Я создаю проход LLVM, загруженный в 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;
}
Даже если проход успешно клонирует функцию, opt бросает EXC_BAD_ACCESS в функцию LookupBucketFor.
if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst())))
Я хочу знать, правильный ли способ клонирования функций. Если это так, найдите причину сбоев.