1 //===- lib/MC/MCSectionCOFF.cpp - COFF Code Section Representation --------===// 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 #include "llvm/MC/MCSectionCOFF.h" 11 #include "llvm/BinaryFormat/COFF.h" 12 #include "llvm/MC/MCSymbol.h" 13 #include "llvm/Support/raw_ostream.h" 14 #include <cassert> 15 16 using namespace llvm; 17 18 MCSectionCOFF::~MCSectionCOFF() = default; // anchor. 19 20 // ShouldOmitSectionDirective - Decides whether a '.section' directive 21 // should be printed before the section name 22 bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name, 23 const MCAsmInfo &MAI) const { 24 if (COMDATSymbol) 25 return false; 26 27 // FIXME: Does .section .bss/.data/.text work everywhere?? 28 if (Name == ".text" || Name == ".data" || Name == ".bss") 29 return true; 30 31 return false; 32 } 33 34 void MCSectionCOFF::setSelection(int Selection) const { 35 assert(Selection != 0 && "invalid COMDAT selection type"); 36 this->Selection = Selection; 37 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 38 } 39 40 void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T, 41 raw_ostream &OS, 42 const MCExpr *Subsection) const { 43 // standard sections don't require the '.section' 44 if (ShouldOmitSectionDirective(SectionName, MAI)) { 45 OS << '\t' << getSectionName() << '\n'; 46 return; 47 } 48 49 OS << "\t.section\t" << getSectionName() << ",\""; 50 if (getCharacteristics() & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA) 51 OS << 'd'; 52 if (getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA) 53 OS << 'b'; 54 if (getCharacteristics() & COFF::IMAGE_SCN_MEM_EXECUTE) 55 OS << 'x'; 56 if (getCharacteristics() & COFF::IMAGE_SCN_MEM_WRITE) 57 OS << 'w'; 58 else if (getCharacteristics() & COFF::IMAGE_SCN_MEM_READ) 59 OS << 'r'; 60 else 61 OS << 'y'; 62 if (getCharacteristics() & COFF::IMAGE_SCN_LNK_REMOVE) 63 OS << 'n'; 64 if (getCharacteristics() & COFF::IMAGE_SCN_MEM_SHARED) 65 OS << 's'; 66 if ((getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) && 67 !isImplicitlyDiscardable(SectionName)) 68 OS << 'D'; 69 OS << '"'; 70 71 if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) { 72 OS << ","; 73 switch (Selection) { 74 case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES: 75 OS << "one_only,"; 76 break; 77 case COFF::IMAGE_COMDAT_SELECT_ANY: 78 OS << "discard,"; 79 break; 80 case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE: 81 OS << "same_size,"; 82 break; 83 case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH: 84 OS << "same_contents,"; 85 break; 86 case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE: 87 OS << "associative,"; 88 break; 89 case COFF::IMAGE_COMDAT_SELECT_LARGEST: 90 OS << "largest,"; 91 break; 92 case COFF::IMAGE_COMDAT_SELECT_NEWEST: 93 OS << "newest,"; 94 break; 95 default: 96 assert(false && "unsupported COFF selection type"); 97 break; 98 } 99 assert(COMDATSymbol); 100 COMDATSymbol->print(OS, &MAI); 101 } 102 OS << '\n'; 103 } 104 105 bool MCSectionCOFF::UseCodeAlign() const { 106 return getKind().isText(); 107 } 108 109 bool MCSectionCOFF::isVirtualSection() const { 110 return getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA; 111 } 112