1 //===- MCSectionCOFF.h - COFF 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 MCSectionCOFF class. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_MC_MCSECTIONCOFF_H 15 #define LLVM_MC_MCSECTIONCOFF_H 16 17 #include "llvm/ADT/StringRef.h" 18 #include "llvm/MC/MCSection.h" 19 #include "llvm/Support/COFF.h" 20 21 namespace llvm { 22 class MCSymbol; 23 24 /// MCSectionCOFF - This represents a section on Windows 25 class MCSectionCOFF : public MCSection { 26 // The memory for this string is stored in the same MCContext as *this. 27 StringRef SectionName; 28 29 // FIXME: The following fields should not be mutable, but are for now so 30 // the asm parser can honor the .linkonce directive. 31 32 /// Characteristics - This is the Characteristics field of a section, 33 /// drawn from the enums below. 34 mutable unsigned Characteristics; 35 36 /// The COMDAT symbol of this section. Only valid if this is a COMDAT 37 /// section. Two COMDAT sections are merged if they have the same 38 /// COMDAT symbol. 39 const MCSymbol *COMDATSymbol; 40 41 /// Selection - This is the Selection field for the section symbol, if 42 /// it is a COMDAT section (Characteristics & IMAGE_SCN_LNK_COMDAT) != 0 43 mutable int Selection; 44 45 private: 46 friend class MCContext; 47 MCSectionCOFF(StringRef Section, unsigned Characteristics, 48 const MCSymbol *COMDATSymbol, int Selection, SectionKind K) 49 : MCSection(SV_COFF, K), SectionName(Section), 50 Characteristics(Characteristics), COMDATSymbol(COMDATSymbol), 51 Selection(Selection) { 52 assert ((Characteristics & 0x00F00000) == 0 && 53 "alignment must not be set upon section creation"); 54 } 55 ~MCSectionCOFF(); 56 57 public: 58 /// ShouldOmitSectionDirective - Decides whether a '.section' directive 59 /// should be printed before the section name 60 bool ShouldOmitSectionDirective(StringRef Name, const MCAsmInfo &MAI) const; 61 62 StringRef getSectionName() const { return SectionName; } 63 std::string getLabelBeginName() const override { 64 return SectionName.str() + "_begin"; 65 } 66 std::string getLabelEndName() const override { 67 return SectionName.str() + "_end"; 68 } 69 unsigned getCharacteristics() const { return Characteristics; } 70 const MCSymbol *getCOMDATSymbol() const { return COMDATSymbol; } 71 int getSelection() const { return Selection; } 72 73 void setSelection(int Selection) const; 74 75 void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS, 76 const MCExpr *Subsection) const override; 77 bool UseCodeAlign() const override; 78 bool isVirtualSection() const override; 79 80 static bool classof(const MCSection *S) { 81 return S->getVariant() == SV_COFF; 82 } 83 }; 84 85 } // end namespace llvm 86 87 #endif 88