使用 Llvm pass 插入内联汇编表达式

Insert inline assembly expressions using Llvm pass

我正在尝试使用 llvm pass 创建和附加内联汇编表达式。我知道我可以使用 void appendModuleInlineAsm(StringRef Asm) ,但我无法让它工作。

基本上我想附加这样的指令:

%X = call i32 asm "bswap [=10=]", "=r,r"(i32 %Y)

就在另一条指令之前。有人试过吗?

基本思路:

a) 您需要一个函数传递来迭代指令, b) 您需要遍历基本块和指令,直到找到之前要插入的指令, c) 执行如下操作:

  llvm::InlineAsm *IA =
    llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect,
                         /* IsAlignStack */ false, AsmDialect);
  llvm::CallInst *Result = Builder.CreateCall(IA, Args);
  Result->addAttribute(llvm::AttributeSet::FunctionIndex,
                       llvm::Attribute::NoUnwind);

这是从 clang 中大量窃取的。查看 InlineAsm 的文档以了解其余参数,Builder 是一个 DIBuilder 实例。确保在所需位置设置 DIBuilder 插入点。