Вот полный код для ll c. cpp: llvm / tools / ll c. cpp. Основная часть - это compileModule
функция.
Основной вопрос - как эта реализация может добавить проходы в соответствии с различным OptimizationLevel? Это сбивает меня с толку, потому что я не могу найти связь между переменной OLvl
и PassManager PM
.
Вот набросок для этого кода, я опустил некоторые нереляционные коды своими мыслями:
CodeGenOpt::Level OLvl = CodeGenOpt::Default;
switch (OptLevel) {
/// Assign value to OLvl
}
std::unique_ptr<TargetMachine> Target(TheTarget->createTargetMachine(
TheTriple.getTriple(), CPUStr, FeaturesStr, Options, RM,
getCodeModel(), OLvl));
// Build up all of the passes that we want to do to the module.
legacy::PassManager PM;
// Add an appropriate TargetLibraryInfo pass for the module's triple.
TargetLibraryInfoImpl TLII(Triple(M->getTargetTriple()));
PM.add(new TargetLibraryInfoWrapperPass(TLII));
LLVMTargetMachine &LLVMTM = static_cast<LLVMTargetMachine &>(*Target);
MachineModuleInfoWrapperPass *MMIWP =
new MachineModuleInfoWrapperPass(&LLVMTM);
/// Some codes and a if-else branch. I tested that this branch won't be taken if I did not specify
/// -pass-name arguments.
PM.run(*M);
Кажется, что код просто передает OLvl
в Target
и не добавляет никакого прохода в PM
, кроме TargetLibraryInfoWrapperPass
. Но где связь между OLvl
и PM
в кодах?