1 //===- MCSectionELF.h - ELF Machine Code Sections ---------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares the MCSectionELF class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_MC_MCSECTIONELF_H 14 #define LLVM_MC_MCSECTIONELF_H 15 16 #include "llvm/ADT/PointerIntPair.h" 17 #include "llvm/ADT/StringRef.h" 18 #include "llvm/BinaryFormat/ELF.h" 19 #include "llvm/MC/MCSection.h" 20 #include "llvm/MC/MCSymbolELF.h" 21 #include "llvm/MC/SectionKind.h" 22 23 namespace llvm { 24 25 /// This represents a section on linux, lots of unix variants and some bare 26 /// metal systems. 27 class MCSectionELF final : public MCSection { 28 /// This is the sh_type field of a section, drawn from the enums below. 29 unsigned Type; 30 31 /// This is the sh_flags field of a section, drawn from the enums below. 32 unsigned Flags; 33 34 unsigned UniqueID; 35 36 /// The size of each entry in this section. This size only makes sense for 37 /// sections that contain fixed-sized entries. If a section does not contain 38 /// fixed-sized entries 'EntrySize' will be 0. 39 unsigned EntrySize; 40 41 /// The section group signature symbol (if not null) and a bool indicating 42 /// whether this is a GRP_COMDAT group. 43 const PointerIntPair<const MCSymbolELF *, 1, bool> Group; 44 45 /// Used by SHF_LINK_ORDER. If non-null, the sh_link field will be set to the 46 /// section header index of the section where LinkedToSym is defined. 47 const MCSymbol *LinkedToSym; 48 49 /// Start/end offset in file, used by ELFWriter. 50 uint64_t StartOffset; 51 uint64_t EndOffset; 52 53 private: 54 friend class MCContext; 55 56 // The storage of Name is owned by MCContext's ELFUniquingMap. MCSectionELF(StringRef Name,unsigned type,unsigned flags,unsigned entrySize,const MCSymbolELF * group,bool IsComdat,unsigned UniqueID,MCSymbol * Begin,const MCSymbolELF * LinkedToSym)57 MCSectionELF(StringRef Name, unsigned type, unsigned flags, 58 unsigned entrySize, const MCSymbolELF *group, bool IsComdat, 59 unsigned UniqueID, MCSymbol *Begin, 60 const MCSymbolELF *LinkedToSym) 61 : MCSection(SV_ELF, Name, flags & ELF::SHF_EXECINSTR, 62 type == ELF::SHT_NOBITS, Begin), 63 Type(type), Flags(flags), UniqueID(UniqueID), EntrySize(entrySize), 64 Group(group, IsComdat), LinkedToSym(LinkedToSym) { 65 if (Group.getPointer()) 66 Group.getPointer()->setIsSignature(); 67 } 68 69 // TODO Delete after we stop supporting generation of GNU-style .zdebug_* 70 // sections. setSectionName(StringRef Name)71 void setSectionName(StringRef Name) { this->Name = Name; } 72 73 public: 74 /// Decides whether a '.section' directive should be printed before the 75 /// section name 76 bool shouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const; 77 getType()78 unsigned getType() const { return Type; } getFlags()79 unsigned getFlags() const { return Flags; } getEntrySize()80 unsigned getEntrySize() const { return EntrySize; } setFlags(unsigned F)81 void setFlags(unsigned F) { Flags = F; } getGroup()82 const MCSymbolELF *getGroup() const { return Group.getPointer(); } isComdat()83 bool isComdat() const { return Group.getInt(); } 84 85 void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T, 86 raw_ostream &OS, 87 uint32_t Subsection) const override; 88 bool useCodeAlign() const override; 89 StringRef getVirtualSectionKind() const override; 90 isUnique()91 bool isUnique() const { return UniqueID != NonUniqueID; } getUniqueID()92 unsigned getUniqueID() const { return UniqueID; } 93 getLinkedToSection()94 const MCSection *getLinkedToSection() const { 95 return &LinkedToSym->getSection(); 96 } getLinkedToSymbol()97 const MCSymbol *getLinkedToSymbol() const { return LinkedToSym; } 98 setOffsets(uint64_t Start,uint64_t End)99 void setOffsets(uint64_t Start, uint64_t End) { 100 StartOffset = Start; 101 EndOffset = End; 102 } getOffsets()103 std::pair<uint64_t, uint64_t> getOffsets() const { 104 return std::make_pair(StartOffset, EndOffset); 105 } 106 classof(const MCSection * S)107 static bool classof(const MCSection *S) { 108 return S->getVariant() == SV_ELF; 109 } 110 }; 111 112 } // end namespace llvm 113 114 #endif // LLVM_MC_MCSECTIONELF_H 115