[lld] r313731 - Revert rL313697, "Compact EhSectionPiece from 32 bytes to 16 bytes."

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 28 10:18:11 PDT 2017


Test finally added in r314433.

Cheers,
Rafael

Rafael Avila de Espindola <rafael.espindola at gmail.com> writes:

> I was able to reproduce the issues with an ubuntu 14.04 chroot. I will
> reduce it and check in a test case.
>
> Cheers,
> Rafael
>
> NAKAMURA Takumi via llvm-commits <llvm-commits at lists.llvm.org> writes:
>
>> Author: chapuni
>> Date: Wed Sep 20 01:03:18 2017
>> New Revision: 313731
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=313731&view=rev
>> Log:
>> Revert rL313697, "Compact EhSectionPiece from 32 bytes to 16 bytes."
>>
>> It broke selfhosting.
>> http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/4896
>>
>> Modified:
>>     lld/trunk/ELF/EhFrame.cpp
>>     lld/trunk/ELF/EhFrame.h
>>     lld/trunk/ELF/InputSection.cpp
>>     lld/trunk/ELF/InputSection.h
>>     lld/trunk/ELF/MarkLive.cpp
>>     lld/trunk/ELF/SyntheticSections.cpp
>>     lld/trunk/ELF/SyntheticSections.h
>>
>> Modified: lld/trunk/ELF/EhFrame.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/EhFrame.cpp?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/EhFrame.cpp (original)
>> +++ lld/trunk/ELF/EhFrame.cpp Wed Sep 20 01:03:18 2017
>> @@ -153,9 +153,8 @@ template <class ELFT> void EhReader<ELFT
>>    D = D.slice(Size);
>>  }
>>  
>> -template <class ELFT>
>> -uint8_t elf::getFdeEncoding(EhInputSection *Sec, EhSectionPiece *Piece) {
>> -  return EhReader<ELFT>(Sec, Piece->data(Sec)).getFdeEncoding();
>> +template <class ELFT> uint8_t elf::getFdeEncoding(EhSectionPiece *P) {
>> +  return EhReader<ELFT>(P->Sec, P->data()).getFdeEncoding();
>>  }
>>  
>>  template <class ELFT> uint8_t EhReader<ELFT>::getFdeEncoding() {
>> @@ -206,11 +205,7 @@ template size_t elf::readEhRecordSize<EL
>>  template size_t elf::readEhRecordSize<ELF64LE>(InputSectionBase *S, size_t Off);
>>  template size_t elf::readEhRecordSize<ELF64BE>(InputSectionBase *S, size_t Off);
>>  
>> -template uint8_t elf::getFdeEncoding<ELF32LE>(EhInputSection *,
>> -                                              EhSectionPiece *);
>> -template uint8_t elf::getFdeEncoding<ELF32BE>(EhInputSection *,
>> -                                              EhSectionPiece *);
>> -template uint8_t elf::getFdeEncoding<ELF64LE>(EhInputSection *,
>> -                                              EhSectionPiece *);
>> -template uint8_t elf::getFdeEncoding<ELF64BE>(EhInputSection *,
>> -                                              EhSectionPiece *);
>> +template uint8_t elf::getFdeEncoding<ELF32LE>(EhSectionPiece *P);
>> +template uint8_t elf::getFdeEncoding<ELF32BE>(EhSectionPiece *P);
>> +template uint8_t elf::getFdeEncoding<ELF64LE>(EhSectionPiece *P);
>> +template uint8_t elf::getFdeEncoding<ELF64BE>(EhSectionPiece *P);
>>
>> Modified: lld/trunk/ELF/EhFrame.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/EhFrame.h?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/EhFrame.h (original)
>> +++ lld/trunk/ELF/EhFrame.h Wed Sep 20 01:03:18 2017
>> @@ -14,13 +14,11 @@
>>  
>>  namespace lld {
>>  namespace elf {
>> -class EhInputSection;
>>  class InputSectionBase;
>>  struct EhSectionPiece;
>>  
>>  template <class ELFT> size_t readEhRecordSize(InputSectionBase *S, size_t Off);
>> -template <class ELFT>
>> -uint8_t getFdeEncoding(EhInputSection *, EhSectionPiece *);
>> +template <class ELFT> uint8_t getFdeEncoding(EhSectionPiece *P);
>>  } // namespace elf
>>  } // namespace lld
>>  
>>
>> Modified: lld/trunk/ELF/InputSection.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.cpp?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/InputSection.cpp (original)
>> +++ lld/trunk/ELF/InputSection.cpp Wed Sep 20 01:03:18 2017
>> @@ -870,7 +870,7 @@ void EhInputSection::split(ArrayRef<RelT
>>    unsigned RelI = 0;
>>    for (size_t Off = 0, End = Data.size(); Off != End;) {
>>      size_t Size = readEhRecordSize<ELFT>(this, Off);
>> -    this->Pieces.emplace_back(Off, Size, getReloc(Off, Size, Rels, RelI));
>> +    this->Pieces.emplace_back(Off, this, Size, getReloc(Off, Size, Rels, RelI));
>>      // The empty record is the end marker.
>>      if (Size == 4)
>>        break;
>>
>> Modified: lld/trunk/ELF/InputSection.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/InputSection.h (original)
>> +++ lld/trunk/ELF/InputSection.h Wed Sep 20 01:03:18 2017
>> @@ -25,7 +25,6 @@ namespace lld {
>>  namespace elf {
>>  
>>  class DefinedCommon;
>> -class EhInputSection;
>>  class SymbolBody;
>>  struct SectionPiece;
>>  
>> @@ -263,16 +262,17 @@ private:
>>  };
>>  
>>  struct EhSectionPiece {
>> -  EhSectionPiece(size_t Off, uint32_t Size, unsigned FirstRelocation)
>> -      : InputOff(Off), Size(Size), FirstRelocation(FirstRelocation) {
>> -    assert(Off < UINT32_MAX && Size < UINT32_MAX);
>> -  }
>> +  EhSectionPiece(size_t Off, InputSectionBase *Sec, uint32_t Size,
>> +                 unsigned FirstRelocation)
>> +      : InputOff(Off), Sec(Sec), Size(Size), FirstRelocation(FirstRelocation) {}
>> +
>> +  ArrayRef<uint8_t> data() { return {Sec->Data.data() + this->InputOff, Size}; }
>>  
>> -  ArrayRef<uint8_t> data(EhInputSection *Sec);
>> -  uint32_t InputOff;
>> -  int32_t OutputOff = -1;
>> +  size_t InputOff;
>> +  ssize_t OutputOff = -1;
>> +  InputSectionBase *Sec;
>>    uint32_t Size;
>> -  uint32_t FirstRelocation;
>> +  unsigned FirstRelocation;
>>  };
>>  
>>  // This corresponds to a .eh_frame section of an input file.
>> @@ -292,10 +292,6 @@ public:
>>    SyntheticSection *getParent() const;
>>  };
>>  
>> -inline ArrayRef<uint8_t> EhSectionPiece::data(EhInputSection *Sec) {
>> -  return {Sec->Data.data() + InputOff, Size};
>> -}
>> -
>>  // This is a section that is added directly to an output section
>>  // instead of needing special combination via a synthetic section. This
>>  // includes all input sections with the exceptions of SHF_MERGE and
>>
>> Modified: lld/trunk/ELF/MarkLive.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/MarkLive.cpp?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/MarkLive.cpp (original)
>> +++ lld/trunk/ELF/MarkLive.cpp Wed Sep 20 01:03:18 2017
>> @@ -126,7 +126,7 @@ scanEhFrameSection(EhInputSection &EH, A
>>      unsigned FirstRelI = Piece.FirstRelocation;
>>      if (FirstRelI == (unsigned)-1)
>>        continue;
>> -    if (read32<E>(Piece.data(&EH).data() + 4) == 0) {
>> +    if (read32<E>(Piece.data().data() + 4) == 0) {
>>        // This is a CIE, we only need to worry about the first relocation. It is
>>        // known to point to the personality function.
>>        resolveReloc<ELFT>(EH, Rels[FirstRelI], Fn);
>>
>> Modified: lld/trunk/ELF/SyntheticSections.cpp
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/SyntheticSections.cpp (original)
>> +++ lld/trunk/ELF/SyntheticSections.cpp Wed Sep 20 01:03:18 2017
>> @@ -403,11 +403,11 @@ EhFrameSection<ELFT>::EhFrameSection()
>>  // and where their relocations point to.
>>  template <class ELFT>
>>  template <class RelTy>
>> -CieRecord *EhFrameSection<ELFT>::addCie(EhInputSection *Sec,
>> -                                        EhSectionPiece &Cie,
>> +CieRecord *EhFrameSection<ELFT>::addCie(EhSectionPiece &Cie,
>>                                          ArrayRef<RelTy> Rels) {
>> +  auto *Sec = cast<EhInputSection>(Cie.Sec);
>>    const endianness E = ELFT::TargetEndianness;
>> -  if (read32<E>(Cie.data(Sec).data() + 4) != 0)
>> +  if (read32<E>(Cie.data().data() + 4) != 0)
>>      fatal(toString(Sec) + ": CIE expected at beginning of .eh_frame");
>>  
>>    SymbolBody *Personality = nullptr;
>> @@ -417,11 +417,10 @@ CieRecord *EhFrameSection<ELFT>::addCie(
>>          &Sec->template getFile<ELFT>()->getRelocTargetSym(Rels[FirstRelI]);
>>  
>>    // Search for an existing CIE by CIE contents/relocation target pair.
>> -  CieRecord *Rec = &CieMap[{Cie.data(Sec), Personality}];
>> +  CieRecord *Rec = &CieMap[{Cie.data(), Personality}];
>>  
>>    // If not found, create a new one.
>> -  if (Rec->Sec == nullptr) {
>> -    Rec->Sec = Sec;
>> +  if (Rec->Cie == nullptr) {
>>      Rec->Cie = &Cie;
>>      CieRecords.push_back(Rec);
>>    }
>> @@ -432,8 +431,9 @@ CieRecord *EhFrameSection<ELFT>::addCie(
>>  // points to a live function.
>>  template <class ELFT>
>>  template <class RelTy>
>> -bool EhFrameSection<ELFT>::isFdeLive(EhInputSection *Sec, EhSectionPiece &Fde,
>> +bool EhFrameSection<ELFT>::isFdeLive(EhSectionPiece &Fde,
>>                                       ArrayRef<RelTy> Rels) {
>> +  auto *Sec = cast<EhInputSection>(Fde.Sec);
>>    unsigned FirstRelI = Fde.FirstRelocation;
>>  
>>    // An FDE should point to some function because FDEs are to describe
>> @@ -469,9 +469,9 @@ void EhFrameSection<ELFT>::addSectionAux
>>        return;
>>  
>>      size_t Offset = Piece.InputOff;
>> -    uint32_t ID = read32<E>(Piece.data(Sec).data() + 4);
>> +    uint32_t ID = read32<E>(Piece.data().data() + 4);
>>      if (ID == 0) {
>> -      OffsetToCie[Offset] = addCie(Sec, Piece, Rels);
>> +      OffsetToCie[Offset] = addCie(Piece, Rels);
>>        continue;
>>      }
>>  
>> @@ -480,7 +480,7 @@ void EhFrameSection<ELFT>::addSectionAux
>>      if (!Rec)
>>        fatal(toString(Sec) + ": invalid CIE reference");
>>  
>> -    if (!isFdeLive(Sec, Piece, Rels))
>> +    if (!isFdeLive(Piece, Rels))
>>        continue;
>>      Rec->Fdes.push_back(&Piece);
>>      NumFdes++;
>> @@ -586,11 +586,11 @@ template <class ELFT> void EhFrameSectio
>>    const endianness E = ELFT::TargetEndianness;
>>    for (CieRecord *Rec : CieRecords) {
>>      size_t CieOffset = Rec->Cie->OutputOff;
>> -    writeCieFde<ELFT>(Buf + CieOffset, Rec->Cie->data(Rec->Sec));
>> +    writeCieFde<ELFT>(Buf + CieOffset, Rec->Cie->data());
>>  
>>      for (EhSectionPiece *Fde : Rec->Fdes) {
>>        size_t Off = Fde->OutputOff;
>> -      writeCieFde<ELFT>(Buf + Off, Fde->data(Rec->Sec));
>> +      writeCieFde<ELFT>(Buf + Off, Fde->data());
>>  
>>        // FDE's second word should have the offset to an associated CIE.
>>        // Write it.
>> @@ -606,7 +606,7 @@ template <class ELFT> void EhFrameSectio
>>    // we obtain two addresses and pass them to EhFrameHdr object.
>>    if (In<ELFT>::EhFrameHdr) {
>>      for (CieRecord *Rec : CieRecords) {
>> -      uint8_t Enc = getFdeEncoding<ELFT>(Rec->Sec, Rec->Cie);
>> +      uint8_t Enc = getFdeEncoding<ELFT>(Rec->Cie);
>>        for (EhSectionPiece *Fde : Rec->Fdes) {
>>          uint64_t Pc = getFdePc(Buf, Fde->OutputOff, Enc);
>>          uint64_t FdeVA = getParent()->Addr + Fde->OutputOff;
>>
>> Modified: lld/trunk/ELF/SyntheticSections.h
>> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=313731&r1=313730&r2=313731&view=diff
>> ==============================================================================
>> --- lld/trunk/ELF/SyntheticSections.h (original)
>> +++ lld/trunk/ELF/SyntheticSections.h Wed Sep 20 01:03:18 2017
>> @@ -59,7 +59,6 @@ public:
>>  };
>>  
>>  struct CieRecord {
>> -  EhInputSection *Sec = nullptr;
>>    EhSectionPiece *Cie = nullptr;
>>    std::vector<EhSectionPiece *> Fdes;
>>  };
>> @@ -94,12 +93,10 @@ private:
>>    void addSectionAux(EhInputSection *S, llvm::ArrayRef<RelTy> Rels);
>>  
>>    template <class RelTy>
>> -  CieRecord *addCie(EhInputSection *Sec, EhSectionPiece &Piece,
>> -                    ArrayRef<RelTy> Rels);
>> +  CieRecord *addCie(EhSectionPiece &Piece, ArrayRef<RelTy> Rels);
>>  
>>    template <class RelTy>
>> -  bool isFdeLive(EhInputSection *Sec, EhSectionPiece &Piece,
>> -                 ArrayRef<RelTy> Rels);
>> +  bool isFdeLive(EhSectionPiece &Piece, ArrayRef<RelTy> Rels);
>>  
>>    uint64_t getFdePc(uint8_t *Buf, size_t Off, uint8_t Enc);
>>  
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list