这个我要修改一个后端,最好是能增加一条指令,如果增加指令其实挺麻烦的。首先在clang增加对c语言的解析?然后在LLVM中增加一条相对应的指令,再增加c语言到LLVM IR的转变?再增加目标平台的指令集和LLVM IR到平台语言的转换?一个大工程!!!!!!!!!!!!!
在搜索一系列资料之后,找到了文章或者说一本书,先看着。
首先是IR语言到目标平台语言的转换,这可以用在增加一些llvm IR的语言到平台语言的转换。
在InstrFormats.td中定义了对于操作码的解析:
//===----------------------------------------------------------------------===//
// Format L instruction class in Cpu0 : <|opcode|ra|rb|cx|>
//===----------------------------------------------------------------------===//
class FL<bits<8> op, dag outs, dag ins, string asmstr, list<dag> pattern,
InstrItinClass itin>: Cpu0Inst<outs, ins, asmstr, pattern, itin, FrmL>
{
bits<4> ra;
bits<4> rb;
bits<16> imm16;
let Opcode = op;
let Inst{23-20} = ra;
let Inst{19-16} = rb;
let Inst{15-0} = imm16;
}
在InstrInfo.td中定义指令:其中class是定义一个操作类型的模板,之后可以直接调用,参数正确就行。
// Node immediate fits as 16-bit sign extended on target immediate.
// e.g. addi, andi
def immSExt16 : PatLeaf<(imm), [{ return isInt<16>(N->getSExtValue()); }]>;
// Arithmetic and logical instructions with 2 register operands.
class ArithLogicI<bits<8> op, string instr_asm, SDNode OpNode,
Operand Od, PatLeaf imm_type, RegisterClass RC> :
FL<op, (outs GPROut:$ra), (ins RC:$rb, Od:$imm16),
!strconcat(instr_asm, "\t$ra, $rb, $imm16"),
[(set GPROut:$ra, (OpNode RC:$rb, imm_type:$imm16))], IIAlu> {
let isReMaterializable = 1;
}
// IR "add" defined in include/llvm/Target/TargetSelectionDAG.td, line 315 (def add).
def ADDiu : ArithLogicI<0x09, "addiu", add, simm16, immSExt16, CPURegs>;
下图展示了刚刚定义的类型的模式匹配过程,是在DAG的转换 ,讲述了各个要素的对应,比如op、立即数等