MCSection.cpp revision 892e18239308f8a02a4c83758616be84a459c19d
1ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//===- lib/MC/MCSection.cpp - Machine Code Section Representation ---------===// 2ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// 3ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// The LLVM Compiler Infrastructure 4ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// 5ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// This file is distributed under the University of Illinois Open Source 6ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// License. See LICENSE.TXT for details. 7ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner// 8ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner//===----------------------------------------------------------------------===// 9ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner 10ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner#include "llvm/MC/MCSection.h" 11ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner#include "llvm/MC/MCContext.h" 12892e18239308f8a02a4c83758616be84a459c19dChris Lattner#include "llvm/Target/TargetAsmInfo.h" 13892e18239308f8a02a4c83758616be84a459c19dChris Lattner#include "llvm/Support/raw_ostream.h" 14ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattnerusing namespace llvm; 15ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner 16892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 17892e18239308f8a02a4c83758616be84a459c19dChris Lattner// MCSection 18892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 19892e18239308f8a02a4c83758616be84a459c19dChris Lattner 20ed47a0409b187d5dcd2bddfd054326fc809d00aeChris LattnerMCSection::~MCSection() { 21ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner} 22ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner 23968ff1196768c0b6dbcc5508025a2923bfa73fabChris LattnerMCSection::MCSection(const StringRef &N, bool isDirective, SectionKind K, 24968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner MCContext &Ctx) 25968ff1196768c0b6dbcc5508025a2923bfa73fabChris Lattner : Name(N), IsDirective(isDirective), Kind(K) { 26ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner MCSection *&Entry = Ctx.Sections[Name]; 27ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner assert(Entry == 0 && "Multiple sections with the same name created"); 28ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner Entry = this; 29ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner} 30ed47a0409b187d5dcd2bddfd054326fc809d00aeChris Lattner 31892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 32892e18239308f8a02a4c83758616be84a459c19dChris Lattner// MCSectionELF 33892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 34a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 35a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris LattnerMCSectionELF *MCSectionELF:: 36a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris LattnerCreate(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { 37a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner return new (Ctx) MCSectionELF(Name, IsDirective, K, Ctx); 38a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner} 39a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 40892e18239308f8a02a4c83758616be84a459c19dChris Lattnervoid MCSectionELF::PrintSwitchToSection(const TargetAsmInfo &TAI, 41892e18239308f8a02a4c83758616be84a459c19dChris Lattner raw_ostream &OS) const { 42892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (isDirective()) { 43892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << getName() << '\n'; 44892e18239308f8a02a4c83758616be84a459c19dChris Lattner return; 45892e18239308f8a02a4c83758616be84a459c19dChris Lattner } 46892e18239308f8a02a4c83758616be84a459c19dChris Lattner 47892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "\t.section\t" << getName(); 48892e18239308f8a02a4c83758616be84a459c19dChris Lattner 49892e18239308f8a02a4c83758616be84a459c19dChris Lattner // Handle the weird solaris syntax if desired. 50892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (TAI.usesSunStyleELFSectionSwitchSyntax() && 51892e18239308f8a02a4c83758616be84a459c19dChris Lattner !getKind().isMergeableConst() && !getKind().isMergeableCString()) { 52892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (!getKind().isMetadata()) 53892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",#alloc"; 54892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isText()) 55892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",#execinstr"; 56892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isWriteable()) 57892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",#write"; 58892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isThreadLocal()) 59892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",#tls"; 60892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else { 61892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",\""; 62892e18239308f8a02a4c83758616be84a459c19dChris Lattner 63892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (!getKind().isMetadata()) 64892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'a'; 65892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isText()) 66892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'x'; 67892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isWriteable()) 68892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'w'; 69892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isMergeable1ByteCString() || 70892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeable2ByteCString() || 71892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeable4ByteCString() || 72892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeableConst4() || 73892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeableConst8() || 74892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeableConst16()) 75892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'M'; 76892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isMergeable1ByteCString() || 77892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeable2ByteCString() || 78892e18239308f8a02a4c83758616be84a459c19dChris Lattner getKind().isMergeable4ByteCString()) 79892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'S'; 80892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isThreadLocal()) 81892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'T'; 82892e18239308f8a02a4c83758616be84a459c19dChris Lattner 83892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "\","; 84892e18239308f8a02a4c83758616be84a459c19dChris Lattner 85892e18239308f8a02a4c83758616be84a459c19dChris Lattner // If comment string is '@', e.g. as on ARM - use '%' instead 86892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (TAI.getCommentString()[0] == '@') 87892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << '%'; 88892e18239308f8a02a4c83758616be84a459c19dChris Lattner else 89892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << '@'; 90892e18239308f8a02a4c83758616be84a459c19dChris Lattner 91892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isBSS() || getKind().isThreadBSS()) 92892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "nobits"; 93892e18239308f8a02a4c83758616be84a459c19dChris Lattner else 94892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "progbits"; 95892e18239308f8a02a4c83758616be84a459c19dChris Lattner 96892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isMergeable1ByteCString()) { 97892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",1"; 98892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else if (getKind().isMergeable2ByteCString()) { 99892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",2"; 100892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else if (getKind().isMergeable4ByteCString()) { 101892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",4"; 102892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else if (getKind().isMergeableConst4()) { 103892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",4"; 104892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else if (getKind().isMergeableConst8()) { 105892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",8"; 106892e18239308f8a02a4c83758616be84a459c19dChris Lattner } else if (getKind().isMergeableConst16()) { 107892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << ",16"; 108892e18239308f8a02a4c83758616be84a459c19dChris Lattner } 109892e18239308f8a02a4c83758616be84a459c19dChris Lattner } 110892e18239308f8a02a4c83758616be84a459c19dChris Lattner} 111892e18239308f8a02a4c83758616be84a459c19dChris Lattner 112892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 113892e18239308f8a02a4c83758616be84a459c19dChris Lattner// MCSectionMachO 114892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 115a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 116a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris LattnerMCSectionMachO *MCSectionMachO:: 117a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris LattnerCreate(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { 118a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner return new (Ctx) MCSectionMachO(Name, IsDirective, K, Ctx); 119a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner} 120a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 121892e18239308f8a02a4c83758616be84a459c19dChris Lattnervoid MCSectionMachO::PrintSwitchToSection(const TargetAsmInfo &TAI, 122892e18239308f8a02a4c83758616be84a459c19dChris Lattner raw_ostream &OS) const { 123892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (!isDirective()) 124892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "\t.section\t" << getName() << '\n'; 125892e18239308f8a02a4c83758616be84a459c19dChris Lattner else 126892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << getName() << '\n'; 127892e18239308f8a02a4c83758616be84a459c19dChris Lattner} 128892e18239308f8a02a4c83758616be84a459c19dChris Lattner 129892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 130892e18239308f8a02a4c83758616be84a459c19dChris Lattner// MCSectionCOFF 131892e18239308f8a02a4c83758616be84a459c19dChris Lattner//===----------------------------------------------------------------------===// 132a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 1337c599d056a41262681aa7fcd771eeed53a8e0bd2Chris LattnerMCSectionCOFF *MCSectionCOFF:: 134a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris LattnerCreate(const StringRef &Name, bool IsDirective, SectionKind K, MCContext &Ctx) { 1357c599d056a41262681aa7fcd771eeed53a8e0bd2Chris Lattner return new (Ctx) MCSectionCOFF(Name, IsDirective, K, Ctx); 136a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner} 137a1c31b779cdde0090b8efcde87d7d0d898cabd38Chris Lattner 138892e18239308f8a02a4c83758616be84a459c19dChris Lattnervoid MCSectionCOFF::PrintSwitchToSection(const TargetAsmInfo &TAI, 139892e18239308f8a02a4c83758616be84a459c19dChris Lattner raw_ostream &OS) const { 140892e18239308f8a02a4c83758616be84a459c19dChris Lattner 141892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (isDirective()) { 142892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << getName() << '\n'; 143892e18239308f8a02a4c83758616be84a459c19dChris Lattner return; 144892e18239308f8a02a4c83758616be84a459c19dChris Lattner } 145892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "\t.section\t" << getName() << ",\""; 146892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isText()) 147892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'x'; 148892e18239308f8a02a4c83758616be84a459c19dChris Lattner if (getKind().isWriteable()) 149892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << 'w'; 150892e18239308f8a02a4c83758616be84a459c19dChris Lattner OS << "\"\n"; 151892e18239308f8a02a4c83758616be84a459c19dChris Lattner} 152