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(...)
  • llvm-mctoll.cpp:1441 runMachineFunctionPasses()

    llvm/tools/llvm-mctoll/MachineFunctionRaiser.cpp

    • Build CFG
      • MCInstMachineInstrMCInstRaiser::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 MachineInstruction
          • raiseMachineInstr(MachineInstr)其中MachineInstr是LLVM的类,但是有mctoll定义的内容
            • raiseMemRefMachineInstr(MachineInstr)
            • raiseReturnMachineInstr(MachineInstr)
            • raiseGenericMachineInstr(MachineInstr)
              • raiseBinaryOpImmToRegMachineInstr(MachineInstr)
                • BinaryOperator::CreateAdd()
  • 输出文件

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。