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;
}
我正在创建 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;
}