diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:32:43 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:32:43 +0000 | 
| commit | b7eb8e35e481a74962664b63dfb09483b200209a (patch) | |
| tree | 1937fb4a348458ce2d02ade03ac3bb0aa18d2fcd /lib/MC/MCAssembler.cpp | |
| parent | eb11fae6d08f479c0799db45860a98af528fa6e7 (diff) | |
Notes
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
| -rw-r--r-- | lib/MC/MCAssembler.cpp | 44 | 
1 files changed, 37 insertions, 7 deletions
| 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();  } | 
