当前位置: 首页>>代码示例>>C++>>正文


C++ iterator::getFirstNonPHI方法代码示例

本文整理汇总了C++中function::iterator::getFirstNonPHI方法的典型用法代码示例。如果您正苦于以下问题:C++ iterator::getFirstNonPHI方法的具体用法?C++ iterator::getFirstNonPHI怎么用?C++ iterator::getFirstNonPHI使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在function::iterator的用法示例。


在下文中一共展示了iterator::getFirstNonPHI方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: insert_function_limits

void insert_function_limits(Function &F){
    
    //Functions to be inserted as pragmas
    FunctionType* funvoid = FunctionType::get(Type::getVoidTy( F.getParent()->getContext() ), false);
    
    InlineAsm* fun_begin;
    InlineAsm* fun_end;
    if (sizeof(void*)==sizeof(long long)){
        fun_begin = InlineAsm::get(funvoid, "callq\tpragma_function_begin", "", false);
        fun_end = InlineAsm::get(funvoid, "callq\tpragma_function_end", "", false);
    }
    else {
        fun_begin = InlineAsm::get(funvoid, "call\tpragma_function_begin", "", false);
        fun_end = InlineAsm::get(funvoid, "call\tpragma_function_end", "", false);
    }
    
    //In the beginning
    {
        BasicBlock& first = F.getEntryBlock();
        int preds = 0;
        for (pred_iterator pi = pred_begin(&first), pe = pred_end(&first); pi != pe; pi++){
            preds++;
        }
        if (preds > 0){
            report_fatal_error("Error: The first basic block has predecessor.\n");
            //TODO: insert a new basic block in the beginning
        }
        
        CallInst* before = CallInst::Create(fun_begin);
        before->setDoesNotThrow();
        before->insertBefore( first.getFirstNonPHI() );
    }
    
    //In the end
    for (Function::iterator bb = F.begin(), en = F.end(); bb != en; bb++){
        TerminatorInst* inst = bb->getTerminator();
        
        if ( isa<ReturnInst>(inst) ){
            CallInst* after = CallInst::Create(fun_end);
            after->setDoesNotThrow();
            //after->insertBefore( inst );
            after->insertBefore( bb->getFirstNonPHI() );
        }
    }
    
}
开发者ID:dougct,项目名称:mmt-sync,代码行数:46,代码来源:FunctionLimitCode.cpp

示例2: runOnModule


//.........这里部分代码省略.........
          II->replaceAllUsesWith(NewCall);
          ToErase.push_back(II);

          CallInst *Post = CallInst::Create(PostInvoke, "", II);
          Instruction *Post1 = new TruncInst(Post, i1, "", II);

          // Insert a branch based on the postInvoke
          BranchInst::Create(II->getUnwindDest(), II->getNormalDest(), Post1, II);
        } else {
          // This can't throw, and we don't need this invoke, just replace it with a call+branch
          SmallVector<Value*,16> CallArgs(II->op_begin(), II->op_end() - 3);
          CallInst *NewCall = CallInst::Create(II->getCalledValue(),
                                               CallArgs, "", II);
          NewCall->takeName(II);
          NewCall->setCallingConv(II->getCallingConv());
          NewCall->setAttributes(II->getAttributes());
          NewCall->setDebugLoc(II->getDebugLoc());
          II->replaceAllUsesWith(NewCall);
          ToErase.push_back(II);

          BranchInst::Create(II->getNormalDest(), II);

          // Remove any PHI node entries from the exception destination.
          II->getUnwindDest()->removePredecessor(BB);
        }

        Changed = true;
      }
      // scan the body of the basic block for resumes
      for (BasicBlock::iterator Iter = BB->begin(), E = BB->end();
           Iter != E; ) {
        Instruction *I = Iter++;
        if (ResumeInst *R = dyn_cast<ResumeInst>(I)) {
          // split the input into legal values
          Value *Input = R->getValue();
          ExtractValueInst *Low = ExtractValueInst::Create(Input, 0, "", R);
          ExtractValueInst *High = ExtractValueInst::Create(Input, 1, "", R);

          // create a resume call
          SmallVector<Value*,2> CallArgs;
          CallArgs.push_back(Low);
          CallArgs.push_back(High);
          CallInst::Create(Resume, CallArgs, "", R);

          new UnreachableInst(TheModule->getContext(), R); // add a terminator to the block

          ToErase.push_back(R);
        }
      }
    }

    // Look for orphan landingpads, can occur in blocks with no predecesors
    for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
      Instruction *I = BB->getFirstNonPHI();
      if (LandingPadInst *LP = dyn_cast<LandingPadInst>(I)) {
        LandingPads.insert(LP);
      }
    }

    // Handle all the landingpad for this function together, as multiple invokes may share a single lp
    for (std::set<LandingPadInst*>::iterator I = LandingPads.begin(); I != LandingPads.end(); I++) {
      // Replace the landingpad with a landingpad call to get the low part, and a getHigh for the high
      LandingPadInst *LP = *I;
      unsigned Num = LP->getNumClauses();
      SmallVector<Value*,16> NewLPArgs;
      NewLPArgs.push_back(LP->getPersonalityFn());
      for (unsigned i = 0; i < Num; i++) {
        Value *Arg = LP->getClause(i);
        // As a temporary workaround for the lack of aggregate varargs support
        // in the varargs lowering code, break out filter operands into their
        // component elements.
        if (LP->isFilter(i)) {
          ArrayType *ATy = cast<ArrayType>(Arg->getType());
          for (unsigned elem = 0, elemEnd = ATy->getNumElements(); elem != elemEnd; ++elem) {
            Instruction *EE = ExtractValueInst::Create(Arg, makeArrayRef(elem), "", LP);
            NewLPArgs.push_back(EE);
          }
        } else {
          NewLPArgs.push_back(Arg);
        }
      }
      NewLPArgs.push_back(LP->isCleanup() ? ConstantInt::getTrue(i1) : ConstantInt::getFalse(i1));
      CallInst *NewLP = CallInst::Create(LandingPad, NewLPArgs, "", LP);

      Instruction *High = CallInst::Create(GetHigh, "", LP);

      // New recreate an aggregate for them, which will be all simplified later (simplification cannot handle landingpad, hence all this)
      InsertValueInst *IVA = InsertValueInst::Create(UndefValue::get(LP->getType()), NewLP, 0, "", LP);
      InsertValueInst *IVB = InsertValueInst::Create(IVA, High, 1, "", LP);

      LP->replaceAllUsesWith(IVB);
      ToErase.push_back(LP);
    }

    // erase everything we no longer need in this function
    for (unsigned i = 0; i < ToErase.size(); i++) ToErase[i]->eraseFromParent();
  }

  return Changed;
}
开发者ID:UplinkCoder,项目名称:emscripten-fastcomp,代码行数:101,代码来源:LowerEmExceptionsPass.cpp


注:本文中的function::iterator::getFirstNonPHI方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。