Передача функции клонирования LLVM в другой модуль - PullRequest
0 голосов
/ 13 апреля 2020

Я создаю проход 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())))

Я хочу знать, правильный ли способ клонирования функций. Если это так, найдите причину сбоев.

1 Ответ

0 голосов
/ 24 апреля 2020

После некоторых экспериментов выяснилось, что после прохождения существующего контекста 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;
}
...