1 //===- lib/MC/MCSectionELF.cpp - ELF 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/MCSectionELF.h" 11 #include "llvm/MC/MCContext.h" 12 #include "llvm/Support/raw_ostream.h" 13 #include "llvm/MC/MCAsmInfo.h" 14 15 using namespace llvm; 16 17 MCSectionELF *MCSectionELF:: 18 Create(const StringRef &Section, unsigned Type, unsigned Flags, 19 SectionKind K, bool isExplicit, MCContext &Ctx) { 20 return new (Ctx) MCSectionELF(Section, Type, Flags, K, isExplicit); 21 } 22 23 // ShouldOmitSectionDirective - Decides whether a '.section' directive 24 // should be printed before the section name 25 bool MCSectionELF::ShouldOmitSectionDirective(const char *Name, 26 const MCAsmInfo &MAI) const { 27 28 // FIXME: Does .section .bss/.data/.text work everywhere?? 29 if (strcmp(Name, ".text") == 0 || 30 strcmp(Name, ".data") == 0 || 31 (strcmp(Name, ".bss") == 0 && 32 !MAI.usesELFSectionDirectiveForBSS())) 33 return true; 34 35 return false; 36 } 37 38 // ShouldPrintSectionType - Only prints the section type if supported 39 bool MCSectionELF::ShouldPrintSectionType(unsigned Ty) const { 40 41 if (IsExplicit && !(Ty == SHT_NOBITS || Ty == SHT_PROGBITS)) 42 return false; 43 44 return true; 45 } 46 47 void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, 48 raw_ostream &OS) const { 49 50 if (ShouldOmitSectionDirective(SectionName.c_str(), MAI)) { 51 OS << '\t' << getSectionName() << '\n'; 52 return; 53 } 54 55 OS << "\t.section\t" << getSectionName(); 56 57 // Handle the weird solaris syntax if desired. 58 if (MAI.usesSunStyleELFSectionSwitchSyntax() && 59 !(Flags & MCSectionELF::SHF_MERGE)) { 60 if (Flags & MCSectionELF::SHF_ALLOC) 61 OS << ",#alloc"; 62 if (Flags & MCSectionELF::SHF_EXECINSTR) 63 OS << ",#execinstr"; 64 if (Flags & MCSectionELF::SHF_WRITE) 65 OS << ",#write"; 66 if (Flags & MCSectionELF::SHF_TLS) 67 OS << ",#tls"; 68 } else { 69 OS << ",\""; 70 if (Flags & MCSectionELF::SHF_ALLOC) 71 OS << 'a'; 72 if (Flags & MCSectionELF::SHF_EXECINSTR) 73 OS << 'x'; 74 if (Flags & MCSectionELF::SHF_WRITE) 75 OS << 'w'; 76 if (Flags & MCSectionELF::SHF_MERGE) 77 OS << 'M'; 78 if (Flags & MCSectionELF::SHF_STRINGS) 79 OS << 'S'; 80 if (Flags & MCSectionELF::SHF_TLS) 81 OS << 'T'; 82 83 // If there are target-specific flags, print them. 84 if (Flags & ~MCSectionELF::TARGET_INDEP_SHF) 85 PrintTargetSpecificSectionFlags(MAI, OS); 86 87 OS << '"'; 88 89 if (ShouldPrintSectionType(Type)) { 90 OS << ','; 91 92 // If comment string is '@', e.g. as on ARM - use '%' instead 93 if (MAI.getCommentString()[0] == '@') 94 OS << '%'; 95 else 96 OS << '@'; 97 98 if (Type == MCSectionELF::SHT_INIT_ARRAY) 99 OS << "init_array"; 100 else if (Type == MCSectionELF::SHT_FINI_ARRAY) 101 OS << "fini_array"; 102 else if (Type == MCSectionELF::SHT_PREINIT_ARRAY) 103 OS << "preinit_array"; 104 else if (Type == MCSectionELF::SHT_NOBITS) 105 OS << "nobits"; 106 else if (Type == MCSectionELF::SHT_PROGBITS) 107 OS << "progbits"; 108 109 if (getKind().isMergeable1ByteCString()) { 110 OS << ",1"; 111 } else if (getKind().isMergeable2ByteCString()) { 112 OS << ",2"; 113 } else if (getKind().isMergeable4ByteCString() || 114 getKind().isMergeableConst4()) { 115 OS << ",4"; 116 } else if (getKind().isMergeableConst8()) { 117 OS << ",8"; 118 } else if (getKind().isMergeableConst16()) { 119 OS << ",16"; 120 } 121 } 122 } 123 124 OS << '\n'; 125 } 126 127 // HasCommonSymbols - True if this section holds common symbols, this is 128 // indicated on the ELF object file by a symbol with SHN_COMMON section 129 // header index. 130 bool MCSectionELF::HasCommonSymbols() const { 131 132 if (strncmp(SectionName.c_str(), ".gnu.linkonce.", 14) == 0) 133 return true; 134 135 return false; 136 } 137 138 139