2020.3.16
-
dumpinput
-
DumpObject
-
DisassemleObject
-
llvm-mctoll.cpp:1375 getInstruction(...)Disassemble a real instruction or a data- x86的话
llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp:1700 getInstruction(...):1713getInstrctionID(...)指令的操作码,INSTRUCTIONS_SYM可能要编译时才生成吧:2295 translateInstruction(...)
- x86的话
-
llvm-mctoll.cpp:1441 runMachineFunctionPasses()llvm/tools/llvm-mctoll/MachineFunctionRaiser.cpp- Build CFG
MCInst转MachineInstr在MCInstRaiser::RaiseMCInst(...)中完成。在mctoll的MCInstRaiser.cpp文件里
- Construct function prototype
MachineFunctionRaiser::runRaiserPasses()- x86的话
llvm/tools/llvm-mctoll/X86/X86MachineInstructionRaiser.cpp: 425 X86MachineInstructionRaiser::raise()X86MachineInstructionRaiser::raiseMachineFunction()Raise MachineInstr in MachineFunction to MachineInstructionraiseMachineInstr(MachineInstr)其中MachineInstr是LLVM的类,但是有mctoll定义的内容raiseMemRefMachineInstr(MachineInstr)raiseReturnMachineInstr(MachineInstr)raiseGenericMachineInstr(MachineInstr)raiseBinaryOpImmToRegMachineInstr(MachineInstr)BinaryOperator::CreateAdd()
- x86的话
- Build CFG
-
输出文件
2020.3.20
注:BinaryOperator *CreateXXX的定义在include/llvm/IR/InstrTypes.h里,通过同名宏HANDLE_BINARY_INST的3次定义3次“调用”llvm/IR/Instruction.def完成了统一函数名的不同签名的声明+定义。十分巧妙!最终是调用了BinaryOperator::Create(...)
想要搞清楚的问题:
-
类型信息在哪个阶段获取的?
注:MachineInstr是LLVM描述机器语言类,Value是LLVM IR的操作数类。
raise指令时,比如
X86MachineInstructionRaiser::raiseBinaryOpImmToRegMachineInstr(MachineInstr)生成了Value类型的操作数,其中就包含了类型,通过寄存器、原操作数、目的操作数的信息来判断类型。(当然有必要的话会生产类型转换的代码)。 -
在哪个地方用x86汇编生成的LLVM IR?
同上,利用
BinaryOperator::CreateXXX()函数生成LLVM IR,然后添加到RaisedBB->getInstList()里。同时在这里处理了EFLAGS。