LLVM  8.0.1
TargetLoweringObjectFileImpl.cpp
Go to the documentation of this file.
1 //===- 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 
16 #include "llvm/ADT/SmallString.h"
17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/ADT/StringExtras.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/Triple.h"
21 #include "llvm/BinaryFormat/COFF.h"
23 #include "llvm/BinaryFormat/ELF.h"
27 #include "llvm/IR/Comdat.h"
28 #include "llvm/IR/Constants.h"
29 #include "llvm/IR/DataLayout.h"
30 #include "llvm/IR/DerivedTypes.h"
31 #include "llvm/IR/Function.h"
32 #include "llvm/IR/GlobalAlias.h"
33 #include "llvm/IR/GlobalObject.h"
34 #include "llvm/IR/GlobalValue.h"
35 #include "llvm/IR/GlobalVariable.h"
36 #include "llvm/IR/Mangler.h"
37 #include "llvm/IR/Metadata.h"
38 #include "llvm/IR/Module.h"
39 #include "llvm/IR/Type.h"
40 #include "llvm/MC/MCAsmInfo.h"
41 #include "llvm/MC/MCContext.h"
42 #include "llvm/MC/MCExpr.h"
43 #include "llvm/MC/MCSectionCOFF.h"
44 #include "llvm/MC/MCSectionELF.h"
45 #include "llvm/MC/MCSectionMachO.h"
46 #include "llvm/MC/MCSectionWasm.h"
47 #include "llvm/MC/MCStreamer.h"
48 #include "llvm/MC/MCSymbol.h"
49 #include "llvm/MC/MCSymbolELF.h"
50 #include "llvm/MC/MCValue.h"
51 #include "llvm/MC/SectionKind.h"
53 #include "llvm/Support/Casting.h"
54 #include "llvm/Support/CodeGen.h"
55 #include "llvm/Support/Format.h"
59 #include <cassert>
60 #include <string>
61 
62 using namespace llvm;
63 using namespace dwarf;
64 
65 static void GetObjCImageInfo(Module &M, unsigned &Version, unsigned &Flags,
66  StringRef &Section) {
68  M.getModuleFlagsMetadata(ModuleFlags);
69 
70  for (const auto &MFE: ModuleFlags) {
71  // Ignore flags with 'Require' behaviour.
72  if (MFE.Behavior == Module::Require)
73  continue;
74 
75  StringRef Key = MFE.Key->getString();
76  if (Key == "Objective-C Image Info Version") {
77  Version = mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
78  } else if (Key == "Objective-C Garbage Collection" ||
79  Key == "Objective-C GC Only" ||
80  Key == "Objective-C Is Simulated" ||
81  Key == "Objective-C Class Properties" ||
82  Key == "Objective-C Image Swift Version") {
83  Flags |= mdconst::extract<ConstantInt>(MFE.Val)->getZExtValue();
84  } else if (Key == "Objective-C Image Info Section") {
85  Section = cast<MDString>(MFE.Val)->getString();
86  }
87  }
88 }
89 
90 //===----------------------------------------------------------------------===//
91 // ELF
92 //===----------------------------------------------------------------------===//
93 
95  const TargetMachine &TgtM) {
97  TM = &TgtM;
98 
99  CodeModel::Model CM = TgtM.getCodeModel();
100 
101  switch (TgtM.getTargetTriple().getArch()) {
102  case Triple::arm:
103  case Triple::armeb:
104  case Triple::thumb:
105  case Triple::thumbeb:
107  break;
108  // Fallthrough if not using EHABI
110  case Triple::ppc:
111  case Triple::x86:
112  PersonalityEncoding = isPositionIndependent()
117  LSDAEncoding = isPositionIndependent()
120  TTypeEncoding = isPositionIndependent()
124  break;
125  case Triple::x86_64:
126  if (isPositionIndependent()) {
127  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
128  ((CM == CodeModel::Small || CM == CodeModel::Medium)
130  LSDAEncoding = dwarf::DW_EH_PE_pcrel |
131  (CM == CodeModel::Small
134  ((CM == CodeModel::Small || CM == CodeModel::Medium)
135  ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
136  } else {
137  PersonalityEncoding =
138  (CM == CodeModel::Small || CM == CodeModel::Medium)
140  LSDAEncoding = (CM == CodeModel::Small)
142  TTypeEncoding = (CM == CodeModel::Small)
144  }
145  break;
146  case Triple::hexagon:
147  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
148  LSDAEncoding = dwarf::DW_EH_PE_absptr;
149  TTypeEncoding = dwarf::DW_EH_PE_absptr;
150  if (isPositionIndependent()) {
151  PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
152  LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
154  }
155  break;
156  case Triple::aarch64:
157  case Triple::aarch64_be:
158  // The small model guarantees static code/data size < 4GB, but not where it
159  // will be in memory. Most of these could end up >2GB away so even a signed
160  // pc-relative 32-bit address is insufficient, theoretically.
161  if (isPositionIndependent()) {
162  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
167  } else {
168  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
169  LSDAEncoding = dwarf::DW_EH_PE_absptr;
170  TTypeEncoding = dwarf::DW_EH_PE_absptr;
171  }
172  break;
173  case Triple::lanai:
174  LSDAEncoding = dwarf::DW_EH_PE_absptr;
175  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
176  TTypeEncoding = dwarf::DW_EH_PE_absptr;
177  break;
178  case Triple::mips:
179  case Triple::mipsel:
180  case Triple::mips64:
181  case Triple::mips64el:
182  // MIPS uses indirect pointer to refer personality functions and types, so
183  // that the eh_frame section can be read-only. DW.ref.personality will be
184  // generated for relocation.
185  PersonalityEncoding = dwarf::DW_EH_PE_indirect;
186  // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
187  // identify N64 from just a triple.
190  // We don't support PC-relative LSDA references in GAS so we use the default
191  // DW_EH_PE_absptr for those.
192 
193  // FreeBSD must be explicit about the data size and using pcrel since it's
194  // assembler/linker won't do the automatic conversion that the Linux tools
195  // do.
196  if (TgtM.getTargetTriple().isOSFreeBSD()) {
197  PersonalityEncoding |= dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
199  }
200  break;
201  case Triple::ppc64:
202  case Triple::ppc64le:
203  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
208  break;
209  case Triple::sparcel:
210  case Triple::sparc:
211  if (isPositionIndependent()) {
213  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
217  } else {
218  LSDAEncoding = dwarf::DW_EH_PE_absptr;
219  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
220  TTypeEncoding = dwarf::DW_EH_PE_absptr;
221  }
222  break;
223  case Triple::sparcv9:
225  if (isPositionIndependent()) {
226  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
230  } else {
231  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
232  TTypeEncoding = dwarf::DW_EH_PE_absptr;
233  }
234  break;
235  case Triple::systemz:
236  // All currently-defined code models guarantee that 4-byte PC-relative
237  // values will be in range.
238  if (isPositionIndependent()) {
239  PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
244  } else {
245  PersonalityEncoding = dwarf::DW_EH_PE_absptr;
246  LSDAEncoding = dwarf::DW_EH_PE_absptr;
247  TTypeEncoding = dwarf::DW_EH_PE_absptr;
248  }
249  break;
250  default:
251  break;
252  }
253 }
254 
256  Module &M) const {
257  auto &C = getContext();
258 
259  if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
260  auto *S = C.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS,
262 
263  Streamer.SwitchSection(S);
264 
265  for (const auto &Operand : LinkerOptions->operands()) {
266  if (cast<MDNode>(Operand)->getNumOperands() != 2)
267  report_fatal_error("invalid llvm.linker.options");
268  for (const auto &Option : cast<MDNode>(Operand)->operands()) {
269  Streamer.EmitBytes(cast<MDString>(Option)->getString());
270  Streamer.EmitIntValue(0, 1);
271  }
272  }
273  }
274 
275  unsigned Version = 0;
276  unsigned Flags = 0;
278 
279  GetObjCImageInfo(M, Version, Flags, Section);
280  if (!Section.empty()) {
281  auto *S = C.getELFSection(Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
282  Streamer.SwitchSection(S);
283  Streamer.EmitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
284  Streamer.EmitIntValue(Version, 4);
285  Streamer.EmitIntValue(Flags, 4);
286  Streamer.AddBlankLine();
287  }
288 
290  M.getModuleFlagsMetadata(ModuleFlags);
291 
292  MDNode *CFGProfile = nullptr;
293 
294  for (const auto &MFE : ModuleFlags) {
295  StringRef Key = MFE.Key->getString();
296  if (Key == "CG Profile") {
297  CFGProfile = cast<MDNode>(MFE.Val);
298  break;
299  }
300  }
301 
302  if (!CFGProfile)
303  return;
304 
305  auto GetSym = [this](const MDOperand &MDO) -> MCSymbol * {
306  if (!MDO)
307  return nullptr;
308  auto V = cast<ValueAsMetadata>(MDO);
309  const Function *F = cast<Function>(V->getValue());
310  return TM->getSymbol(F);
311  };
312 
313  for (const auto &Edge : CFGProfile->operands()) {
314  MDNode *E = cast<MDNode>(Edge);
315  const MCSymbol *From = GetSym(E->getOperand(0));
316  const MCSymbol *To = GetSym(E->getOperand(1));
317  // Skip null functions. This can happen if functions are dead stripped after
318  // the CGProfile pass has been run.
319  if (!From || !To)
320  continue;
321  uint64_t Count = cast<ConstantAsMetadata>(E->getOperand(2))
322  ->getValue()
323  ->getUniqueInteger()
324  .getZExtValue();
325  Streamer.emitCGProfileEntry(
328  }
329 }
330 
332  const GlobalValue *GV, const TargetMachine &TM,
333  MachineModuleInfo *MMI) const {
334  unsigned Encoding = getPersonalityEncoding();
335  if ((Encoding & 0x80) == DW_EH_PE_indirect)
336  return getContext().getOrCreateSymbol(StringRef("DW.ref.") +
337  TM.getSymbol(GV)->getName());
338  if ((Encoding & 0x70) == DW_EH_PE_absptr)
339  return TM.getSymbol(GV);
340  report_fatal_error("We do not support this DWARF encoding yet!");
341 }
342 
344  MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym) const {
345  SmallString<64> NameData("DW.ref.");
346  NameData += Sym->getName();
347  MCSymbolELF *Label =
348  cast<MCSymbolELF>(getContext().getOrCreateSymbol(NameData));
349  Streamer.EmitSymbolAttribute(Label, MCSA_Hidden);
350  Streamer.EmitSymbolAttribute(Label, MCSA_Weak);
351  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP;
352  MCSection *Sec = getContext().getELFNamedSection(".data", Label->getName(),
353  ELF::SHT_PROGBITS, Flags, 0);
354  unsigned Size = DL.getPointerSize();
355  Streamer.SwitchSection(Sec);
357  Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject);
358  const MCExpr *E = MCConstantExpr::create(Size, getContext());
359  Streamer.emitELFSize(Label, E);
360  Streamer.EmitLabel(Label);
361 
362  Streamer.EmitSymbolValue(Sym, Size);
363 }
364 
366  const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
367  MachineModuleInfo *MMI, MCStreamer &Streamer) const {
368  if (Encoding & DW_EH_PE_indirect) {
370 
371  MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", TM);
372 
373  // Add information about the stub reference to ELFMMI so that the stub
374  // gets emitted by the asmprinter.
375  MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym);
376  if (!StubSym.getPointer()) {
377  MCSymbol *Sym = TM.getSymbol(GV);
379  }
380 
382  getTTypeReference(MCSymbolRefExpr::create(SSym, getContext()),
383  Encoding & ~DW_EH_PE_indirect, Streamer);
384  }
385 
387  MMI, Streamer);
388 }
389 
391  // N.B.: The defaults used in here are not the same ones used in MC.
392  // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
393  // both gas and MC will produce a section with no flags. Given
394  // section(".eh_frame") gcc will produce:
395  //
396  // .section .eh_frame,"a",@progbits
397 
398  if (Name == getInstrProfSectionName(IPSK_covmap, Triple::ELF,
399  /*AddSegmentInfo=*/false))
400  return SectionKind::getMetadata();
401 
402  if (Name.empty() || Name[0] != '.') return K;
403 
404  // Default implementation based on some magic section names.
405  if (Name == ".bss" ||
406  Name.startswith(".bss.") ||
407  Name.startswith(".gnu.linkonce.b.") ||
408  Name.startswith(".llvm.linkonce.b.") ||
409  Name == ".sbss" ||
410  Name.startswith(".sbss.") ||
411  Name.startswith(".gnu.linkonce.sb.") ||
412  Name.startswith(".llvm.linkonce.sb."))
413  return SectionKind::getBSS();
414 
415  if (Name == ".tdata" ||
416  Name.startswith(".tdata.") ||
417  Name.startswith(".gnu.linkonce.td.") ||
418  Name.startswith(".llvm.linkonce.td."))
420 
421  if (Name == ".tbss" ||
422  Name.startswith(".tbss.") ||
423  Name.startswith(".gnu.linkonce.tb.") ||
424  Name.startswith(".llvm.linkonce.tb."))
425  return SectionKind::getThreadBSS();
426 
427  return K;
428 }
429 
431  // Use SHT_NOTE for section whose name starts with ".note" to allow
432  // emitting ELF notes from C variable declaration.
433  // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
434  if (Name.startswith(".note"))
435  return ELF::SHT_NOTE;
436 
437  if (Name == ".init_array")
438  return ELF::SHT_INIT_ARRAY;
439 
440  if (Name == ".fini_array")
441  return ELF::SHT_FINI_ARRAY;
442 
443  if (Name == ".preinit_array")
444  return ELF::SHT_PREINIT_ARRAY;
445 
446  if (K.isBSS() || K.isThreadBSS())
447  return ELF::SHT_NOBITS;
448 
449  return ELF::SHT_PROGBITS;
450 }
451 
452 static unsigned getELFSectionFlags(SectionKind K) {
453  unsigned Flags = 0;
454 
455  if (!K.isMetadata())
456  Flags |= ELF::SHF_ALLOC;
457 
458  if (K.isText())
459  Flags |= ELF::SHF_EXECINSTR;
460 
461  if (K.isExecuteOnly())
462  Flags |= ELF::SHF_ARM_PURECODE;
463 
464  if (K.isWriteable())
465  Flags |= ELF::SHF_WRITE;
466 
467  if (K.isThreadLocal())
468  Flags |= ELF::SHF_TLS;
469 
470  if (K.isMergeableCString() || K.isMergeableConst())
471  Flags |= ELF::SHF_MERGE;
472 
473  if (K.isMergeableCString())
474  Flags |= ELF::SHF_STRINGS;
475 
476  return Flags;
477 }
478 
479 static const Comdat *getELFComdat(const GlobalValue *GV) {
480  const Comdat *C = GV->getComdat();
481  if (!C)
482  return nullptr;
483 
484  if (C->getSelectionKind() != Comdat::Any)
485  report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" +
486  C->getName() + "' cannot be lowered.");
487 
488  return C;
489 }
490 
492  const TargetMachine &TM) {
494  if (!MD)
495  return nullptr;
496 
497  const MDOperand &Op = MD->getOperand(0);
498  if (!Op.get())
499  return nullptr;
500 
501  auto *VM = dyn_cast<ValueAsMetadata>(Op);
502  if (!VM)
503  report_fatal_error("MD_associated operand is not ValueAsMetadata");
504 
505  GlobalObject *OtherGO = dyn_cast<GlobalObject>(VM->getValue());
506  return OtherGO ? dyn_cast<MCSymbolELF>(TM.getSymbol(OtherGO)) : nullptr;
507 }
508 
510  if (Kind.isMergeable1ByteCString())
511  return 1;
512  else if (Kind.isMergeable2ByteCString())
513  return 2;
514  else if (Kind.isMergeable4ByteCString())
515  return 4;
516  else if (Kind.isMergeableConst4())
517  return 4;
518  else if (Kind.isMergeableConst8())
519  return 8;
520  else if (Kind.isMergeableConst16())
521  return 16;
522  else if (Kind.isMergeableConst32())
523  return 32;
524  else {
525  // We shouldn't have mergeable C strings or mergeable constants that we
526  // didn't handle above.
527  assert(!Kind.isMergeableCString() && "unknown string width");
528  assert(!Kind.isMergeableConst() && "unknown data width");
529  return 0;
530  }
531 }
532 
534  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
536 
537  // Check if '#pragma clang section' name is applicable.
538  // Note that pragma directive overrides -ffunction-section, -fdata-section
539  // and so section name is exactly as user specified and not uniqued.
540  const GlobalVariable *GV = dyn_cast<GlobalVariable>(GO);
541  if (GV && GV->hasImplicitSection()) {
542  auto Attrs = GV->getAttributes();
543  if (Attrs.hasAttribute("bss-section") && Kind.isBSS()) {
544  SectionName = Attrs.getAttribute("bss-section").getValueAsString();
545  } else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly()) {
546  SectionName = Attrs.getAttribute("rodata-section").getValueAsString();
547  } else if (Attrs.hasAttribute("data-section") && Kind.isData()) {
548  SectionName = Attrs.getAttribute("data-section").getValueAsString();
549  }
550  }
551  const Function *F = dyn_cast<Function>(GO);
552  if (F && F->hasFnAttribute("implicit-section-name")) {
553  SectionName = F->getFnAttribute("implicit-section-name").getValueAsString();
554  }
555 
556  // Infer section flags from the section name if we can.
557  Kind = getELFKindForNamedSection(SectionName, Kind);
558 
559  StringRef Group = "";
560  unsigned Flags = getELFSectionFlags(Kind);
561  if (const Comdat *C = getELFComdat(GO)) {
562  Group = C->getName();
563  Flags |= ELF::SHF_GROUP;
564  }
565 
566  // A section can have at most one associated section. Put each global with
567  // MD_associated in a unique section.
568  unsigned UniqueID = MCContext::GenericSectionID;
569  const MCSymbolELF *AssociatedSymbol = getAssociatedSymbol(GO, TM);
570  if (AssociatedSymbol) {
571  UniqueID = NextUniqueID++;
572  Flags |= ELF::SHF_LINK_ORDER;
573  }
574 
575  MCSectionELF *Section = getContext().getELFSection(
576  SectionName, getELFSectionType(SectionName, Kind), Flags,
577  getEntrySizeForKind(Kind), Group, UniqueID, AssociatedSymbol);
578  // Make sure that we did not get some other section with incompatible sh_link.
579  // This should not be possible due to UniqueID code above.
580  assert(Section->getAssociatedSymbol() == AssociatedSymbol &&
581  "Associated symbol mismatch between sections");
582  return Section;
583 }
584 
585 /// Return the section prefix name used by options FunctionsSections and
586 /// DataSections.
588  if (Kind.isText())
589  return ".text";
590  if (Kind.isReadOnly())
591  return ".rodata";
592  if (Kind.isBSS())
593  return ".bss";
594  if (Kind.isThreadData())
595  return ".tdata";
596  if (Kind.isThreadBSS())
597  return ".tbss";
598  if (Kind.isData())
599  return ".data";
600  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
601  return ".data.rel.ro";
602 }
603 
605  MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
606  const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags,
607  unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol) {
608 
609  StringRef Group = "";
610  if (const Comdat *C = getELFComdat(GO)) {
611  Flags |= ELF::SHF_GROUP;
612  Group = C->getName();
613  }
614 
615  // Get the section entry size based on the kind.
616  unsigned EntrySize = getEntrySizeForKind(Kind);
617 
619  if (Kind.isMergeableCString()) {
620  // We also need alignment here.
621  // FIXME: this is getting the alignment of the character, not the
622  // alignment of the global!
624  cast<GlobalVariable>(GO));
625 
626  std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + ".";
627  Name = SizeSpec + utostr(Align);
628  } else if (Kind.isMergeableConst()) {
629  Name = ".rodata.cst";
630  Name += utostr(EntrySize);
631  } else {
632  Name = getSectionPrefixForGlobal(Kind);
633  }
634 
635  if (const auto *F = dyn_cast<Function>(GO)) {
636  const auto &OptionalPrefix = F->getSectionPrefix();
637  if (OptionalPrefix)
638  Name += *OptionalPrefix;
639  }
640 
641  unsigned UniqueID = MCContext::GenericSectionID;
642  if (EmitUniqueSection) {
643  if (TM.getUniqueSectionNames()) {
644  Name.push_back('.');
645  TM.getNameWithPrefix(Name, GO, Mang, true /*MayAlwaysUsePrivate*/);
646  } else {
647  UniqueID = *NextUniqueID;
648  (*NextUniqueID)++;
649  }
650  }
651  // Use 0 as the unique ID for execute-only text.
652  if (Kind.isExecuteOnly())
653  UniqueID = 0;
654  return Ctx.getELFSection(Name, getELFSectionType(Name, Kind), Flags,
655  EntrySize, Group, UniqueID, AssociatedSymbol);
656 }
657 
659  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
660  unsigned Flags = getELFSectionFlags(Kind);
661 
662  // If we have -ffunction-section or -fdata-section then we should emit the
663  // global value to a uniqued section specifically for it.
664  bool EmitUniqueSection = false;
665  if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
666  if (Kind.isText())
667  EmitUniqueSection = TM.getFunctionSections();
668  else
669  EmitUniqueSection = TM.getDataSections();
670  }
671  EmitUniqueSection |= GO->hasComdat();
672 
673  const MCSymbolELF *AssociatedSymbol = getAssociatedSymbol(GO, TM);
674  if (AssociatedSymbol) {
675  EmitUniqueSection = true;
676  Flags |= ELF::SHF_LINK_ORDER;
677  }
678 
680  getContext(), GO, Kind, getMangler(), TM, EmitUniqueSection, Flags,
681  &NextUniqueID, AssociatedSymbol);
682  assert(Section->getAssociatedSymbol() == AssociatedSymbol);
683  return Section;
684 }
685 
687  const Function &F, const TargetMachine &TM) const {
688  // If the function can be removed, produce a unique section so that
689  // the table doesn't prevent the removal.
690  const Comdat *C = F.getComdat();
691  bool EmitUniqueSection = TM.getFunctionSections() || C;
692  if (!EmitUniqueSection)
693  return ReadOnlySection;
694 
695  return selectELFSectionForGlobal(getContext(), &F, SectionKind::getReadOnly(),
696  getMangler(), TM, EmitUniqueSection,
697  ELF::SHF_ALLOC, &NextUniqueID,
698  /* AssociatedSymbol */ nullptr);
699 }
700 
702  bool UsesLabelDifference, const Function &F) const {
703  // We can always create relative relocations, so use another section
704  // that can be marked non-executable.
705  return false;
706 }
707 
708 /// Given a mergeable constant with the specified size and relocation
709 /// information, return a section that it should be placed in.
711  const DataLayout &DL, SectionKind Kind, const Constant *C,
712  unsigned &Align) const {
713  if (Kind.isMergeableConst4() && MergeableConst4Section)
714  return MergeableConst4Section;
715  if (Kind.isMergeableConst8() && MergeableConst8Section)
716  return MergeableConst8Section;
717  if (Kind.isMergeableConst16() && MergeableConst16Section)
718  return MergeableConst16Section;
719  if (Kind.isMergeableConst32() && MergeableConst32Section)
720  return MergeableConst32Section;
721  if (Kind.isReadOnly())
722  return ReadOnlySection;
723 
724  assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
725  return DataRelROSection;
726 }
727 
728 static MCSectionELF *getStaticStructorSection(MCContext &Ctx, bool UseInitArray,
729  bool IsCtor, unsigned Priority,
730  const MCSymbol *KeySym) {
731  std::string Name;
732  unsigned Type;
733  unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
734  StringRef COMDAT = KeySym ? KeySym->getName() : "";
735 
736  if (KeySym)
737  Flags |= ELF::SHF_GROUP;
738 
739  if (UseInitArray) {
740  if (IsCtor) {
741  Type = ELF::SHT_INIT_ARRAY;
742  Name = ".init_array";
743  } else {
744  Type = ELF::SHT_FINI_ARRAY;
745  Name = ".fini_array";
746  }
747  if (Priority != 65535) {
748  Name += '.';
749  Name += utostr(Priority);
750  }
751  } else {
752  // The default scheme is .ctor / .dtor, so we have to invert the priority
753  // numbering.
754  if (IsCtor)
755  Name = ".ctors";
756  else
757  Name = ".dtors";
758  if (Priority != 65535)
759  raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
760  Type = ELF::SHT_PROGBITS;
761  }
762 
763  return Ctx.getELFSection(Name, Type, Flags, 0, COMDAT);
764 }
765 
767  unsigned Priority, const MCSymbol *KeySym) const {
768  return getStaticStructorSection(getContext(), UseInitArray, true, Priority,
769  KeySym);
770 }
771 
773  unsigned Priority, const MCSymbol *KeySym) const {
774  return getStaticStructorSection(getContext(), UseInitArray, false, Priority,
775  KeySym);
776 }
777 
779  const GlobalValue *LHS, const GlobalValue *RHS,
780  const TargetMachine &TM) const {
781  // We may only use a PLT-relative relocation to refer to unnamed_addr
782  // functions.
783  if (!LHS->hasGlobalUnnamedAddr() || !LHS->getValueType()->isFunctionTy())
784  return nullptr;
785 
786  // Basic sanity checks.
787  if (LHS->getType()->getPointerAddressSpace() != 0 ||
788  RHS->getType()->getPointerAddressSpace() != 0 || LHS->isThreadLocal() ||
789  RHS->isThreadLocal())
790  return nullptr;
791 
793  MCSymbolRefExpr::create(TM.getSymbol(LHS), PLTRelativeVariantKind,
794  getContext()),
795  MCSymbolRefExpr::create(TM.getSymbol(RHS), getContext()), getContext());
796 }
797 
799  // Use ".GCC.command.line" since this feature is to support clang's
800  // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
801  // same name.
802  return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS,
804 }
805 
806 void
808  UseInitArray = UseInitArray_;
809  MCContext &Ctx = getContext();
810  if (!UseInitArray) {
811  StaticCtorSection = Ctx.getELFSection(".ctors", ELF::SHT_PROGBITS,
813 
814  StaticDtorSection = Ctx.getELFSection(".dtors", ELF::SHT_PROGBITS,
816  return;
817  }
818 
819  StaticCtorSection = Ctx.getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
821  StaticDtorSection = Ctx.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
823 }
824 
825 //===----------------------------------------------------------------------===//
826 // MachO
827 //===----------------------------------------------------------------------===//
828 
832 }
833 
835  const TargetMachine &TM) {
837  if (TM.getRelocationModel() == Reloc::Static) {
838  StaticCtorSection = Ctx.getMachOSection("__TEXT", "__constructor", 0,
840  StaticDtorSection = Ctx.getMachOSection("__TEXT", "__destructor", 0,
842  } else {
843  StaticCtorSection = Ctx.getMachOSection("__DATA", "__mod_init_func",
846  StaticDtorSection = Ctx.getMachOSection("__DATA", "__mod_term_func",
849  }
850 
854  TTypeEncoding =
856 }
857 
859  Module &M) const {
860  // Emit the linker options if present.
861  if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
862  for (const auto &Option : LinkerOptions->operands()) {
863  SmallVector<std::string, 4> StrOptions;
864  for (const auto &Piece : cast<MDNode>(Option)->operands())
865  StrOptions.push_back(cast<MDString>(Piece)->getString());
866  Streamer.EmitLinkerOptions(StrOptions);
867  }
868  }
869 
870  unsigned VersionVal = 0;
871  unsigned ImageInfoFlags = 0;
872  StringRef SectionVal;
873 
874  GetObjCImageInfo(M, VersionVal, ImageInfoFlags, SectionVal);
875 
876  // The section is mandatory. If we don't have it, then we don't have GC info.
877  if (SectionVal.empty())
878  return;
879 
880  StringRef Segment, Section;
881  unsigned TAA = 0, StubSize = 0;
882  bool TAAParsed;
883  std::string ErrorCode =
884  MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section,
885  TAA, TAAParsed, StubSize);
886  if (!ErrorCode.empty())
887  // If invalid, report the error with report_fatal_error.
888  report_fatal_error("Invalid section specifier '" + Section + "': " +
889  ErrorCode + ".");
890 
891  // Get the section.
893  Segment, Section, TAA, StubSize, SectionKind::getData());
894  Streamer.SwitchSection(S);
895  Streamer.EmitLabel(getContext().
896  getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
897  Streamer.EmitIntValue(VersionVal, 4);
898  Streamer.EmitIntValue(ImageInfoFlags, 4);
899  Streamer.AddBlankLine();
900 }
901 
902 static void checkMachOComdat(const GlobalValue *GV) {
903  const Comdat *C = GV->getComdat();
904  if (!C)
905  return;
906 
907  report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() +
908  "' cannot be lowered.");
909 }
910 
912  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
913  // Parse the section specifier and create it if valid.
914  StringRef Segment, Section;
915  unsigned TAA = 0, StubSize = 0;
916  bool TAAParsed;
917 
918  checkMachOComdat(GO);
919 
920  std::string ErrorCode =
922  TAA, TAAParsed, StubSize);
923  if (!ErrorCode.empty()) {
924  // If invalid, report the error with report_fatal_error.
925  report_fatal_error("Global variable '" + GO->getName() +
926  "' has an invalid section specifier '" +
927  GO->getSection() + "': " + ErrorCode + ".");
928  }
929 
930  // Get the section.
931  MCSectionMachO *S =
932  getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
933 
934  // If TAA wasn't set by ParseSectionSpecifier() above,
935  // use the value returned by getMachOSection() as a default.
936  if (!TAAParsed)
937  TAA = S->getTypeAndAttributes();
938 
939  // Okay, now that we got the section, verify that the TAA & StubSize agree.
940  // If the user declared multiple globals with different section flags, we need
941  // to reject it here.
942  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
943  // If invalid, report the error with report_fatal_error.
944  report_fatal_error("Global variable '" + GO->getName() +
945  "' section type or attributes does not match previous"
946  " section specifier");
947  }
948 
949  return S;
950 }
951 
953  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
954  checkMachOComdat(GO);
955 
956  // Handle thread local data.
957  if (Kind.isThreadBSS()) return TLSBSSSection;
958  if (Kind.isThreadData()) return TLSDataSection;
959 
960  if (Kind.isText())
962 
963  // If this is weak/linkonce, put this in a coalescable section, either in text
964  // or data depending on if it is writable.
965  if (GO->isWeakForLinker()) {
966  if (Kind.isReadOnly())
967  return ConstTextCoalSection;
968  if (Kind.isReadOnlyWithRel())
969  return ConstDataCoalSection;
970  return DataCoalSection;
971  }
972 
973  // FIXME: Alignment check should be handled by section classifier.
974  if (Kind.isMergeable1ByteCString() &&
976  cast<GlobalVariable>(GO)) < 32)
977  return CStringSection;
978 
979  // Do not put 16-bit arrays in the UString section if they have an
980  // externally visible label, this runs into issues with certain linker
981  // versions.
982  if (Kind.isMergeable2ByteCString() && !GO->hasExternalLinkage() &&
984  cast<GlobalVariable>(GO)) < 32)
985  return UStringSection;
986 
987  // With MachO only variables whose corresponding symbol starts with 'l' or
988  // 'L' can be merged, so we only try merging GVs with private linkage.
989  if (GO->hasPrivateLinkage() && Kind.isMergeableConst()) {
990  if (Kind.isMergeableConst4())
992  if (Kind.isMergeableConst8())
994  if (Kind.isMergeableConst16())
996  }
997 
998  // Otherwise, if it is readonly, but not something we can specially optimize,
999  // just drop it in .const.
1000  if (Kind.isReadOnly())
1001  return ReadOnlySection;
1002 
1003  // If this is marked const, put it into a const section. But if the dynamic
1004  // linker needs to write to it, put it in the data segment.
1005  if (Kind.isReadOnlyWithRel())
1006  return ConstDataSection;
1007 
1008  // Put zero initialized globals with strong external linkage in the
1009  // DATA, __common section with the .zerofill directive.
1010  if (Kind.isBSSExtern())
1011  return DataCommonSection;
1012 
1013  // Put zero initialized globals with local linkage in __DATA,__bss directive
1014  // with the .zerofill directive (aka .lcomm).
1015  if (Kind.isBSSLocal())
1016  return DataBSSSection;
1017 
1018  // Otherwise, just drop the variable in the normal data section.
1019  return DataSection;
1020 }
1021 
1023  const DataLayout &DL, SectionKind Kind, const Constant *C,
1024  unsigned &Align) const {
1025  // If this constant requires a relocation, we have to put it in the data
1026  // segment, not in the text segment.
1027  if (Kind.isData() || Kind.isReadOnlyWithRel())
1028  return ConstDataSection;
1029 
1030  if (Kind.isMergeableConst4())
1031  return FourByteConstantSection;
1032  if (Kind.isMergeableConst8())
1033  return EightByteConstantSection;
1034  if (Kind.isMergeableConst16())
1036  return ReadOnlySection; // .const
1037 }
1038 
1040  const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
1041  MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1042  // The mach-o version of this method defaults to returning a stub reference.
1043 
1044  if (Encoding & DW_EH_PE_indirect) {
1045  MachineModuleInfoMachO &MachOMMI =
1047 
1048  MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1049 
1050  // Add information about the stub reference to MachOMMI so that the stub
1051  // gets emitted by the asmprinter.
1052  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1053  if (!StubSym.getPointer()) {
1054  MCSymbol *Sym = TM.getSymbol(GV);
1055  StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
1056  }
1057 
1060  Encoding & ~DW_EH_PE_indirect, Streamer);
1061  }
1062 
1063  return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, TM,
1064  MMI, Streamer);
1065 }
1066 
1068  const GlobalValue *GV, const TargetMachine &TM,
1069  MachineModuleInfo *MMI) const {
1070  // The mach-o version of this method defaults to returning a stub reference.
1071  MachineModuleInfoMachO &MachOMMI =
1073 
1074  MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1075 
1076  // Add information about the stub reference to MachOMMI so that the stub
1077  // gets emitted by the asmprinter.
1078  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1079  if (!StubSym.getPointer()) {
1080  MCSymbol *Sym = TM.getSymbol(GV);
1081  StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
1082  }
1083 
1084  return SSym;
1085 }
1086 
1088  const MCSymbol *Sym, const MCValue &MV, int64_t Offset,
1089  MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1090  // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1091  // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1092  // through a non_lazy_ptr stub instead. One advantage is that it allows the
1093  // computation of deltas to final external symbols. Example:
1094  //
1095  // _extgotequiv:
1096  // .long _extfoo
1097  //
1098  // _delta:
1099  // .long _extgotequiv-_delta
1100  //
1101  // is transformed to:
1102  //
1103  // _delta:
1104  // .long L_extfoo$non_lazy_ptr-(_delta+0)
1105  //
1106  // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1107  // L_extfoo$non_lazy_ptr:
1108  // .indirect_symbol _extfoo
1109  // .long 0
1110  //
1111  // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1112  // may point to both local (same translation unit) and global (other
1113  // translation units) symbols. Example:
1114  //
1115  // .section __DATA,__pointers,non_lazy_symbol_pointers
1116  // L1:
1117  // .indirect_symbol _myGlobal
1118  // .long 0
1119  // L2:
1120  // .indirect_symbol _myLocal
1121  // .long _myLocal
1122  //
1123  // If the symbol is local, instead of the symbol's index, the assembler
1124  // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1125  // Then the linker will notice the constant in the table and will look at the
1126  // content of the symbol.
1127  MachineModuleInfoMachO &MachOMMI =
1129  MCContext &Ctx = getContext();
1130 
1131  // The offset must consider the original displacement from the base symbol
1132  // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1133  Offset = -MV.getConstant();
1134  const MCSymbol *BaseSym = &MV.getSymB()->getSymbol();
1135 
1136  // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1137  // non_lazy_ptr stubs.
1139  StringRef Suffix = "$non_lazy_ptr";
1140  Name += MMI->getModule()->getDataLayout().getPrivateGlobalPrefix();
1141  Name += Sym->getName();
1142  Name += Suffix;
1143  MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
1144 
1145  MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub);
1146  if (!StubSym.getPointer()) {
1147  bool IsIndirectLocal = Sym->isDefined() && !Sym->isExternal();
1148  // With the assumption that IsIndirectLocal == GV->hasLocalLinkage().
1149  StubSym = MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol *>(Sym),
1150  !IsIndirectLocal);
1151  }
1152 
1153  const MCExpr *BSymExpr =
1155  const MCExpr *LHS =
1157 
1158  if (!Offset)
1159  return MCBinaryExpr::createSub(LHS, BSymExpr, Ctx);
1160 
1161  const MCExpr *RHS =
1162  MCBinaryExpr::createAdd(BSymExpr, MCConstantExpr::create(Offset, Ctx), Ctx);
1163  return MCBinaryExpr::createSub(LHS, RHS, Ctx);
1164 }
1165 
1166 static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
1167  const MCSection &Section) {
1168  if (!AsmInfo.isSectionAtomizableBySymbols(Section))
1169  return true;
1170 
1171  // If it is not dead stripped, it is safe to use private labels.
1172  const MCSectionMachO &SMO = cast<MCSectionMachO>(Section);
1174  return true;
1175 
1176  return false;
1177 }
1178 
1180  SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1181  const TargetMachine &TM) const {
1182  bool CannotUsePrivateLabel = true;
1183  if (auto *GO = GV->getBaseObject()) {
1185  const MCSection *TheSection = SectionForGlobal(GO, GOKind, TM);
1186  CannotUsePrivateLabel =
1187  !canUsePrivateLabel(*TM.getMCAsmInfo(), *TheSection);
1188  }
1189  getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1190 }
1191 
1192 //===----------------------------------------------------------------------===//
1193 // COFF
1194 //===----------------------------------------------------------------------===//
1195 
1196 static unsigned
1198  unsigned Flags = 0;
1199  bool isThumb = TM.getTargetTriple().getArch() == Triple::thumb;
1200 
1201  if (K.isMetadata())
1202  Flags |=
1204  else if (K.isText())
1205  Flags |=
1210  else if (K.isBSS())
1211  Flags |=
1215  else if (K.isThreadLocal())
1216  Flags |=
1220  else if (K.isReadOnly() || K.isReadOnlyWithRel())
1221  Flags |=
1224  else if (K.isWriteable())
1225  Flags |=
1229 
1230  return Flags;
1231 }
1232 
1233 static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) {
1234  const Comdat *C = GV->getComdat();
1235  assert(C && "expected GV to have a Comdat!");
1236 
1237  StringRef ComdatGVName = C->getName();
1238  const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName);
1239  if (!ComdatGV)
1240  report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1241  "' does not exist.");
1242 
1243  if (ComdatGV->getComdat() != C)
1244  report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1245  "' is not a key for its COMDAT.");
1246 
1247  return ComdatGV;
1248 }
1249 
1250 static int getSelectionForCOFF(const GlobalValue *GV) {
1251  if (const Comdat *C = GV->getComdat()) {
1252  const GlobalValue *ComdatKey = getComdatGVForCOFF(GV);
1253  if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
1254  ComdatKey = GA->getBaseObject();
1255  if (ComdatKey == GV) {
1256  switch (C->getSelectionKind()) {
1257  case Comdat::Any:
1259  case Comdat::ExactMatch:
1261  case Comdat::Largest:
1263  case Comdat::NoDuplicates:
1265  case Comdat::SameSize:
1267  }
1268  } else {
1270  }
1271  }
1272  return 0;
1273 }
1274 
1276  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1277  int Selection = 0;
1278  unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1279  StringRef Name = GO->getSection();
1280  StringRef COMDATSymName = "";
1281  if (GO->hasComdat()) {
1282  Selection = getSelectionForCOFF(GO);
1283  const GlobalValue *ComdatGV;
1284  if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE)
1285  ComdatGV = getComdatGVForCOFF(GO);
1286  else
1287  ComdatGV = GO;
1288 
1289  if (!ComdatGV->hasPrivateLinkage()) {
1290  MCSymbol *Sym = TM.getSymbol(ComdatGV);
1291  COMDATSymName = Sym->getName();
1292  Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1293  } else {
1294  Selection = 0;
1295  }
1296  }
1297 
1298  return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName,
1299  Selection);
1300 }
1301 
1303  if (Kind.isText())
1304  return ".text";
1305  if (Kind.isBSS())
1306  return ".bss";
1307  if (Kind.isThreadLocal())
1308  return ".tls$";
1309  if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1310  return ".rdata";
1311  return ".data";
1312 }
1313 
1315  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1316  // If we have -ffunction-sections then we should emit the global value to a
1317  // uniqued section specifically for it.
1318  bool EmitUniquedSection;
1319  if (Kind.isText())
1320  EmitUniquedSection = TM.getFunctionSections();
1321  else
1322  EmitUniquedSection = TM.getDataSections();
1323 
1324  if ((EmitUniquedSection && !Kind.isCommon()) || GO->hasComdat()) {
1326 
1327  unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1328 
1329  Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1330  int Selection = getSelectionForCOFF(GO);
1331  if (!Selection)
1333  const GlobalValue *ComdatGV;
1334  if (GO->hasComdat())
1335  ComdatGV = getComdatGVForCOFF(GO);
1336  else
1337  ComdatGV = GO;
1338 
1339  unsigned UniqueID = MCContext::GenericSectionID;
1340  if (EmitUniquedSection)
1341  UniqueID = NextUniqueID++;
1342 
1343  if (!ComdatGV->hasPrivateLinkage()) {
1344  MCSymbol *Sym = TM.getSymbol(ComdatGV);
1345  StringRef COMDATSymName = Sym->getName();
1346 
1347  // Append "$symbol" to the section name *before* IR-level mangling is
1348  // applied when targetting mingw. This is what GCC does, and the ld.bfd
1349  // COFF linker will not properly handle comdats otherwise.
1350  if (getTargetTriple().isWindowsGNUEnvironment())
1351  raw_svector_ostream(Name) << '$' << ComdatGV->getName();
1352 
1353  return getContext().getCOFFSection(Name, Characteristics, Kind,
1354  COMDATSymName, Selection, UniqueID);
1355  } else {
1356  SmallString<256> TmpData;
1357  getMangler().getNameWithPrefix(TmpData, GO, /*CannotUsePrivateLabel=*/true);
1358  return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
1359  Selection, UniqueID);
1360  }
1361  }
1362 
1363  if (Kind.isText())
1364  return TextSection;
1365 
1366  if (Kind.isThreadLocal())
1367  return TLSDataSection;
1368 
1369  if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1370  return ReadOnlySection;
1371 
1372  // Note: we claim that common symbols are put in BSSSection, but they are
1373  // really emitted with the magic .comm directive, which creates a symbol table
1374  // entry but not a section.
1375  if (Kind.isBSS() || Kind.isCommon())
1376  return BSSSection;
1377 
1378  return DataSection;
1379 }
1380 
1382  SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1383  const TargetMachine &TM) const {
1384  bool CannotUsePrivateLabel = false;
1385  if (GV->hasPrivateLinkage() &&
1386  ((isa<Function>(GV) && TM.getFunctionSections()) ||
1387  (isa<GlobalVariable>(GV) && TM.getDataSections())))
1388  CannotUsePrivateLabel = true;
1389 
1390  getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1391 }
1392 
1394  const Function &F, const TargetMachine &TM) const {
1395  // If the function can be removed, produce a unique section so that
1396  // the table doesn't prevent the removal.
1397  const Comdat *C = F.getComdat();
1398  bool EmitUniqueSection = TM.getFunctionSections() || C;
1399  if (!EmitUniqueSection)
1400  return ReadOnlySection;
1401 
1402  // FIXME: we should produce a symbol for F instead.
1403  if (F.hasPrivateLinkage())
1404  return ReadOnlySection;
1405 
1406  MCSymbol *Sym = TM.getSymbol(&F);
1407  StringRef COMDATSymName = Sym->getName();
1408 
1411  unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1412  Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1413  unsigned UniqueID = NextUniqueID++;
1414 
1415  return getContext().getCOFFSection(
1416  SecName, Characteristics, Kind, COMDATSymName,
1418 }
1419 
1421  Module &M) const {
1422  if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1423  // Emit the linker options to the linker .drectve section. According to the
1424  // spec, this section is a space-separated string containing flags for
1425  // linker.
1426  MCSection *Sec = getDrectveSection();
1427  Streamer.SwitchSection(Sec);
1428  for (const auto &Option : LinkerOptions->operands()) {
1429  for (const auto &Piece : cast<MDNode>(Option)->operands()) {
1430  // Lead with a space for consistency with our dllexport implementation.
1431  std::string Directive(" ");
1432  Directive.append(cast<MDString>(Piece)->getString());
1433  Streamer.EmitBytes(Directive);
1434  }
1435  }
1436  }
1437 
1438  unsigned Version = 0;
1439  unsigned Flags = 0;
1441 
1442  GetObjCImageInfo(M, Version, Flags, Section);
1443  if (Section.empty())
1444  return;
1445 
1446  auto &C = getContext();
1447  auto *S = C.getCOFFSection(
1450  Streamer.SwitchSection(S);
1451  Streamer.EmitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1452  Streamer.EmitIntValue(Version, 4);
1453  Streamer.EmitIntValue(Flags, 4);
1454  Streamer.AddBlankLine();
1455 }
1456 
1458  const TargetMachine &TM) {
1460  const Triple &T = TM.getTargetTriple();
1470  } else {
1479  }
1480 }
1481 
1483  const Triple &T, bool IsCtor,
1484  unsigned Priority,
1485  const MCSymbol *KeySym,
1488  // If the priority is the default, use .CRT$XCU, possibly associative.
1489  if (Priority == 65535)
1490  return Ctx.getAssociativeCOFFSection(Default, KeySym, 0);
1491 
1492  // Otherwise, we need to compute a new section name. Low priorities should
1493  // run earlier. The linker will sort sections ASCII-betically, and we need a
1494  // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
1495  // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
1496  // low priorities need to sort before 'L', since the CRT uses that
1497  // internally, so we use ".CRT$XCA00001" for them.
1499  raw_svector_ostream OS(Name);
1500  OS << ".CRT$XC" << (Priority < 200 ? 'A' : 'T') << format("%05u", Priority);
1501  MCSectionCOFF *Sec = Ctx.getCOFFSection(
1504  return Ctx.getAssociativeCOFFSection(Sec, KeySym, 0);
1505  }
1506 
1507  std::string Name = IsCtor ? ".ctors" : ".dtors";
1508  if (Priority != 65535)
1509  raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
1510 
1511  return Ctx.getAssociativeCOFFSection(
1516  KeySym, 0);
1517 }
1518 
1520  unsigned Priority, const MCSymbol *KeySym) const {
1522  Priority, KeySym,
1523  cast<MCSectionCOFF>(StaticCtorSection));
1524 }
1525 
1527  unsigned Priority, const MCSymbol *KeySym) const {
1529  Priority, KeySym,
1530  cast<MCSectionCOFF>(StaticDtorSection));
1531 }
1532 
1534  raw_ostream &OS, const GlobalValue *GV) const {
1536 }
1537 
1539  raw_ostream &OS, const GlobalValue *GV) const {
1541 }
1542 
1544  const GlobalValue *LHS, const GlobalValue *RHS,
1545  const TargetMachine &TM) const {
1546  const Triple &T = TM.getTargetTriple();
1547  if (!T.isKnownWindowsMSVCEnvironment() &&
1550  return nullptr;
1551 
1552  // Our symbols should exist in address space zero, cowardly no-op if
1553  // otherwise.
1554  if (LHS->getType()->getPointerAddressSpace() != 0 ||
1555  RHS->getType()->getPointerAddressSpace() != 0)
1556  return nullptr;
1557 
1558  // Both ptrtoint instructions must wrap global objects:
1559  // - Only global variables are eligible for image relative relocations.
1560  // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
1561  // We expect __ImageBase to be a global variable without a section, externally
1562  // defined.
1563  //
1564  // It should look something like this: @__ImageBase = external constant i8
1565  if (!isa<GlobalObject>(LHS) || !isa<GlobalVariable>(RHS) ||
1566  LHS->isThreadLocal() || RHS->isThreadLocal() ||
1567  RHS->getName() != "__ImageBase" || !RHS->hasExternalLinkage() ||
1568  cast<GlobalVariable>(RHS)->hasInitializer() || RHS->hasSection())
1569  return nullptr;
1570 
1571  return MCSymbolRefExpr::create(TM.getSymbol(LHS),
1573  getContext());
1574 }
1575 
1576 static std::string APIntToHexString(const APInt &AI) {
1577  unsigned Width = (AI.getBitWidth() / 8) * 2;
1578  std::string HexString = utohexstr(AI.getLimitedValue(), /*LowerCase=*/true);
1579  unsigned Size = HexString.size();
1580  assert(Width >= Size && "hex string is too large!");
1581  HexString.insert(HexString.begin(), Width - Size, '0');
1582 
1583  return HexString;
1584 }
1585 
1586 static std::string scalarConstantToHexString(const Constant *C) {
1587  Type *Ty = C->getType();
1588  if (isa<UndefValue>(C)) {
1590  } else if (const auto *CFP = dyn_cast<ConstantFP>(C)) {
1591  return APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
1592  } else if (const auto *CI = dyn_cast<ConstantInt>(C)) {
1593  return APIntToHexString(CI->getValue());
1594  } else {
1595  unsigned NumElements;
1596  if (isa<VectorType>(Ty))
1597  NumElements = Ty->getVectorNumElements();
1598  else
1599  NumElements = Ty->getArrayNumElements();
1600  std::string HexString;
1601  for (int I = NumElements - 1, E = -1; I != E; --I)
1603  return HexString;
1604  }
1605 }
1606 
1608  const DataLayout &DL, SectionKind Kind, const Constant *C,
1609  unsigned &Align) const {
1610  if (Kind.isMergeableConst() && C &&
1612  // This creates comdat sections with the given symbol name, but unless
1613  // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
1614  // will be created with a null storage class, which makes GNU binutils
1615  // error out.
1619  std::string COMDATSymName;
1620  if (Kind.isMergeableConst4()) {
1621  if (Align <= 4) {
1622  COMDATSymName = "__real@" + scalarConstantToHexString(C);
1623  Align = 4;
1624  }
1625  } else if (Kind.isMergeableConst8()) {
1626  if (Align <= 8) {
1627  COMDATSymName = "__real@" + scalarConstantToHexString(C);
1628  Align = 8;
1629  }
1630  } else if (Kind.isMergeableConst16()) {
1631  // FIXME: These may not be appropriate for non-x86 architectures.
1632  if (Align <= 16) {
1633  COMDATSymName = "__xmm@" + scalarConstantToHexString(C);
1634  Align = 16;
1635  }
1636  } else if (Kind.isMergeableConst32()) {
1637  if (Align <= 32) {
1638  COMDATSymName = "__ymm@" + scalarConstantToHexString(C);
1639  Align = 32;
1640  }
1641  }
1642 
1643  if (!COMDATSymName.empty())
1644  return getContext().getCOFFSection(".rdata", Characteristics, Kind,
1645  COMDATSymName,
1647  }
1648 
1649  return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C, Align);
1650 }
1651 
1652 
1653 //===----------------------------------------------------------------------===//
1654 // Wasm
1655 //===----------------------------------------------------------------------===//
1656 
1657 static const Comdat *getWasmComdat(const GlobalValue *GV) {
1658  const Comdat *C = GV->getComdat();
1659  if (!C)
1660  return nullptr;
1661 
1662  if (C->getSelectionKind() != Comdat::Any)
1663  report_fatal_error("WebAssembly COMDATs only support "
1664  "SelectionKind::Any, '" + C->getName() + "' cannot be "
1665  "lowered.");
1666 
1667  return C;
1668 }
1669 
1671  // If we're told we have function data, then use that.
1672  if (K.isText())
1673  return SectionKind::getText();
1674 
1675  // Otherwise, ignore whatever section type the generic impl detected and use
1676  // a plain data section.
1677  return SectionKind::getData();
1678 }
1679 
1681  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1682  // We don't support explict section names for functions in the wasm object
1683  // format. Each function has to be in its own unique section.
1684  if (isa<Function>(GO)) {
1685  return SelectSectionForGlobal(GO, Kind, TM);
1686  }
1687 
1688  StringRef Name = GO->getSection();
1689 
1690  Kind = getWasmKindForNamedSection(Name, Kind);
1691 
1692  StringRef Group = "";
1693  if (const Comdat *C = getWasmComdat(GO)) {
1694  Group = C->getName();
1695  }
1696 
1697  return getContext().getWasmSection(Name, Kind, Group,
1699 }
1700 
1702  MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
1703  const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID) {
1704  StringRef Group = "";
1705  if (const Comdat *C = getWasmComdat(GO)) {
1706  Group = C->getName();
1707  }
1708 
1709  bool UniqueSectionNames = TM.getUniqueSectionNames();
1711 
1712  if (const auto *F = dyn_cast<Function>(GO)) {
1713  const auto &OptionalPrefix = F->getSectionPrefix();
1714  if (OptionalPrefix)
1715  Name += *OptionalPrefix;
1716  }
1717 
1718  if (EmitUniqueSection && UniqueSectionNames) {
1719  Name.push_back('.');
1720  TM.getNameWithPrefix(Name, GO, Mang, true);
1721  }
1722  unsigned UniqueID = MCContext::GenericSectionID;
1723  if (EmitUniqueSection && !UniqueSectionNames) {
1724  UniqueID = *NextUniqueID;
1725  (*NextUniqueID)++;
1726  }
1727  return Ctx.getWasmSection(Name, Kind, Group, UniqueID);
1728 }
1729 
1731  const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1732 
1733  if (Kind.isCommon())
1734  report_fatal_error("mergable sections not supported yet on wasm");
1735 
1736  // If we have -ffunction-section or -fdata-section then we should emit the
1737  // global value to a uniqued section specifically for it.
1738  bool EmitUniqueSection = false;
1739  if (Kind.isText())
1740  EmitUniqueSection = TM.getFunctionSections();
1741  else
1742  EmitUniqueSection = TM.getDataSections();
1743  EmitUniqueSection |= GO->hasComdat();
1744 
1745  return selectWasmSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
1746  EmitUniqueSection, &NextUniqueID);
1747 }
1748 
1750  bool UsesLabelDifference, const Function &F) const {
1751  // We can always create relative relocations, so use another section
1752  // that can be marked non-executable.
1753  return false;
1754 }
1755 
1757  const GlobalValue *LHS, const GlobalValue *RHS,
1758  const TargetMachine &TM) const {
1759  // We may only use a PLT-relative relocation to refer to unnamed_addr
1760  // functions.
1761  if (!LHS->hasGlobalUnnamedAddr() || !LHS->getValueType()->isFunctionTy())
1762  return nullptr;
1763 
1764  // Basic sanity checks.
1765  if (LHS->getType()->getPointerAddressSpace() != 0 ||
1766  RHS->getType()->getPointerAddressSpace() != 0 || LHS->isThreadLocal() ||
1767  RHS->isThreadLocal())
1768  return nullptr;
1769 
1770  return MCBinaryExpr::createSub(
1772  getContext()),
1774 }
1775 
1778  getContext().getWasmSection(".init_array", SectionKind::getData());
1779 
1780  // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
1781  // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
1783 }
1784 
1786  unsigned Priority, const MCSymbol *KeySym) const {
1787  return Priority == UINT16_MAX ?
1789  getContext().getWasmSection(".init_array." + utostr(Priority),
1791 }
1792 
1794  unsigned Priority, const MCSymbol *KeySym) const {
1795  llvm_unreachable("@llvm.global_dtors should have been lowered already");
1796  return nullptr;
1797 }
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:293
AttributeSet getAttributes() const
Return the attribute set for this global.
uint64_t CallInst * C
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
bool isBSSExtern() const
Definition: SectionKind.h:162
StringRef getSection() const
Get the custom section of this global if it has one.
Definition: GlobalObject.h:90
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:39
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
A parsed version of the target data layout string in and methods for querying it. ...
Definition: DataLayout.h:111
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
Tracking metadata reference owned by Metadata.
Definition: Metadata.h:711
static SectionKind getData()
Definition: SectionKind.h:202
static MCSectionCOFF * getCOFFStaticStructorSection(MCContext &Ctx, const Triple &T, bool IsCtor, unsigned Priority, const MCSymbol *KeySym, MCSectionCOFF *Default)
static MCSectionELF * selectELFSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags, unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol)
bool isThreadData() const
Definition: SectionKind.h:154
bool hasLocalLinkage() const
Definition: GlobalValue.h:436
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
bool hasAttribute(unsigned Value) const
This represents a section on a Mach-O system (used by Mac OS X).
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:323
bool hasPrivateLinkage() const
Definition: GlobalValue.h:435
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:140
This class represents lattice values for constants.
Definition: AllocatorList.h:24
PointerTy getPointer() const
void EmitSymbolValue(const MCSymbol *Sym, unsigned Size, bool IsSectionRelative=false)
Special case of EmitValue that avoids the client having to pass in a MCExpr for MCSymbols.
Definition: MCStreamer.cpp:159
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
.type _foo, STT_OBJECT # aka
Definition: MCDirectives.h:25
This represents an "assembler immediate".
Definition: MCValue.h:40
bool isWriteable() const
Definition: SectionKind.h:145
void emitPersonalityValue(MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym) const override
StringRef getPrivateGlobalPrefix() const
Definition: DataLayout.h:294
static std::string scalarConstantToHexString(const Constant *C)
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:42
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:65
#define LLVM_FALLTHROUGH
Definition: Compiler.h:86
void emitLinkerFlagsForGlobal(raw_ostream &OS, const GlobalValue *GV) const override
virtual void AddBlankLine()
AddBlankLine - Emit a blank line to a .s file to pretty it up.
Definition: MCStreamer.h:333
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
MCSection * SixteenByteConstantSection
void push_back(const T &Elt)
Definition: SmallVector.h:218
MCSection * TextSection
Section directive for standard text.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit Obj-C garbage collection and linker options.
MCSection * StaticCtorSection
This section contains the static constructor pointer list.
MCSection * ConstTextCoalSection
virtual void EmitBytes(StringRef Data)
Emit the bytes in Data into the output.
void emitModuleMetadata(MCStreamer &Streamer, Module &M) const override
Emit the module flags that specify the garbage collection information.
static void checkMachOComdat(const GlobalValue *GV)
This file contains the declarations for metadata subclasses.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
Definition: Format.h:124
MCSymbol * getCFIPersonalitySymbol(const GlobalValue *GV, const TargetMachine &TM, MachineModuleInfo *MMI) const override
MCSectionWasm * getWasmSection(const Twine &Section, SectionKind K)
Definition: MCContext.h:454
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM...
bool isMergeableConst8() const
Definition: SectionKind.h:141
PointerIntPair< MCSymbol *, 1, bool > StubValueTy
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.h:321
The data referenced by the COMDAT must be the same size.
Definition: Comdat.h:39
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:510
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
bool isMergeableCString() const
Definition: SectionKind.h:128
const MCExpr * getTTypeReference(const MCSymbolRefExpr *Sym, unsigned Encoding, MCStreamer &Streamer) const
Metadata node.
Definition: Metadata.h:864
std::string getInstrProfSectionName(InstrProfSectKind IPSK, Triple::ObjectFormatType OF, bool AddSegmentInfo=true)
Return the name of the profile section corresponding to IPSK.
Definition: InstrProf.cpp:165
F(f)
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const override
Given a constant with the SectionKind, return a section that it should be placed in.
setjmp/longjmp based exceptions
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1069
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
Definition: DerivedTypes.h:503
MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const override
S_ATTR_NO_DEAD_STRIP - No dead stripping.
Definition: MachO.h:190
const MCExpr * getIndirectSymViaGOTPCRel(const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Get MachO PC relative GOT entry relocation.
unsigned getPointerABIAlignment(unsigned AS) const
Layout pointer alignment.
Definition: DataLayout.cpp:611
static bool isThumb(const MCSubtargetInfo &STI)
unsigned getTypeAndAttributes() const
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1509
MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, SectionKind Kind, StringRef COMDATSymName, int Selection, unsigned UniqueID=GenericSectionID, const char *BeginSymName=nullptr)
Definition: MCContext.cpp:422
bool isMergeable2ByteCString() const
Definition: SectionKind.h:133
MCSectionCOFF * getAssociativeCOFFSection(MCSectionCOFF *Sec, const MCSymbol *KeySym, unsigned UniqueID=GenericSectionID)
Gets or creates a section equivalent to Sec that is associated with the section containing KeySym...
Definition: MCContext.cpp:470
Adds a requirement that another module flag be present and have a specified value after linking is pe...
Definition: Module.h:129
unsigned PersonalityEncoding
PersonalityEncoding, LSDAEncoding, TTypeEncoding - Some encoding values for EH.
This represents a section on Windows.
Definition: MCSectionCOFF.h:27
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
static MCSectionWasm * selectWasmSectionForGlobal(MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang, const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID)
bool hasSection() const
Definition: GlobalValue.h:270
int64_t getConstant() const
Definition: MCValue.h:47
const MCSymbolRefExpr * getSymB() const
Definition: MCValue.h:49
A tuple of MDNodes.
Definition: Metadata.h:1326
amdgpu Simplify well known AMD library false Value Value const Twine & Name
static SectionKind getBSS()
Definition: SectionKind.h:198
const DataLayout & getDataLayout() const
Get the data layout for the module&#39;s target platform.
Definition: Module.cpp:371
uint64_t getArrayNumElements() const
Definition: DerivedTypes.h:388
virtual void Initialize(MCContext &ctx, const TargetMachine &TM)
This method must be called before any actual lowering is done.
bool isKnownWindowsMSVCEnvironment() const
Checks if the environment is MSVC.
Definition: Triple.h:535
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:36
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition: Metadata.cpp:1444
The linker may choose any COMDAT.
Definition: Comdat.h:35
bool hasCOFFComdatConstants() const
Definition: MCAsmInfo.h:476
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV, Mangler &Mang, bool MayAlwaysUsePrivate=false) const
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
MCSection * EightByteConstantSection
S_MOD_TERM_FUNC_POINTERS - Section with only function pointers for termination.
Definition: MachO.h:143
MCSection * TLSDataSection
Section directive for Thread Local data. ELF, MachO, COFF, and Wasm.
static const GlobalValue * getComdatGVForCOFF(const GlobalValue *GV)
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Context object for machine code objects.
Definition: MCContext.h:63
bool hasExternalLinkage() const
Definition: GlobalValue.h:422
Key
PAL metadata keys.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool startswith(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition: StringRef.h:267
bool isText() const
Definition: SectionKind.h:119
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:245
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:546
MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
Definition: MCContext.cpp:273
op_range operands() const
Definition: Metadata.h:1067
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
Definition: Triple.h:290
static std::string APIntToHexString(const APInt &AI)
MCSection * StaticDtorSection
This section contains the static destructor pointer list.
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:133
static void GetObjCImageInfo(Module &M, unsigned &Version, unsigned &Flags, StringRef &Section)
NamedMDNode * getNamedMetadata(const Twine &Name) const
Return the first NamedMDNode in the module with the specified name.
Definition: Module.cpp:252
MCSection * ConstDataCoalSection
GlobalValue * getNamedValue(StringRef Name) const
Return the global value in the module with the specified name, of arbitrary type. ...
Definition: Module.cpp:114
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
bool isBSSLocal() const
Definition: SectionKind.h:161
bool isMergeableConst32() const
Definition: SectionKind.h:143
bool hasImplicitSection() const
Check if section name is present.
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Value wrapper in the Metadata hierarchy.
Definition: Metadata.h:339
static SectionKind getThreadData()
Definition: SectionKind.h:197
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:461
bool isWindowsItaniumEnvironment() const
Definition: Triple.h:543
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
virtual void EmitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers...
Definition: MCStreamer.cpp:124
bool isWindowsCoreCLREnvironment() const
Definition: Triple.h:539
static StringRef getCOFFSectionNameForUniqueGlobal(SectionKind Kind)
MCSection * DataSection
Section directive for standard data.
bool getDataSections() const
Return true if data objects should be emitted into their own section, corresponds to -fdata-sections...
SectionCharacteristics
Definition: COFF.h:284
bool isReadOnlyWithRel() const
Definition: SectionKind.h:168
void getNameWithPrefix(SmallVectorImpl< char > &OutName, const GlobalValue *GV, const TargetMachine &TM) const override
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
Definition: Constants.cpp:335
static bool isWeakForLinker(LinkageTypes Linkage)
Whether the definition of this global may be replaced at link time.
Definition: GlobalValue.h:370
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:56
bool getFunctionSections() const
Return true if functions should be emitted into their own section, corresponding to -ffunction-sectio...
.hidden (ELF)
Definition: MCDirectives.h:31
void getModuleFlagsMetadata(SmallVectorImpl< ModuleFlagEntry > &Flags) const
Returns the module flags in the provided vector.
Definition: Module.cpp:292
static const Comdat * getWasmComdat(const GlobalValue *GV)
No other Module may specify this COMDAT.
Definition: Comdat.h:38
Streaming machine code generation interface.
Definition: MCStreamer.h:189
StringRef getName() const
Definition: Comdat.cpp:27
static std::string ParseSectionSpecifier(StringRef Spec, StringRef &Segment, StringRef &Section, unsigned &TAA, bool &TAAParsed, unsigned &StubSize)
Parse the section specifier indicated by "Spec".
MCSection * getSectionForCommandLines() const override
If supported, return the section to use for the llvm.commandline metadata.
PointerIntPair - This class implements a pair of a pointer and small integer.
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const override
Given a mergeable constant with the specified size and relocation information, return a section that ...
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This is an important base class in LLVM.
Definition: Constant.h:42
unsigned getPointerSize(unsigned AS=0) const
Layout pointer size FIXME: The defaults need to be removed once all of the backends/clients are updat...
Definition: DataLayout.cpp:629
virtual void SwitchSection(MCSection *Section, const MCExpr *Subsection=nullptr)
Set the current section where code is being emitted to Section.
This represents a section on wasm.
Definition: MCSectionWasm.h:28
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
Return an MCExpr to use for a reference to the specified type info global variable from exception han...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static SectionKind getELFKindForNamedSection(StringRef Name, SectionKind K)
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const
Given a constant with the SectionKind, return a section that it should be placed in.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
MCSymbol * getSymbol(const GlobalValue *GV) const
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
virtual bool isSectionAtomizableBySymbols(const MCSection &Section) const
True if the section is atomized using the symbols in it.
Definition: MCAsmInfo.cpp:74
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
void emitLinkerFlagsForGlobalCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &TT, Mangler &Mangler)
Definition: Mangler.cpp:185
SectionKind - This is a simple POD value that classifies the properties of a section.
Definition: SectionKind.h:23
const Triple & getTargetTriple() const
void emitLinkerFlagsForUsed(raw_ostream &OS, const GlobalValue *GV) const override
virtual const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Return an MCExpr to use for a reference to the specified global variable from exception handling info...
bool isMergeableConst16() const
Definition: SectionKind.h:142
MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const override
Given a constant with the SectionKind, return a section that it should be placed in.
Ty & getObjFileInfo()
Keep track of various per-function pieces of information for backends that would like to do so...
The data referenced by the COMDAT must be the same.
Definition: Comdat.h:36
StubValueTy & getGVStubEntry(MCSymbol *Sym)
bool isExternal() const
Definition: MCSymbol.h:393
StubValueTy & getGVStubEntry(MCSymbol *Sym)
MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const override
bool isThreadBSS() const
Definition: SectionKind.h:153
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:44
MCSection * getDrectveSection() const
bool isBSS() const
Definition: SectionKind.h:160
const MCExpr * getTTypeGlobalReference(const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM, MachineModuleInfo *MMI, MCStreamer &Streamer) const override
The mach-o version of this method defaults to returning a stub reference.
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override
bool isMergeableConst4() const
Definition: SectionKind.h:140
static const MCSymbolELF * getAssociatedSymbol(const GlobalObject *GO, const TargetMachine &TM)
static SectionKind getThreadBSS()
Definition: SectionKind.h:196
BlockVerifier::State From
static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo, const MCSection &Section)
const MCSymbol & getSymbol() const
Definition: MCExpr.h:336
bool isMergeable4ByteCString() const
Definition: SectionKind.h:134
bool isCommon() const
Definition: SectionKind.h:164
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
Module.h This file contains the declarations for the Module class.
static SectionKind getMetadata()
Definition: SectionKind.h:179
bool isMetadata() const
Definition: SectionKind.h:117
const Triple & getTargetTriple() const
static const Comdat * getELFComdat(const GlobalValue *GV)
The linker will choose the largest COMDAT.
Definition: Comdat.h:37
bool hasGlobalUnnamedAddr() const
Definition: GlobalValue.h:200
std::string utostr(uint64_t X, bool isNeg=false)
Definition: StringExtras.h:224
bool isOSFreeBSD() const
Definition: Triple.h:491
unsigned getVectorNumElements() const
Definition: DerivedTypes.h:462
unsigned getPreferredAlignment(const GlobalVariable *GV) const
Returns the preferred alignment of the specified global.
Definition: DataLayout.cpp:818
This file contains constants used for implementing Dwarf debug support.
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
Definition: MCSymbol.h:248
const Comdat * getComdat() const
Definition: Globals.cpp:171
Class for arbitrary precision integers.
Definition: APInt.h:70
CodeModel::Model getCodeModel() const
Returns the code model.
static SectionKind getWasmKindForNamedSection(StringRef Name, SectionKind K)
amdgpu AMDGPU DAG DAG Pattern Instruction Selection
static StringRef getSectionPrefixForGlobal(SectionKind Kind)
Return the section prefix name used by options FunctionsSections and DataSections.
MCSection * FourByteConstantSection
bool hasComdat() const
Definition: GlobalObject.h:100
bool isReadOnly() const
Definition: SectionKind.h:123
MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation for ELF targets.
const Comdat * getComdat() const
Definition: GlobalObject.h:101
bool isMergeableConst() const
Definition: SectionKind.h:136
const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const override
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition: Type.h:215
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
virtual void EmitLinkerOptions(ArrayRef< std::string > Kind)
Emit the given list Options of strings as linker options into the output.
Definition: MCStreamer.h:449
bool getUniqueSectionNames() const
StringRef getValueAsString() const
Return the attribute&#39;s value as a string.
Definition: Attributes.cpp:195
MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const override
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value...
Definition: APInt.h:482
MCSection * SelectSectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
StringRef getName() const
Return a constant reference to the value&#39;s name.
Definition: Value.cpp:214
static int getSelectionForCOFF(const GlobalValue *GV)
#define I(x, y, z)
Definition: MD5.cpp:58
COFFYAML::WeakExternalCharacteristics Characteristics
Definition: COFFYAML.cpp:323
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
static unsigned getCOFFSectionFlags(SectionKind K, const TargetMachine &TM)
This represents a section on linux, lots of unix variants and some bare metal systems.
Definition: MCSectionELF.h:28
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
Type * getValueType() const
Definition: GlobalValue.h:276
uint32_t Size
Definition: Profile.cpp:47
void emitLinkerFlagsForUsedCOFF(raw_ostream &OS, const GlobalValue *GV, const Triple &T, Mangler &M)
Definition: Mangler.cpp:216
const Module * getModule() const
MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation for MachO targets...
const GlobalObject * getBaseObject() const
Definition: Globals.cpp:261
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:203
const unsigned Kind
static unsigned getEntrySizeForKind(SectionKind Kind)
MCSection * TLSBSSSection
Section directive for Thread Local uninitialized data.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:483
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition: MCContext.h:389
unsigned getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition: Type.cpp:115
static MCSectionELF * getStaticStructorSection(MCContext &Ctx, bool UseInitArray, bool IsCtor, unsigned Priority, const MCSymbol *KeySym)
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:566
bool isData() const
Definition: SectionKind.h:166
bool isThreadLocal() const
Definition: SectionKind.h:149
bool isMergeable1ByteCString() const
Definition: SectionKind.h:132
MCSection * getExplicitSectionGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const override
Targets should implement this method to assign a section to globals with an explicit section specfied...
virtual void EmitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
Definition: MCStreamer.cpp:347
ExceptionHandling getExceptionHandlingType() const
Definition: MCAsmInfo.h:570
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
Definition: Function.h:331
Metadata * get() const
Definition: Metadata.h:722
bool isExecuteOnly() const
Definition: SectionKind.h:121
This class implements an extremely fast bulk output stream that can only output to a stream...
Definition: raw_ostream.h:46
virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count)
Definition: MCStreamer.cpp:709
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:59
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable&#39;s name.
Definition: Mangler.cpp:112
MCSection * BSSSection
Section that is default initialized to zero.
bool isThreadLocal() const
If the value is "Thread Local", its value isn&#39;t shared by the threads.
Definition: GlobalValue.h:247
const MCSymbol * getAssociatedSymbol() const
Definition: MCSectionELF.h:90
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
MCSection * ReadOnlySection
Section that is readonly and can contain arbitrary initialized data.
static unsigned getELFSectionFlags(SectionKind K)
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
static APInt getNullValue(unsigned numBits)
Get the &#39;0&#39; value.
Definition: APInt.h:569
S_MOD_INIT_FUNC_POINTERS - Section with only function pointers for initialization.
Definition: MachO.h:140
void Initialize(MCContext &Ctx, const TargetMachine &TM) override
This method must be called before any actual lowering is done.
static SectionKind getReadOnly()
Definition: SectionKind.h:182
const uint64_t Version
Definition: InstrProf.h:895
static unsigned getELFSectionType(StringRef Name, SectionKind K)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx)
Definition: MCExpr.cpp:164
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:274
This class contains meta information specific to a module.
std::string utohexstr(uint64_t X, bool LowerCase=false)
Definition: StringExtras.h:125
Pass this value as the UniqueID during section creation to get the generic section with the given nam...
Definition: MCContext.h:372
SelectionKind getSelectionKind() const
Definition: Comdat.h:45
static SectionKind getText()
Definition: SectionKind.h:180
bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const override