簡體   English   中英

將 armv7m 指令翻譯成 LLVM IR

[英]Translating armv7m instructions into LLVM IR

我正在 c++ 中開發一個提升器,它將 armv7m 指令提升到 LLVM IR 中。

現在我處於翻譯階段,我只需輸入一條 arm 指令並將其翻譯成等效的 SSA LLVM IR 指令。

My architecture simply creates an llvm function for each function in my assembly code and for each basic block inside a function create an llvm basic block and for each assembly instruction inside a basic block I use a builder to build the equivalent llvm IR instructions for that instruction (同時將該指令的基本塊的 llvm 基本塊傳遞給 IRBuilder)..我的 ADD 匯編指令代碼示例。

//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;

基本上,我正在嘗試為示例add r1, r3, #2匯編指令生成 llvm IR 指令。

我想在生成的等效 llvm ir 指令(即 %r1、%r3)中使用匯編指令(r1、r3)中使用的寄存器的名稱。 然而,在生成的 IR 中的許多情況下,在本示例中,我將附加索引添加到寄存器名稱中,如 %r346(在“%r3”之后添加了“46”)。 為什么要添加這些索引,請問有沒有辦法刪除它們。

例如add r1, r3, #2匯編指令。 我想要的 output 是:

%12 = alloca i32,對齊 4

存儲 i32 0,i32* %12,對齊 4

%r3 = 加載 i32,i32* %12,對齊 4

%r1 = 添加 i32 %r3, 2

雖然我得到的 output 是:

%12 = alloca i32,對齊 4

存儲 i32 0,i32* %12,對齊 4

%r346 = 加載 i32,i32* %12,對齊 4

%r1 = 添加 i32 %r346, 2

我可以像這里的 %1 一樣更新 llvm function 中的變量嗎?

%1 = 多重 i32 %x, %y

%1 = 添加 i32 %1, %z

當我測試我的升降機 id 時,我喜歡跟隨一個特定的寄存器 (r3),因為它通過 function 內的不同匯編指令進行。 這些額外的索引會增加混亂。 對於以下匯編代碼 id,例如為每個匯編指令生成的 llvm IR,使其具有 %r3 而沒有任何附加索引。

 ldr r3, [fp, #-8] 

 add r3, r3, #1 

 str r3, [fp, #-8] 

LLVM IR 使用 SSA,即。 每個符號僅指一個值。 add r3, r3, #1是不可能的,因為 r3 指的是兩個值(結果和輸入)。

我認為最常見的解決方案是添加一個從 function 中的偏移量確定的后綴。 如果該 add 是第 16 條指令,並且它使用的 r3 來自第 12 條,也許%r3.16 = add i32 %r3.12, 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM