0

我正在使用LLVM IR代码。我想创建一个新的store指令(例如:store i32 %add, i32* %temp1, align 4),我需要在特定指令之后插入它,比如在add指令之后。我的意图是,一个加法操作的结果(一些指针)存储在%add中,我需要保留一个温度变量相同的副本说%temp1创建新的存储指令LLVM

为此,我首先创建了一个名为temp1的变量(%temp1 = alloca i32, align 4)。现在我要存储加法指令(%add = add nsw i32 %0, %1)的结果,即%addtemp1。然后最后存储指令将是这样的:store i32 %add, i32* %temp1, align 4。这个怎么做?

任何帮助一些例子?

回答

0

为了创建%temp1 = alloca i32, align 4指令,我用下面的语句:

AllocaInst* pa = new AllocaInst(llvm::Type::getInt32Ty(getGlobalContext()), 0, 4,"temp1"); 

用于创建和插入一个新的store指令:

StoreInst *str = new StoreInst(i, pa); // i -> current instruction pointer which represents %add (source of store instruction), pa -> destination. i.e., temp1 
BB->getInstList().insert(ib, str); // ib -> instruction address before which you want to insert this store instruction 
+0

您可以将'ib'作为第三个参数传递给'StorInst'构造函数。所有指令构造函数都将插入点作为最后一个参数:例如'StoreInst(Value * Val,Value * Ptr,Instruction * InsertBefore)'和'StoreInst(Value * Val,Value * Ptr,BasicBlock * InsertAtEnd)' –

0

有两点要注意:

  1. 你应该使用IRBuilder来创建IR。这很容易,万花筒教程和clang本身都有很多例子可供使用。
  2. 我不确定你为什么要创建额外的分配。一般来说,除非你有一个实际的本地变量来存储一个值就足以保存结果。你存储什么,为什么?
  3. 如果你确实需要一个额外的分配给本地变量,那么你应该在函数的入口块中创建它,否则你将在函数的中间创建一个动态分配。