Assembly 将armv7m指令转换为LLVM IR 我开发了一个C++中的升降机,它将ARMV7m指令提升到LLVM IR。
现在我正处于翻译阶段,我只需输入一条arm指令并将其转换为等效的SSA LLVM IR指令 我的体系结构只是为汇编代码中的每个函数创建一个llvm函数,并为函数中的每个基本块创建一个llvm基本块,对于基本块中的每个汇编指令,我使用生成器为该指令构建等效的llvm IR指令(将该指令的基本块的llvm基本块传递给IRBuilder时)…我的ADD汇编指令代码示例Assembly 将armv7m指令转换为LLVM IR 我开发了一个C++中的升降机,它将ARMV7m指令提升到LLVM IR。,assembly,llvm,reverse-engineering,armv7,lifting,Assembly,Llvm,Reverse Engineering,Armv7,Lifting,现在我正处于翻译阶段,我只需输入一条arm指令并将其转换为等效的SSA LLVM IR指令 我的体系结构只是为汇编代码中的每个函数创建一个llvm函数,并为函数中的每个基本块创建一个llvm基本块,对于基本块中的每个汇编指令,我使用生成器为该指令构建等效的llvm IR指令(将该指令的基本块的llvm基本块传递给IRBuilder时)…我的ADD汇编指令代码示例 //Translates an ADD assembly instruction object into the equivalent
//Translates an ADD assembly instruction object into the equivalent SSA llvm IR instructions.
llvm::Instruction* ADD(Instr* instruction, bool update_condition_flags = false) {
IRBuilder<> builder(instruction->basic_block->get_llvm_basic_block());
std::vector<Reg*> registers = instruction->get_registers();
std::vector<Immediate*> immediates = instruction->get_immediates();
if (instruction->get_immediates().empty()) {
std::string register1 = registers[1]->get_register_name();
Value* register1_val = registers[1]->get_register_value();
llvm::Value* immediate = immediates[0]->get_immediate_value_long();
std::string output_register = registers[0]->get_register_name();
llvm::Instruction* x = builder.CreateAlloca(Type::getInt32Ty(TheContext), nullptr);
instruction->insert_llvm_instructions(x);
llvm::Instruction* s = builder.CreateStore(register1_val, x, /*isVolatile=*/false);
instruction->insert_llvm_instructions(s);
llvm::Instruction* LHS = builder.CreateLoad(x, register1);
instruction->insert_llvm_instructions(LHS);
llvm::Instruction* add_ll = BinaryOperator::Create(Instruction::Add,
LHS, immediate, output_register);
instruction->insert_llvm_instructions(add_ll);
return add_ll;
LLVM IR使用SSA,即每个符号仅指一个值。
不可能添加r3,r3,#1,因为r3指两个值(结果和输入)
我认为最常见的解决方案是添加一个由函数内偏移量确定的后缀。如果该add是第16条指令,并且它使用的r3来自第12条指令,那么可能%r3.16=add i32%r3.12,1
LLVM IR使用SSA,即每个符号只引用一个值。添加r3,r3,#1
是不可能的,because r3表示两个值(结果和输入)
我认为最常见的解决方案是添加一个由函数内的偏移量确定的后缀。如果add是第16条指令,而它使用的r3来自第12条指令,那么可能%r3.16=add i32%r3.12,1
我猜这是因为LLVM使用SSA(),这些索引更像是寄存器版本号,不可移动。相关项目:我猜因为LLVM使用SSA(),所以这些索引更像是寄存器版本号,不可移动。相关项目:
ldr r3, [fp, #-8]
add r3, r3, #1
str r3, [fp, #-8]