TargetLoweringObjectFile.cpp revision 35039ac24163e99cfab161620a9fb41f944a63d5
1//===-- llvm/Target/TargetLoweringObjectFile.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/Target/TargetLoweringObjectFile.h"
16#include "llvm/Constants.h"
17#include "llvm/DerivedTypes.h"
18#include "llvm/GlobalVariable.h"
19#include "llvm/MC/MCContext.h"
20#include "llvm/MC/MCSection.h"
21#include "llvm/Target/TargetMachine.h"
22#include "llvm/Target/TargetData.h"
23#include "llvm/Target/TargetOptions.h"
24#include "llvm/Support/Mangler.h"
25#include "llvm/ADT/StringExtras.h"
26using namespace llvm;
27
28//===----------------------------------------------------------------------===//
29//                              Generic Code
30//===----------------------------------------------------------------------===//
31
32TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) {
33  TextSection = 0;
34  DataSection = 0;
35  BSSSection = 0;
36  ReadOnlySection = 0;
37  StaticCtorSection = 0;
38  StaticDtorSection = 0;
39  LSDASection = 0;
40  EHFrameSection = 0;
41}
42
43TargetLoweringObjectFile::~TargetLoweringObjectFile() {
44}
45
46static bool isSuitableForBSS(const GlobalVariable *GV) {
47  Constant *C = GV->getInitializer();
48
49  // Must have zero initializer.
50  if (!C->isNullValue())
51    return false;
52
53  // Leave constant zeros in readonly constant sections, so they can be shared.
54  if (GV->isConstant())
55    return false;
56
57  // If the global has an explicit section specified, don't put it in BSS.
58  if (!GV->getSection().empty())
59    return false;
60
61  // If -nozero-initialized-in-bss is specified, don't ever use BSS.
62  if (NoZerosInBSS)
63    return false;
64
65  // Otherwise, put it in BSS!
66  return true;
67}
68
69static bool isConstantString(const Constant *C) {
70  // First check: is we have constant array of i8 terminated with zero
71  const ConstantArray *CVA = dyn_cast<ConstantArray>(C);
72  // Check, if initializer is a null-terminated string
73  if (CVA && CVA->isCString())
74    return true;
75
76  // Another possibility: [1 x i8] zeroinitializer
77  if (isa<ConstantAggregateZero>(C))
78    if (const ArrayType *Ty = dyn_cast<ArrayType>(C->getType()))
79      return (Ty->getElementType() == Type::Int8Ty &&
80              Ty->getNumElements() == 1);
81
82  return false;
83}
84
85/// SectionKindForGlobal - This is a top-level target-independent classifier for
86/// a global variable.  Given an global variable and information from TM, it
87/// classifies the global in a variety of ways that make various target
88/// implementations simpler.  The target implementation is free to ignore this
89/// extra info of course.
90static SectionKind SectionKindForGlobal(const GlobalValue *GV,
91                                        const TargetMachine &TM) {
92  Reloc::Model ReloModel = TM.getRelocationModel();
93
94  // Early exit - functions should be always in text sections.
95  const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
96  if (GVar == 0)
97    return SectionKind::getText();
98
99
100  // Handle thread-local data first.
101  if (GVar->isThreadLocal()) {
102    if (isSuitableForBSS(GVar))
103      return SectionKind::getThreadBSS();
104    return SectionKind::getThreadData();
105  }
106
107  // Variable can be easily put to BSS section.
108  if (isSuitableForBSS(GVar))
109    return SectionKind::getBSS();
110
111  Constant *C = GVar->getInitializer();
112
113  // If the global is marked constant, we can put it into a mergable section,
114  // a mergable string section, or general .data if it contains relocations.
115  if (GVar->isConstant()) {
116    // If the initializer for the global contains something that requires a
117    // relocation, then we may have to drop this into a wriable data section
118    // even though it is marked const.
119    switch (C->getRelocationInfo()) {
120    default: llvm_unreachable("unknown relocation info kind");
121    case Constant::NoRelocation:
122      // If initializer is a null-terminated string, put it in a "cstring"
123      // section if the target has it.
124      if (isConstantString(C))
125        return SectionKind::getMergeableCString();
126
127      // Otherwise, just drop it into a mergable constant section.  If we have
128      // a section for this size, use it, otherwise use the arbitrary sized
129      // mergable section.
130      switch (TM.getTargetData()->getTypeAllocSize(C->getType())) {
131      case 4:  return SectionKind::getMergeableConst4();
132      case 8:  return SectionKind::getMergeableConst8();
133      case 16: return SectionKind::getMergeableConst16();
134      default: return SectionKind::getMergeableConst();
135      }
136
137    case Constant::LocalRelocation:
138      // In static relocation model, the linker will resolve all addresses, so
139      // the relocation entries will actually be constants by the time the app
140      // starts up.  However, we can't put this into a mergable section, because
141      // the linker doesn't take relocations into consideration when it tries to
142      // merge entries in the section.
143      if (ReloModel == Reloc::Static)
144        return SectionKind::getReadOnly();
145
146      // Otherwise, the dynamic linker needs to fix it up, put it in the
147      // writable data.rel.local section.
148      return SectionKind::getReadOnlyWithRelLocal();
149
150    case Constant::GlobalRelocations:
151      // In static relocation model, the linker will resolve all addresses, so
152      // the relocation entries will actually be constants by the time the app
153      // starts up.  However, we can't put this into a mergable section, because
154      // the linker doesn't take relocations into consideration when it tries to
155      // merge entries in the section.
156      if (ReloModel == Reloc::Static)
157        return SectionKind::getReadOnly();
158
159      // Otherwise, the dynamic linker needs to fix it up, put it in the
160      // writable data.rel section.
161      return SectionKind::getReadOnlyWithRel();
162    }
163  }
164
165  // Okay, this isn't a constant.  If the initializer for the global is going
166  // to require a runtime relocation by the dynamic linker, put it into a more
167  // specific section to improve startup time of the app.  This coalesces these
168  // globals together onto fewer pages, improving the locality of the dynamic
169  // linker.
170  if (ReloModel == Reloc::Static)
171    return SectionKind::getDataNoRel();
172
173  switch (C->getRelocationInfo()) {
174  default: llvm_unreachable("unknown relocation info kind");
175  case Constant::NoRelocation:
176    return SectionKind::getDataNoRel();
177  case Constant::LocalRelocation:
178    return SectionKind::getDataRelLocal();
179  case Constant::GlobalRelocations:
180    return SectionKind::getDataRel();
181  }
182}
183
184/// SectionForGlobal - This method computes the appropriate section to emit
185/// the specified global variable or function definition.  This should not
186/// be passed external (or available externally) globals.
187const MCSection *TargetLoweringObjectFile::
188SectionForGlobal(const GlobalValue *GV, Mangler *Mang,
189                 const TargetMachine &TM) const {
190  assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() &&
191         "Can only be used for global definitions");
192
193  SectionKind Kind = SectionKindForGlobal(GV, TM);
194
195  // Select section name.
196  if (GV->hasSection()) {
197    // If the target has special section hacks for specifically named globals,
198    // return them now.
199    if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind))
200      return TS;
201
202    // If the target has magic semantics for certain section names, make sure to
203    // pick up the flags.  This allows the user to write things with attribute
204    // section and still get the appropriate section flags printed.
205    Kind = getKindForNamedSection(GV->getSection().c_str(), Kind);
206
207    return getOrCreateSection(GV->getSection().c_str(), false, Kind);
208  }
209
210
211  // Use default section depending on the 'type' of global
212  return SelectSectionForGlobal(GV, Kind, Mang, TM);
213}
214
215// Lame default implementation. Calculate the section name for global.
216const MCSection *
217TargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV,
218                                                 SectionKind Kind,
219                                                 Mangler *Mang,
220                                                 const TargetMachine &TM) const{
221  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
222
223  if (Kind.isText())
224    return getTextSection();
225
226  if (Kind.isBSS() && BSSSection != 0)
227    return BSSSection;
228
229  if (Kind.isReadOnly() && ReadOnlySection != 0)
230    return ReadOnlySection;
231
232  return getDataSection();
233}
234
235/// getSectionForConstant - Given a mergable constant with the
236/// specified size and relocation information, return a section that it
237/// should be placed in.
238const MCSection *
239TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const {
240  if (Kind.isReadOnly() && ReadOnlySection != 0)
241    return ReadOnlySection;
242
243  return DataSection;
244}
245
246
247const MCSection *TargetLoweringObjectFile::
248getOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const {
249  if (MCSection *S = Ctx->GetSection(Name))
250    return S;
251  return MCSection::Create(Name, isDirective, Kind, *Ctx);
252}
253
254
255
256//===----------------------------------------------------------------------===//
257//                                  ELF
258//===----------------------------------------------------------------------===//
259
260void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx,
261                                             const TargetMachine &TM) {
262  TargetLoweringObjectFile::Initialize(Ctx, TM);
263  if (!HasCrazyBSS)
264    BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS());
265  else
266    // PPC/Linux doesn't support the .bss directive, it needs .section .bss.
267    // FIXME: Does .section .bss work everywhere??
268    // FIXME2: this should just be handle by the section printer.  We should get
269    // away from syntactic view of the sections and MCSection should just be a
270    // semantic view.
271    BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS());
272
273
274  TextSection = getOrCreateSection("\t.text", true, SectionKind::getText());
275  DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel());
276  ReadOnlySection =
277    getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly());
278  TLSDataSection =
279    getOrCreateSection("\t.tdata", false, SectionKind::getThreadData());
280  CStringSection = getOrCreateSection("\t.rodata.str", true,
281                               SectionKind::getMergeableCString());
282
283  TLSBSSSection = getOrCreateSection("\t.tbss", false,
284                                     SectionKind::getThreadBSS());
285
286  DataRelSection = getOrCreateSection("\t.data.rel", false,
287                                      SectionKind::getDataRel());
288  DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false,
289                                   SectionKind::getDataRelLocal());
290  DataRelROSection = getOrCreateSection("\t.data.rel.ro", false,
291                                SectionKind::getReadOnlyWithRel());
292  DataRelROLocalSection =
293    getOrCreateSection("\t.data.rel.ro.local", false,
294                       SectionKind::getReadOnlyWithRelLocal());
295
296  MergeableConst4Section = getOrCreateSection(".rodata.cst4", false,
297                                SectionKind::getMergeableConst4());
298  MergeableConst8Section = getOrCreateSection(".rodata.cst8", false,
299                                SectionKind::getMergeableConst8());
300  MergeableConst16Section = getOrCreateSection(".rodata.cst16", false,
301                               SectionKind::getMergeableConst16());
302
303  StaticCtorSection =
304    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
305  StaticDtorSection =
306    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
307
308
309  // FIXME: We're emitting LSDA info into a readonly section on ELF, even though
310  // it contains relocatable pointers.  In PIC mode, this is probably a big
311  // runtime hit for C++ apps.  Either the contents of the LSDA need to be
312  // adjusted or this should be a data section.
313  LSDASection =
314    getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly());
315  EHFrameSection =
316    getOrCreateSection(".eh_frame", false, SectionKind::getDataRel());
317}
318
319
320SectionKind TargetLoweringObjectFileELF::
321getKindForNamedSection(const char *Name, SectionKind K) const {
322  if (Name[0] != '.') return K;
323
324  // Some lame default implementation based on some magic section names.
325  if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 ||
326      strncmp(Name, ".llvm.linkonce.b.", 17) == 0 ||
327      strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 ||
328      strncmp(Name, ".llvm.linkonce.sb.", 18) == 0)
329    return SectionKind::getBSS();
330
331  if (strcmp(Name, ".tdata") == 0 ||
332      strncmp(Name, ".tdata.", 7) == 0 ||
333      strncmp(Name, ".gnu.linkonce.td.", 17) == 0 ||
334      strncmp(Name, ".llvm.linkonce.td.", 18) == 0)
335    return SectionKind::getThreadData();
336
337  if (strcmp(Name, ".tbss") == 0 ||
338      strncmp(Name, ".tbss.", 6) == 0 ||
339      strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 ||
340      strncmp(Name, ".llvm.linkonce.tb.", 18) == 0)
341    return SectionKind::getThreadBSS();
342
343  return K;
344}
345
346void TargetLoweringObjectFileELF::
347getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
348  Str.push_back(',');
349  Str.push_back('"');
350
351  if (!Kind.isMetadata())
352    Str.push_back('a');
353  if (Kind.isText())
354    Str.push_back('x');
355  if (Kind.isWriteable())
356    Str.push_back('w');
357  if (Kind.isMergeableCString() ||
358      Kind.isMergeableConst4() ||
359      Kind.isMergeableConst8() ||
360      Kind.isMergeableConst16())
361    Str.push_back('M');
362  if (Kind.isMergeableCString())
363    Str.push_back('S');
364  if (Kind.isThreadLocal())
365    Str.push_back('T');
366
367  Str.push_back('"');
368  Str.push_back(',');
369
370  // If comment string is '@', e.g. as on ARM - use '%' instead
371  if (AtIsCommentChar)
372    Str.push_back('%');
373  else
374    Str.push_back('@');
375
376  const char *KindStr;
377  if (Kind.isBSS() || Kind.isThreadBSS())
378    KindStr = "nobits";
379  else
380    KindStr = "progbits";
381
382  Str.append(KindStr, KindStr+strlen(KindStr));
383
384  if (Kind.isMergeableCString()) {
385    // TODO: Eventually handle multiple byte character strings.  For now, all
386    // mergable C strings are single byte.
387    Str.push_back(',');
388    Str.push_back('1');
389  } else if (Kind.isMergeableConst4()) {
390    Str.push_back(',');
391    Str.push_back('4');
392  } else if (Kind.isMergeableConst8()) {
393    Str.push_back(',');
394    Str.push_back('8');
395  } else if (Kind.isMergeableConst16()) {
396    Str.push_back(',');
397    Str.push_back('1');
398    Str.push_back('6');
399  }
400}
401
402
403static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) {
404  if (Kind.isText())                 return ".gnu.linkonce.t.";
405  if (Kind.isReadOnly())             return ".gnu.linkonce.r.";
406
407  if (Kind.isThreadData())           return ".gnu.linkonce.td.";
408  if (Kind.isThreadBSS())            return ".gnu.linkonce.tb.";
409
410  if (Kind.isBSS())                  return ".gnu.linkonce.b.";
411  if (Kind.isDataNoRel())            return ".gnu.linkonce.d.";
412  if (Kind.isDataRelLocal())         return ".gnu.linkonce.d.rel.local.";
413  if (Kind.isDataRel())              return ".gnu.linkonce.d.rel.";
414  if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local.";
415
416  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
417  return ".gnu.linkonce.d.rel.ro.";
418}
419
420const MCSection *TargetLoweringObjectFileELF::
421SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
422                       Mangler *Mang, const TargetMachine &TM) const {
423
424  // If this global is linkonce/weak and the target handles this by emitting it
425  // into a 'uniqued' section name, create and return the section now.
426  if (GV->isWeakForLinker()) {
427    const char *Prefix = getSectionPrefixForUniqueGlobal(Kind);
428    std::string Name = Mang->makeNameProper(GV->getNameStr());
429    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
430  }
431
432  if (Kind.isText()) return TextSection;
433
434  if (Kind.isMergeableCString()) {
435   assert(CStringSection && "Should have string section prefix");
436
437    // We also need alignment here.
438    // FIXME: this is getting the alignment of the character, not the
439    // alignment of the global!
440    unsigned Align =
441      TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV));
442
443    std::string Name = CStringSection->getName() + "1." + utostr(Align);
444    return getOrCreateSection(Name.c_str(), false,
445                              SectionKind::getMergeableCString());
446  }
447
448  if (Kind.isMergeableConst()) {
449    if (Kind.isMergeableConst4())
450      return MergeableConst4Section;
451    if (Kind.isMergeableConst8())
452      return MergeableConst8Section;
453    if (Kind.isMergeableConst16())
454      return MergeableConst16Section;
455    return ReadOnlySection;  // .const
456  }
457
458  if (Kind.isReadOnly())             return ReadOnlySection;
459
460  if (Kind.isThreadData())           return TLSDataSection;
461  if (Kind.isThreadBSS())            return TLSBSSSection;
462
463  if (Kind.isBSS())                  return BSSSection;
464
465  if (Kind.isDataNoRel())            return DataSection;
466  if (Kind.isDataRelLocal())         return DataRelLocalSection;
467  if (Kind.isDataRel())              return DataRelSection;
468  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
469
470  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
471  return DataRelROSection;
472}
473
474/// getSectionForConstant - Given a mergeable constant with the
475/// specified size and relocation information, return a section that it
476/// should be placed in.
477const MCSection *TargetLoweringObjectFileELF::
478getSectionForConstant(SectionKind Kind) const {
479  if (Kind.isMergeableConst4())
480    return MergeableConst4Section;
481  if (Kind.isMergeableConst8())
482    return MergeableConst8Section;
483  if (Kind.isMergeableConst16())
484    return MergeableConst16Section;
485  if (Kind.isReadOnly())
486    return ReadOnlySection;
487
488  if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection;
489  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
490  return DataRelROSection;
491}
492
493//===----------------------------------------------------------------------===//
494//                                 MachO
495//===----------------------------------------------------------------------===//
496
497void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
498                                               const TargetMachine &TM) {
499  TargetLoweringObjectFile::Initialize(Ctx, TM);
500  TextSection = getOrCreateSection("\t.text", true,
501                                   SectionKind::getText());
502  DataSection = getOrCreateSection("\t.data", true,
503                                   SectionKind::getDataRel());
504
505  CStringSection = getOrCreateSection("\t.cstring", true,
506                               SectionKind::getMergeableCString());
507  FourByteConstantSection = getOrCreateSection("\t.literal4\n", true,
508                                SectionKind::getMergeableConst4());
509  EightByteConstantSection = getOrCreateSection("\t.literal8\n", true,
510                                SectionKind::getMergeableConst8());
511
512  // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back
513  // to using it in -static mode.
514  if (TM.getRelocationModel() != Reloc::Static &&
515      TM.getTargetData()->getPointerSize() == 32)
516    SixteenByteConstantSection =
517      getOrCreateSection("\t.literal16\n", true,
518                         SectionKind::getMergeableConst16());
519  else
520    SixteenByteConstantSection = 0;
521
522  ReadOnlySection = getOrCreateSection("\t.const", true,
523                                       SectionKind::getReadOnly());
524
525  TextCoalSection =
526  getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions",
527                     false, SectionKind::getText());
528  ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced",
529                                            false,
530                                           SectionKind::getText());
531  ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced",
532                                            false,
533                                          SectionKind::getText());
534  ConstDataSection = getOrCreateSection("\t.const_data", true,
535                                SectionKind::getReadOnlyWithRel());
536  DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced",
537                                       false,
538                                       SectionKind::getDataRel());
539
540  if (TM.getRelocationModel() == Reloc::Static) {
541    StaticCtorSection =
542      getOrCreateSection(".constructor", true, SectionKind::getDataRel());
543    StaticDtorSection =
544      getOrCreateSection(".destructor", true, SectionKind::getDataRel());
545  } else {
546    StaticCtorSection =
547      getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel());
548    StaticDtorSection =
549      getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel());
550  }
551
552  LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false,
553                                   SectionKind::getDataRel());
554  EHFrameSection =
555    getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms"
556                       "+live_support", false, SectionKind::getReadOnly());
557}
558
559const MCSection *TargetLoweringObjectFileMachO::
560SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
561                       Mangler *Mang, const TargetMachine &TM) const {
562  assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS");
563
564  if (Kind.isText())
565    return GV->isWeakForLinker() ? TextCoalSection : TextSection;
566
567  // If this is weak/linkonce, put this in a coalescable section, either in text
568  // or data depending on if it is writable.
569  if (GV->isWeakForLinker()) {
570    if (Kind.isReadOnly())
571      return ConstTextCoalSection;
572    return DataCoalSection;
573  }
574
575  // FIXME: Alignment check should be handled by section classifier.
576  if (Kind.isMergeableCString()) {
577    Constant *C = cast<GlobalVariable>(GV)->getInitializer();
578    const Type *Ty = cast<ArrayType>(C->getType())->getElementType();
579    const TargetData &TD = *TM.getTargetData();
580    unsigned Size = TD.getTypeAllocSize(Ty);
581    if (Size) {
582      unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV));
583      if (Align <= 32)
584        return CStringSection;
585    }
586
587    return ReadOnlySection;
588  }
589
590  if (Kind.isMergeableConst()) {
591    if (Kind.isMergeableConst4())
592      return FourByteConstantSection;
593    if (Kind.isMergeableConst8())
594      return EightByteConstantSection;
595    if (Kind.isMergeableConst16() && SixteenByteConstantSection)
596      return SixteenByteConstantSection;
597    return ReadOnlySection;  // .const
598  }
599
600  // FIXME: ROData -> const in -static mode that is relocatable but they happen
601  // by the static linker.  Why not mergeable?
602  if (Kind.isReadOnly())
603    return ReadOnlySection;
604
605  // If this is marked const, put it into a const section.  But if the dynamic
606  // linker needs to write to it, put it in the data segment.
607  if (Kind.isReadOnlyWithRel())
608    return ConstDataSection;
609
610  // Otherwise, just drop the variable in the normal data section.
611  return DataSection;
612}
613
614const MCSection *
615TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const {
616  // If this constant requires a relocation, we have to put it in the data
617  // segment, not in the text segment.
618  if (Kind.isDataRel())
619    return ConstDataSection;
620
621  if (Kind.isMergeableConst4())
622    return FourByteConstantSection;
623  if (Kind.isMergeableConst8())
624    return EightByteConstantSection;
625  if (Kind.isMergeableConst16() && SixteenByteConstantSection)
626    return SixteenByteConstantSection;
627  return ReadOnlySection;  // .const
628}
629
630/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide
631/// not to emit the UsedDirective for some symbols in llvm.used.
632// FIXME: REMOVE this (rdar://7071300)
633bool TargetLoweringObjectFileMachO::
634shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const {
635  /// On Darwin, internally linked data beginning with "L" or "l" does not have
636  /// the directive emitted (this occurs in ObjC metadata).
637  if (!GV) return false;
638
639  // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix.
640  if (GV->hasLocalLinkage() && !isa<Function>(GV)) {
641    // FIXME: ObjC metadata is currently emitted as internal symbols that have
642    // \1L and \0l prefixes on them.  Fix them to be Private/LinkerPrivate and
643    // this horrible hack can go away.
644    const std::string &Name = Mang->getMangledName(GV);
645    if (Name[0] == 'L' || Name[0] == 'l')
646      return false;
647  }
648
649  return true;
650}
651
652
653//===----------------------------------------------------------------------===//
654//                                  COFF
655//===----------------------------------------------------------------------===//
656
657void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
658                                              const TargetMachine &TM) {
659  TargetLoweringObjectFile::Initialize(Ctx, TM);
660  TextSection = getOrCreateSection("\t.text", true,
661                                   SectionKind::getText());
662  DataSection = getOrCreateSection("\t.data", true,
663                                   SectionKind::getDataRel());
664  StaticCtorSection =
665    getOrCreateSection(".ctors", false, SectionKind::getDataRel());
666  StaticDtorSection =
667    getOrCreateSection(".dtors", false, SectionKind::getDataRel());
668}
669
670void TargetLoweringObjectFileCOFF::
671getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const {
672  // FIXME: Inefficient.
673  std::string Res = ",\"";
674  if (Kind.isText())
675    Res += 'x';
676  if (Kind.isWriteable())
677    Res += 'w';
678  Res += "\"";
679
680  Str.append(Res.begin(), Res.end());
681}
682
683static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) {
684  if (Kind.isText())
685    return ".text$linkonce";
686  if (Kind.isWriteable())
687    return ".data$linkonce";
688  return ".rdata$linkonce";
689}
690
691
692const MCSection *TargetLoweringObjectFileCOFF::
693SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind,
694                       Mangler *Mang, const TargetMachine &TM) const {
695  assert(!Kind.isThreadLocal() && "Doesn't support TLS");
696
697  // If this global is linkonce/weak and the target handles this by emitting it
698  // into a 'uniqued' section name, create and return the section now.
699  if (GV->isWeakForLinker()) {
700    const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind);
701    std::string Name = Mang->makeNameProper(GV->getNameStr());
702    return getOrCreateSection((Prefix+Name).c_str(), false, Kind);
703  }
704
705  if (Kind.isText())
706    return getTextSection();
707
708  return getDataSection();
709}
710
711