• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  //===- MCSectionELF.h - ELF Machine Code Sections ---------------*- C++ -*-===//
2  //
3  //                     The LLVM Compiler Infrastructure
4  //
5  // This file is distributed under the University of Illinois Open Source
6  // License. See LICENSE.TXT for details.
7  //
8  //===----------------------------------------------------------------------===//
9  //
10  // This file declares the MCSectionELF class.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #ifndef LLVM_MC_MCSECTIONELF_H
15  #define LLVM_MC_MCSECTIONELF_H
16  
17  #include "llvm/ADT/Twine.h"
18  #include "llvm/MC/MCSection.h"
19  #include "llvm/MC/MCSymbol.h"
20  #include "llvm/Support/Debug.h"
21  #include "llvm/Support/ELF.h"
22  #include "llvm/Support/raw_ostream.h"
23  
24  namespace llvm {
25  
26  class MCSymbol;
27  
28  /// MCSectionELF - This represents a section on linux, lots of unix variants
29  /// and some bare metal systems.
30  class MCSectionELF : public MCSection {
31    /// SectionName - This is the name of the section.  The referenced memory is
32    /// owned by TargetLoweringObjectFileELF's ELFUniqueMap.
33    StringRef SectionName;
34  
35    /// Type - This is the sh_type field of a section, drawn from the enums below.
36    unsigned Type;
37  
38    /// Flags - This is the sh_flags field of a section, drawn from the enums.
39    /// below.
40    unsigned Flags;
41  
42    /// EntrySize - The size of each entry in this section. This size only
43    /// makes sense for sections that contain fixed-sized entries. If a
44    /// section does not contain fixed-sized entries 'EntrySize' will be 0.
45    unsigned EntrySize;
46  
47    const MCSymbol *Group;
48  
49  private:
50    friend class MCContext;
MCSectionELF(StringRef Section,unsigned type,unsigned flags,SectionKind K,unsigned entrySize,const MCSymbol * group)51    MCSectionELF(StringRef Section, unsigned type, unsigned flags,
52                 SectionKind K, unsigned entrySize, const MCSymbol *group)
53      : MCSection(SV_ELF, K), SectionName(Section), Type(type), Flags(flags),
54        EntrySize(entrySize), Group(group) {}
55    ~MCSectionELF();
56  
setSectionName(StringRef Name)57    void setSectionName(StringRef Name) { SectionName = Name; }
58  
59  public:
60  
61    /// ShouldOmitSectionDirective - Decides whether a '.section' directive
62    /// should be printed before the section name
63    bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
64  
getSectionName()65    StringRef getSectionName() const { return SectionName; }
getLabelBeginName()66    std::string getLabelBeginName() const override {
67      if (Group)
68        return (SectionName.str() + '_' + Group->getName() + "_begin").str();
69      return SectionName.str() + "_begin";
70    }
getLabelEndName()71    std::string getLabelEndName() const override {
72      if (Group)
73        return (SectionName.str() + '_' + Group->getName() + "_end").str();
74      return SectionName.str() + "_end";
75    }
getType()76    unsigned getType() const { return Type; }
getFlags()77    unsigned getFlags() const { return Flags; }
getEntrySize()78    unsigned getEntrySize() const { return EntrySize; }
getGroup()79    const MCSymbol *getGroup() const { return Group; }
80  
81    void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
82                              const MCExpr *Subsection) const override;
83    bool UseCodeAlign() const override;
84    bool isVirtualSection() const override;
85  
86    /// isBaseAddressKnownZero - We know that non-allocatable sections (like
87    /// debug info) have a base of zero.
isBaseAddressKnownZero()88    bool isBaseAddressKnownZero() const override {
89      return (getFlags() & ELF::SHF_ALLOC) == 0;
90    }
91  
classof(const MCSection * S)92    static bool classof(const MCSection *S) {
93      return S->getVariant() == SV_ELF;
94    }
95  
96    // Return the entry size for sections with fixed-width data.
97    static unsigned DetermineEntrySize(SectionKind Kind);
98  
99  };
100  
101  } // end namespace llvm
102  
103  #endif
104