如何在 LLVM IR 转换过程中创建添加指令?
How do you create an add instruction in an LLVM IR transform pass?
我想用 ConstantInt
值替换 IR 中的某些 CallInst
。在我的转换过程中,我已经能够识别出我想要替换的这些 CallInst
,并且我已经创建了我想要替换它们的 ConstantInt
。
但是,当我尝试使用 llvm::Value::replaceAllUsesWith(Value* V)
进行替换时,出现运行时错误,提示我要替换 CallInst
的 Value
不相同输入 CallInst
(这是有道理的)。
我的替代解决方案是将 CallInst
替换为将常数整数加到零的添加指令。但是,我似乎无法找到如何在我的转换过程中创建添加指令对象。我知道 IRBuilder
有一个 CreateAdd
方法,但我想创建一个独立的指令,而不是一个新的基本块。
要创建添加指令,您需要创建 BinaryOperator
记录的 here。
BinaryOperator
class 为您提供了一些 CreateX
函数以及通用的 Create,您可以在其中指定要创建的操作作为第一个参数。
但是,我建议先解决 ConstantInt
的类型问题。假设您的 CallInst returns 是一个整数类型,您可以这样做:
CallInst* call = ... // your call
call->replaceAllUsesWith(ConstantInt::get(call->getType(), 0));
如果它 returns 其他你可以使用各种演员之一,例如bitcast 获取匹配类型的说明。
我想用 ConstantInt
值替换 IR 中的某些 CallInst
。在我的转换过程中,我已经能够识别出我想要替换的这些 CallInst
,并且我已经创建了我想要替换它们的 ConstantInt
。
但是,当我尝试使用 llvm::Value::replaceAllUsesWith(Value* V)
进行替换时,出现运行时错误,提示我要替换 CallInst
的 Value
不相同输入 CallInst
(这是有道理的)。
我的替代解决方案是将 CallInst
替换为将常数整数加到零的添加指令。但是,我似乎无法找到如何在我的转换过程中创建添加指令对象。我知道 IRBuilder
有一个 CreateAdd
方法,但我想创建一个独立的指令,而不是一个新的基本块。
要创建添加指令,您需要创建 BinaryOperator
记录的 here。
BinaryOperator
class 为您提供了一些 CreateX
函数以及通用的 Create,您可以在其中指定要创建的操作作为第一个参数。
但是,我建议先解决 ConstantInt
的类型问题。假设您的 CallInst returns 是一个整数类型,您可以这样做:
CallInst* call = ... // your call
call->replaceAllUsesWith(ConstantInt::get(call->getType(), 0));
如果它 returns 其他你可以使用各种演员之一,例如bitcast 获取匹配类型的说明。