[PATCH] D38012: Compact EhSectionPiece from 32 bytes to 16 bytes.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 19 16:32:48 PDT 2017


LGTM

Rui Ueyama via Phabricator <reviews at reviews.llvm.org> writes:

> ruiu updated this revision to Diff 115906.
> ruiu added a comment.
>
> - Do not rename varaibles in this patch
> - Rebase
>
>
> https://reviews.llvm.org/D38012
>
> Files:
>   lld/ELF/EhFrame.cpp
>   lld/ELF/EhFrame.h
>   lld/ELF/InputSection.cpp
>   lld/ELF/InputSection.h
>   lld/ELF/MarkLive.cpp
>   lld/ELF/SyntheticSections.cpp
>   lld/ELF/SyntheticSections.h
>
> Index: lld/ELF/SyntheticSections.h
> ===================================================================
> --- lld/ELF/SyntheticSections.h
> +++ lld/ELF/SyntheticSections.h
> @@ -59,6 +59,7 @@
>  };
>  
>  struct CieRecord {
> +  EhInputSection *Sec = nullptr;
>    EhSectionPiece *Cie = nullptr;
>    std::vector<EhSectionPiece *> Fdes;
>  };
> @@ -93,10 +94,12 @@
>    void addSectionAux(EhInputSection *S, llvm::ArrayRef<RelTy> Rels);
>  
>    template <class RelTy>
> -  CieRecord *addCie(EhSectionPiece &Piece, ArrayRef<RelTy> Rels);
> +  CieRecord *addCie(EhInputSection *Sec, EhSectionPiece &Piece,
> +                    ArrayRef<RelTy> Rels);
>  
>    template <class RelTy>
> -  bool isFdeLive(EhSectionPiece &Piece, ArrayRef<RelTy> Rels);
> +  bool isFdeLive(EhInputSection *Sec, EhSectionPiece &Piece,
> +                 ArrayRef<RelTy> Rels);
>  
>    uint64_t getFdePc(uint8_t *Buf, size_t Off, uint8_t Enc);
>  
> Index: lld/ELF/SyntheticSections.cpp
> ===================================================================
> --- lld/ELF/SyntheticSections.cpp
> +++ lld/ELF/SyntheticSections.cpp
> @@ -403,11 +403,11 @@
>  // and where their relocations point to.
>  template <class ELFT>
>  template <class RelTy>
> -CieRecord *EhFrameSection<ELFT>::addCie(EhSectionPiece &Cie,
> +CieRecord *EhFrameSection<ELFT>::addCie(EhInputSection *Sec,
> +                                        EhSectionPiece &Cie,
>                                          ArrayRef<RelTy> Rels) {
> -  auto *Sec = cast<EhInputSection>(Cie.Sec);
>    const endianness E = ELFT::TargetEndianness;
> -  if (read32<E>(Cie.data().data() + 4) != 0)
> +  if (read32<E>(Cie.data(Sec).data() + 4) != 0)
>      fatal(toString(Sec) + ": CIE expected at beginning of .eh_frame");
>  
>    SymbolBody *Personality = nullptr;
> @@ -417,10 +417,11 @@
>          &Sec->template getFile<ELFT>()->getRelocTargetSym(Rels[FirstRelI]);
>  
>    // Search for an existing CIE by CIE contents/relocation target pair.
> -  CieRecord *Rec = &CieMap[{Cie.data(), Personality}];
> +  CieRecord *Rec = &CieMap[{Cie.data(Sec), Personality}];
>  
>    // If not found, create a new one.
> -  if (Rec->Cie == nullptr) {
> +  if (Rec->Sec == nullptr) {
> +    Rec->Sec = Sec;
>      Rec->Cie = &Cie;
>      CieRecords.push_back(Rec);
>    }
> @@ -431,9 +432,8 @@
>  // points to a live function.
>  template <class ELFT>
>  template <class RelTy>
> -bool EhFrameSection<ELFT>::isFdeLive(EhSectionPiece &Fde,
> +bool EhFrameSection<ELFT>::isFdeLive(EhInputSection *Sec, 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,18 +469,18 @@
>        return;
>  
>      size_t Offset = Piece.InputOff;
> -    uint32_t ID = read32<E>(Piece.data().data() + 4);
> +    uint32_t ID = read32<E>(Piece.data(Sec).data() + 4);
>      if (ID == 0) {
> -      OffsetToCie[Offset] = addCie(Piece, Rels);
> +      OffsetToCie[Offset] = addCie(Sec, Piece, Rels);
>        continue;
>      }
>  
>      uint32_t CieOffset = Offset + 4 - ID;
>      CieRecord *Rec = OffsetToCie[CieOffset];
>      if (!Rec)
>        fatal(toString(Sec) + ": invalid CIE reference");
>  
> -    if (!isFdeLive(Piece, Rels))
> +    if (!isFdeLive(Sec, Piece, Rels))
>        continue;
>      Rec->Fdes.push_back(&Piece);
>      NumFdes++;
> @@ -586,11 +586,11 @@
>    const endianness E = ELFT::TargetEndianness;
>    for (CieRecord *Rec : CieRecords) {
>      size_t CieOffset = Rec->Cie->OutputOff;
> -    writeCieFde<ELFT>(Buf + CieOffset, Rec->Cie->data());
> +    writeCieFde<ELFT>(Buf + CieOffset, Rec->Cie->data(Rec->Sec));
>  
>      for (EhSectionPiece *Fde : Rec->Fdes) {
>        size_t Off = Fde->OutputOff;
> -      writeCieFde<ELFT>(Buf + Off, Fde->data());
> +      writeCieFde<ELFT>(Buf + Off, Fde->data(Rec->Sec));
>  
>        // FDE's second word should have the offset to an associated CIE.
>        // Write it.
> @@ -606,7 +606,7 @@
>    // we obtain two addresses and pass them to EhFrameHdr object.
>    if (In<ELFT>::EhFrameHdr) {
>      for (CieRecord *Rec : CieRecords) {
> -      uint8_t Enc = getFdeEncoding<ELFT>(Rec->Cie);
> +      uint8_t Enc = getFdeEncoding<ELFT>(Rec->Sec, Rec->Cie);
>        for (EhSectionPiece *Fde : Rec->Fdes) {
>          uint64_t Pc = getFdePc(Buf, Fde->OutputOff, Enc);
>          uint64_t FdeVA = getParent()->Addr + Fde->OutputOff;
> Index: lld/ELF/MarkLive.cpp
> ===================================================================
> --- lld/ELF/MarkLive.cpp
> +++ lld/ELF/MarkLive.cpp
> @@ -126,7 +126,7 @@
>      unsigned FirstRelI = Piece.FirstRelocation;
>      if (FirstRelI == (unsigned)-1)
>        continue;
> -    if (read32<E>(Piece.data().data() + 4) == 0) {
> +    if (read32<E>(Piece.data(&EH).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);
> Index: lld/ELF/InputSection.h
> ===================================================================
> --- lld/ELF/InputSection.h
> +++ lld/ELF/InputSection.h
> @@ -25,6 +25,7 @@
>  namespace elf {
>  
>  class DefinedCommon;
> +class EhInputSection;
>  class SymbolBody;
>  struct SectionPiece;
>  
> @@ -262,17 +263,16 @@
>  };
>  
>  struct EhSectionPiece {
> -  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}; }
> +  EhSectionPiece(size_t Off, uint32_t Size, unsigned FirstRelocation)
> +      : InputOff(Off), Size(Size), FirstRelocation(FirstRelocation) {
> +    assert(Off < UINT32_MAX && Size < UINT32_MAX);
> +  }
>  
> -  size_t InputOff;
> -  ssize_t OutputOff = -1;
> -  InputSectionBase *Sec;
> +  ArrayRef<uint8_t> data(EhInputSection *Sec);
> +  uint32_t InputOff;
> +  int32_t OutputOff = -1;
>    uint32_t Size;
> -  unsigned FirstRelocation;
> +  uint32_t FirstRelocation;
>  };
>  
>  // This corresponds to a .eh_frame section of an input file.
> @@ -292,6 +292,10 @@
>    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
> Index: lld/ELF/InputSection.cpp
> ===================================================================
> --- lld/ELF/InputSection.cpp
> +++ lld/ELF/InputSection.cpp
> @@ -870,7 +870,7 @@
>    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, this, Size, getReloc(Off, Size, Rels, RelI));
> +    this->Pieces.emplace_back(Off, Size, getReloc(Off, Size, Rels, RelI));
>      // The empty record is the end marker.
>      if (Size == 4)
>        break;
> Index: lld/ELF/EhFrame.h
> ===================================================================
> --- lld/ELF/EhFrame.h
> +++ lld/ELF/EhFrame.h
> @@ -14,11 +14,13 @@
>  
>  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(EhSectionPiece *P);
> +template <class ELFT>
> +uint8_t getFdeEncoding(EhInputSection *, EhSectionPiece *);
>  } // namespace elf
>  } // namespace lld
>  
> Index: lld/ELF/EhFrame.cpp
> ===================================================================
> --- lld/ELF/EhFrame.cpp
> +++ lld/ELF/EhFrame.cpp
> @@ -153,8 +153,9 @@
>    D = D.slice(Size);
>  }
>  
> -template <class ELFT> uint8_t elf::getFdeEncoding(EhSectionPiece *P) {
> -  return EhReader<ELFT>(P->Sec, P->data()).getFdeEncoding();
> +template <class ELFT>
> +uint8_t elf::getFdeEncoding(EhInputSection *Sec, EhSectionPiece *Piece) {
> +  return EhReader<ELFT>(Sec, Piece->data(Sec)).getFdeEncoding();
>  }
>  
>  template <class ELFT> uint8_t EhReader<ELFT>::getFdeEncoding() {
> @@ -205,7 +206,11 @@
>  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>(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);
> +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 *);


More information about the llvm-commits mailing list