diff options
Diffstat (limited to 'contrib/llvm/lib/MC/MCAssembler.cpp')
| -rw-r--r-- | contrib/llvm/lib/MC/MCAssembler.cpp | 110 | 
1 files changed, 57 insertions, 53 deletions
diff --git a/contrib/llvm/lib/MC/MCAssembler.cpp b/contrib/llvm/lib/MC/MCAssembler.cpp index 868b0f1228af..55f50097744d 100644 --- a/contrib/llvm/lib/MC/MCAssembler.cpp +++ b/contrib/llvm/lib/MC/MCAssembler.cpp @@ -120,14 +120,13 @@ uint64_t MCAsmLayout::getFragmentOffset(const MCFragment *F) const {  // Simple getSymbolOffset helper for the non-varibale case.  static bool getLabelOffset(const MCAsmLayout &Layout, const MCSymbol &S,                             bool ReportError, uint64_t &Val) { -  const MCSymbolData &SD = S.getData(); -  if (!SD.getFragment()) { +  if (!S.getFragment()) {      if (ReportError)        report_fatal_error("unable to evaluate offset to undefined symbol '" +                           S.getName() + "'");      return false;    } -  Val = Layout.getFragmentOffset(SD.getFragment()) + SD.getOffset(); +  Val = Layout.getFragmentOffset(S.getFragment()) + S.getOffset();    return true;  } @@ -138,7 +137,7 @@ static bool getSymbolOffsetImpl(const MCAsmLayout &Layout, const MCSymbol &S,    // If SD is a variable, evaluate it.    MCValue Target; -  if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout, nullptr)) +  if (!S.getVariableValue()->evaluateAsRelocatable(Target, &Layout, nullptr))      report_fatal_error("unable to evaluate offset for variable '" +                         S.getName() + "'"); @@ -195,8 +194,7 @@ const MCSymbol *MCAsmLayout::getBaseSymbol(const MCSymbol &Symbol) const {    const MCSymbol &ASym = A->getSymbol();    const MCAssembler &Asm = getAssembler(); -  const MCSymbolData &ASD = Asm.getSymbolData(ASym); -  if (ASD.isCommon()) { +  if (ASym.isCommon()) {      // FIXME: we should probably add a SMLoc to MCExpr.      Asm.getContext().reportFatalError(SMLoc(),                                  "Common symbol " + ASym.getName() + @@ -378,17 +376,17 @@ const MCSymbol *MCAssembler::getAtom(const MCSymbol &S) const {      return &S;    // Absolute and undefined symbols have no defining atom. -  if (!S.getData().getFragment()) +  if (!S.getFragment())      return nullptr;    // Non-linker visible symbols in sections which can't be atomized have no    // defining atom.    if (!getContext().getAsmInfo()->isSectionAtomizableBySymbols( -          *S.getData().getFragment()->getParent())) +          *S.getFragment()->getParent()))      return nullptr;    // Otherwise, return the atom for the containing fragment. -  return S.getData().getFragment()->getAtom(); +  return S.getFragment()->getAtom();  }  bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout, @@ -396,11 +394,11 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,                                  MCValue &Target, uint64_t &Value) const {    ++stats::evaluateFixup; -  // FIXME: This code has some duplication with RecordRelocation. We should +  // FIXME: This code has some duplication with recordRelocation. We should    // probably merge the two into a single callback that tries to evaluate a    // fixup and records a relocation if one is needed.    const MCExpr *Expr = Fixup.getValue(); -  if (!Expr->EvaluateAsRelocatable(Target, &Layout, &Fixup)) +  if (!Expr->evaluateAsRelocatable(Target, &Layout, &Fixup))      getContext().reportFatalError(Fixup.getLoc(), "expected relocatable expression");    bool IsPCRel = Backend.getFixupKindInfo( @@ -418,7 +416,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout,        if (A->getKind() != MCSymbolRefExpr::VK_None || SA.isUndefined()) {          IsResolved = false;        } else { -        IsResolved = getWriter().IsSymbolRefDifferenceFullyResolvedImpl( +        IsResolved = getWriter().isSymbolRefDifferenceFullyResolvedImpl(              *this, SA, *DF, false, true);        }      } @@ -475,6 +473,9 @@ uint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,    case MCFragment::FT_LEB:      return cast<MCLEBFragment>(F).getContents().size(); +  case MCFragment::FT_SafeSEH: +    return 4; +    case MCFragment::FT_Align: {      const MCAlignFragment &AF = cast<MCAlignFragment>(F);      unsigned Offset = Layout.getFragmentOffset(&AF); @@ -493,7 +494,7 @@ uint64_t MCAssembler::computeFragmentSize(const MCAsmLayout &Layout,    case MCFragment::FT_Org: {      const MCOrgFragment &OF = cast<MCOrgFragment>(F);      int64_t TargetLocation; -    if (!OF.getOffset().EvaluateAsAbsolute(TargetLocation, Layout)) +    if (!OF.getOffset().evaluateAsAbsolute(TargetLocation, Layout))        report_fatal_error("expected assembly-time absolute expression");      // FIXME: We need a way to communicate this error. @@ -575,7 +576,17 @@ void MCAsmLayout::layoutFragment(MCFragment *F) {  ///        a MCEncodedFragment.  static void writeFragmentContents(const MCFragment &F, MCObjectWriter *OW) {    const MCEncodedFragment &EF = cast<MCEncodedFragment>(F); -  OW->WriteBytes(EF.getContents()); +  OW->writeBytes(EF.getContents()); +} + +void MCAssembler::registerSymbol(const MCSymbol &Symbol, bool *Created) { +  bool New = !Symbol.isRegistered(); +  if (Created) +    *Created = New; +  if (New) { +    Symbol.setIsRegistered(true); +    Symbols.push_back(&Symbol); +  }  }  void MCAssembler::writeFragmentPadding(const MCFragment &F, uint64_t FSize, @@ -659,10 +670,10 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,      for (uint64_t i = 0; i != Count; ++i) {        switch (AF.getValueSize()) {        default: llvm_unreachable("Invalid size!"); -      case 1: OW->Write8 (uint8_t (AF.getValue())); break; -      case 2: OW->Write16(uint16_t(AF.getValue())); break; -      case 4: OW->Write32(uint32_t(AF.getValue())); break; -      case 8: OW->Write64(uint64_t(AF.getValue())); break; +      case 1: OW->write8 (uint8_t (AF.getValue())); break; +      case 2: OW->write16(uint16_t(AF.getValue())); break; +      case 4: OW->write32(uint32_t(AF.getValue())); break; +      case 8: OW->write64(uint64_t(AF.getValue())); break;        }      }      break; @@ -692,10 +703,10 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,      for (uint64_t i = 0, e = FF.getSize() / FF.getValueSize(); i != e; ++i) {        switch (FF.getValueSize()) {        default: llvm_unreachable("Invalid size!"); -      case 1: OW->Write8 (uint8_t (FF.getValue())); break; -      case 2: OW->Write16(uint16_t(FF.getValue())); break; -      case 4: OW->Write32(uint32_t(FF.getValue())); break; -      case 8: OW->Write64(uint64_t(FF.getValue())); break; +      case 1: OW->write8 (uint8_t (FF.getValue())); break; +      case 2: OW->write16(uint16_t(FF.getValue())); break; +      case 4: OW->write32(uint32_t(FF.getValue())); break; +      case 8: OW->write64(uint64_t(FF.getValue())); break;        }      }      break; @@ -703,7 +714,13 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,    case MCFragment::FT_LEB: {      const MCLEBFragment &LF = cast<MCLEBFragment>(F); -    OW->WriteBytes(LF.getContents()); +    OW->writeBytes(LF.getContents()); +    break; +  } + +  case MCFragment::FT_SafeSEH: { +    const MCSafeSEHFragment &SF = cast<MCSafeSEHFragment>(F); +    OW->write32(SF.getSymbol()->getIndex());      break;    } @@ -712,19 +729,19 @@ static void writeFragment(const MCAssembler &Asm, const MCAsmLayout &Layout,      const MCOrgFragment &OF = cast<MCOrgFragment>(F);      for (uint64_t i = 0, e = FragmentSize; i != e; ++i) -      OW->Write8(uint8_t(OF.getValue())); +      OW->write8(uint8_t(OF.getValue()));      break;    }    case MCFragment::FT_Dwarf: {      const MCDwarfLineAddrFragment &OF = cast<MCDwarfLineAddrFragment>(F); -    OW->WriteBytes(OF.getContents()); +    OW->writeBytes(OF.getContents());      break;    }    case MCFragment::FT_DwarfFrame: {      const MCDwarfCallFrameFragment &CF = cast<MCDwarfCallFrameFragment>(F); -    OW->WriteBytes(CF.getContents()); +    OW->writeBytes(CF.getContents());      break;    }    } @@ -802,7 +819,7 @@ std::pair<uint64_t, bool> MCAssembler::handleFixup(const MCAsmLayout &Layout,      // The fixup was unresolved, we need a relocation. Inform the object      // writer of the relocation, and give it an opportunity to adjust the      // fixup value if need be. -    getWriter().RecordRelocation(*this, Layout, &F, Fixup, Target, IsPCRel, +    getWriter().recordRelocation(*this, Layout, &F, Fixup, Target, IsPCRel,                                   FixedValue);    }    return std::make_pair(FixedValue, IsPCRel); @@ -857,7 +874,7 @@ void MCAssembler::Finish() {    // Allow the object writer a chance to perform post-layout binding (for    // example, to set the index fields in the symbol data). -  getWriter().ExecutePostLayoutBinding(*this, Layout); +  getWriter().executePostLayoutBinding(*this, Layout);    // Evaluate and apply the fixups, generating relocation entries as necessary.    for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) { @@ -880,7 +897,7 @@ void MCAssembler::Finish() {    }    // Write the object file. -  getWriter().WriteObject(*this, Layout); +  getWriter().writeObject(*this, Layout);    stats::ObjectBytes += OS.tell() - StartOffset;  } @@ -888,13 +905,11 @@ void MCAssembler::Finish() {  bool MCAssembler::fixupNeedsRelaxation(const MCFixup &Fixup,                                         const MCRelaxableFragment *DF,                                         const MCAsmLayout &Layout) const { -  // If we cannot resolve the fixup value, it requires relaxation.    MCValue Target;    uint64_t Value; -  if (!evaluateFixup(Layout, Fixup, DF, Target, Value)) -    return true; - -  return getBackend().fixupNeedsRelaxation(Fixup, Value, DF, Layout); +  bool Resolved = evaluateFixup(Layout, Fixup, DF, Target, Value); +  return getBackend().fixupNeedsRelaxationAdvanced(Fixup, Resolved, Value, DF, +                                                   Layout);  }  bool MCAssembler::fragmentNeedsRelaxation(const MCRelaxableFragment *F, @@ -1088,6 +1103,7 @@ void MCFragment::dump() {    case MCFragment::FT_Dwarf: OS << "MCDwarfFragment"; break;    case MCFragment::FT_DwarfFrame: OS << "MCDwarfCallFrameFragment"; break;    case MCFragment::FT_LEB:   OS << "MCLEBFragment"; break; +  case MCFragment::FT_SafeSEH:    OS << "MCSafeSEHFragment"; break;    }    OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder @@ -1180,25 +1196,13 @@ void MCFragment::dump() {      OS << " Value:" << LF->getValue() << " Signed:" << LF->isSigned();      break;    } +  case MCFragment::FT_SafeSEH: { +    const MCSafeSEHFragment *F = cast<MCSafeSEHFragment>(this); +    OS << "\n       "; +    OS << " Sym:" << F->getSymbol(); +    break; +  }    } -  OS << ">"; -} - -void MCSymbolData::dump() const { -  raw_ostream &OS = llvm::errs(); - -  OS << "<MCSymbolData" -     << " Fragment:" << getFragment(); -  if (!isCommon()) -    OS << " Offset:" << getOffset(); -  OS << " Flags:" << getFlags(); -  if (isCommon()) -    OS << " (common, size:" << getCommonSize() -       << " align: " << getCommonAlignment() << ")"; -  if (isExternal()) -    OS << " (external)"; -  if (isPrivateExtern()) -    OS << " (private extern)";    OS << ">";  } @@ -1219,7 +1223,6 @@ void MCAssembler::dump() {      OS << "(";      it->dump();      OS << ", Index:" << it->getIndex() << ", "; -    it->getData().dump();      OS << ")";    }    OS << "]>\n"; @@ -1236,5 +1239,6 @@ void MCAlignFragment::anchor() { }  void MCFillFragment::anchor() { }  void MCOrgFragment::anchor() { }  void MCLEBFragment::anchor() { } +void MCSafeSEHFragment::anchor() { }  void MCDwarfLineAddrFragment::anchor() { }  void MCDwarfCallFrameFragment::anchor() { }  | 
