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