LLVM 克隆函数传递给不同的模块

LLVM clone function pass to different module

我正在创建 LLVM pass,作为库加载到 opt 中,它从硬编码模块获取函数并将其函数克隆到输入模块。

bool MyPass::runOnModule(llvm::Module &M)
{
  SMDiagnostic error;
  LLVMContext context;
  StringRef ImplAssembly = R"(
    define void @foo() {
      ret void
    }
  )";
  auto InjectedModule = parseAssemblyString(ImplAssembly, error, context);

  auto* ImplFunction = InjectedModule->getFunction("foo");
  auto DeclFunction = Function::Create(ImplFunction->getFunctionType(), ImplFunction->getLinkage(), "foo", M);

  VMap[ImplFunction] = DeclFunction;

  SmallVector<ReturnInst*, 8> Returns;
  CloneFunctionInto(DeclFunction, ImplFunction, VMap, false, Returns);
  return true;
}

即使 pass 成功克隆了函数,opt 也会在 LookupBucketFor 函数中抛出 EXC_BAD_ACCESS。

if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst())))

我想知道克隆函数的方式是否正确。如果是,则找出崩溃背后的原因。

经过一些实验,发现在传递M的现有上下文而不是空变量上下文后,传递成功完成了它的工作,即我应该传递现有上下文而不是创建新上下文。

bool MyPass::runOnModule(llvm::Module &M)
{
  SMDiagnostic error;
  StringRef ImplAssembly = R"(
    define void @foo() {
      ret void
    }
  )";
  auto InjectedModule = parseAssemblyString(ImplAssembly, error, M.getContext());

  auto* ImplFunction = InjectedModule->getFunction("foo");
  auto DeclFunction = Function::Create(ImplFunction->getFunctionType(), ImplFunction->getLinkage(), "foo", M);

  VMap[ImplFunction] = DeclFunction;

  SmallVector<ReturnInst*, 8> Returns;
  CloneFunctionInto(DeclFunction, ImplFunction, VMap, false, Returns);
  return true;
}