X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FMC%2FMCSection.h;h=ab8968ef2baf0a4e6918b6d2a25f253fb38bccb0;hb=e005d71e4b5447df00e4b8e17d14b1fbcbf29196;hp=1c01b2f8f3cc659aa455e80733d62ac7b7be3adf;hpb=ba9934648f1b8f5b1749548963f385f1147c1f68;p=oota-llvm.git diff --git a/include/llvm/MC/MCSection.h b/include/llvm/MC/MCSection.h index 1c01b2f8f3c..ab8968ef2ba 100644 --- a/include/llvm/MC/MCSection.h +++ b/include/llvm/MC/MCSection.h @@ -14,62 +14,58 @@ #ifndef LLVM_MC_MCSECTION_H #define LLVM_MC_MCSECTION_H -#include #include "llvm/ADT/StringRef.h" #include "llvm/MC/SectionKind.h" -#include "llvm/Support/Casting.h" +#include "llvm/Support/Compiler.h" namespace llvm { - class MCContext; - class MCAsmInfo; - class raw_ostream; - - /// MCSection - Instances of this class represent a uniqued identifier for a - /// section in the current translation unit. The MCContext class uniques and - /// creates these. - class MCSection { - public: - enum SectionVariant { - SV_COFF = 0, - SV_ELF, - SV_MachO - }; - - private: - MCSection(const MCSection&); // DO NOT IMPLEMENT - void operator=(const MCSection&); // DO NOT IMPLEMENT - protected: - MCSection(SectionVariant V, SectionKind K) : Variant(V), Kind(K) {} - SectionVariant Variant; - SectionKind Kind; - public: - virtual ~MCSection(); - - SectionKind getKind() const { return Kind; } - - SectionVariant getVariant() const { return Variant; } - - virtual void PrintSwitchToSection(const MCAsmInfo &MAI, - raw_ostream &OS) const = 0; - - /// isBaseAddressKnownZero - Return true if we know that this section will - /// get a base address of zero. In cases where we know that this is true we - /// can emit section offsets as direct references to avoid a subtraction - /// from the base of the section, saving a relocation. - virtual bool isBaseAddressKnownZero() const { - return false; - } - - // UseCodeAlign - Return true if a .align directive should use - // "optimized nops" to fill instead of 0s. - virtual bool UseCodeAlign() const = 0; - - /// isVirtualSection - Check whether this section is "virtual", that is - /// has no actual object file contents. - virtual bool isVirtualSection() const = 0; - - static bool classof(const MCSection *) { return true; } - }; +class MCAsmInfo; +class MCContext; +class MCExpr; +class MCSymbol; +class raw_ostream; + +/// Instances of this class represent a uniqued identifier for a section in the +/// current translation unit. The MCContext class uniques and creates these. +class MCSection { +public: + enum SectionVariant { SV_COFF = 0, SV_ELF, SV_MachO }; + +private: + MCSection(const MCSection &) = delete; + void operator=(const MCSection &) = delete; + + MCSymbol *Begin; + mutable MCSymbol *End; + +protected: + MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin) + : Begin(Begin), End(nullptr), Variant(V), Kind(K) {} + SectionVariant Variant; + SectionKind Kind; + +public: + virtual ~MCSection(); + + SectionKind getKind() const { return Kind; } + + SectionVariant getVariant() const { return Variant; } + + MCSymbol *getBeginSymbol() const { return Begin; } + MCSymbol *getEndSymbol(MCContext &Ctx) const; + bool hasEnded() const; + + virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, + const MCExpr *Subsection) const = 0; + + /// Return true if a .align directive should use "optimized nops" to fill + /// instead of 0s. + virtual bool UseCodeAlign() const = 0; + + /// Check whether this section is "virtual", that is has no actual object + /// file contents. + virtual bool isVirtualSection() const = 0; +}; } // end namespace llvm