Mam dwa przechodzi LLVM, jeden, który wymaga wyjść drugiego. Więc w PASSB mam:

void DiscoPoP::getAnalysisUsage(AnalysisUsage &Info) const{
    Info.addRequired<PassA>();
}

Próbowałem dodać fragment poniżej do PASB, ale podczas pracy clang -Xclang -load -Xclang LLVMPassB.so Rozumiem błąd: niezdefiniowany symbol: _Zn18passa2ide

static RegisterStandardPasses PassLoader(
    PassManagerBuilder::EP_EarlyAsPossible,
    [](const PassManagerBuilder &Builder,
       legacy::PassManagerBase &PM) { PM.add(new PassA()); });

Jeśli załaduję Passa w Clang, to działa: clang -Xclang -load -Xclang LLVMPassA.so -Xclang -load -Xclang LLVMPassB.so

Ale wydaje się zbędne, musi go załadować ręcznie, jeśli wymaga go z passb. Czy istnieje sposób, aby ładować Passa programowo z PASSB?

1
nicolas-mosch 28 listopad 2019, 18:25

1 odpowiedź

Najlepsza odpowiedź

Otrzymuję błąd: niezdefiniowany symbol: _Zn18passa2ide

Ponieważ Passa nie jest widoczna dla klgar.

Jeśli załaduję Passa w Clang, działa: Clang -xcang -load -xcang Llvmassa.so -xcang -load -xclang llvmpassb.so

Zgodnie z oczekiwaniami.

Ale wydaje się zbędne, musi go załadować ręcznie, jeśli wymaga go z passb.

Tylko wtedy, gdy nie wiedzieć, że wiedzą o PassA, gdy passb jest dostarczany jako flaga. Clang nie ma sposobu na poznanie, gdzie znajduje się LLVMPassA.so, chyba że przechodzimy jako flagę.

Czy istnieje sposób, aby ładować Passa programowo z PASSB?

Można to zrobić, jeśli zmodyfikujesz kod źródłowy LLVM i umieścić tam obie przepustki. Rejestrowanie przepustki w Menedżerze LLVM jest proste. Zobacz https://reviews.llvm.org/d50658 (Gorący przełęcz rozszczepiania) jako przykład, W szczególności zmiany w lib/Transforms/IPO/PassManagerBuilder.cpp i funkcji createHotColdSplittingPass.

0
A. K. 28 listopad 2019, 19:00