Skip to content
AsmPrinter.cpp 74.3 KiB
Newer Older
/// exactly one predecessor and the control transfer mechanism between
/// the predecessor and this block is a fall-through.
bool AsmPrinter::
isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
  // If this is a landing pad, it isn't a fall through.  If it has no preds,
  // then nothing falls through to it.
  if (MBB->isLandingPad() || MBB->pred_empty())
    return false;
  // If there isn't exactly one predecessor, it can't be a fall through.
  MachineBasicBlock::const_pred_iterator PI = MBB->pred_begin(), PI2 = PI;
  ++PI2;
  if (PI2 != MBB->pred_end())
    return false;
  // The predecessor has to be immediately before this block.
  MachineBasicBlock *Pred = *PI;
  if (!Pred->isLayoutSuccessor(MBB))
    return false;
  // If the block is completely empty, then it definitely does fall through.
  if (Pred->empty())
    return true;
  // Check the terminators in the previous blocks
  for (MachineBasicBlock::iterator II = Pred->getFirstTerminator(),
         IE = Pred->end(); II != IE; ++II) {
    MachineInstr &MI = *II;

    // If it is not a simple branch, we are in a table somewhere.
    if (!MI.getDesc().isBranch() || MI.getDesc().isIndirectBranch())
      return false;

    // If we are the operands of one of the branches, this is not
    // a fall through.
    for (MachineInstr::mop_iterator OI = MI.operands_begin(),
           OE = MI.operands_end(); OI != OE; ++OI) {
      const MachineOperand& OP = *OI;
      if (OP.isJTI())
        return false;
      if (OP.isMBB() && OP.getMBB() == MBB)
        return false;
    }
  }

  return true;
GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy *S) {
  if (!S->usesMetadata())

  gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
  gcp_map_type::iterator GCPI = GCMap.find(S);
  if (GCPI != GCMap.end())
  const char *Name = S->getName().c_str();
  for (GCMetadataPrinterRegistry::iterator
         I = GCMetadataPrinterRegistry::begin(),
         E = GCMetadataPrinterRegistry::end(); I != E; ++I)
    if (strcmp(Name, I->getName()) == 0) {
      GCMetadataPrinter *GMP = I->instantiate();
      GMP->S = S;
      GCMap.insert(std::make_pair(S, GMP));
  report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
David Greene's avatar
 
David Greene committed