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


C++ const_iterator::getLandingPadInst方法代码示例

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


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

示例1: set


//.........这里部分代码省略.........
          const Value *Address = DI->getAddress();
          if (Address) {
            if (const BitCastInst *BCI = dyn_cast<BitCastInst>(Address))
              Address = BCI->getOperand(0);
            if (const AllocaInst *AI = dyn_cast<AllocaInst>(Address)) {
              DenseMap<const AllocaInst *, int>::iterator SI =
                StaticAllocaMap.find(AI);
              if (SI != StaticAllocaMap.end()) { // Check for VLAs.
                int FI = SI->second;
                MMI.setVariableDbgInfo(DI->getVariable(), DI->getExpression(),
                                       FI, DI->getDebugLoc());
              }
            }
          }
        }
      }

      // Decide the preferred extend type for a value.
      PreferredExtendType[I] = getPreferredExtendForValue(I);
    }

  // Create an initial MachineBasicBlock for each LLVM BasicBlock in F.  This
  // also creates the initial PHI MachineInstrs, though none of the input
  // operands are populated.
  for (BB = Fn->begin(); BB != EB; ++BB) {
    MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(BB);
    MBBMap[BB] = MBB;
    MF->push_back(MBB);

    // Transfer the address-taken flag. This is necessary because there could
    // be multiple MachineBasicBlocks corresponding to one BasicBlock, and only
    // the first one should be marked.
    if (BB->hasAddressTaken())
      MBB->setHasAddressTaken();

    // Create Machine PHI nodes for LLVM PHI nodes, lowering them as
    // appropriate.
    for (BasicBlock::const_iterator I = BB->begin();
         const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
      if (PN->use_empty()) continue;

      // Skip empty types
      if (PN->getType()->isEmptyTy())
        continue;

      DebugLoc DL = PN->getDebugLoc();
      unsigned PHIReg = ValueMap[PN];
      assert(PHIReg && "PHI node does not have an assigned virtual register!");

      SmallVector<EVT, 4> ValueVTs;
      ComputeValueVTs(*TLI, PN->getType(), ValueVTs);
      for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
        EVT VT = ValueVTs[vti];
        unsigned NumRegisters = TLI->getNumRegisters(Fn->getContext(), VT);
        const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
        for (unsigned i = 0; i != NumRegisters; ++i)
          BuildMI(MBB, DL, TII->get(TargetOpcode::PHI), PHIReg + i);
        PHIReg += NumRegisters;
      }
    }
  }

  // Mark landing pad blocks.
  SmallVector<const LandingPadInst *, 4> LPads;
  for (BB = Fn->begin(); BB != EB; ++BB) {
    if (const auto *Invoke = dyn_cast<InvokeInst>(BB->getTerminator()))
      MBBMap[Invoke->getSuccessor(1)]->setIsLandingPad();
    if (BB->isLandingPad())
      LPads.push_back(BB->getLandingPadInst());
  }

  // If this is an MSVC EH personality, we need to do a bit more work.
  EHPersonality Personality = EHPersonality::Unknown;
  if (!LPads.empty())
    Personality = classifyEHPersonality(LPads.back()->getPersonalityFn());
  if (!isMSVCEHPersonality(Personality))
    return;

  if (Personality == EHPersonality::MSVC_Win64SEH ||
      Personality == EHPersonality::MSVC_X86SEH) {
    addSEHHandlersForLPads(LPads);
  }

  WinEHFuncInfo &EHInfo = MMI.getWinEHFuncInfo(&fn);
  if (Personality == EHPersonality::MSVC_CXX) {
    const Function *WinEHParentFn = MMI.getWinEHParent(&fn);
    calculateWinCXXEHStateNumbers(WinEHParentFn, EHInfo);
  }

  // Copy the state numbers to LandingPadInfo for the current function, which
  // could be a handler or the parent. This should happen for 32-bit SEH and
  // C++ EH.
  if (Personality == EHPersonality::MSVC_CXX ||
      Personality == EHPersonality::MSVC_X86SEH) {
    for (const LandingPadInst *LP : LPads) {
      MachineBasicBlock *LPadMBB = MBBMap[LP->getParent()];
      MMI.addWinEHState(LPadMBB, EHInfo.LandingPadStateMap[LP]);
    }
  }
}
开发者ID:MorpheusCommunity,项目名称:llvm,代码行数:101,代码来源:FunctionLoweringInfo.cpp


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