如何在 LLVM 模块中增加全局变量?
How to increment a Global Variable in a LLVM module?
我想在基本块的末尾添加一条指令来递增 GlobalVariable(使用 LLVM C++ 库)。我是 LLVM 的新手,我可以直接执行此操作还是需要加载全局变量,将其递增所需的值并写回全局变量?
即使我加载变量(使用 LoadInst 构造函数),"Add" 指令如何知道变量在哪里?
例如,看看这个 IR ocde :
%cell_index = load i32* %cell_index_ptr
%new_cell_index = add i32 1, %cell_index
add 指令知道要操作哪个变量 (cell_index)。但是因为我将从 C++ 创建加载指令,所以我不知道变量将在哪里创建。
是的,您必须创建加载、添加和存储指令。
在 LLVM 的 C++ class 层次结构中,Instruction
subclass 是 Value
。当你创建你的LoadInst
时,你可以在创建新指令时直接引用它。例如:
IRBuilder<> IR(SomeInsertionPoint);
LoadInst *Load = IR.CreateLoad(MyGlobalVariable);
Value *Inc = IR.CreateAdd(IR.getInt32(1), Load);
StoreInst *Store = IR.CreateStore(Inc, MyGlobalVariable);
我想在基本块的末尾添加一条指令来递增 GlobalVariable(使用 LLVM C++ 库)。我是 LLVM 的新手,我可以直接执行此操作还是需要加载全局变量,将其递增所需的值并写回全局变量?
即使我加载变量(使用 LoadInst 构造函数),"Add" 指令如何知道变量在哪里?
例如,看看这个 IR ocde :
%cell_index = load i32* %cell_index_ptr
%new_cell_index = add i32 1, %cell_index
add 指令知道要操作哪个变量 (cell_index)。但是因为我将从 C++ 创建加载指令,所以我不知道变量将在哪里创建。
是的,您必须创建加载、添加和存储指令。
在 LLVM 的 C++ class 层次结构中,Instruction
subclass 是 Value
。当你创建你的LoadInst
时,你可以在创建新指令时直接引用它。例如:
IRBuilder<> IR(SomeInsertionPoint);
LoadInst *Load = IR.CreateLoad(MyGlobalVariable);
Value *Inc = IR.CreateAdd(IR.getInt32(1), Load);
StoreInst *Store = IR.CreateStore(Inc, MyGlobalVariable);