diff options
Diffstat (limited to 'lib/MC')
| -rw-r--r-- | lib/MC/MCAsmStreamer.cpp | 4 | ||||
| -rw-r--r-- | lib/MC/MCAssembler.cpp | 44 | ||||
| -rw-r--r-- | lib/MC/MCDisassembler/Disassembler.cpp | 2 | ||||
| -rw-r--r-- | lib/MC/MCDisassembler/Disassembler.h | 4 | ||||
| -rw-r--r-- | lib/MC/MCDwarf.cpp | 53 | ||||
| -rw-r--r-- | lib/MC/MCInstrAnalysis.cpp | 5 | ||||
| -rw-r--r-- | lib/MC/MCObjectFileInfo.cpp | 15 | ||||
| -rw-r--r-- | lib/MC/MCParser/ELFAsmParser.cpp | 2 | ||||
| -rw-r--r-- | lib/MC/MCStreamer.cpp | 2 | ||||
| -rw-r--r-- | lib/MC/MachObjectWriter.cpp | 2 | 
10 files changed, 115 insertions, 18 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 92f615180561..ae02f50bf8bd 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -337,7 +337,7 @@ void MCAsmStreamer::AddComment(const Twine &T, bool EOL) {    if (!IsVerboseAsm) return;    T.toVector(CommentToEmit); -  +    if (EOL)      CommentToEmit.push_back('\n'); // Place comment in a new line.  } @@ -655,7 +655,7 @@ void MCAsmStreamer::EmitSyntaxDirective() {      EmitEOL();    }    // FIXME: Currently emit unprefix'ed registers. -  // The intel_syntax directive has one optional argument  +  // The intel_syntax directive has one optional argument    // with may have a value of prefix or noprefix.  } diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 1470e026d985..1e23b6d816e8 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -550,7 +550,7 @@ static void writeFragment(raw_ostream &OS, const MCAssembler &Asm,      break;    } -  case MCFragment::FT_Data:  +  case MCFragment::FT_Data:      ++stats::EmittedDataFragments;      OS << cast<MCDataFragment>(F).getContents();      break; @@ -822,6 +822,9 @@ void MCAssembler::layout(MCAsmLayout &Layout) {        } else if (auto *FragWithFixups = dyn_cast<MCCVDefRangeFragment>(&Frag)) {          Fixups = FragWithFixups->getFixups();          Contents = FragWithFixups->getContents(); +      } else if (auto *FragWithFixups = dyn_cast<MCDwarfLineAddrFragment>(&Frag)) { +        Fixups = FragWithFixups->getFixups(); +        Contents = FragWithFixups->getContents();        } else          llvm_unreachable("Unknown fragment with fixups!");        for (const MCFixup &Fixup : Fixups) { @@ -951,16 +954,43 @@ bool MCAssembler::relaxDwarfLineAddr(MCAsmLayout &Layout,    MCContext &Context = Layout.getAssembler().getContext();    uint64_t OldSize = DF.getContents().size();    int64_t AddrDelta; -  bool Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout); -  assert(Abs && "We created a line delta with an invalid expression"); -  (void) Abs; +  bool Abs; +  if (getBackend().requiresDiffExpressionRelocations()) +    Abs = DF.getAddrDelta().evaluateAsAbsolute(AddrDelta, Layout); +  else { +    Abs = DF.getAddrDelta().evaluateKnownAbsolute(AddrDelta, Layout); +    assert(Abs && "We created a line delta with an invalid expression"); +  }    int64_t LineDelta;    LineDelta = DF.getLineDelta(); -  SmallString<8> &Data = DF.getContents(); +  SmallVectorImpl<char> &Data = DF.getContents();    Data.clear();    raw_svector_ostream OSE(Data); -  MCDwarfLineAddr::Encode(Context, getDWARFLinetableParams(), LineDelta, -                          AddrDelta, OSE); +  DF.getFixups().clear(); + +  if (Abs) { +    MCDwarfLineAddr::Encode(Context, getDWARFLinetableParams(), LineDelta, +                            AddrDelta, OSE); +  } else { +    uint32_t Offset; +    uint32_t Size; +    bool SetDelta = MCDwarfLineAddr::FixedEncode(Context, +                                                 getDWARFLinetableParams(), +                                                 LineDelta, AddrDelta, +                                                 OSE, &Offset, &Size); +    // Add Fixups for address delta or new address. +    const MCExpr *FixupExpr; +    if (SetDelta) { +      FixupExpr = &DF.getAddrDelta(); +    } else { +      const MCBinaryExpr *ABE = cast<MCBinaryExpr>(&DF.getAddrDelta()); +      FixupExpr = ABE->getLHS(); +    } +    DF.getFixups().push_back( +        MCFixup::create(Offset, FixupExpr, +                        MCFixup::getKindForSize(Size, false /*isPCRel*/))); +  } +    return OldSize != Data.size();  } diff --git a/lib/MC/MCDisassembler/Disassembler.cpp b/lib/MC/MCDisassembler/Disassembler.cpp index 30e0bb562644..ad0a39991c53 100644 --- a/lib/MC/MCDisassembler/Disassembler.cpp +++ b/lib/MC/MCDisassembler/Disassembler.cpp @@ -38,7 +38,7 @@ using namespace llvm;  // LLVMCreateDisasm() creates a disassembler for the TripleName.  Symbolic  // disassembly is supported by passing a block of information in the DisInfo  // parameter and specifying the TagType and callback functions as described in -// the header llvm-c/Disassembler.h .  The pointer to the block and the  +// the header llvm-c/Disassembler.h .  The pointer to the block and the  // functions can all be passed as NULL.  If successful, this returns a  // disassembler context.  If not, it returns NULL.  // diff --git a/lib/MC/MCDisassembler/Disassembler.h b/lib/MC/MCDisassembler/Disassembler.h index 25d17dafb576..f638fdc781d7 100644 --- a/lib/MC/MCDisassembler/Disassembler.h +++ b/lib/MC/MCDisassembler/Disassembler.h @@ -4,10 +4,10 @@  //  // This file is distributed under the University of Illinois Open Source  // License. See LICENSE.TXT for details. -//  +//  //===----------------------------------------------------------------------===//  // -// This file defines the interface for the Disassembly library's disassembler  +// This file defines the interface for the Disassembly library's disassembler  // context.  The disassembler is responsible for producing strings for  // individual instructions according to a given architecture and disassembly  // syntax. diff --git a/lib/MC/MCDwarf.cpp b/lib/MC/MCDwarf.cpp index 6131fcd658b2..0461c2564ccf 100644 --- a/lib/MC/MCDwarf.cpp +++ b/lib/MC/MCDwarf.cpp @@ -492,7 +492,7 @@ MCDwarfLineTableHeader::Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params,    // Parameters of the state machine, are next.    MCOS->EmitIntValue(context.getAsmInfo()->getMinInstAlignment(), 1); -  // maximum_operations_per_instruction  +  // maximum_operations_per_instruction    // For non-VLIW architectures this field is always 1.    // FIXME: VLIW architectures need to update this field accordingly.    if (LineTableVersion >= 4) @@ -731,6 +731,57 @@ void MCDwarfLineAddr::Encode(MCContext &Context, MCDwarfLineTableParams Params,    }  } +bool MCDwarfLineAddr::FixedEncode(MCContext &Context, +                                  MCDwarfLineTableParams Params, +                                  int64_t LineDelta, uint64_t AddrDelta, +                                  raw_ostream &OS, +                                  uint32_t *Offset, uint32_t *Size) { +  if (LineDelta != INT64_MAX) { +    OS << char(dwarf::DW_LNS_advance_line); +    encodeSLEB128(LineDelta, OS); +  } + +  // Use address delta to adjust address or use absolute address to adjust +  // address. +  bool SetDelta; +  // According to DWARF spec., the DW_LNS_fixed_advance_pc opcode takes a +  // single uhalf (unencoded) operand. So, the maximum value of AddrDelta +  // is 65535. We set a conservative upper bound for it for relaxation. +  if (AddrDelta > 60000) { +    const MCAsmInfo *asmInfo = Context.getAsmInfo(); +    unsigned AddrSize = asmInfo->getCodePointerSize(); + +    OS << char(dwarf::DW_LNS_extended_op); +    encodeULEB128(1 + AddrSize, OS); +    OS << char(dwarf::DW_LNE_set_address); +    // Generate fixup for the address. +    *Offset = OS.tell(); +    *Size = AddrSize; +    SetDelta = false; +    std::vector<uint8_t> FillData; +    FillData.insert(FillData.begin(), AddrSize, 0); +    OS.write(reinterpret_cast<char *>(FillData.data()), AddrSize); +  } else { +    OS << char(dwarf::DW_LNS_fixed_advance_pc); +    // Generate fixup for 2-bytes address delta. +    *Offset = OS.tell(); +    *Size = 2; +    SetDelta = true; +    OS << char(0); +    OS << char(0); +  } + +  if (LineDelta == INT64_MAX) { +    OS << char(dwarf::DW_LNS_extended_op); +    OS << char(1); +    OS << char(dwarf::DW_LNE_end_sequence); +  } else { +    OS << char(dwarf::DW_LNS_copy); +  } + +  return SetDelta; +} +  // Utility function to write a tuple for .debug_abbrev.  static void EmitAbbrev(MCStreamer *MCOS, uint64_t Name, uint64_t Form) {    MCOS->EmitULEB128IntValue(Name); diff --git a/lib/MC/MCInstrAnalysis.cpp b/lib/MC/MCInstrAnalysis.cpp index 8223f3a5c66f..4d7c89116893 100644 --- a/lib/MC/MCInstrAnalysis.cpp +++ b/lib/MC/MCInstrAnalysis.cpp @@ -24,6 +24,11 @@ bool MCInstrAnalysis::clearsSuperRegisters(const MCRegisterInfo &MRI,    return false;  } +bool MCInstrAnalysis::isDependencyBreaking(const MCSubtargetInfo &STI, +                                           const MCInst &Inst) const { +  return false; +} +  bool MCInstrAnalysis::evaluateBranch(const MCInst &Inst, uint64_t Addr,                                       uint64_t Size, uint64_t &Target) const {    if (Inst.getNumOperands() == 0 || diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 29d34a8c1e3e..b88d2d801822 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -950,8 +950,19 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,  }  MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { -  return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, -                            0, utostr(Hash)); +  switch (TT.getObjectFormat()) { +  case Triple::ELF: +    return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, +                              0, utostr(Hash)); +  case Triple::MachO: +  case Triple::COFF: +  case Triple::Wasm: +  case Triple::UnknownObjectFormat: +    report_fatal_error("Cannot get DWARF types section for this object file " +                       "format: not implemented."); +    break; +  } +  llvm_unreachable("Unknown ObjectFormatType");  }  MCSection * diff --git a/lib/MC/MCParser/ELFAsmParser.cpp b/lib/MC/MCParser/ELFAsmParser.cpp index 67e3512cc5bd..7bf14968c973 100644 --- a/lib/MC/MCParser/ELFAsmParser.cpp +++ b/lib/MC/MCParser/ELFAsmParser.cpp @@ -254,7 +254,7 @@ bool ELFAsmParser::ParseSectionName(StringRef &SectionName) {      if (getLexer().is(AsmToken::Comma) ||        getLexer().is(AsmToken::EndOfStatement))        break; -     +      unsigned CurSize;      if (getLexer().is(AsmToken::String)) {        CurSize = getTok().getIdentifier().size() + 2; diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 8dd4b61be68f..21a9c3604cfc 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -514,7 +514,7 @@ void MCStreamer::EmitCFIEscape(StringRef Values) {  void MCStreamer::EmitCFIGnuArgsSize(int64_t Size) {    MCSymbol *Label = EmitCFILabel(); -  MCCFIInstruction Instruction =  +  MCCFIInstruction Instruction =      MCCFIInstruction::createGnuArgsSize(Label, Size);    MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();    if (!CurFrame) diff --git a/lib/MC/MachObjectWriter.cpp b/lib/MC/MachObjectWriter.cpp index a464af1d42a7..2664528909af 100644 --- a/lib/MC/MachObjectWriter.cpp +++ b/lib/MC/MachObjectWriter.cpp @@ -952,7 +952,7 @@ uint64_t MachObjectWriter::writeObject(MCAssembler &Asm,      const DataRegionData *Data = &(*it);      uint64_t Start = getSymbolAddress(*Data->Start, Layout);      uint64_t End; -    if (Data->End)  +    if (Data->End)        End = getSymbolAddress(*Data->End, Layout);      else        report_fatal_error("Data region not terminated");  | 
