[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
Tue Sep 26 16:31:00 PDT 2017
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