diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:08:33 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:08:33 +0000 |
| commit | 20d35e67e67f106f617c939725101223211659f0 (patch) | |
| tree | 64eb963cbf5ba58765e0a6b64a440965d66a7a4d /ELF/InputSection.h | |
| parent | ae1a339de31cf4065777531959a11e55a2e5fa00 (diff) | |
Notes
Diffstat (limited to 'ELF/InputSection.h')
| -rw-r--r-- | ELF/InputSection.h | 65 |
1 files changed, 36 insertions, 29 deletions
diff --git a/ELF/InputSection.h b/ELF/InputSection.h index 8c114ae719481..4db01e035e324 100644 --- a/ELF/InputSection.h +++ b/ELF/InputSection.h @@ -18,8 +18,6 @@ #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/TinyPtrVector.h" #include "llvm/Object/ELF.h" -#include "llvm/Support/Threading.h" -#include <mutex> namespace lld { namespace elf { @@ -63,6 +61,9 @@ public: unsigned Bss : 1; + // Set for sections that should not be folded by ICF. + unsigned KeepUnique : 1; + // These corresponds to the fields in Elf_Shdr. uint32_t Alignment; uint64_t Flags; @@ -80,13 +81,15 @@ public: // section. uint64_t getOffset(uint64_t Offset) const; + uint64_t getVA(uint64_t Offset = 0) const; + protected: SectionBase(Kind SectionKind, StringRef Name, uint64_t Flags, uint64_t Entsize, uint64_t Alignment, uint32_t Type, uint32_t Info, uint32_t Link) : Name(Name), Repl(this), SectionKind(SectionKind), Live(false), - Bss(false), Alignment(Alignment), Flags(Flags), Entsize(Entsize), - Type(Type), Link(Link), Info(Info) {} + Bss(false), KeepUnique(false), Alignment(Alignment), Flags(Flags), + Entsize(Entsize), Type(Type), Link(Link), Info(Info) {} }; // This corresponds to a section of an input file. @@ -103,7 +106,7 @@ public: static bool classof(const SectionBase *S) { return S->kind() != Output; } - // The file which contains this section. It's dynamic type is always + // The file which contains this section. Its dynamic type is always // ObjFile<ELFT>, but in order to avoid ELFT, we use InputFile as // its static type. InputFile *File; @@ -161,10 +164,15 @@ public: InputSection *getLinkOrderDep() const; + // Get the function symbol that encloses this offset from within the + // section. + template <class ELFT> + Defined *getEnclosingFunction(uint64_t Offset); + // Compilers emit zlib-compressed debug sections if the -gz option // is given. This function checks if this section is compressed, and // if so, decompress in memory. - void maybeUncompress(); + void maybeDecompress(); // Returns a source location string. Used to construct an error message. template <class ELFT> std::string getLocation(uint64_t Offset); @@ -182,6 +190,15 @@ public: // This vector contains such "cooked" relocations. std::vector<Relocation> Relocations; + // A function compiled with -fsplit-stack calling a function + // compiled without -fsplit-stack needs its prologue adjusted. Find + // such functions and adjust their prologues. This is very similar + // to relocation. See https://gcc.gnu.org/wiki/SplitStacks for more + // information. + template <typename ELFT> + void adjustSplitStackFunctionPrologues(uint8_t *Buf, uint8_t *End); + + template <typename T> llvm::ArrayRef<T> getDataAs() const { size_t S = Data.size(); assert(S % sizeof(T) == 0); @@ -189,9 +206,9 @@ public: } private: - // A pointer that owns uncompressed data if a section is compressed by zlib. + // A pointer that owns decompressed data if a section is compressed by zlib. // Since the feature is not used often, this is usually a nullptr. - std::unique_ptr<char[]> UncompressBuf; + std::unique_ptr<char[]> DecompressBuf; }; // SectionPiece represents a piece of splittable section contents. @@ -200,7 +217,7 @@ private: // be found by looking at the next one). struct SectionPiece { SectionPiece(size_t Off, uint32_t Hash, bool Live) - : InputOff(Off), Hash(Hash), OutputOff(-1), + : InputOff(Off), Hash(Hash), OutputOff(0), Live(Live || !Config->GcSections) {} uint32_t InputOff; @@ -223,19 +240,14 @@ public: static bool classof(const SectionBase *S) { return S->kind() == Merge; } void splitIntoPieces(); - // Mark the piece at a given offset live. Used by GC. - void markLiveAt(uint64_t Offset) { - if (this->Flags & llvm::ELF::SHF_ALLOC) - LiveOffsets.insert(Offset); - } - - // Translate an offset in the input section to an offset - // in the output section. - uint64_t getOffset(uint64_t Offset) const; + // Translate an offset in the input section to an offset in the parent + // MergeSyntheticSection. + uint64_t getParentOffset(uint64_t Offset) const; // Splittable sections are handled as a sequence of data // rather than a single large blob of data. std::vector<SectionPiece> Pieces; + llvm::DenseMap<uint32_t, uint32_t> OffsetMap; // Returns I'th piece's data. This function is very hot when // string merging is enabled, so we want to inline. @@ -249,18 +261,15 @@ public: // Returns the SectionPiece at a given input section offset. SectionPiece *getSectionPiece(uint64_t Offset); - const SectionPiece *getSectionPiece(uint64_t Offset) const; + const SectionPiece *getSectionPiece(uint64_t Offset) const { + return const_cast<MergeInputSection *>(this)->getSectionPiece(Offset); + } SyntheticSection *getParent() const; private: void splitStrings(ArrayRef<uint8_t> A, size_t Size); void splitNonStrings(ArrayRef<uint8_t> A, size_t Size); - - mutable llvm::DenseMap<uint32_t, uint32_t> OffsetMap; - mutable llvm::once_flag InitOffsetMap; - - llvm::DenseSet<uint64_t> LiveOffsets; }; struct EhSectionPiece { @@ -310,6 +319,8 @@ public: // beginning of the output section. template <class ELFT> void writeTo(uint8_t *Buf); + uint64_t getOffset(uint64_t Offset) const { return OutSecOff + Offset; } + OutputSection *getParent() const; // This variable has two usages. Initially, it represents an index in the @@ -320,7 +331,7 @@ public: static bool classof(const SectionBase *S); - InputSectionBase *getRelocatedSection(); + InputSectionBase *getRelocatedSection() const; template <class ELFT, class RelTy> void relocateNonAlloc(uint8_t *Buf, llvm::ArrayRef<RelTy> Rels); @@ -342,10 +353,6 @@ private: // The list of all input sections. extern std::vector<InputSectionBase *> InputSections; - -// Builds section order for handling --symbol-ordering-file. -llvm::DenseMap<SectionBase *, int> buildSectionOrder(); - } // namespace elf std::string toString(const elf::InputSectionBase *); |
