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