Как реализация ll c в llvm add проходит в PassManager? - PullRequest
0 голосов
/ 17 марта 2020

Вот полный код для 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 в кодах?

...