1 //===- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info ---===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements classes used to handle lowerings specific to common
11 // object file formats.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
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"
22 #include "llvm/BinaryFormat/Dwarf.h"
23 #include "llvm/BinaryFormat/ELF.h"
24 #include "llvm/BinaryFormat/MachO.h"
25 #include "llvm/CodeGen/MachineModuleInfo.h"
26 #include "llvm/CodeGen/MachineModuleInfoImpls.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"
52 #include "llvm/ProfileData/InstrProf.h"
53 #include "llvm/Support/Casting.h"
54 #include "llvm/Support/CodeGen.h"
55 #include "llvm/Support/Format.h"
56 #include "llvm/Support/ErrorHandling.h"
57 #include "llvm/Support/raw_ostream.h"
58 #include "llvm/Target/TargetMachine.h"
63 using namespace dwarf
;
65 static void GetObjCImageInfo(Module
&M
, unsigned &Version
, unsigned &Flags
,
67 SmallVector
<Module::ModuleFlagEntry
, 8> ModuleFlags
;
68 M
.getModuleFlagsMetadata(ModuleFlags
);
70 for (const auto &MFE
: ModuleFlags
) {
71 // Ignore flags with 'Require' behaviour.
72 if (MFE
.Behavior
== Module::Require
)
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();
90 //===----------------------------------------------------------------------===//
92 //===----------------------------------------------------------------------===//
94 void TargetLoweringObjectFileELF::Initialize(MCContext
&Ctx
,
95 const TargetMachine
&TgtM
) {
96 TargetLoweringObjectFile::Initialize(Ctx
, TgtM
);
99 CodeModel::Model CM
= TgtM
.getCodeModel();
101 switch (TgtM
.getTargetTriple().getArch()) {
105 case Triple::thumbeb
:
106 if (Ctx
.getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM
)
108 // Fallthrough if not using EHABI
112 PersonalityEncoding
= isPositionIndependent()
113 ? dwarf::DW_EH_PE_indirect
|
114 dwarf::DW_EH_PE_pcrel
|
115 dwarf::DW_EH_PE_sdata4
116 : dwarf::DW_EH_PE_absptr
;
117 LSDAEncoding
= isPositionIndependent()
118 ? dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
119 : dwarf::DW_EH_PE_absptr
;
120 TTypeEncoding
= isPositionIndependent()
121 ? dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
122 dwarf::DW_EH_PE_sdata4
123 : dwarf::DW_EH_PE_absptr
;
126 if (isPositionIndependent()) {
127 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
128 ((CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
129 ? dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_sdata8
);
130 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
|
131 (CM
== CodeModel::Small
132 ? dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_sdata8
);
133 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
134 ((CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
135 ? dwarf::DW_EH_PE_sdata8
: dwarf::DW_EH_PE_sdata4
);
137 PersonalityEncoding
=
138 (CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
139 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
140 LSDAEncoding
= (CM
== CodeModel::Small
)
141 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
142 TTypeEncoding
= (CM
== CodeModel::Small
)
143 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
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
;
153 TTypeEncoding
|= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
;
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
|
163 dwarf::DW_EH_PE_sdata8
;
164 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata8
;
165 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
166 dwarf::DW_EH_PE_sdata8
;
168 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
169 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
170 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
174 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
175 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
176 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
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.
188 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
189 dwarf::DW_EH_PE_sdata4
;
190 // We don't support PC-relative LSDA references in GAS so we use the default
191 // DW_EH_PE_absptr for those.
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
196 if (TgtM
.getTargetTriple().isOSFreeBSD()) {
197 PersonalityEncoding
|= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
198 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
202 case Triple::ppc64le
:
203 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
204 dwarf::DW_EH_PE_udata8
;
205 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_udata8
;
206 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
207 dwarf::DW_EH_PE_udata8
;
209 case Triple::sparcel
:
211 if (isPositionIndependent()) {
212 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
213 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
214 dwarf::DW_EH_PE_sdata4
;
215 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
216 dwarf::DW_EH_PE_sdata4
;
218 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
219 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
220 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
223 case Triple::sparcv9
:
224 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
225 if (isPositionIndependent()) {
226 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
227 dwarf::DW_EH_PE_sdata4
;
228 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
229 dwarf::DW_EH_PE_sdata4
;
231 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
232 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
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
|
240 dwarf::DW_EH_PE_sdata4
;
241 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
242 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
243 dwarf::DW_EH_PE_sdata4
;
245 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
246 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
247 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
255 void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer
&Streamer
,
257 auto &C
= getContext();
259 if (NamedMDNode
*LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
260 auto *S
= C
.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS
,
263 Streamer
.SwitchSection(S
);
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);
275 unsigned Version
= 0;
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();
289 SmallVector
<Module::ModuleFlagEntry
, 8> ModuleFlags
;
290 M
.getModuleFlagsMetadata(ModuleFlags
);
292 MDNode
*CFGProfile
= nullptr;
294 for (const auto &MFE
: ModuleFlags
) {
295 StringRef Key
= MFE
.Key
->getString();
296 if (Key
== "CG Profile") {
297 CFGProfile
= cast
<MDNode
>(MFE
.Val
);
305 auto GetSym
= [this](const MDOperand
&MDO
) -> MCSymbol
* {
308 auto V
= cast
<ValueAsMetadata
>(MDO
);
309 const Function
*F
= cast
<Function
>(V
->getValue());
310 return TM
->getSymbol(F
);
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.
321 uint64_t Count
= cast
<ConstantAsMetadata
>(E
->getOperand(2))
325 Streamer
.emitCGProfileEntry(
326 MCSymbolRefExpr::create(From
, MCSymbolRefExpr::VK_None
, C
),
327 MCSymbolRefExpr::create(To
, MCSymbolRefExpr::VK_None
, C
), Count
);
331 MCSymbol
*TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
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!");
343 void TargetLoweringObjectFileELF::emitPersonalityValue(
344 MCStreamer
&Streamer
, const DataLayout
&DL
, const MCSymbol
*Sym
) const {
345 SmallString
<64> NameData("DW.ref.");
346 NameData
+= Sym
->getName();
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
);
356 Streamer
.EmitValueToAlignment(DL
.getPointerABIAlignment(0));
357 Streamer
.EmitSymbolAttribute(Label
, MCSA_ELF_TypeObject
);
358 const MCExpr
*E
= MCConstantExpr::create(Size
, getContext());
359 Streamer
.emitELFSize(Label
, E
);
360 Streamer
.EmitLabel(Label
);
362 Streamer
.EmitSymbolValue(Sym
, Size
);
365 const MCExpr
*TargetLoweringObjectFileELF::getTTypeGlobalReference(
366 const GlobalValue
*GV
, unsigned Encoding
, const TargetMachine
&TM
,
367 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
368 if (Encoding
& DW_EH_PE_indirect
) {
369 MachineModuleInfoELF
&ELFMMI
= MMI
->getObjFileInfo
<MachineModuleInfoELF
>();
371 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, ".DW.stub", TM
);
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
);
378 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
381 return TargetLoweringObjectFile::
382 getTTypeReference(MCSymbolRefExpr::create(SSym
, getContext()),
383 Encoding
& ~DW_EH_PE_indirect
, Streamer
);
386 return TargetLoweringObjectFile::getTTypeGlobalReference(GV
, Encoding
, TM
,
390 static SectionKind
getELFKindForNamedSection(StringRef Name
, SectionKind K
) {
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:
396 // .section .eh_frame,"a",@progbits
398 if (Name
== getInstrProfSectionName(IPSK_covmap
, Triple::ELF
,
399 /*AddSegmentInfo=*/false))
400 return SectionKind::getMetadata();
402 if (Name
.empty() || Name
[0] != '.') return K
;
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.") ||
410 Name
.startswith(".sbss.") ||
411 Name
.startswith(".gnu.linkonce.sb.") ||
412 Name
.startswith(".llvm.linkonce.sb."))
413 return SectionKind::getBSS();
415 if (Name
== ".tdata" ||
416 Name
.startswith(".tdata.") ||
417 Name
.startswith(".gnu.linkonce.td.") ||
418 Name
.startswith(".llvm.linkonce.td."))
419 return SectionKind::getThreadData();
421 if (Name
== ".tbss" ||
422 Name
.startswith(".tbss.") ||
423 Name
.startswith(".gnu.linkonce.tb.") ||
424 Name
.startswith(".llvm.linkonce.tb."))
425 return SectionKind::getThreadBSS();
430 static unsigned getELFSectionType(StringRef Name
, SectionKind K
) {
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
;
437 if (Name
== ".init_array")
438 return ELF::SHT_INIT_ARRAY
;
440 if (Name
== ".fini_array")
441 return ELF::SHT_FINI_ARRAY
;
443 if (Name
== ".preinit_array")
444 return ELF::SHT_PREINIT_ARRAY
;
446 if (K
.isBSS() || K
.isThreadBSS())
447 return ELF::SHT_NOBITS
;
449 return ELF::SHT_PROGBITS
;
452 static unsigned getELFSectionFlags(SectionKind K
) {
456 Flags
|= ELF::SHF_ALLOC
;
459 Flags
|= ELF::SHF_EXECINSTR
;
461 if (K
.isExecuteOnly())
462 Flags
|= ELF::SHF_ARM_PURECODE
;
465 Flags
|= ELF::SHF_WRITE
;
467 if (K
.isThreadLocal())
468 Flags
|= ELF::SHF_TLS
;
470 if (K
.isMergeableCString() || K
.isMergeableConst())
471 Flags
|= ELF::SHF_MERGE
;
473 if (K
.isMergeableCString())
474 Flags
|= ELF::SHF_STRINGS
;
479 static const Comdat
*getELFComdat(const GlobalValue
*GV
) {
480 const Comdat
*C
= GV
->getComdat();
484 if (C
->getSelectionKind() != Comdat::Any
)
485 report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" +
486 C
->getName() + "' cannot be lowered.");
491 static const MCSymbolELF
*getAssociatedSymbol(const GlobalObject
*GO
,
492 const TargetMachine
&TM
) {
493 MDNode
*MD
= GO
->getMetadata(LLVMContext::MD_associated
);
497 const MDOperand
&Op
= MD
->getOperand(0);
501 auto *VM
= dyn_cast
<ValueAsMetadata
>(Op
);
503 report_fatal_error("MD_associated operand is not ValueAsMetadata");
505 GlobalObject
*OtherGO
= dyn_cast
<GlobalObject
>(VM
->getValue());
506 return OtherGO
? dyn_cast
<MCSymbolELF
>(TM
.getSymbol(OtherGO
)) : nullptr;
509 MCSection
*TargetLoweringObjectFileELF::getExplicitSectionGlobal(
510 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
511 StringRef SectionName
= GO
->getSection();
513 // Check if '#pragma clang section' name is applicable.
514 // Note that pragma directive overrides -ffunction-section, -fdata-section
515 // and so section name is exactly as user specified and not uniqued.
516 const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(GO
);
517 if (GV
&& GV
->hasImplicitSection()) {
518 auto Attrs
= GV
->getAttributes();
519 if (Attrs
.hasAttribute("bss-section") && Kind
.isBSS()) {
520 SectionName
= Attrs
.getAttribute("bss-section").getValueAsString();
521 } else if (Attrs
.hasAttribute("rodata-section") && Kind
.isReadOnly()) {
522 SectionName
= Attrs
.getAttribute("rodata-section").getValueAsString();
523 } else if (Attrs
.hasAttribute("data-section") && Kind
.isData()) {
524 SectionName
= Attrs
.getAttribute("data-section").getValueAsString();
527 const Function
*F
= dyn_cast
<Function
>(GO
);
528 if (F
&& F
->hasFnAttribute("implicit-section-name")) {
529 SectionName
= F
->getFnAttribute("implicit-section-name").getValueAsString();
532 // Infer section flags from the section name if we can.
533 Kind
= getELFKindForNamedSection(SectionName
, Kind
);
535 StringRef Group
= "";
536 unsigned Flags
= getELFSectionFlags(Kind
);
537 if (const Comdat
*C
= getELFComdat(GO
)) {
538 Group
= C
->getName();
539 Flags
|= ELF::SHF_GROUP
;
542 // A section can have at most one associated section. Put each global with
543 // MD_associated in a unique section.
544 unsigned UniqueID
= MCContext::GenericSectionID
;
545 const MCSymbolELF
*AssociatedSymbol
= getAssociatedSymbol(GO
, TM
);
546 if (AssociatedSymbol
) {
547 UniqueID
= NextUniqueID
++;
548 Flags
|= ELF::SHF_LINK_ORDER
;
551 MCSectionELF
*Section
= getContext().getELFSection(
552 SectionName
, getELFSectionType(SectionName
, Kind
), Flags
,
553 /*EntrySize=*/0, Group
, UniqueID
, AssociatedSymbol
);
554 // Make sure that we did not get some other section with incompatible sh_link.
555 // This should not be possible due to UniqueID code above.
556 assert(Section
->getAssociatedSymbol() == AssociatedSymbol
&&
557 "Associated symbol mismatch between sections");
561 /// Return the section prefix name used by options FunctionsSections and
563 static StringRef
getSectionPrefixForGlobal(SectionKind Kind
) {
566 if (Kind
.isReadOnly())
570 if (Kind
.isThreadData())
572 if (Kind
.isThreadBSS())
576 assert(Kind
.isReadOnlyWithRel() && "Unknown section kind");
577 return ".data.rel.ro";
580 static unsigned getEntrySizeForKind(SectionKind Kind
) {
581 if (Kind
.isMergeable1ByteCString())
583 else if (Kind
.isMergeable2ByteCString())
585 else if (Kind
.isMergeable4ByteCString())
587 else if (Kind
.isMergeableConst4())
589 else if (Kind
.isMergeableConst8())
591 else if (Kind
.isMergeableConst16())
593 else if (Kind
.isMergeableConst32())
596 // We shouldn't have mergeable C strings or mergeable constants that we
597 // didn't handle above.
598 assert(!Kind
.isMergeableCString() && "unknown string width");
599 assert(!Kind
.isMergeableConst() && "unknown data width");
604 static MCSectionELF
*selectELFSectionForGlobal(
605 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
606 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned Flags
,
607 unsigned *NextUniqueID
, const MCSymbolELF
*AssociatedSymbol
) {
609 StringRef Group
= "";
610 if (const Comdat
*C
= getELFComdat(GO
)) {
611 Flags
|= ELF::SHF_GROUP
;
612 Group
= C
->getName();
615 // Get the section entry size based on the kind.
616 unsigned EntrySize
= getEntrySizeForKind(Kind
);
618 SmallString
<128> Name
;
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!
623 unsigned Align
= GO
->getParent()->getDataLayout().getPreferredAlignment(
624 cast
<GlobalVariable
>(GO
));
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
);
632 Name
= getSectionPrefixForGlobal(Kind
);
635 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
636 const auto &OptionalPrefix
= F
->getSectionPrefix();
638 Name
+= *OptionalPrefix
;
641 unsigned UniqueID
= MCContext::GenericSectionID
;
642 if (EmitUniqueSection
) {
643 if (TM
.getUniqueSectionNames()) {
645 TM
.getNameWithPrefix(Name
, GO
, Mang
, true /*MayAlwaysUsePrivate*/);
647 UniqueID
= *NextUniqueID
;
651 // Use 0 as the unique ID for execute-only text.
652 if (Kind
.isExecuteOnly())
654 return Ctx
.getELFSection(Name
, getELFSectionType(Name
, Kind
), Flags
,
655 EntrySize
, Group
, UniqueID
, AssociatedSymbol
);
658 MCSection
*TargetLoweringObjectFileELF::SelectSectionForGlobal(
659 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
660 unsigned Flags
= getELFSectionFlags(Kind
);
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()) {
667 EmitUniqueSection
= TM
.getFunctionSections();
669 EmitUniqueSection
= TM
.getDataSections();
671 EmitUniqueSection
|= GO
->hasComdat();
673 const MCSymbolELF
*AssociatedSymbol
= getAssociatedSymbol(GO
, TM
);
674 if (AssociatedSymbol
) {
675 EmitUniqueSection
= true;
676 Flags
|= ELF::SHF_LINK_ORDER
;
679 MCSectionELF
*Section
= selectELFSectionForGlobal(
680 getContext(), GO
, Kind
, getMangler(), TM
, EmitUniqueSection
, Flags
,
681 &NextUniqueID
, AssociatedSymbol
);
682 assert(Section
->getAssociatedSymbol() == AssociatedSymbol
);
686 MCSection
*TargetLoweringObjectFileELF::getSectionForJumpTable(
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
;
695 return selectELFSectionForGlobal(getContext(), &F
, SectionKind::getReadOnly(),
696 getMangler(), TM
, EmitUniqueSection
,
697 ELF::SHF_ALLOC
, &NextUniqueID
,
698 /* AssociatedSymbol */ nullptr);
701 bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(
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.
708 /// Given a mergeable constant with the specified size and relocation
709 /// information, return a section that it should be placed in.
710 MCSection
*TargetLoweringObjectFileELF::getSectionForConstant(
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
;
724 assert(Kind
.isReadOnlyWithRel() && "Unknown section kind");
725 return DataRelROSection
;
728 static MCSectionELF
*getStaticStructorSection(MCContext
&Ctx
, bool UseInitArray
,
729 bool IsCtor
, unsigned Priority
,
730 const MCSymbol
*KeySym
) {
733 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_WRITE
;
734 StringRef COMDAT
= KeySym
? KeySym
->getName() : "";
737 Flags
|= ELF::SHF_GROUP
;
741 Type
= ELF::SHT_INIT_ARRAY
;
742 Name
= ".init_array";
744 Type
= ELF::SHT_FINI_ARRAY
;
745 Name
= ".fini_array";
747 if (Priority
!= 65535) {
749 Name
+= utostr(Priority
);
752 // The default scheme is .ctor / .dtor, so we have to invert the priority
758 if (Priority
!= 65535)
759 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
760 Type
= ELF::SHT_PROGBITS
;
763 return Ctx
.getELFSection(Name
, Type
, Flags
, 0, COMDAT
);
766 MCSection
*TargetLoweringObjectFileELF::getStaticCtorSection(
767 unsigned Priority
, const MCSymbol
*KeySym
) const {
768 return getStaticStructorSection(getContext(), UseInitArray
, true, Priority
,
772 MCSection
*TargetLoweringObjectFileELF::getStaticDtorSection(
773 unsigned Priority
, const MCSymbol
*KeySym
) const {
774 return getStaticStructorSection(getContext(), UseInitArray
, false, Priority
,
778 const MCExpr
*TargetLoweringObjectFileELF::lowerRelativeReference(
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
783 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
786 // Basic sanity checks.
787 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
788 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
789 RHS
->isThreadLocal())
792 return MCBinaryExpr::createSub(
793 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), PLTRelativeVariantKind
,
795 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
799 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_
) {
800 UseInitArray
= UseInitArray_
;
801 MCContext
&Ctx
= getContext();
803 StaticCtorSection
= Ctx
.getELFSection(".ctors", ELF::SHT_PROGBITS
,
804 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
806 StaticDtorSection
= Ctx
.getELFSection(".dtors", ELF::SHT_PROGBITS
,
807 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
811 StaticCtorSection
= Ctx
.getELFSection(".init_array", ELF::SHT_INIT_ARRAY
,
812 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
813 StaticDtorSection
= Ctx
.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY
,
814 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
817 //===----------------------------------------------------------------------===//
819 //===----------------------------------------------------------------------===//
821 TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO()
822 : TargetLoweringObjectFile() {
823 SupportIndirectSymViaGOTPCRel
= true;
826 void TargetLoweringObjectFileMachO::Initialize(MCContext
&Ctx
,
827 const TargetMachine
&TM
) {
828 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
829 if (TM
.getRelocationModel() == Reloc::Static
) {
830 StaticCtorSection
= Ctx
.getMachOSection("__TEXT", "__constructor", 0,
831 SectionKind::getData());
832 StaticDtorSection
= Ctx
.getMachOSection("__TEXT", "__destructor", 0,
833 SectionKind::getData());
835 StaticCtorSection
= Ctx
.getMachOSection("__DATA", "__mod_init_func",
836 MachO::S_MOD_INIT_FUNC_POINTERS
,
837 SectionKind::getData());
838 StaticDtorSection
= Ctx
.getMachOSection("__DATA", "__mod_term_func",
839 MachO::S_MOD_TERM_FUNC_POINTERS
,
840 SectionKind::getData());
843 PersonalityEncoding
=
844 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
845 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
;
847 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
850 void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer
&Streamer
,
852 // Emit the linker options if present.
853 if (auto *LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
854 for (const auto &Option
: LinkerOptions
->operands()) {
855 SmallVector
<std::string
, 4> StrOptions
;
856 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands())
857 StrOptions
.push_back(cast
<MDString
>(Piece
)->getString());
858 Streamer
.EmitLinkerOptions(StrOptions
);
862 unsigned VersionVal
= 0;
863 unsigned ImageInfoFlags
= 0;
864 StringRef SectionVal
;
866 GetObjCImageInfo(M
, VersionVal
, ImageInfoFlags
, SectionVal
);
868 // The section is mandatory. If we don't have it, then we don't have GC info.
869 if (SectionVal
.empty())
872 StringRef Segment
, Section
;
873 unsigned TAA
= 0, StubSize
= 0;
875 std::string ErrorCode
=
876 MCSectionMachO::ParseSectionSpecifier(SectionVal
, Segment
, Section
,
877 TAA
, TAAParsed
, StubSize
);
878 if (!ErrorCode
.empty())
879 // If invalid, report the error with report_fatal_error.
880 report_fatal_error("Invalid section specifier '" + Section
+ "': " +
884 MCSectionMachO
*S
= getContext().getMachOSection(
885 Segment
, Section
, TAA
, StubSize
, SectionKind::getData());
886 Streamer
.SwitchSection(S
);
887 Streamer
.EmitLabel(getContext().
888 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
889 Streamer
.EmitIntValue(VersionVal
, 4);
890 Streamer
.EmitIntValue(ImageInfoFlags
, 4);
891 Streamer
.AddBlankLine();
894 static void checkMachOComdat(const GlobalValue
*GV
) {
895 const Comdat
*C
= GV
->getComdat();
899 report_fatal_error("MachO doesn't support COMDATs, '" + C
->getName() +
900 "' cannot be lowered.");
903 MCSection
*TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
904 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
905 // Parse the section specifier and create it if valid.
906 StringRef Segment
, Section
;
907 unsigned TAA
= 0, StubSize
= 0;
910 checkMachOComdat(GO
);
912 std::string ErrorCode
=
913 MCSectionMachO::ParseSectionSpecifier(GO
->getSection(), Segment
, Section
,
914 TAA
, TAAParsed
, StubSize
);
915 if (!ErrorCode
.empty()) {
916 // If invalid, report the error with report_fatal_error.
917 report_fatal_error("Global variable '" + GO
->getName() +
918 "' has an invalid section specifier '" +
919 GO
->getSection() + "': " + ErrorCode
+ ".");
924 getContext().getMachOSection(Segment
, Section
, TAA
, StubSize
, Kind
);
926 // If TAA wasn't set by ParseSectionSpecifier() above,
927 // use the value returned by getMachOSection() as a default.
929 TAA
= S
->getTypeAndAttributes();
931 // Okay, now that we got the section, verify that the TAA & StubSize agree.
932 // If the user declared multiple globals with different section flags, we need
933 // to reject it here.
934 if (S
->getTypeAndAttributes() != TAA
|| S
->getStubSize() != StubSize
) {
935 // If invalid, report the error with report_fatal_error.
936 report_fatal_error("Global variable '" + GO
->getName() +
937 "' section type or attributes does not match previous"
938 " section specifier");
944 MCSection
*TargetLoweringObjectFileMachO::SelectSectionForGlobal(
945 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
946 checkMachOComdat(GO
);
948 // Handle thread local data.
949 if (Kind
.isThreadBSS()) return TLSBSSSection
;
950 if (Kind
.isThreadData()) return TLSDataSection
;
953 return GO
->isWeakForLinker() ? TextCoalSection
: TextSection
;
955 // If this is weak/linkonce, put this in a coalescable section, either in text
956 // or data depending on if it is writable.
957 if (GO
->isWeakForLinker()) {
958 if (Kind
.isReadOnly())
959 return ConstTextCoalSection
;
960 if (Kind
.isReadOnlyWithRel())
961 return ConstDataCoalSection
;
962 return DataCoalSection
;
965 // FIXME: Alignment check should be handled by section classifier.
966 if (Kind
.isMergeable1ByteCString() &&
967 GO
->getParent()->getDataLayout().getPreferredAlignment(
968 cast
<GlobalVariable
>(GO
)) < 32)
969 return CStringSection
;
971 // Do not put 16-bit arrays in the UString section if they have an
972 // externally visible label, this runs into issues with certain linker
974 if (Kind
.isMergeable2ByteCString() && !GO
->hasExternalLinkage() &&
975 GO
->getParent()->getDataLayout().getPreferredAlignment(
976 cast
<GlobalVariable
>(GO
)) < 32)
977 return UStringSection
;
979 // With MachO only variables whose corresponding symbol starts with 'l' or
980 // 'L' can be merged, so we only try merging GVs with private linkage.
981 if (GO
->hasPrivateLinkage() && Kind
.isMergeableConst()) {
982 if (Kind
.isMergeableConst4())
983 return FourByteConstantSection
;
984 if (Kind
.isMergeableConst8())
985 return EightByteConstantSection
;
986 if (Kind
.isMergeableConst16())
987 return SixteenByteConstantSection
;
990 // Otherwise, if it is readonly, but not something we can specially optimize,
991 // just drop it in .const.
992 if (Kind
.isReadOnly())
993 return ReadOnlySection
;
995 // If this is marked const, put it into a const section. But if the dynamic
996 // linker needs to write to it, put it in the data segment.
997 if (Kind
.isReadOnlyWithRel())
998 return ConstDataSection
;
1000 // Put zero initialized globals with strong external linkage in the
1001 // DATA, __common section with the .zerofill directive.
1002 if (Kind
.isBSSExtern())
1003 return DataCommonSection
;
1005 // Put zero initialized globals with local linkage in __DATA,__bss directive
1006 // with the .zerofill directive (aka .lcomm).
1007 if (Kind
.isBSSLocal())
1008 return DataBSSSection
;
1010 // Otherwise, just drop the variable in the normal data section.
1014 MCSection
*TargetLoweringObjectFileMachO::getSectionForConstant(
1015 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1016 unsigned &Align
) const {
1017 // If this constant requires a relocation, we have to put it in the data
1018 // segment, not in the text segment.
1019 if (Kind
.isData() || Kind
.isReadOnlyWithRel())
1020 return ConstDataSection
;
1022 if (Kind
.isMergeableConst4())
1023 return FourByteConstantSection
;
1024 if (Kind
.isMergeableConst8())
1025 return EightByteConstantSection
;
1026 if (Kind
.isMergeableConst16())
1027 return SixteenByteConstantSection
;
1028 return ReadOnlySection
; // .const
1031 const MCExpr
*TargetLoweringObjectFileMachO::getTTypeGlobalReference(
1032 const GlobalValue
*GV
, unsigned Encoding
, const TargetMachine
&TM
,
1033 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1034 // The mach-o version of this method defaults to returning a stub reference.
1036 if (Encoding
& DW_EH_PE_indirect
) {
1037 MachineModuleInfoMachO
&MachOMMI
=
1038 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1040 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1042 // Add information about the stub reference to MachOMMI so that the stub
1043 // gets emitted by the asmprinter.
1044 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1045 if (!StubSym
.getPointer()) {
1046 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1047 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1050 return TargetLoweringObjectFile::
1051 getTTypeReference(MCSymbolRefExpr::create(SSym
, getContext()),
1052 Encoding
& ~DW_EH_PE_indirect
, Streamer
);
1055 return TargetLoweringObjectFile::getTTypeGlobalReference(GV
, Encoding
, TM
,
1059 MCSymbol
*TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
1060 const GlobalValue
*GV
, const TargetMachine
&TM
,
1061 MachineModuleInfo
*MMI
) const {
1062 // The mach-o version of this method defaults to returning a stub reference.
1063 MachineModuleInfoMachO
&MachOMMI
=
1064 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1066 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1068 // Add information about the stub reference to MachOMMI so that the stub
1069 // gets emitted by the asmprinter.
1070 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1071 if (!StubSym
.getPointer()) {
1072 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1073 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1079 const MCExpr
*TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
1080 const MCSymbol
*Sym
, const MCValue
&MV
, int64_t Offset
,
1081 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1082 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1083 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1084 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1085 // computation of deltas to final external symbols. Example:
1091 // .long _extgotequiv-_delta
1093 // is transformed to:
1096 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1098 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1099 // L_extfoo$non_lazy_ptr:
1100 // .indirect_symbol _extfoo
1103 MachineModuleInfoMachO
&MachOMMI
=
1104 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1105 MCContext
&Ctx
= getContext();
1107 // The offset must consider the original displacement from the base symbol
1108 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1109 Offset
= -MV
.getConstant();
1110 const MCSymbol
*BaseSym
= &MV
.getSymB()->getSymbol();
1112 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1113 // non_lazy_ptr stubs.
1114 SmallString
<128> Name
;
1115 StringRef Suffix
= "$non_lazy_ptr";
1116 Name
+= MMI
->getModule()->getDataLayout().getPrivateGlobalPrefix();
1117 Name
+= Sym
->getName();
1119 MCSymbol
*Stub
= Ctx
.getOrCreateSymbol(Name
);
1121 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(Stub
);
1122 if (!StubSym
.getPointer())
1123 StubSym
= MachineModuleInfoImpl::
1124 StubValueTy(const_cast<MCSymbol
*>(Sym
), true /* access indirectly */);
1126 const MCExpr
*BSymExpr
=
1127 MCSymbolRefExpr::create(BaseSym
, MCSymbolRefExpr::VK_None
, Ctx
);
1129 MCSymbolRefExpr::create(Stub
, MCSymbolRefExpr::VK_None
, Ctx
);
1132 return MCBinaryExpr::createSub(LHS
, BSymExpr
, Ctx
);
1135 MCBinaryExpr::createAdd(BSymExpr
, MCConstantExpr::create(Offset
, Ctx
), Ctx
);
1136 return MCBinaryExpr::createSub(LHS
, RHS
, Ctx
);
1139 static bool canUsePrivateLabel(const MCAsmInfo
&AsmInfo
,
1140 const MCSection
&Section
) {
1141 if (!AsmInfo
.isSectionAtomizableBySymbols(Section
))
1144 // If it is not dead stripped, it is safe to use private labels.
1145 const MCSectionMachO
&SMO
= cast
<MCSectionMachO
>(Section
);
1146 if (SMO
.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP
))
1152 void TargetLoweringObjectFileMachO::getNameWithPrefix(
1153 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1154 const TargetMachine
&TM
) const {
1155 bool CannotUsePrivateLabel
= true;
1156 if (auto *GO
= GV
->getBaseObject()) {
1157 SectionKind GOKind
= TargetLoweringObjectFile::getKindForGlobal(GO
, TM
);
1158 const MCSection
*TheSection
= SectionForGlobal(GO
, GOKind
, TM
);
1159 CannotUsePrivateLabel
=
1160 !canUsePrivateLabel(*TM
.getMCAsmInfo(), *TheSection
);
1162 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1165 //===----------------------------------------------------------------------===//
1167 //===----------------------------------------------------------------------===//
1170 getCOFFSectionFlags(SectionKind K
, const TargetMachine
&TM
) {
1172 bool isThumb
= TM
.getTargetTriple().getArch() == Triple::thumb
;
1176 COFF::IMAGE_SCN_MEM_DISCARDABLE
;
1177 else if (K
.isText())
1179 COFF::IMAGE_SCN_MEM_EXECUTE
|
1180 COFF::IMAGE_SCN_MEM_READ
|
1181 COFF::IMAGE_SCN_CNT_CODE
|
1182 (isThumb
? COFF::IMAGE_SCN_MEM_16BIT
: (COFF::SectionCharacteristics
)0);
1185 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
|
1186 COFF::IMAGE_SCN_MEM_READ
|
1187 COFF::IMAGE_SCN_MEM_WRITE
;
1188 else if (K
.isThreadLocal())
1190 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1191 COFF::IMAGE_SCN_MEM_READ
|
1192 COFF::IMAGE_SCN_MEM_WRITE
;
1193 else if (K
.isReadOnly() || K
.isReadOnlyWithRel())
1195 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1196 COFF::IMAGE_SCN_MEM_READ
;
1197 else if (K
.isWriteable())
1199 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1200 COFF::IMAGE_SCN_MEM_READ
|
1201 COFF::IMAGE_SCN_MEM_WRITE
;
1206 static const GlobalValue
*getComdatGVForCOFF(const GlobalValue
*GV
) {
1207 const Comdat
*C
= GV
->getComdat();
1208 assert(C
&& "expected GV to have a Comdat!");
1210 StringRef ComdatGVName
= C
->getName();
1211 const GlobalValue
*ComdatGV
= GV
->getParent()->getNamedValue(ComdatGVName
);
1213 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1214 "' does not exist.");
1216 if (ComdatGV
->getComdat() != C
)
1217 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1218 "' is not a key for its COMDAT.");
1223 static int getSelectionForCOFF(const GlobalValue
*GV
) {
1224 if (const Comdat
*C
= GV
->getComdat()) {
1225 const GlobalValue
*ComdatKey
= getComdatGVForCOFF(GV
);
1226 if (const auto *GA
= dyn_cast
<GlobalAlias
>(ComdatKey
))
1227 ComdatKey
= GA
->getBaseObject();
1228 if (ComdatKey
== GV
) {
1229 switch (C
->getSelectionKind()) {
1231 return COFF::IMAGE_COMDAT_SELECT_ANY
;
1232 case Comdat::ExactMatch
:
1233 return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH
;
1234 case Comdat::Largest
:
1235 return COFF::IMAGE_COMDAT_SELECT_LARGEST
;
1236 case Comdat::NoDuplicates
:
1237 return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1238 case Comdat::SameSize
:
1239 return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE
;
1242 return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
;
1248 MCSection
*TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
1249 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1251 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1252 StringRef Name
= GO
->getSection();
1253 StringRef COMDATSymName
= "";
1254 if (GO
->hasComdat()) {
1255 Selection
= getSelectionForCOFF(GO
);
1256 const GlobalValue
*ComdatGV
;
1257 if (Selection
== COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
)
1258 ComdatGV
= getComdatGVForCOFF(GO
);
1262 if (!ComdatGV
->hasPrivateLinkage()) {
1263 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1264 COMDATSymName
= Sym
->getName();
1265 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1271 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, COMDATSymName
,
1275 static StringRef
getCOFFSectionNameForUniqueGlobal(SectionKind Kind
) {
1280 if (Kind
.isThreadLocal())
1282 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1287 MCSection
*TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
1288 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1289 // If we have -ffunction-sections then we should emit the global value to a
1290 // uniqued section specifically for it.
1291 bool EmitUniquedSection
;
1293 EmitUniquedSection
= TM
.getFunctionSections();
1295 EmitUniquedSection
= TM
.getDataSections();
1297 if ((EmitUniquedSection
&& !Kind
.isCommon()) || GO
->hasComdat()) {
1298 SmallString
<256> Name
= getCOFFSectionNameForUniqueGlobal(Kind
);
1300 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1302 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1303 int Selection
= getSelectionForCOFF(GO
);
1305 Selection
= COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1306 const GlobalValue
*ComdatGV
;
1307 if (GO
->hasComdat())
1308 ComdatGV
= getComdatGVForCOFF(GO
);
1312 unsigned UniqueID
= MCContext::GenericSectionID
;
1313 if (EmitUniquedSection
)
1314 UniqueID
= NextUniqueID
++;
1316 if (!ComdatGV
->hasPrivateLinkage()) {
1317 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1318 StringRef COMDATSymName
= Sym
->getName();
1320 // Append "$symbol" to the section name when targetting mingw. The ld.bfd
1321 // COFF linker will not properly handle comdats otherwise.
1322 if (getTargetTriple().isWindowsGNUEnvironment())
1323 raw_svector_ostream(Name
) << '$' << COMDATSymName
;
1325 return getContext().getCOFFSection(Name
, Characteristics
, Kind
,
1326 COMDATSymName
, Selection
, UniqueID
);
1328 SmallString
<256> TmpData
;
1329 getMangler().getNameWithPrefix(TmpData
, GO
, /*CannotUsePrivateLabel=*/true);
1330 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, TmpData
,
1331 Selection
, UniqueID
);
1338 if (Kind
.isThreadLocal())
1339 return TLSDataSection
;
1341 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1342 return ReadOnlySection
;
1344 // Note: we claim that common symbols are put in BSSSection, but they are
1345 // really emitted with the magic .comm directive, which creates a symbol table
1346 // entry but not a section.
1347 if (Kind
.isBSS() || Kind
.isCommon())
1353 void TargetLoweringObjectFileCOFF::getNameWithPrefix(
1354 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1355 const TargetMachine
&TM
) const {
1356 bool CannotUsePrivateLabel
= false;
1357 if (GV
->hasPrivateLinkage() &&
1358 ((isa
<Function
>(GV
) && TM
.getFunctionSections()) ||
1359 (isa
<GlobalVariable
>(GV
) && TM
.getDataSections())))
1360 CannotUsePrivateLabel
= true;
1362 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1365 MCSection
*TargetLoweringObjectFileCOFF::getSectionForJumpTable(
1366 const Function
&F
, const TargetMachine
&TM
) const {
1367 // If the function can be removed, produce a unique section so that
1368 // the table doesn't prevent the removal.
1369 const Comdat
*C
= F
.getComdat();
1370 bool EmitUniqueSection
= TM
.getFunctionSections() || C
;
1371 if (!EmitUniqueSection
)
1372 return ReadOnlySection
;
1374 // FIXME: we should produce a symbol for F instead.
1375 if (F
.hasPrivateLinkage())
1376 return ReadOnlySection
;
1378 MCSymbol
*Sym
= TM
.getSymbol(&F
);
1379 StringRef COMDATSymName
= Sym
->getName();
1381 SectionKind Kind
= SectionKind::getReadOnly();
1382 StringRef SecName
= getCOFFSectionNameForUniqueGlobal(Kind
);
1383 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1384 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1385 unsigned UniqueID
= NextUniqueID
++;
1387 return getContext().getCOFFSection(
1388 SecName
, Characteristics
, Kind
, COMDATSymName
,
1389 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
, UniqueID
);
1392 void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer
&Streamer
,
1394 if (NamedMDNode
*LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
1395 // Emit the linker options to the linker .drectve section. According to the
1396 // spec, this section is a space-separated string containing flags for
1398 MCSection
*Sec
= getDrectveSection();
1399 Streamer
.SwitchSection(Sec
);
1400 for (const auto &Option
: LinkerOptions
->operands()) {
1401 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands()) {
1402 // Lead with a space for consistency with our dllexport implementation.
1403 std::string
Directive(" ");
1404 Directive
.append(cast
<MDString
>(Piece
)->getString());
1405 Streamer
.EmitBytes(Directive
);
1410 unsigned Version
= 0;
1414 GetObjCImageInfo(M
, Version
, Flags
, Section
);
1415 if (Section
.empty())
1418 auto &C
= getContext();
1419 auto *S
= C
.getCOFFSection(
1420 Section
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
| COFF::IMAGE_SCN_MEM_READ
,
1421 SectionKind::getReadOnly());
1422 Streamer
.SwitchSection(S
);
1423 Streamer
.EmitLabel(C
.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1424 Streamer
.EmitIntValue(Version
, 4);
1425 Streamer
.EmitIntValue(Flags
, 4);
1426 Streamer
.AddBlankLine();
1429 void TargetLoweringObjectFileCOFF::Initialize(MCContext
&Ctx
,
1430 const TargetMachine
&TM
) {
1431 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
1432 const Triple
&T
= TM
.getTargetTriple();
1433 if (T
.isKnownWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1435 Ctx
.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1436 COFF::IMAGE_SCN_MEM_READ
,
1437 SectionKind::getReadOnly());
1439 Ctx
.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1440 COFF::IMAGE_SCN_MEM_READ
,
1441 SectionKind::getReadOnly());
1443 StaticCtorSection
= Ctx
.getCOFFSection(
1444 ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1445 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1446 SectionKind::getData());
1447 StaticDtorSection
= Ctx
.getCOFFSection(
1448 ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1449 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1450 SectionKind::getData());
1454 static MCSectionCOFF
*getCOFFStaticStructorSection(MCContext
&Ctx
,
1455 const Triple
&T
, bool IsCtor
,
1457 const MCSymbol
*KeySym
,
1458 MCSectionCOFF
*Default
) {
1459 if (T
.isKnownWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1460 // If the priority is the default, use .CRT$XCU, possibly associative.
1461 if (Priority
== 65535)
1462 return Ctx
.getAssociativeCOFFSection(Default
, KeySym
, 0);
1464 // Otherwise, we need to compute a new section name. Low priorities should
1465 // run earlier. The linker will sort sections ASCII-betically, and we need a
1466 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
1467 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
1468 // low priorities need to sort before 'L', since the CRT uses that
1469 // internally, so we use ".CRT$XCA00001" for them.
1470 SmallString
<24> Name
;
1471 raw_svector_ostream
OS(Name
);
1472 OS
<< ".CRT$XC" << (Priority
< 200 ? 'A' : 'T') << format("%05u", Priority
);
1473 MCSectionCOFF
*Sec
= Ctx
.getCOFFSection(
1474 Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
| COFF::IMAGE_SCN_MEM_READ
,
1475 SectionKind::getReadOnly());
1476 return Ctx
.getAssociativeCOFFSection(Sec
, KeySym
, 0);
1479 std::string Name
= IsCtor
? ".ctors" : ".dtors";
1480 if (Priority
!= 65535)
1481 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
1483 return Ctx
.getAssociativeCOFFSection(
1484 Ctx
.getCOFFSection(Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1485 COFF::IMAGE_SCN_MEM_READ
|
1486 COFF::IMAGE_SCN_MEM_WRITE
,
1487 SectionKind::getData()),
1491 MCSection
*TargetLoweringObjectFileCOFF::getStaticCtorSection(
1492 unsigned Priority
, const MCSymbol
*KeySym
) const {
1493 return getCOFFStaticStructorSection(getContext(), getTargetTriple(), true,
1495 cast
<MCSectionCOFF
>(StaticCtorSection
));
1498 MCSection
*TargetLoweringObjectFileCOFF::getStaticDtorSection(
1499 unsigned Priority
, const MCSymbol
*KeySym
) const {
1500 return getCOFFStaticStructorSection(getContext(), getTargetTriple(), false,
1502 cast
<MCSectionCOFF
>(StaticDtorSection
));
1505 void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal(
1506 raw_ostream
&OS
, const GlobalValue
*GV
) const {
1507 emitLinkerFlagsForGlobalCOFF(OS
, GV
, getTargetTriple(), getMangler());
1510 void TargetLoweringObjectFileCOFF::emitLinkerFlagsForUsed(
1511 raw_ostream
&OS
, const GlobalValue
*GV
) const {
1512 emitLinkerFlagsForUsedCOFF(OS
, GV
, getTargetTriple(), getMangler());
1515 const MCExpr
*TargetLoweringObjectFileCOFF::lowerRelativeReference(
1516 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
1517 const TargetMachine
&TM
) const {
1518 const Triple
&T
= TM
.getTargetTriple();
1519 if (!T
.isKnownWindowsMSVCEnvironment() &&
1520 !T
.isWindowsItaniumEnvironment() &&
1521 !T
.isWindowsCoreCLREnvironment())
1524 // Our symbols should exist in address space zero, cowardly no-op if
1526 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
1527 RHS
->getType()->getPointerAddressSpace() != 0)
1530 // Both ptrtoint instructions must wrap global objects:
1531 // - Only global variables are eligible for image relative relocations.
1532 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
1533 // We expect __ImageBase to be a global variable without a section, externally
1536 // It should look something like this: @__ImageBase = external constant i8
1537 if (!isa
<GlobalObject
>(LHS
) || !isa
<GlobalVariable
>(RHS
) ||
1538 LHS
->isThreadLocal() || RHS
->isThreadLocal() ||
1539 RHS
->getName() != "__ImageBase" || !RHS
->hasExternalLinkage() ||
1540 cast
<GlobalVariable
>(RHS
)->hasInitializer() || RHS
->hasSection())
1543 return MCSymbolRefExpr::create(TM
.getSymbol(LHS
),
1544 MCSymbolRefExpr::VK_COFF_IMGREL32
,
1548 static std::string
APIntToHexString(const APInt
&AI
) {
1549 unsigned Width
= (AI
.getBitWidth() / 8) * 2;
1550 std::string HexString
= utohexstr(AI
.getLimitedValue(), /*LowerCase=*/true);
1551 unsigned Size
= HexString
.size();
1552 assert(Width
>= Size
&& "hex string is too large!");
1553 HexString
.insert(HexString
.begin(), Width
- Size
, '0');
1558 static std::string
scalarConstantToHexString(const Constant
*C
) {
1559 Type
*Ty
= C
->getType();
1560 if (isa
<UndefValue
>(C
)) {
1561 return APIntToHexString(APInt::getNullValue(Ty
->getPrimitiveSizeInBits()));
1562 } else if (const auto *CFP
= dyn_cast
<ConstantFP
>(C
)) {
1563 return APIntToHexString(CFP
->getValueAPF().bitcastToAPInt());
1564 } else if (const auto *CI
= dyn_cast
<ConstantInt
>(C
)) {
1565 return APIntToHexString(CI
->getValue());
1567 unsigned NumElements
;
1568 if (isa
<VectorType
>(Ty
))
1569 NumElements
= Ty
->getVectorNumElements();
1571 NumElements
= Ty
->getArrayNumElements();
1572 std::string HexString
;
1573 for (int I
= NumElements
- 1, E
= -1; I
!= E
; --I
)
1574 HexString
+= scalarConstantToHexString(C
->getAggregateElement(I
));
1579 MCSection
*TargetLoweringObjectFileCOFF::getSectionForConstant(
1580 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1581 unsigned &Align
) const {
1582 if (Kind
.isMergeableConst() && C
&&
1583 getContext().getAsmInfo()->hasCOFFComdatConstants()) {
1584 // This creates comdat sections with the given symbol name, but unless
1585 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
1586 // will be created with a null storage class, which makes GNU binutils
1588 const unsigned Characteristics
= COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1589 COFF::IMAGE_SCN_MEM_READ
|
1590 COFF::IMAGE_SCN_LNK_COMDAT
;
1591 std::string COMDATSymName
;
1592 if (Kind
.isMergeableConst4()) {
1594 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
1597 } else if (Kind
.isMergeableConst8()) {
1599 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
1602 } else if (Kind
.isMergeableConst16()) {
1603 // FIXME: These may not be appropriate for non-x86 architectures.
1605 COMDATSymName
= "__xmm@" + scalarConstantToHexString(C
);
1608 } else if (Kind
.isMergeableConst32()) {
1610 COMDATSymName
= "__ymm@" + scalarConstantToHexString(C
);
1615 if (!COMDATSymName
.empty())
1616 return getContext().getCOFFSection(".rdata", Characteristics
, Kind
,
1618 COFF::IMAGE_COMDAT_SELECT_ANY
);
1621 return TargetLoweringObjectFile::getSectionForConstant(DL
, Kind
, C
, Align
);
1625 //===----------------------------------------------------------------------===//
1627 //===----------------------------------------------------------------------===//
1629 static const Comdat
*getWasmComdat(const GlobalValue
*GV
) {
1630 const Comdat
*C
= GV
->getComdat();
1634 if (C
->getSelectionKind() != Comdat::Any
)
1635 report_fatal_error("WebAssembly COMDATs only support "
1636 "SelectionKind::Any, '" + C
->getName() + "' cannot be "
1642 static SectionKind
getWasmKindForNamedSection(StringRef Name
, SectionKind K
) {
1643 // If we're told we have function data, then use that.
1645 return SectionKind::getText();
1647 // Otherwise, ignore whatever section type the generic impl detected and use
1648 // a plain data section.
1649 return SectionKind::getData();
1652 MCSection
*TargetLoweringObjectFileWasm::getExplicitSectionGlobal(
1653 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1654 // We don't support explict section names for functions in the wasm object
1655 // format. Each function has to be in its own unique section.
1656 if (isa
<Function
>(GO
)) {
1657 return SelectSectionForGlobal(GO
, Kind
, TM
);
1660 StringRef Name
= GO
->getSection();
1662 Kind
= getWasmKindForNamedSection(Name
, Kind
);
1664 StringRef Group
= "";
1665 if (const Comdat
*C
= getWasmComdat(GO
)) {
1666 Group
= C
->getName();
1669 return getContext().getWasmSection(Name
, Kind
, Group
,
1670 MCContext::GenericSectionID
);
1673 static MCSectionWasm
*selectWasmSectionForGlobal(
1674 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
1675 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned *NextUniqueID
) {
1676 StringRef Group
= "";
1677 if (const Comdat
*C
= getWasmComdat(GO
)) {
1678 Group
= C
->getName();
1681 bool UniqueSectionNames
= TM
.getUniqueSectionNames();
1682 SmallString
<128> Name
= getSectionPrefixForGlobal(Kind
);
1684 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
1685 const auto &OptionalPrefix
= F
->getSectionPrefix();
1687 Name
+= *OptionalPrefix
;
1690 if (EmitUniqueSection
&& UniqueSectionNames
) {
1691 Name
.push_back('.');
1692 TM
.getNameWithPrefix(Name
, GO
, Mang
, true);
1694 unsigned UniqueID
= MCContext::GenericSectionID
;
1695 if (EmitUniqueSection
&& !UniqueSectionNames
) {
1696 UniqueID
= *NextUniqueID
;
1699 return Ctx
.getWasmSection(Name
, Kind
, Group
, UniqueID
);
1702 MCSection
*TargetLoweringObjectFileWasm::SelectSectionForGlobal(
1703 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1705 if (Kind
.isCommon())
1706 report_fatal_error("mergable sections not supported yet on wasm");
1708 // If we have -ffunction-section or -fdata-section then we should emit the
1709 // global value to a uniqued section specifically for it.
1710 bool EmitUniqueSection
= false;
1712 EmitUniqueSection
= TM
.getFunctionSections();
1714 EmitUniqueSection
= TM
.getDataSections();
1715 EmitUniqueSection
|= GO
->hasComdat();
1717 return selectWasmSectionForGlobal(getContext(), GO
, Kind
, getMangler(), TM
,
1718 EmitUniqueSection
, &NextUniqueID
);
1721 bool TargetLoweringObjectFileWasm::shouldPutJumpTableInFunctionSection(
1722 bool UsesLabelDifference
, const Function
&F
) const {
1723 // We can always create relative relocations, so use another section
1724 // that can be marked non-executable.
1728 const MCExpr
*TargetLoweringObjectFileWasm::lowerRelativeReference(
1729 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
1730 const TargetMachine
&TM
) const {
1731 // We may only use a PLT-relative relocation to refer to unnamed_addr
1733 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
1736 // Basic sanity checks.
1737 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
1738 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
1739 RHS
->isThreadLocal())
1742 return MCBinaryExpr::createSub(
1743 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), MCSymbolRefExpr::VK_None
,
1745 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
1748 void TargetLoweringObjectFileWasm::InitializeWasm() {
1750 getContext().getWasmSection(".init_array", SectionKind::getData());
1753 MCSection
*TargetLoweringObjectFileWasm::getStaticCtorSection(
1754 unsigned Priority
, const MCSymbol
*KeySym
) const {
1755 return Priority
== UINT16_MAX
?
1757 getContext().getWasmSection(".init_array." + utostr(Priority
),
1758 SectionKind::getData());
1761 MCSection
*TargetLoweringObjectFileWasm::getStaticDtorSection(
1762 unsigned Priority
, const MCSymbol
*KeySym
) const {
1763 llvm_unreachable("@llvm.global_dtors should have been lowered already");