blob: 3f346a359578284b5d1f313a0f4c2e62c26a395b [file] [log] [blame]
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001//===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===//
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// This file implements classes used to handle lowerings specific to common
11// object file formats.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
16#include "llvm/Constants.h"
17#include "llvm/DerivedTypes.h"
18#include "llvm/Function.h"
19#include "llvm/GlobalVariable.h"
20#include "llvm/CodeGen/MachineModuleInfoImpls.h"
21#include "llvm/MC/MCContext.h"
22#include "llvm/MC/MCExpr.h"
23#include "llvm/MC/MCSectionMachO.h"
24#include "llvm/MC/MCSectionELF.h"
Chris Lattnereb40a0f2010-05-07 17:17:41 +000025#include "llvm/MC/MCSectionCOFF.h"
Rafael Espindola30deafc2011-04-16 03:51:21 +000026#include "llvm/MC/MCStreamer.h"
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000027#include "llvm/MC/MCSymbol.h"
28#include "llvm/Target/Mangler.h"
29#include "llvm/Target/TargetData.h"
30#include "llvm/Target/TargetMachine.h"
31#include "llvm/Target/TargetOptions.h"
32#include "llvm/Support/Dwarf.h"
Rafael Espindolac85dca62011-01-23 04:28:49 +000033#include "llvm/Support/ELF.h"
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000034#include "llvm/Support/ErrorHandling.h"
35#include "llvm/Support/raw_ostream.h"
36#include "llvm/ADT/SmallString.h"
37#include "llvm/ADT/StringExtras.h"
Chris Lattner8048ebe2010-09-27 06:44:54 +000038#include "llvm/ADT/Triple.h"
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000039using namespace llvm;
Anton Korobeynikov293d5922010-02-21 20:28:15 +000040using namespace dwarf;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000041
42//===----------------------------------------------------------------------===//
43// ELF
44//===----------------------------------------------------------------------===//
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000045
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000046void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
47 const TargetMachine &TM) {
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000048 TargetLoweringObjectFile::Initialize(Ctx, TM);
49
50 BSSSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000051 getContext().getELFSection(".bss", ELF::SHT_NOBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000052 ELF::SHF_WRITE |ELF::SHF_ALLOC,
Chris Lattner287df1b2010-04-08 21:34:17 +000053 SectionKind::getBSS());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000054
55 TextSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000056 getContext().getELFSection(".text", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000057 ELF::SHF_EXECINSTR |
58 ELF::SHF_ALLOC,
Chris Lattner287df1b2010-04-08 21:34:17 +000059 SectionKind::getText());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000060
61 DataSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000062 getContext().getELFSection(".data", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000063 ELF::SHF_WRITE |ELF::SHF_ALLOC,
Chris Lattner287df1b2010-04-08 21:34:17 +000064 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000065
66 ReadOnlySection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000067 getContext().getELFSection(".rodata", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000068 ELF::SHF_ALLOC,
Chris Lattner287df1b2010-04-08 21:34:17 +000069 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000070
71 TLSDataSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000072 getContext().getELFSection(".tdata", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000073 ELF::SHF_ALLOC | ELF::SHF_TLS |
74 ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +000075 SectionKind::getThreadData());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000076
77 TLSBSSSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000078 getContext().getELFSection(".tbss", ELF::SHT_NOBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000079 ELF::SHF_ALLOC | ELF::SHF_TLS |
80 ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +000081 SectionKind::getThreadBSS());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000082
83 DataRelSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000084 getContext().getELFSection(".data.rel", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000085 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +000086 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000087
88 DataRelLocalSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000089 getContext().getELFSection(".data.rel.local", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000090 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +000091 SectionKind::getDataRelLocal());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000092
93 DataRelROSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000094 getContext().getELFSection(".data.rel.ro", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +000095 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +000096 SectionKind::getReadOnlyWithRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +000097
98 DataRelROLocalSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +000099 getContext().getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000100 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000101 SectionKind::getReadOnlyWithRelLocal());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000102
103 MergeableConst4Section =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000104 getContext().getELFSection(".rodata.cst4", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000105 ELF::SHF_ALLOC |ELF::SHF_MERGE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000106 SectionKind::getMergeableConst4());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000107
108 MergeableConst8Section =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000109 getContext().getELFSection(".rodata.cst8", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000110 ELF::SHF_ALLOC |ELF::SHF_MERGE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000111 SectionKind::getMergeableConst8());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000112
113 MergeableConst16Section =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000114 getContext().getELFSection(".rodata.cst16", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000115 ELF::SHF_ALLOC |ELF::SHF_MERGE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000116 SectionKind::getMergeableConst16());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000117
118 StaticCtorSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000119 getContext().getELFSection(".ctors", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000120 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000121 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000122
123 StaticDtorSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000124 getContext().getELFSection(".dtors", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000125 ELF::SHF_ALLOC |ELF::SHF_WRITE,
Chris Lattner287df1b2010-04-08 21:34:17 +0000126 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000127
128 // Exception Handling Sections.
129
130 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
131 // it contains relocatable pointers. In PIC mode, this is probably a big
132 // runtime hit for C++ apps. Either the contents of the LSDA need to be
133 // adjusted or this should be a data section.
134 LSDASection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000135 getContext().getELFSection(".gcc_except_table", ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000136 ELF::SHF_ALLOC,
Chris Lattner287df1b2010-04-08 21:34:17 +0000137 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000138 // Debug Info Sections.
139 DwarfAbbrevSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000140 getContext().getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000141 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000142 DwarfInfoSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000143 getContext().getELFSection(".debug_info", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000144 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000145 DwarfLineSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000146 getContext().getELFSection(".debug_line", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000147 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000148 DwarfFrameSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000149 getContext().getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000150 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000151 DwarfPubNamesSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000152 getContext().getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000153 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000154 DwarfPubTypesSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000155 getContext().getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000156 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000157 DwarfStrSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000158 getContext().getELFSection(".debug_str", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000159 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000160 DwarfLocSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000161 getContext().getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000162 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000163 DwarfARangesSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000164 getContext().getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000165 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000166 DwarfRangesSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000167 getContext().getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000168 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000169 DwarfMacroInfoSection =
Rafael Espindolac85dca62011-01-23 04:28:49 +0000170 getContext().getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0,
Chris Lattner287df1b2010-04-08 21:34:17 +0000171 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000172}
173
Rafael Espindola0cf5e3d2011-01-23 05:43:40 +0000174const MCSection *TargetLoweringObjectFileELF::getEHFrameSection() const {
175 return getContext().getELFSection(".eh_frame", ELF::SHT_PROGBITS,
176 ELF::SHF_ALLOC,
177 SectionKind::getDataRel());
178}
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000179
Rafael Espindola30deafc2011-04-16 03:51:21 +0000180MCSymbol *
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000181TargetLoweringObjectFileELF::getCFIPersonalitySymbol(const GlobalValue *GV,
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000182 Mangler *Mang,
183 MachineModuleInfo *MMI) const {
Rafael Espindola60246a92011-04-27 23:17:57 +0000184 unsigned Encoding = getPersonalityEncoding();
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000185 switch (Encoding & 0x70) {
186 default:
187 report_fatal_error("We do not support this DWARF encoding yet!");
188 case dwarf::DW_EH_PE_absptr:
189 return Mang->getSymbol(GV);
190 break;
191 case dwarf::DW_EH_PE_pcrel: {
Rafael Espindolafb66f472011-06-13 03:09:13 +0000192 return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
193 Mang->getSymbol(GV)->getName());
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000194 break;
195 }
196 }
Rafael Espindola30deafc2011-04-16 03:51:21 +0000197}
198
199void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,
200 const TargetMachine &TM,
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000201 const MCSymbol *Sym) const {
Rafael Espindolafb66f472011-06-13 03:09:13 +0000202 SmallString<64> NameData("DW.ref.");
203 NameData += Sym->getName();
204 MCSymbol *Label = getContext().GetOrCreateSymbol(NameData);
Rafael Espindola018e38c2011-04-27 21:29:52 +0000205 Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
206 Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
Rafael Espindolafb66f472011-06-13 03:09:13 +0000207 StringRef Prefix = ".data.";
208 NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end());
Rafael Espindola018e38c2011-04-27 21:29:52 +0000209 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
210 const MCSection *Sec = getContext().getELFSection(NameData,
211 ELF::SHT_PROGBITS,
212 Flags,
213 SectionKind::getDataRel(),
214 0, Label->getName());
215 Streamer.SwitchSection(Sec);
216 Streamer.EmitValueToAlignment(8);
217 Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
218 const MCExpr *E = MCConstantExpr::Create(8, getContext());
219 Streamer.EmitELFSize(Label, E);
220 Streamer.EmitLabel(Label);
Rafael Espindola30deafc2011-04-16 03:51:21 +0000221
Rafael Espindola018e38c2011-04-27 21:29:52 +0000222 unsigned Size = TM.getTargetData()->getPointerSize();
223 Streamer.EmitSymbolValue(Sym, Size);
Rafael Espindola30deafc2011-04-16 03:51:21 +0000224}
225
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000226static SectionKind
227getELFKindForNamedSection(StringRef Name, SectionKind K) {
Rafael Espindolae6657982011-05-24 03:10:31 +0000228 // N.B.: The defaults used in here are no the same ones used in MC.
229 // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
230 // both gas and MC will produce a section with no flags. Given
231 // section(".eh_frame") gcc will produce
232 // .section .eh_frame,"a",@progbits
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000233 if (Name.empty() || Name[0] != '.') return K;
234
235 // Some lame default implementation based on some magic section names.
236 if (Name == ".bss" ||
237 Name.startswith(".bss.") ||
238 Name.startswith(".gnu.linkonce.b.") ||
239 Name.startswith(".llvm.linkonce.b.") ||
240 Name == ".sbss" ||
241 Name.startswith(".sbss.") ||
242 Name.startswith(".gnu.linkonce.sb.") ||
243 Name.startswith(".llvm.linkonce.sb."))
244 return SectionKind::getBSS();
245
246 if (Name == ".tdata" ||
247 Name.startswith(".tdata.") ||
248 Name.startswith(".gnu.linkonce.td.") ||
249 Name.startswith(".llvm.linkonce.td."))
250 return SectionKind::getThreadData();
251
252 if (Name == ".tbss" ||
253 Name.startswith(".tbss.") ||
254 Name.startswith(".gnu.linkonce.tb.") ||
255 Name.startswith(".llvm.linkonce.tb."))
256 return SectionKind::getThreadBSS();
257
258 return K;
259}
260
261
262static unsigned getELFSectionType(StringRef Name, SectionKind K) {
263
264 if (Name == ".init_array")
Rafael Espindolac85dca62011-01-23 04:28:49 +0000265 return ELF::SHT_INIT_ARRAY;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000266
267 if (Name == ".fini_array")
Rafael Espindolac85dca62011-01-23 04:28:49 +0000268 return ELF::SHT_FINI_ARRAY;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000269
270 if (Name == ".preinit_array")
Rafael Espindolac85dca62011-01-23 04:28:49 +0000271 return ELF::SHT_PREINIT_ARRAY;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000272
273 if (K.isBSS() || K.isThreadBSS())
Rafael Espindolac85dca62011-01-23 04:28:49 +0000274 return ELF::SHT_NOBITS;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000275
Rafael Espindolac85dca62011-01-23 04:28:49 +0000276 return ELF::SHT_PROGBITS;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000277}
278
279
280static unsigned
281getELFSectionFlags(SectionKind K) {
282 unsigned Flags = 0;
283
284 if (!K.isMetadata())
Rafael Espindola1c130262011-01-23 04:43:11 +0000285 Flags |= ELF::SHF_ALLOC;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000286
287 if (K.isText())
Rafael Espindola1c130262011-01-23 04:43:11 +0000288 Flags |= ELF::SHF_EXECINSTR;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000289
Rafael Espindolad846e3f2011-06-07 23:26:45 +0000290 if (K.isWriteable())
Rafael Espindola1c130262011-01-23 04:43:11 +0000291 Flags |= ELF::SHF_WRITE;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000292
293 if (K.isThreadLocal())
Rafael Espindola1c130262011-01-23 04:43:11 +0000294 Flags |= ELF::SHF_TLS;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000295
296 // K.isMergeableConst() is left out to honour PR4650
297 if (K.isMergeableCString() || K.isMergeableConst4() ||
298 K.isMergeableConst8() || K.isMergeableConst16())
Rafael Espindola1c130262011-01-23 04:43:11 +0000299 Flags |= ELF::SHF_MERGE;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000300
301 if (K.isMergeableCString())
Rafael Espindola1c130262011-01-23 04:43:11 +0000302 Flags |= ELF::SHF_STRINGS;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000303
304 return Flags;
305}
306
307
308const MCSection *TargetLoweringObjectFileELF::
309getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
310 Mangler *Mang, const TargetMachine &TM) const {
311 StringRef SectionName = GV->getSection();
312
313 // Infer section flags from the section name if we can.
314 Kind = getELFKindForNamedSection(SectionName, Kind);
315
Chris Lattner287df1b2010-04-08 21:34:17 +0000316 return getContext().getELFSection(SectionName,
317 getELFSectionType(SectionName, Kind),
Rafael Espindola34be3962010-11-09 23:42:07 +0000318 getELFSectionFlags(Kind), Kind);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000319}
320
Chris Lattner43ac7212010-04-13 00:36:43 +0000321/// getSectionPrefixForGlobal - Return the section prefix name used by options
322/// FunctionsSections and DataSections.
323static const char *getSectionPrefixForGlobal(SectionKind Kind) {
324 if (Kind.isText()) return ".text.";
325 if (Kind.isReadOnly()) return ".rodata.";
326
327 if (Kind.isThreadData()) return ".tdata.";
328 if (Kind.isThreadBSS()) return ".tbss.";
329
330 if (Kind.isDataNoRel()) return ".data.";
331 if (Kind.isDataRelLocal()) return ".data.rel.local.";
332 if (Kind.isDataRel()) return ".data.rel.";
333 if (Kind.isReadOnlyWithRelLocal()) return ".data.rel.ro.local.";
334
335 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
336 return ".data.rel.ro.";
337}
338
339
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000340const MCSection *TargetLoweringObjectFileELF::
341SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
342 Mangler *Mang, const TargetMachine &TM) const {
Chris Lattner43ac7212010-04-13 00:36:43 +0000343 // If we have -ffunction-section or -fdata-section then we should emit the
344 // global value to a uniqued section specifically for it.
345 bool EmitUniquedSection;
346 if (Kind.isText())
347 EmitUniquedSection = TM.getFunctionSections();
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000348 else
Chris Lattner43ac7212010-04-13 00:36:43 +0000349 EmitUniquedSection = TM.getDataSections();
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000350
351 // If this global is linkonce/weak and the target handles this by emitting it
352 // into a 'uniqued' section name, create and return the section now.
Chris Lattner43ac7212010-04-13 00:36:43 +0000353 if ((GV->isWeakForLinker() || EmitUniquedSection) &&
354 !Kind.isCommon() && !Kind.isBSS()) {
355 const char *Prefix;
Rafael Espindola5d618ef2011-02-14 22:23:49 +0000356 Prefix = getSectionPrefixForGlobal(Kind);
Chris Lattner43ac7212010-04-13 00:36:43 +0000357
Chris Lattner4c6741f2010-03-15 20:37:38 +0000358 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
359 MCSymbol *Sym = Mang->getSymbol(GV);
360 Name.append(Sym->getName().begin(), Sym->getName().end());
Rafael Espindola5d618ef2011-02-14 22:23:49 +0000361 StringRef Group = "";
362 unsigned Flags = getELFSectionFlags(Kind);
363 if (GV->isWeakForLinker()) {
364 Group = Sym->getName();
365 Flags |= ELF::SHF_GROUP;
366 }
367
Chris Lattner287df1b2010-04-08 21:34:17 +0000368 return getContext().getELFSection(Name.str(),
369 getELFSectionType(Name.str(), Kind),
Rafael Espindola5d618ef2011-02-14 22:23:49 +0000370 Flags, Kind, 0, Group);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000371 }
372
373 if (Kind.isText()) return TextSection;
374
375 if (Kind.isMergeable1ByteCString() ||
376 Kind.isMergeable2ByteCString() ||
377 Kind.isMergeable4ByteCString()) {
378
379 // We also need alignment here.
380 // FIXME: this is getting the alignment of the character, not the
381 // alignment of the global!
382 unsigned Align =
383 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
384
385 const char *SizeSpec = ".rodata.str1.";
386 if (Kind.isMergeable2ByteCString())
387 SizeSpec = ".rodata.str2.";
388 else if (Kind.isMergeable4ByteCString())
389 SizeSpec = ".rodata.str4.";
390 else
391 assert(Kind.isMergeable1ByteCString() && "unknown string width");
392
393
394 std::string Name = SizeSpec + utostr(Align);
Rafael Espindolac85dca62011-01-23 04:28:49 +0000395 return getContext().getELFSection(Name, ELF::SHT_PROGBITS,
Rafael Espindola1c130262011-01-23 04:43:11 +0000396 ELF::SHF_ALLOC |
397 ELF::SHF_MERGE |
398 ELF::SHF_STRINGS,
Chris Lattner287df1b2010-04-08 21:34:17 +0000399 Kind);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000400 }
401
402 if (Kind.isMergeableConst()) {
403 if (Kind.isMergeableConst4() && MergeableConst4Section)
404 return MergeableConst4Section;
405 if (Kind.isMergeableConst8() && MergeableConst8Section)
406 return MergeableConst8Section;
407 if (Kind.isMergeableConst16() && MergeableConst16Section)
408 return MergeableConst16Section;
409 return ReadOnlySection; // .const
410 }
411
412 if (Kind.isReadOnly()) return ReadOnlySection;
413
414 if (Kind.isThreadData()) return TLSDataSection;
415 if (Kind.isThreadBSS()) return TLSBSSSection;
416
417 // Note: we claim that common symbols are put in BSSSection, but they are
418 // really emitted with the magic .comm directive, which creates a symbol table
419 // entry but not a section.
420 if (Kind.isBSS() || Kind.isCommon()) return BSSSection;
421
422 if (Kind.isDataNoRel()) return DataSection;
423 if (Kind.isDataRelLocal()) return DataRelLocalSection;
424 if (Kind.isDataRel()) return DataRelSection;
425 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
426
427 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
428 return DataRelROSection;
429}
430
431/// getSectionForConstant - Given a mergeable constant with the
432/// specified size and relocation information, return a section that it
433/// should be placed in.
434const MCSection *TargetLoweringObjectFileELF::
435getSectionForConstant(SectionKind Kind) const {
436 if (Kind.isMergeableConst4() && MergeableConst4Section)
437 return MergeableConst4Section;
438 if (Kind.isMergeableConst8() && MergeableConst8Section)
439 return MergeableConst8Section;
440 if (Kind.isMergeableConst16() && MergeableConst16Section)
441 return MergeableConst16Section;
442 if (Kind.isReadOnly())
443 return ReadOnlySection;
444
445 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
446 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
447 return DataRelROSection;
448}
449
450const MCExpr *TargetLoweringObjectFileELF::
Chris Lattner3192d142010-03-11 19:41:58 +0000451getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
452 MachineModuleInfo *MMI,
453 unsigned Encoding, MCStreamer &Streamer) const {
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000454
455 if (Encoding & dwarf::DW_EH_PE_indirect) {
456 MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>();
457
458 SmallString<128> Name;
459 Mang->getNameWithPrefix(Name, GV, true);
460 Name += ".DW.stub";
461
462 // Add information about the stub reference to ELFMMI so that the stub
463 // gets emitted by the asmprinter.
Chris Lattner9b97a732010-03-30 18:10:53 +0000464 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
Chris Lattner4c6741f2010-03-15 20:37:38 +0000465 MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
Bill Wendlingcebae362010-03-10 22:34:10 +0000466 if (StubSym.getPointer() == 0) {
Chris Lattner4c6741f2010-03-15 20:37:38 +0000467 MCSymbol *Sym = Mang->getSymbol(GV);
468 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000469 }
470
471 return TargetLoweringObjectFile::
Rafael Espindola4788c3e2011-04-20 03:08:09 +0000472 getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000473 }
474
475 return TargetLoweringObjectFile::
Chris Lattner3192d142010-03-11 19:41:58 +0000476 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000477}
478
479//===----------------------------------------------------------------------===//
480// MachO
481//===----------------------------------------------------------------------===//
482
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000483void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
484 const TargetMachine &TM) {
Chris Lattner09d53fe2010-03-10 07:20:42 +0000485 IsFunctionEHFrameSymbolPrivate = false;
486 SupportsWeakOmittedEHFrame = false;
Chris Lattner8048ebe2010-09-27 06:44:54 +0000487
Daniel Dunbarebc50662011-04-19 20:32:39 +0000488 // .comm doesn't support alignment before Leopard.
Chris Lattner8048ebe2010-09-27 06:44:54 +0000489 Triple T(((LLVMTargetMachine&)TM).getTargetTriple());
Daniel Dunbar558692f2011-04-20 00:14:25 +0000490 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
Daniel Dunbarebc50662011-04-19 20:32:39 +0000491 CommDirectiveSupportsAlignment = false;
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000492
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000493 TargetLoweringObjectFile::Initialize(Ctx, TM);
494
495 TextSection // .text
Chris Lattner22772212010-04-08 20:40:11 +0000496 = getContext().getMachOSection("__TEXT", "__text",
497 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
498 SectionKind::getText());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000499 DataSection // .data
Chris Lattner22772212010-04-08 20:40:11 +0000500 = getContext().getMachOSection("__DATA", "__data", 0,
501 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000502
Eric Christopher423c9e32010-05-17 21:02:07 +0000503 TLSDataSection // .tdata
504 = getContext().getMachOSection("__DATA", "__thread_data",
505 MCSectionMachO::S_THREAD_LOCAL_REGULAR,
506 SectionKind::getDataRel());
507 TLSBSSSection // .tbss
508 = getContext().getMachOSection("__DATA", "__thread_bss",
509 MCSectionMachO::S_THREAD_LOCAL_ZEROFILL,
510 SectionKind::getThreadBSS());
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000511
Eric Christopher423c9e32010-05-17 21:02:07 +0000512 // TODO: Verify datarel below.
513 TLSTLVSection // .tlv
514 = getContext().getMachOSection("__DATA", "__thread_vars",
515 MCSectionMachO::S_THREAD_LOCAL_VARIABLES,
516 SectionKind::getDataRel());
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000517
Eric Christopherc6177a42010-05-17 22:53:55 +0000518 TLSThreadInitSection
519 = getContext().getMachOSection("__DATA", "__thread_init",
520 MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS,
521 SectionKind::getDataRel());
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000522
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000523 CStringSection // .cstring
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000524 = getContext().getMachOSection("__TEXT", "__cstring",
Chris Lattner22772212010-04-08 20:40:11 +0000525 MCSectionMachO::S_CSTRING_LITERALS,
526 SectionKind::getMergeable1ByteCString());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000527 UStringSection
Chris Lattner22772212010-04-08 20:40:11 +0000528 = getContext().getMachOSection("__TEXT","__ustring", 0,
529 SectionKind::getMergeable2ByteCString());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000530 FourByteConstantSection // .literal4
Chris Lattner22772212010-04-08 20:40:11 +0000531 = getContext().getMachOSection("__TEXT", "__literal4",
532 MCSectionMachO::S_4BYTE_LITERALS,
533 SectionKind::getMergeableConst4());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000534 EightByteConstantSection // .literal8
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000535 = getContext().getMachOSection("__TEXT", "__literal8",
Chris Lattner22772212010-04-08 20:40:11 +0000536 MCSectionMachO::S_8BYTE_LITERALS,
537 SectionKind::getMergeableConst8());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000538
539 // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
540 // to using it in -static mode.
541 SixteenByteConstantSection = 0;
542 if (TM.getRelocationModel() != Reloc::Static &&
543 TM.getTargetData()->getPointerSize() == 32)
544 SixteenByteConstantSection = // .literal16
Chris Lattner22772212010-04-08 20:40:11 +0000545 getContext().getMachOSection("__TEXT", "__literal16",
546 MCSectionMachO::S_16BYTE_LITERALS,
547 SectionKind::getMergeableConst16());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000548
549 ReadOnlySection // .const
Chris Lattner22772212010-04-08 20:40:11 +0000550 = getContext().getMachOSection("__TEXT", "__const", 0,
551 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000552
553 TextCoalSection
Chris Lattner22772212010-04-08 20:40:11 +0000554 = getContext().getMachOSection("__TEXT", "__textcoal_nt",
555 MCSectionMachO::S_COALESCED |
556 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS,
557 SectionKind::getText());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000558 ConstTextCoalSection
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000559 = getContext().getMachOSection("__TEXT", "__const_coal",
Chris Lattner22772212010-04-08 20:40:11 +0000560 MCSectionMachO::S_COALESCED,
Chris Lattner6a624a62010-07-15 21:22:00 +0000561 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000562 ConstDataSection // .const_data
Chris Lattner22772212010-04-08 20:40:11 +0000563 = getContext().getMachOSection("__DATA", "__const", 0,
564 SectionKind::getReadOnlyWithRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000565 DataCoalSection
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000566 = getContext().getMachOSection("__DATA","__datacoal_nt",
Chris Lattner22772212010-04-08 20:40:11 +0000567 MCSectionMachO::S_COALESCED,
568 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000569 DataCommonSection
Chris Lattner22772212010-04-08 20:40:11 +0000570 = getContext().getMachOSection("__DATA","__common",
571 MCSectionMachO::S_ZEROFILL,
572 SectionKind::getBSS());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000573 DataBSSSection
Chris Lattner22772212010-04-08 20:40:11 +0000574 = getContext().getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL,
575 SectionKind::getBSS());
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000576
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000577
578 LazySymbolPointerSection
Chris Lattner22772212010-04-08 20:40:11 +0000579 = getContext().getMachOSection("__DATA", "__la_symbol_ptr",
580 MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
581 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000582 NonLazySymbolPointerSection
Chris Lattner22772212010-04-08 20:40:11 +0000583 = getContext().getMachOSection("__DATA", "__nl_symbol_ptr",
584 MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
585 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000586
587 if (TM.getRelocationModel() == Reloc::Static) {
588 StaticCtorSection
Chris Lattner22772212010-04-08 20:40:11 +0000589 = getContext().getMachOSection("__TEXT", "__constructor", 0,
590 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000591 StaticDtorSection
Chris Lattner22772212010-04-08 20:40:11 +0000592 = getContext().getMachOSection("__TEXT", "__destructor", 0,
593 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000594 } else {
595 StaticCtorSection
Chris Lattner22772212010-04-08 20:40:11 +0000596 = getContext().getMachOSection("__DATA", "__mod_init_func",
597 MCSectionMachO::S_MOD_INIT_FUNC_POINTERS,
598 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000599 StaticDtorSection
Chris Lattner22772212010-04-08 20:40:11 +0000600 = getContext().getMachOSection("__DATA", "__mod_term_func",
601 MCSectionMachO::S_MOD_TERM_FUNC_POINTERS,
602 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000603 }
604
605 // Exception Handling.
Chris Lattner22772212010-04-08 20:40:11 +0000606 LSDASection = getContext().getMachOSection("__TEXT", "__gcc_except_tab", 0,
607 SectionKind::getReadOnlyWithRel());
Bill Wendlingaa0a8f32011-06-22 22:22:24 +0000608
609 CompactUnwindSection =
610 getContext().getMachOSection("__LD", "__compact_unwind",
611 MCSectionMachO::S_ATTR_DEBUG,
612 SectionKind::getReadOnly());
613
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000614 // Debug Information.
615 DwarfAbbrevSection =
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000616 getContext().getMachOSection("__DWARF", "__debug_abbrev",
Chris Lattner22772212010-04-08 20:40:11 +0000617 MCSectionMachO::S_ATTR_DEBUG,
618 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000619 DwarfInfoSection =
Chris Lattner22772212010-04-08 20:40:11 +0000620 getContext().getMachOSection("__DWARF", "__debug_info",
621 MCSectionMachO::S_ATTR_DEBUG,
622 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000623 DwarfLineSection =
Chris Lattner22772212010-04-08 20:40:11 +0000624 getContext().getMachOSection("__DWARF", "__debug_line",
625 MCSectionMachO::S_ATTR_DEBUG,
626 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000627 DwarfFrameSection =
Chris Lattner22772212010-04-08 20:40:11 +0000628 getContext().getMachOSection("__DWARF", "__debug_frame",
629 MCSectionMachO::S_ATTR_DEBUG,
630 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000631 DwarfPubNamesSection =
Chris Lattner22772212010-04-08 20:40:11 +0000632 getContext().getMachOSection("__DWARF", "__debug_pubnames",
633 MCSectionMachO::S_ATTR_DEBUG,
634 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000635 DwarfPubTypesSection =
Chris Lattner22772212010-04-08 20:40:11 +0000636 getContext().getMachOSection("__DWARF", "__debug_pubtypes",
637 MCSectionMachO::S_ATTR_DEBUG,
638 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000639 DwarfStrSection =
Chris Lattner22772212010-04-08 20:40:11 +0000640 getContext().getMachOSection("__DWARF", "__debug_str",
641 MCSectionMachO::S_ATTR_DEBUG,
642 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000643 DwarfLocSection =
Chris Lattner22772212010-04-08 20:40:11 +0000644 getContext().getMachOSection("__DWARF", "__debug_loc",
645 MCSectionMachO::S_ATTR_DEBUG,
646 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000647 DwarfARangesSection =
Chris Lattner22772212010-04-08 20:40:11 +0000648 getContext().getMachOSection("__DWARF", "__debug_aranges",
649 MCSectionMachO::S_ATTR_DEBUG,
650 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000651 DwarfRangesSection =
Chris Lattner22772212010-04-08 20:40:11 +0000652 getContext().getMachOSection("__DWARF", "__debug_ranges",
653 MCSectionMachO::S_ATTR_DEBUG,
654 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000655 DwarfMacroInfoSection =
Chris Lattner22772212010-04-08 20:40:11 +0000656 getContext().getMachOSection("__DWARF", "__debug_macinfo",
657 MCSectionMachO::S_ATTR_DEBUG,
658 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000659 DwarfDebugInlineSection =
Chris Lattner22772212010-04-08 20:40:11 +0000660 getContext().getMachOSection("__DWARF", "__debug_inlined",
661 MCSectionMachO::S_ATTR_DEBUG,
662 SectionKind::getMetadata());
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000663
Eric Christopher8116ca52010-05-22 00:10:22 +0000664 TLSExtraDataSection = TLSTLVSection;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000665}
666
Rafael Espindola0cf5e3d2011-01-23 05:43:40 +0000667const MCSection *TargetLoweringObjectFileMachO::getEHFrameSection() const {
668 return getContext().getMachOSection("__TEXT", "__eh_frame",
669 MCSectionMachO::S_COALESCED |
670 MCSectionMachO::S_ATTR_NO_TOC |
671 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
672 MCSectionMachO::S_ATTR_LIVE_SUPPORT,
673 SectionKind::getReadOnly());
674}
675
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000676const MCSection *TargetLoweringObjectFileMachO::
677getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
678 Mangler *Mang, const TargetMachine &TM) const {
679 // Parse the section specifier and create it if valid.
680 StringRef Segment, Section;
Stuart Hastings65c8bca2011-03-19 02:42:31 +0000681 unsigned TAA = 0, StubSize = 0;
682 bool TAAParsed;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000683 std::string ErrorCode =
684 MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
Stuart Hastings65c8bca2011-03-19 02:42:31 +0000685 TAA, TAAParsed, StubSize);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000686 if (!ErrorCode.empty()) {
Chris Lattner75361b62010-04-07 22:58:41 +0000687 // If invalid, report the error with report_fatal_error.
688 report_fatal_error("Global variable '" + GV->getNameStr() +
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000689 "' has an invalid section specifier '" + GV->getSection()+
690 "': " + ErrorCode + ".");
691 // Fall back to dropping it into the data section.
692 return DataSection;
693 }
694
695 // Get the section.
696 const MCSectionMachO *S =
Chris Lattner22772212010-04-08 20:40:11 +0000697 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000698
Stuart Hastings6ad82d82011-02-21 17:27:17 +0000699 // If TAA wasn't set by ParseSectionSpecifier() above,
700 // use the value returned by getMachOSection() as a default.
Stuart Hastings65c8bca2011-03-19 02:42:31 +0000701 if (!TAAParsed)
Stuart Hastings6ad82d82011-02-21 17:27:17 +0000702 TAA = S->getTypeAndAttributes();
703
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000704 // Okay, now that we got the section, verify that the TAA & StubSize agree.
705 // If the user declared multiple globals with different section flags, we need
706 // to reject it here.
707 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
Chris Lattner75361b62010-04-07 22:58:41 +0000708 // If invalid, report the error with report_fatal_error.
709 report_fatal_error("Global variable '" + GV->getNameStr() +
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000710 "' section type or attributes does not match previous"
711 " section specifier");
712 }
713
714 return S;
715}
716
717const MCSection *TargetLoweringObjectFileMachO::
718SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
Eric Christopher8116ca52010-05-22 00:10:22 +0000719 Mangler *Mang, const TargetMachine &TM) const {
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000720
Eric Christopher02b46bc2010-05-25 21:28:50 +0000721 // Handle thread local data.
Eric Christopher8116ca52010-05-22 00:10:22 +0000722 if (Kind.isThreadBSS()) return TLSBSSSection;
Eric Christopher02b46bc2010-05-25 21:28:50 +0000723 if (Kind.isThreadData()) return TLSDataSection;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000724
725 if (Kind.isText())
726 return GV->isWeakForLinker() ? TextCoalSection : TextSection;
727
728 // If this is weak/linkonce, put this in a coalescable section, either in text
729 // or data depending on if it is writable.
730 if (GV->isWeakForLinker()) {
731 if (Kind.isReadOnly())
732 return ConstTextCoalSection;
733 return DataCoalSection;
734 }
735
736 // FIXME: Alignment check should be handled by section classifier.
Chris Lattner98f15d22010-03-07 04:28:09 +0000737 if (Kind.isMergeable1ByteCString() &&
738 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
739 return CStringSection;
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000740
Chris Lattner98f15d22010-03-07 04:28:09 +0000741 // Do not put 16-bit arrays in the UString section if they have an
742 // externally visible label, this runs into issues with certain linker
743 // versions.
744 if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() &&
745 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)) < 32)
746 return UStringSection;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000747
748 if (Kind.isMergeableConst()) {
749 if (Kind.isMergeableConst4())
750 return FourByteConstantSection;
751 if (Kind.isMergeableConst8())
752 return EightByteConstantSection;
753 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
754 return SixteenByteConstantSection;
755 }
756
757 // Otherwise, if it is readonly, but not something we can specially optimize,
758 // just drop it in .const.
759 if (Kind.isReadOnly())
760 return ReadOnlySection;
761
762 // If this is marked const, put it into a const section. But if the dynamic
763 // linker needs to write to it, put it in the data segment.
764 if (Kind.isReadOnlyWithRel())
765 return ConstDataSection;
766
767 // Put zero initialized globals with strong external linkage in the
768 // DATA, __common section with the .zerofill directive.
769 if (Kind.isBSSExtern())
770 return DataCommonSection;
771
772 // Put zero initialized globals with local linkage in __DATA,__bss directive
773 // with the .zerofill directive (aka .lcomm).
774 if (Kind.isBSSLocal())
775 return DataBSSSection;
Michael J. Spencer579d7a32010-10-27 18:52:20 +0000776
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000777 // Otherwise, just drop the variable in the normal data section.
778 return DataSection;
779}
780
781const MCSection *
782TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
783 // If this constant requires a relocation, we have to put it in the data
784 // segment, not in the text segment.
785 if (Kind.isDataRel() || Kind.isReadOnlyWithRel())
786 return ConstDataSection;
787
788 if (Kind.isMergeableConst4())
789 return FourByteConstantSection;
790 if (Kind.isMergeableConst8())
791 return EightByteConstantSection;
792 if (Kind.isMergeableConst16() && SixteenByteConstantSection)
793 return SixteenByteConstantSection;
794 return ReadOnlySection; // .const
795}
796
797/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
798/// not to emit the UsedDirective for some symbols in llvm.used.
799// FIXME: REMOVE this (rdar://7071300)
800bool TargetLoweringObjectFileMachO::
801shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
802 /// On Darwin, internally linked data beginning with "L" or "l" does not have
803 /// the directive emitted (this occurs in ObjC metadata).
804 if (!GV) return false;
805
Bill Wendling07d31772010-06-29 22:34:52 +0000806 // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000807 if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
808 // FIXME: ObjC metadata is currently emitted as internal symbols that have
Bill Wendling07d31772010-06-29 22:34:52 +0000809 // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and
810 // this horrible hack can go away.
Chris Lattner4c6741f2010-03-15 20:37:38 +0000811 MCSymbol *Sym = Mang->getSymbol(GV);
812 if (Sym->getName()[0] == 'L' || Sym->getName()[0] == 'l')
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000813 return false;
814 }
815
816 return true;
817}
818
819const MCExpr *TargetLoweringObjectFileMachO::
Chris Lattner3192d142010-03-11 19:41:58 +0000820getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
821 MachineModuleInfo *MMI, unsigned Encoding,
822 MCStreamer &Streamer) const {
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000823 // The mach-o version of this method defaults to returning a stub reference.
824
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000825 if (Encoding & DW_EH_PE_indirect) {
826 MachineModuleInfoMachO &MachOMMI =
827 MMI->getObjFileInfo<MachineModuleInfoMachO>();
828
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000829 SmallString<128> Name;
830 Mang->getNameWithPrefix(Name, GV, true);
831 Name += "$non_lazy_ptr";
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000832
833 // Add information about the stub reference to MachOMMI so that the stub
834 // gets emitted by the asmprinter.
Chris Lattner9b97a732010-03-30 18:10:53 +0000835 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
Chris Lattner4c6741f2010-03-15 20:37:38 +0000836 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
Bill Wendlingcebae362010-03-10 22:34:10 +0000837 if (StubSym.getPointer() == 0) {
Chris Lattner4c6741f2010-03-15 20:37:38 +0000838 MCSymbol *Sym = Mang->getSymbol(GV);
839 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000840 }
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000841
842 return TargetLoweringObjectFile::
Rafael Espindola4788c3e2011-04-20 03:08:09 +0000843 getExprForDwarfReference(SSym, Encoding & ~dwarf::DW_EH_PE_indirect, Streamer);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000844 }
845
846 return TargetLoweringObjectFile::
Chris Lattner3192d142010-03-11 19:41:58 +0000847 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000848}
849
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000850MCSymbol *TargetLoweringObjectFileMachO::
Rafael Espindola60246a92011-04-27 23:17:57 +0000851getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
Rafael Espindola7afec9c2011-04-27 23:08:15 +0000852 MachineModuleInfo *MMI) const {
853 // The mach-o version of this method defaults to returning a stub reference.
854 MachineModuleInfoMachO &MachOMMI =
855 MMI->getObjFileInfo<MachineModuleInfoMachO>();
856
857 SmallString<128> Name;
858 Mang->getNameWithPrefix(Name, GV, true);
859 Name += "$non_lazy_ptr";
860
861 // Add information about the stub reference to MachOMMI so that the stub
862 // gets emitted by the asmprinter.
863 MCSymbol *SSym = getContext().GetOrCreateSymbol(Name.str());
864 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
865 if (StubSym.getPointer() == 0) {
866 MCSymbol *Sym = Mang->getSymbol(GV);
867 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
868 }
869
870 return SSym;
871}
872
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000873unsigned TargetLoweringObjectFileMachO::getPersonalityEncoding() const {
874 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
875}
876
877unsigned TargetLoweringObjectFileMachO::getLSDAEncoding() const {
878 return DW_EH_PE_pcrel;
879}
880
Rafael Espindola5426a9e2011-05-01 04:49:54 +0000881unsigned TargetLoweringObjectFileMachO::getFDEEncoding(bool CFI) const {
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000882 return DW_EH_PE_pcrel;
883}
884
885unsigned TargetLoweringObjectFileMachO::getTTypeEncoding() const {
Bill Wendling505ad8b2010-03-15 21:09:38 +0000886 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4;
Anton Korobeynikov293d5922010-02-21 20:28:15 +0000887}
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000888
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000889//===----------------------------------------------------------------------===//
890// COFF
891//===----------------------------------------------------------------------===//
892
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000893void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
894 const TargetMachine &TM) {
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000895 TargetLoweringObjectFile::Initialize(Ctx, TM);
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000896 TextSection =
897 getContext().getCOFFSection(".text",
Daniel Dunbar94610582010-07-01 20:07:24 +0000898 COFF::IMAGE_SCN_CNT_CODE |
899 COFF::IMAGE_SCN_MEM_EXECUTE |
900 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000901 SectionKind::getText());
902 DataSection =
903 getContext().getCOFFSection(".data",
Daniel Dunbar94610582010-07-01 20:07:24 +0000904 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
905 COFF::IMAGE_SCN_MEM_READ |
906 COFF::IMAGE_SCN_MEM_WRITE,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000907 SectionKind::getDataRel());
908 ReadOnlySection =
909 getContext().getCOFFSection(".rdata",
Daniel Dunbar94610582010-07-01 20:07:24 +0000910 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
911 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000912 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000913 StaticCtorSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000914 getContext().getCOFFSection(".ctors",
Daniel Dunbar94610582010-07-01 20:07:24 +0000915 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
916 COFF::IMAGE_SCN_MEM_READ |
917 COFF::IMAGE_SCN_MEM_WRITE,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000918 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000919 StaticDtorSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000920 getContext().getCOFFSection(".dtors",
Daniel Dunbar94610582010-07-01 20:07:24 +0000921 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
922 COFF::IMAGE_SCN_MEM_READ |
923 COFF::IMAGE_SCN_MEM_WRITE,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000924 SectionKind::getDataRel());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000925
926 // FIXME: We're emitting LSDA info into a readonly section on COFF, even
927 // though it contains relocatable pointers. In PIC mode, this is probably a
928 // big runtime hit for C++ apps. Either the contents of the LSDA need to be
929 // adjusted or this should be a data section.
930 LSDASection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000931 getContext().getCOFFSection(".gcc_except_table",
Daniel Dunbar94610582010-07-01 20:07:24 +0000932 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
933 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000934 SectionKind::getReadOnly());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000935 // Debug info.
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000936 DwarfAbbrevSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000937 getContext().getCOFFSection(".debug_abbrev",
Daniel Dunbar94610582010-07-01 20:07:24 +0000938 COFF::IMAGE_SCN_MEM_DISCARDABLE |
939 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000940 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000941 DwarfInfoSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000942 getContext().getCOFFSection(".debug_info",
Daniel Dunbar94610582010-07-01 20:07:24 +0000943 COFF::IMAGE_SCN_MEM_DISCARDABLE |
944 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000945 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000946 DwarfLineSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000947 getContext().getCOFFSection(".debug_line",
Daniel Dunbar94610582010-07-01 20:07:24 +0000948 COFF::IMAGE_SCN_MEM_DISCARDABLE |
949 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000950 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000951 DwarfFrameSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000952 getContext().getCOFFSection(".debug_frame",
Daniel Dunbar94610582010-07-01 20:07:24 +0000953 COFF::IMAGE_SCN_MEM_DISCARDABLE |
954 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000955 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000956 DwarfPubNamesSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000957 getContext().getCOFFSection(".debug_pubnames",
Daniel Dunbar94610582010-07-01 20:07:24 +0000958 COFF::IMAGE_SCN_MEM_DISCARDABLE |
959 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000960 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000961 DwarfPubTypesSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000962 getContext().getCOFFSection(".debug_pubtypes",
Daniel Dunbar94610582010-07-01 20:07:24 +0000963 COFF::IMAGE_SCN_MEM_DISCARDABLE |
964 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000965 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000966 DwarfStrSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000967 getContext().getCOFFSection(".debug_str",
Daniel Dunbar94610582010-07-01 20:07:24 +0000968 COFF::IMAGE_SCN_MEM_DISCARDABLE |
969 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000970 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000971 DwarfLocSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000972 getContext().getCOFFSection(".debug_loc",
Daniel Dunbar94610582010-07-01 20:07:24 +0000973 COFF::IMAGE_SCN_MEM_DISCARDABLE |
974 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000975 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000976 DwarfARangesSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000977 getContext().getCOFFSection(".debug_aranges",
Daniel Dunbar94610582010-07-01 20:07:24 +0000978 COFF::IMAGE_SCN_MEM_DISCARDABLE |
979 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000980 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000981 DwarfRangesSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000982 getContext().getCOFFSection(".debug_ranges",
Daniel Dunbar94610582010-07-01 20:07:24 +0000983 COFF::IMAGE_SCN_MEM_DISCARDABLE |
984 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000985 SectionKind::getMetadata());
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +0000986 DwarfMacroInfoSection =
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000987 getContext().getCOFFSection(".debug_macinfo",
Daniel Dunbar94610582010-07-01 20:07:24 +0000988 COFF::IMAGE_SCN_MEM_DISCARDABLE |
989 COFF::IMAGE_SCN_MEM_READ,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000990 SectionKind::getMetadata());
991
992 DrectveSection =
993 getContext().getCOFFSection(".drectve",
Daniel Dunbar94610582010-07-01 20:07:24 +0000994 COFF::IMAGE_SCN_LNK_INFO,
Chris Lattnereb40a0f2010-05-07 17:17:41 +0000995 SectionKind::getMetadata());
Charles Davisf3ffc2c2011-05-20 22:13:55 +0000996
997 PDataSection =
998 getContext().getCOFFSection(".pdata",
999 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1000 COFF::IMAGE_SCN_MEM_READ |
1001 COFF::IMAGE_SCN_MEM_WRITE,
1002 SectionKind::getDataRel());
1003
1004 XDataSection =
1005 getContext().getCOFFSection(".xdata",
1006 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1007 COFF::IMAGE_SCN_MEM_READ |
1008 COFF::IMAGE_SCN_MEM_WRITE,
1009 SectionKind::getDataRel());
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001010}
1011
Rafael Espindola0cf5e3d2011-01-23 05:43:40 +00001012const MCSection *TargetLoweringObjectFileCOFF::getEHFrameSection() const {
1013 return getContext().getCOFFSection(".eh_frame",
1014 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1015 COFF::IMAGE_SCN_MEM_READ |
1016 COFF::IMAGE_SCN_MEM_WRITE,
1017 SectionKind::getDataRel());
1018}
1019
Charles Davis88c81642011-05-27 21:38:47 +00001020const MCSection *TargetLoweringObjectFileCOFF::getWin64EHFuncTableSection(
1021 StringRef suffix) const {
1022 if (suffix == "")
1023 return PDataSection;
1024 return getContext().getCOFFSection((".pdata"+suffix).str(),
1025 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1026 COFF::IMAGE_SCN_MEM_READ |
1027 COFF::IMAGE_SCN_MEM_WRITE,
1028 SectionKind::getDataRel());
1029}
1030
1031const MCSection *TargetLoweringObjectFileCOFF::getWin64EHTableSection(
1032 StringRef suffix) const {
1033 if (suffix == "")
1034 return XDataSection;
1035 return getContext().getCOFFSection((".xdata"+suffix).str(),
1036 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1037 COFF::IMAGE_SCN_MEM_READ |
1038 COFF::IMAGE_SCN_MEM_WRITE,
1039 SectionKind::getDataRel());
1040}
1041
Rafael Espindola0cf5e3d2011-01-23 05:43:40 +00001042
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001043static unsigned
1044getCOFFSectionFlags(SectionKind K) {
1045 unsigned Flags = 0;
1046
Anton Korobeynikov36335be2010-07-06 15:24:56 +00001047 if (K.isMetadata())
Chris Lattner6e5ce282010-05-07 21:49:09 +00001048 Flags |=
Daniel Dunbar94610582010-07-01 20:07:24 +00001049 COFF::IMAGE_SCN_MEM_DISCARDABLE;
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001050 else if (K.isText())
1051 Flags |=
Daniel Dunbar94610582010-07-01 20:07:24 +00001052 COFF::IMAGE_SCN_MEM_EXECUTE |
Michael J. Spencer3931b542010-10-27 18:52:29 +00001053 COFF::IMAGE_SCN_MEM_READ |
Daniel Dunbar94610582010-07-01 20:07:24 +00001054 COFF::IMAGE_SCN_CNT_CODE;
Chris Lattner6e5ce282010-05-07 21:49:09 +00001055 else if (K.isBSS ())
1056 Flags |=
Daniel Dunbar94610582010-07-01 20:07:24 +00001057 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
1058 COFF::IMAGE_SCN_MEM_READ |
1059 COFF::IMAGE_SCN_MEM_WRITE;
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001060 else if (K.isReadOnly())
1061 Flags |=
Daniel Dunbar94610582010-07-01 20:07:24 +00001062 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1063 COFF::IMAGE_SCN_MEM_READ;
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001064 else if (K.isWriteable())
1065 Flags |=
Daniel Dunbar94610582010-07-01 20:07:24 +00001066 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1067 COFF::IMAGE_SCN_MEM_READ |
1068 COFF::IMAGE_SCN_MEM_WRITE;
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001069
1070 return Flags;
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001071}
1072
1073const MCSection *TargetLoweringObjectFileCOFF::
1074getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
1075 Mangler *Mang, const TargetMachine &TM) const {
Chris Lattnereb40a0f2010-05-07 17:17:41 +00001076 return getContext().getCOFFSection(GV->getSection(),
1077 getCOFFSectionFlags(Kind),
1078 Kind);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001079}
1080
1081static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
1082 if (Kind.isText())
NAKAMURA Takumi3b3b0eb2010-10-19 03:24:42 +00001083 return ".text$";
Chris Lattner6e5ce282010-05-07 21:49:09 +00001084 if (Kind.isBSS ())
NAKAMURA Takumi3b3b0eb2010-10-19 03:24:42 +00001085 return ".bss$";
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001086 if (Kind.isWriteable())
NAKAMURA Takumi3b3b0eb2010-10-19 03:24:42 +00001087 return ".data$";
1088 return ".rdata$";
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001089}
1090
1091
1092const MCSection *TargetLoweringObjectFileCOFF::
1093SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
1094 Mangler *Mang, const TargetMachine &TM) const {
1095 assert(!Kind.isThreadLocal() && "Doesn't support TLS");
1096
1097 // If this global is linkonce/weak and the target handles this by emitting it
1098 // into a 'uniqued' section name, create and return the section now.
1099 if (GV->isWeakForLinker()) {
1100 const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
1101 SmallString<128> Name(Prefix, Prefix+strlen(Prefix));
Chris Lattner4c6741f2010-03-15 20:37:38 +00001102 MCSymbol *Sym = Mang->getSymbol(GV);
NAKAMURA Takumi3b3b0eb2010-10-19 03:24:42 +00001103 Name.append(Sym->getName().begin() + 1, Sym->getName().end());
Chris Lattner6e5ce282010-05-07 21:49:09 +00001104
1105 unsigned Characteristics = getCOFFSectionFlags(Kind);
1106
Daniel Dunbar94610582010-07-01 20:07:24 +00001107 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
Chris Lattner6e5ce282010-05-07 21:49:09 +00001108
1109 return getContext().getCOFFSection(Name.str(), Characteristics,
Anton Korobeynikov657985e2010-10-08 21:50:04 +00001110 COFF::IMAGE_COMDAT_SELECT_ANY, Kind);
Anton Korobeynikov362dd0b2010-02-15 22:37:53 +00001111 }
1112
1113 if (Kind.isText())
1114 return getTextSection();
1115
1116 return getDataSection();
1117}
1118