コード例 #1
0
ファイル: LoopPass.cpp プロジェクト: Celtoys/clReflect
// 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();

    // 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 (PMS.top()->getPassManagerType() == PMT_LoopPassManager &&
            !PMS.top()->preserveHigherLevelAnalysis(this))
        PMS.pop();
}
コード例 #2
0
ファイル: LoopPass.cpp プロジェクト: Celtoys/clReflect
/// 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);
}
コード例 #3
0
ファイル: CallGraphSCCPass.cpp プロジェクト: aosm/clang
/// 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);
}