1 //===- MCSection.h - 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 MCSection class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MCSECTION_H 15 #define LLVM_MC_MCSECTION_H 16 17 #include "llvm/ADT/StringRef.h" 18 #include "llvm/MC/SectionKind.h" 19 #include "llvm/Support/Compiler.h" 20 21 namespace llvm { 22 class MCAsmInfo; 23 class MCContext; 24 class MCExpr; 25 class MCSymbol; 26 class raw_ostream; 27 28 /// Instances of this class represent a uniqued identifier for a section in the 29 /// current translation unit. The MCContext class uniques and creates these. 30 class MCSection { 31 public: 32 enum SectionVariant { SV_COFF = 0, SV_ELF, SV_MachO }; 33 34 private: 35 MCSection(const MCSection &) = delete; 36 void operator=(const MCSection &) = delete; 37 38 MCSymbol *Begin; 39 mutable MCSymbol *End; 40 41 protected: MCSection(SectionVariant V,SectionKind K,MCSymbol * Begin)42 MCSection(SectionVariant V, SectionKind K, MCSymbol *Begin) 43 : Begin(Begin), End(nullptr), Variant(V), Kind(K) {} 44 SectionVariant Variant; 45 SectionKind Kind; 46 47 public: 48 virtual ~MCSection(); 49 getKind()50 SectionKind getKind() const { return Kind; } 51 getVariant()52 SectionVariant getVariant() const { return Variant; } 53 getBeginSymbol()54 MCSymbol *getBeginSymbol() const { return Begin; } 55 MCSymbol *getEndSymbol(MCContext &Ctx) const; 56 bool hasEnded() const; 57 58 virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, 59 const MCExpr *Subsection) const = 0; 60 61 /// Return true if a .align directive should use "optimized nops" to fill 62 /// instead of 0s. 63 virtual bool UseCodeAlign() const = 0; 64 65 /// Check whether this section is "virtual", that is has no actual object 66 /// file contents. 67 virtual bool isVirtualSection() const = 0; 68 }; 69 70 } // end namespace llvm 71 72 #endif 73