LLVM Добавление пропуска - ошибка компоновки - PullRequest
2 голосов
/ 20 апреля 2011

Я написал свой пропуск в llvm/lib/Transforms, и он называется createABCDPass.В свой пропуск я добавил следующий код:

namespace llvm { FunctionPass *createABCDPass(); }
FunctionPass *llvm::createABCDPass() { return new AbcRemoval(); }

, где AbcRemoval - класс пропуска.

После этого я сделал предварительное объявление в lib/CodeGen/LLVMTargetMachine.cpp для распознавания моего прохода:

namespace llvm { FunctionPass *createABCDPass(); }
PM.add(createABCDPass());

Однако, когда я запускаю make на llvm, я получаю следующую ошибку:

llvm[2]: Linking Release executable llc (without symbols)
Undefined symbols:
  "llvm::createABCDPass()", referenced from:
      llvm::LLVMTargetMachine::addCommonCodeGenPasses(llvm::PassManagerBase&, llvm::CodeGenOpt::Level, bool, llvm::MCContext*&)in libLLVMCodeGen.a(LLVMTargetMachine.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[2]: *** [/Users/.../llvm/Release/bin/llc] Error 1
make[1]: *** [llc/.makeall] Error 2
make: *** [all] Error 1

Кто-нибудь знает, почему я получаю эту ошибку?Спасибо!

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Ах, я исправил это в конце, переименовав модуль pass в -libLLVM_xxx. Очевидно, вы должны назвать его libLLVM_ «что-то», чтобы он динамически работал со всеми другими проходами в LLVM. Не знаю почему, но это работает!

2 голосов
/ 21 апреля 2011

Вы должны связать свой пропуск с ООО.По умолчанию llc почти ничего не получает от lib/Transforms, поэтому ваш проход не будет связан с llc.

...