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