1 //===- MCSectionELF.h - ELF Machine Code Sections ---------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the MCSectionELF class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_MC_MCSECTIONELF_H
14 #define LLVM_MC_MCSECTIONELF_H
16 #include "llvm/ADT/StringRef.h"
17 #include "llvm/MC/MCSection.h"
18 #include "llvm/MC/MCSymbolELF.h"
19 #include "llvm/MC/SectionKind.h"
25 /// This represents a section on linux, lots of unix variants and some bare
27 class MCSectionELF final
: public MCSection
{
28 /// This is the name of the section. The referenced memory is owned by
29 /// TargetLoweringObjectFileELF's ELFUniqueMap.
30 StringRef SectionName
;
32 /// This is the sh_type field of a section, drawn from the enums below.
35 /// This is the sh_flags field of a section, drawn from the enums below.
40 /// The size of each entry in this section. This size only makes sense for
41 /// sections that contain fixed-sized entries. If a section does not contain
42 /// fixed-sized entries 'EntrySize' will be 0.
45 const MCSymbolELF
*Group
;
47 /// sh_info for SHF_LINK_ORDER (can be null).
48 const MCSymbol
*AssociatedSymbol
;
51 friend class MCContext
;
53 MCSectionELF(StringRef Section
, unsigned type
, unsigned flags
, SectionKind K
,
54 unsigned entrySize
, const MCSymbolELF
*group
, unsigned UniqueID
,
55 MCSymbol
*Begin
, const MCSymbolELF
*AssociatedSymbol
)
56 : MCSection(SV_ELF
, K
, Begin
), SectionName(Section
), Type(type
),
57 Flags(flags
), UniqueID(UniqueID
), EntrySize(entrySize
), Group(group
),
58 AssociatedSymbol(AssociatedSymbol
) {
60 Group
->setIsSignature();
63 void setSectionName(StringRef Name
) { SectionName
= Name
; }
66 /// Decides whether a '.section' directive should be printed before the
68 bool ShouldOmitSectionDirective(StringRef Name
, const MCAsmInfo
&MAI
) const;
70 StringRef
getSectionName() const { return SectionName
; }
71 unsigned getType() const { return Type
; }
72 unsigned getFlags() const { return Flags
; }
73 unsigned getEntrySize() const { return EntrySize
; }
74 void setFlags(unsigned F
) { Flags
= F
; }
75 const MCSymbolELF
*getGroup() const { return Group
; }
77 void PrintSwitchToSection(const MCAsmInfo
&MAI
, const Triple
&T
,
79 const MCExpr
*Subsection
) const override
;
80 bool UseCodeAlign() const override
;
81 bool isVirtualSection() const override
;
83 bool isUnique() const { return UniqueID
!= ~0U; }
84 unsigned getUniqueID() const { return UniqueID
; }
86 const MCSection
*getAssociatedSection() const { return &AssociatedSymbol
->getSection(); }
87 const MCSymbol
*getAssociatedSymbol() const { return AssociatedSymbol
; }
89 static bool classof(const MCSection
*S
) {
90 return S
->getVariant() == SV_ELF
;
94 } // end namespace llvm
96 #endif // LLVM_MC_MCSECTIONELF_H