MCSectionELF.cpp revision 766f25306af343fb2784350cb4d8cd9ca180f0d3
1b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//===- lib/MC/MCSectionELF.cpp - ELF Code Section Representation ----------===//
2b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//
3b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//                     The LLVM Compiler Infrastructure
4b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//
5b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes// This file is distributed under the University of Illinois Open Source
6b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes// License. See LICENSE.TXT for details.
7b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//
8b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes//===----------------------------------------------------------------------===//
9b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
10b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCSectionELF.h"
114d2419d7519e2bc3b437d01984f9fb268dd7a3cdChris Lattner#include "llvm/MC/MCAsmInfo.h"
12b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/MC/MCContext.h"
13df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne#include "llvm/MC/MCExpr.h"
144d2419d7519e2bc3b437d01984f9fb268dd7a3cdChris Lattner#include "llvm/MC/MCSymbol.h"
15c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h"
16b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes#include "llvm/Support/raw_ostream.h"
17c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola
18b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopesusing namespace llvm;
19b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
2074aae4726a66733c5872588287535a984f9a94c7Chris LattnerMCSectionELF::~MCSectionELF() {} // anchor.
21b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
22b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes// ShouldOmitSectionDirective - Decides whether a '.section' directive
23b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes// should be printed before the section name
24a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramerbool MCSectionELF::ShouldOmitSectionDirective(StringRef Name,
254d2419d7519e2bc3b437d01984f9fb268dd7a3cdChris Lattner                                              const MCAsmInfo &MAI) const {
262684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
27b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  // FIXME: Does .section .bss/.data/.text work everywhere??
28a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (Name == ".text" || Name == ".data" ||
29a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer      (Name == ".bss" && !MAI.usesELFSectionDirectiveForBSS()))
30b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return true;
31b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
32b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  return false;
33b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
34b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
3533adcfb4d217f5f23d9bde8ba02b8e48f9605fc5Chris Lattnervoid MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI,
36df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                        raw_ostream &OS,
37df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne                                        const MCExpr *Subsection) const {
382684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
39a46918d2b1b63aa3db94aa10b9ea70209b84e274Benjamin Kramer  if (ShouldOmitSectionDirective(SectionName, MAI)) {
40df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    OS << '\t' << getSectionName();
41df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    if (Subsection)
42df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne      OS << '\t' << *Subsection;
43df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    OS << '\n';
44b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes    return;
45b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  }
46b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
47ea83b133503afcd6589cf317cbb54ccd9e100f57Joerg Sonnenberger  StringRef name = getSectionName();
4889e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger  if (name.find_first_not_of("0123456789_."
4989e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger                             "abcdefghijklmnopqrstuvwxyz"
5089e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger                             "ABCDEFGHIJKLMNOPQRSTUVWXYZ") == name.npos) {
5189e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger    OS << "\t.section\t" << name;
5289e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger  } else {
5389e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger    OS << "\t.section\t\"";
5489e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger    for (const char *b = name.begin(), *e = name.end(); b < e; ++b) {
5589e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger      if (*b == '"') // Unquoted "
5689e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger        OS << "\\\"";
5789e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger      else if (*b != '\\') // Neither " or backslash
5889e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger        OS << *b;
5989e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger      else if (b + 1 == e) // Trailing backslash
6089e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger        OS << "\\\\";
6189e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger      else {
6289e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger        OS << b[0] << b[1]; // Quoted character
6389e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger        ++b;
6489e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger      }
65ea83b133503afcd6589cf317cbb54ccd9e100f57Joerg Sonnenberger    }
6689e0f386f3c8bafbbae05d7d32695ce571617397Joerg Sonnenberger    OS << '"';
67ea83b133503afcd6589cf317cbb54ccd9e100f57Joerg Sonnenberger  }
68ea83b133503afcd6589cf317cbb54ccd9e100f57Joerg Sonnenberger
69b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  // Handle the weird solaris syntax if desired.
702684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach  if (MAI.usesSunStyleELFSectionSwitchSyntax() &&
711c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola      !(Flags & ELF::SHF_MERGE)) {
721c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    if (Flags & ELF::SHF_ALLOC)
73b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      OS << ",#alloc";
741c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    if (Flags & ELF::SHF_EXECINSTR)
75b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      OS << ",#execinstr";
761c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    if (Flags & ELF::SHF_WRITE)
77b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      OS << ",#write";
78766f25306af343fb2784350cb4d8cd9ca180f0d3Benjamin Kramer    if (Flags & ELF::SHF_EXCLUDE)
79766f25306af343fb2784350cb4d8cd9ca180f0d3Benjamin Kramer      OS << ",#exclude";
801c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    if (Flags & ELF::SHF_TLS)
81b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes      OS << ",#tls";
8274aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << '\n';
8374aae4726a66733c5872588287535a984f9a94c7Chris Lattner    return;
8474aae4726a66733c5872588287535a984f9a94c7Chris Lattner  }
852684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
8674aae4726a66733c5872588287535a984f9a94c7Chris Lattner  OS << ",\"";
871c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_ALLOC)
8874aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'a';
89766f25306af343fb2784350cb4d8cd9ca180f0d3Benjamin Kramer  if (Flags & ELF::SHF_EXCLUDE)
90766f25306af343fb2784350cb4d8cd9ca180f0d3Benjamin Kramer    OS << 'e';
911c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_EXECINSTR)
9274aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'x';
935d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola  if (Flags & ELF::SHF_GROUP)
945d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola    OS << 'G';
951c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_WRITE)
9674aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'w';
971c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_MERGE)
9874aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'M';
991c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_STRINGS)
10074aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'S';
1011c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::SHF_TLS)
10274aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'T';
1032684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
10474aae4726a66733c5872588287535a984f9a94c7Chris Lattner  // If there are target-specific flags, print them.
1051c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::XCORE_SHF_CP_SECTION)
10674aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'c';
1071c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  if (Flags & ELF::XCORE_SHF_DP_SECTION)
10874aae4726a66733c5872588287535a984f9a94c7Chris Lattner    OS << 'd';
1092684d9e3c702b2ef9fd430155d94671d12fa994fJim Grosbach
11074aae4726a66733c5872588287535a984f9a94c7Chris Lattner  OS << '"';
111b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
11234be396a12b00a95a1353c356d64868798ea3098Rafael Espindola  OS << ',';
11334be396a12b00a95a1353c356d64868798ea3098Rafael Espindola
11434be396a12b00a95a1353c356d64868798ea3098Rafael Espindola  // If comment string is '@', e.g. as on ARM - use '%' instead
11534be396a12b00a95a1353c356d64868798ea3098Rafael Espindola  if (MAI.getCommentString()[0] == '@')
11634be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << '%';
11734be396a12b00a95a1353c356d64868798ea3098Rafael Espindola  else
11834be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << '@';
11934be396a12b00a95a1353c356d64868798ea3098Rafael Espindola
120c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  if (Type == ELF::SHT_INIT_ARRAY)
12134be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "init_array";
122c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  else if (Type == ELF::SHT_FINI_ARRAY)
12334be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "fini_array";
124c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  else if (Type == ELF::SHT_PREINIT_ARRAY)
12534be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "preinit_array";
126c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  else if (Type == ELF::SHT_NOBITS)
12734be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "nobits";
128c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  else if (Type == ELF::SHT_NOTE)
12998976610d2c8067efe04042f17486a4b6c746b31Rafael Espindola    OS << "note";
130c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  else if (Type == ELF::SHT_PROGBITS)
13134be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "progbits";
13234be396a12b00a95a1353c356d64868798ea3098Rafael Espindola
13334be396a12b00a95a1353c356d64868798ea3098Rafael Espindola  if (EntrySize) {
1341c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola    assert(Flags & ELF::SHF_MERGE);
13534be396a12b00a95a1353c356d64868798ea3098Rafael Espindola    OS << "," << EntrySize;
136b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  }
13734be396a12b00a95a1353c356d64868798ea3098Rafael Espindola
1385d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola  if (Flags & ELF::SHF_GROUP)
1395d618ef7f1ad005fc6912f3e9a08c044b082e47fRafael Espindola    OS << "," << Group->getName() << ",comdat";
140b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes  OS << '\n';
141df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne
142df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne  if (Subsection)
143df39be6cb4eb44011db3d3e86f8fe463f81ce127Peter Collingbourne    OS << "\t.subsection\t" << *Subsection << '\n';
144b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes}
145b808588a3a5febe931896b3779d159ba90d836f7Bruno Cardoso Lopes
146083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voungbool MCSectionELF::UseCodeAlign() const {
1471c13026e8f94bd332c0979baa9c777da99d48736Rafael Espindola  return getFlags() & ELF::SHF_EXECINSTR;
148083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung}
149083cf1574facc9ce468fba1735c794bd7e520108Jan Wen Voung
150f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindolabool MCSectionELF::isVirtualSection() const {
151c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola  return getType() == ELF::SHT_NOBITS;
152f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola}
153f2dc4aa562e2478a73fe5aeeeec16b1e496a0642Rafael Espindola
154186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voungunsigned MCSectionELF::DetermineEntrySize(SectionKind Kind) {
155186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeable1ByteCString()) return 1;
156186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeable2ByteCString()) return 2;
157186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeable4ByteCString()) return 4;
158186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeableConst4())       return 4;
159186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeableConst8())       return 8;
160186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  if (Kind.isMergeableConst16())      return 16;
161186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung  return 0;
162186e7a0fb1b2028e4fa9c3efe29d9433c91b3f66Jan Wen Voung}
163