Я реализую несколько проходов на LLVM, чтобы добавить исходную оптимизацию, Эти проходы основаны на FunctionPass и ModulePass. Теперь каждый Пасс вызывается соответствующей опцией команды выбора, которая равна , зарегистрированной по шаблону RegisterPass.Как запустить функцию Pass перед модулем Pass в LLVM?
В будущем я хотел бы, чтобы эти проходы были вызваны только одним опцией команды opt. Моя идея такова: - - Во-первых, функция переходит к запуску, и, наконец, модуль переходит к запуску. - Каждая функция переходит к использованию информации анализа прошлых функций. - Окончательный модуль передает конструкцию новой функции, используя результат предыдущих функций. - Все эти последовательности Passes вызывают только одну опцию команды opt, определяющую окончательный проход модуля.
Я думал, что могу сделать это с помощью метода addRequired в классе AnalysisUsage. Однако, похоже, что это не сработало: - - В проходе функции несколько проходов функций могут быть добавлены в порядке. - В пропускной способности функции может быть добавлен только один проход модуля. - В проходе функции (X) пропуск функции и прохождение модуля не могут быть добавлены одновременно. Т.е. команда команды opt с опцией X вызывает статус блокировки. - В проходе модуля может быть добавлен только один проход модуля. - В проходе модуля (Y) невозможно передать значение функции (Z). Т.е. команда opt с опцией Y выполняет только Y, а функция pass (Z) игнорируется.
Я не знаком с механизмом управления Pass. Кто-нибудь поможет мне запустить прогон функции перед прохождением модуля только с одной опцией команды команды?
Случай исполнения приведен ниже: -
$ opt -stats -load ~/samples/tryPass4.so -MPass4 hello2.ll -S -o tryPass4.ll -debug-pass=Structure
Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -MPass4 -verify -verify-di -print-module
Target Library Information ↑
Data Layout -FPass4 doesn't appear here
No target information
Target independent code generator's TTI
X86 Target Transform Info
ModulePass Manager
Module Pass
Unnamed pass: implement Pass::getPassName()
FunctionPass Manager
Module Verifier
Debug Info Verifier
Print module to stderr
Pass Arguments: -FPass4 <- here -FPass4 appears, but not executed
FunctionPass Manager
Function Pass
***** Module Name : hello2.ll <- output from the Module pass
Исходный код выше выглядит следующим образом: -
using namespace llvm;
namespace{
class tryFPass4 : public FunctionPass {
public :
static char ID;
tryFPass4() : FunctionPass(ID){}
~tryFPass4(){}
virtual bool runOnFunction(llvm::Function &F);
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
};
class tryMPass4 : public ModulePass {
public :
static char ID;
tryMPass4() : ModulePass(ID){}
~tryMPass4(){}
virtual bool runOnModule(llvm::Module &M);
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const;
};
}
bool tryFPass4::runOnFunction(Function &F) {
bool change = false;
....
return change;
}
bool tryMPass4::runOnModule(Module &M) {
bool change = false ;
....
return change;
}
void tryFPass4::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
}
void tryMPass4::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesCFG();
AU.addRequired<tryFPass4>();
}
char tryFPass4::ID = 0;
static RegisterPass<tryFPass4> X("FPass4", "Function Pass", false, false);
char tryMPass4::ID = 0;
static RegisterPass<tryMPass4> Y("MPass4", "Module Pass", false, false);