void MachineModulePass::preparePassManager(PMStack &PMS) {
  assert(!PMS.empty() && "No pass manager found, should not happen.");

  MachineFunctionAnalysis *MFA = (MachineFunctionAnalysis*)
                PMS.top()->findAnalysisPass(&MachineFunctionAnalysis::ID, true);
  if (MFA) {
    MFA->preserveMF();
  }
  ModulePass::preparePassManager(PMS);
}
Esempio n. 2
0
/// Assign pass manager to manage this pass.
void LoopPass::assignPassManager(PMStack &PMS,
                                 PassManagerType PreferredType) {
    // Find LPPassManager
    while (!PMS.empty() &&
            PMS.top()->getPassManagerType() > PMT_LoopPassManager)
        PMS.pop();

    LPPassManager *LPPM;
    if (PMS.top()->getPassManagerType() == PMT_LoopPassManager)
        LPPM = (LPPassManager*)PMS.top();
    else {
        // Create new Loop Pass Manager if it does not exist.
        assert (!PMS.empty() && "Unable to create Loop Pass Manager");
        PMDataManager *PMD = PMS.top();

        // [1] Create new Loop Pass Manager
        LPPM = new LPPassManager();
        LPPM->populateInheritedAnalysis(PMS);

        // [2] Set up new manager's top level manager
        PMTopLevelManager *TPM = PMD->getTopLevelManager();
        TPM->addIndirectPassManager(LPPM);

        // [3] Assign manager to manage this new manager. This may create
        // and push new managers into PMS
        Pass *P = LPPM->getAsPass();
        TPM->schedulePass(P);

        // [4] Push new manager into PMS
        PMS.push(LPPM);
    }

    LPPM->add(this);
}
Esempio n. 3
0
/// Assign pass manager to manage this pass.
void CallGraphSCCPass::assignPassManager(PMStack &PMS,
                                         PassManagerType PreferredType) {
  // Find CGPassManager 
  while (!PMS.empty() &&
         PMS.top()->getPassManagerType() > PMT_CallGraphPassManager)
    PMS.pop();

  assert (!PMS.empty() && "Unable to handle Call Graph Pass");
  CGPassManager *CGP = dynamic_cast<CGPassManager *>(PMS.top());

  // Create new Call Graph SCC Pass Manager if it does not exist. 
  if (!CGP) {

    assert (!PMS.empty() && "Unable to create Call Graph Pass Manager");
    PMDataManager *PMD = PMS.top();

    // [1] Create new Call Graph Pass Manager
    CGP = new CGPassManager(PMD->getDepth() + 1);

    // [2] Set up new manager's top level manager
    PMTopLevelManager *TPM = PMD->getTopLevelManager();
    TPM->addIndirectPassManager(CGP);

    // [3] Assign manager to manage this new manager. This may create
    // and push new managers into PMS
    Pass *P = dynamic_cast<Pass *>(CGP);
    TPM->schedulePass(P);

    // [4] Push new manager into PMS
    PMS.push(CGP);
  }

  CGP->add(this);
}
Esempio n. 4
0
// Check if this pass is suitable for the current LPPassManager, if
// available. This pass P is not suitable for a LPPassManager if P
// is not preserving higher level analysis info used by other
// LPPassManager passes. In such case, pop LPPassManager from the
// stack. This will force assignPassManager() to create new
// LPPassManger as expected.
void LoopPass::preparePassManager(PMStack &PMS) {

  // Find LPPassManager 
  while (!PMS.empty() &&
         PMS.top()->getPassManagerType() > PMT_LoopPassManager)
    PMS.pop();

  LPPassManager *LPPM = dynamic_cast<LPPassManager *>(PMS.top());

  // If this pass is destroying high level information that is used
  // by other passes that are managed by LPM then do not insert
  // this pass in current LPM. Use new LPPassManager.
  if (LPPM && !LPPM->preserveHigherLevelAnalysis(this)) 
    PMS.pop();
}
Esempio n. 5
0
 void preparePassManager(PMStack &Stack) override {
     (void)jl_init_llvm();
     PMTopLevelManager *TPM = Stack.top()->getTopLevelManager();
     TPMAdapter Adapter(TPM);
     addTargetPasses(&Adapter, jl_TargetMachine);
     addOptimizationPasses(&Adapter, OptLevel);
 }