summaryrefslogtreecommitdiff
path: root/include/llvm/MC/MCSectionELF.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/MC/MCSectionELF.h')
-rw-r--r--include/llvm/MC/MCSectionELF.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h
new file mode 100644
index 0000000..5ec23f1
--- /dev/null
+++ b/include/llvm/MC/MCSectionELF.h
@@ -0,0 +1,103 @@
+//===- MCSectionELF.h - ELF Machine Code Sections ---------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the MCSectionELF class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_MC_MCSECTIONELF_H
+#define LLVM_MC_MCSECTIONELF_H
+
+#include "llvm/ADT/Twine.h"
+#include "llvm/MC/MCSection.h"
+#include "llvm/MC/MCSymbol.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/Support/ELF.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace llvm {
+
+class MCSymbol;
+
+/// MCSectionELF - This represents a section on linux, lots of unix variants
+/// and some bare metal systems.
+class MCSectionELF : public MCSection {
+ /// SectionName - This is the name of the section. The referenced memory is
+ /// owned by TargetLoweringObjectFileELF's ELFUniqueMap.
+ StringRef SectionName;
+
+ /// Type - This is the sh_type field of a section, drawn from the enums below.
+ unsigned Type;
+
+ /// Flags - This is the sh_flags field of a section, drawn from the enums.
+ /// below.
+ unsigned Flags;
+
+ /// EntrySize - The size of each entry in this section. This size only
+ /// makes sense for sections that contain fixed-sized entries. If a
+ /// section does not contain fixed-sized entries 'EntrySize' will be 0.
+ unsigned EntrySize;
+
+ const MCSymbol *Group;
+
+private:
+ friend class MCContext;
+ MCSectionELF(StringRef Section, unsigned type, unsigned flags,
+ SectionKind K, unsigned entrySize, const MCSymbol *group)
+ : MCSection(SV_ELF, K), SectionName(Section), Type(type), Flags(flags),
+ EntrySize(entrySize), Group(group) {}
+ ~MCSectionELF();
+
+ void setSectionName(StringRef Name) { SectionName = Name; }
+
+public:
+
+ /// ShouldOmitSectionDirective - Decides whether a '.section' directive
+ /// should be printed before the section name
+ bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const;
+
+ StringRef getSectionName() const { return SectionName; }
+ std::string getLabelBeginName() const override {
+ if (Group)
+ return (SectionName.str() + '_' + Group->getName() + "_begin").str();
+ return SectionName.str() + "_begin";
+ }
+ std::string getLabelEndName() const override {
+ if (Group)
+ return (SectionName.str() + '_' + Group->getName() + "_end").str();
+ return SectionName.str() + "_end";
+ }
+ unsigned getType() const { return Type; }
+ unsigned getFlags() const { return Flags; }
+ unsigned getEntrySize() const { return EntrySize; }
+ const MCSymbol *getGroup() const { return Group; }
+
+ void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
+ const MCExpr *Subsection) const override;
+ bool UseCodeAlign() const override;
+ bool isVirtualSection() const override;
+
+ /// isBaseAddressKnownZero - We know that non-allocatable sections (like
+ /// debug info) have a base of zero.
+ bool isBaseAddressKnownZero() const override {
+ return (getFlags() & ELF::SHF_ALLOC) == 0;
+ }
+
+ static bool classof(const MCSection *S) {
+ return S->getVariant() == SV_ELF;
+ }
+
+ // Return the entry size for sections with fixed-width data.
+ static unsigned DetermineEntrySize(SectionKind Kind);
+
+};
+
+} // end namespace llvm
+
+#endif