1 //===- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info ---===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements classes used to handle lowerings specific to common
10 // object file formats.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
15 #include "llvm/ADT/SmallString.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/BinaryFormat/COFF.h"
20 #include "llvm/BinaryFormat/Dwarf.h"
21 #include "llvm/BinaryFormat/ELF.h"
22 #include "llvm/BinaryFormat/MachO.h"
23 #include "llvm/BinaryFormat/Wasm.h"
24 #include "llvm/CodeGen/BasicBlockSectionUtils.h"
25 #include "llvm/CodeGen/MachineBasicBlock.h"
26 #include "llvm/CodeGen/MachineFunction.h"
27 #include "llvm/CodeGen/MachineModuleInfo.h"
28 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
29 #include "llvm/IR/Comdat.h"
30 #include "llvm/IR/Constants.h"
31 #include "llvm/IR/DataLayout.h"
32 #include "llvm/IR/DerivedTypes.h"
33 #include "llvm/IR/DiagnosticInfo.h"
34 #include "llvm/IR/DiagnosticPrinter.h"
35 #include "llvm/IR/Function.h"
36 #include "llvm/IR/GlobalAlias.h"
37 #include "llvm/IR/GlobalObject.h"
38 #include "llvm/IR/GlobalValue.h"
39 #include "llvm/IR/GlobalVariable.h"
40 #include "llvm/IR/Mangler.h"
41 #include "llvm/IR/Metadata.h"
42 #include "llvm/IR/Module.h"
43 #include "llvm/IR/PseudoProbe.h"
44 #include "llvm/IR/Type.h"
45 #include "llvm/MC/MCAsmInfo.h"
46 #include "llvm/MC/MCContext.h"
47 #include "llvm/MC/MCExpr.h"
48 #include "llvm/MC/MCSectionCOFF.h"
49 #include "llvm/MC/MCSectionELF.h"
50 #include "llvm/MC/MCSectionGOFF.h"
51 #include "llvm/MC/MCSectionMachO.h"
52 #include "llvm/MC/MCSectionWasm.h"
53 #include "llvm/MC/MCSectionXCOFF.h"
54 #include "llvm/MC/MCStreamer.h"
55 #include "llvm/MC/MCSymbol.h"
56 #include "llvm/MC/MCSymbolELF.h"
57 #include "llvm/MC/MCValue.h"
58 #include "llvm/MC/SectionKind.h"
59 #include "llvm/ProfileData/InstrProf.h"
60 #include "llvm/Support/Base64.h"
61 #include "llvm/Support/Casting.h"
62 #include "llvm/Support/CodeGen.h"
63 #include "llvm/Support/ErrorHandling.h"
64 #include "llvm/Support/Format.h"
65 #include "llvm/Support/raw_ostream.h"
66 #include "llvm/Target/TargetMachine.h"
67 #include "llvm/TargetParser/Triple.h"
72 using namespace dwarf
;
74 static cl::opt
<bool> JumpTableInFunctionSection(
75 "jumptable-in-function-section", cl::Hidden
, cl::init(false),
76 cl::desc("Putting Jump Table in function section"));
78 static void GetObjCImageInfo(Module
&M
, unsigned &Version
, unsigned &Flags
,
80 SmallVector
<Module::ModuleFlagEntry
, 8> ModuleFlags
;
81 M
.getModuleFlagsMetadata(ModuleFlags
);
83 for (const auto &MFE
: ModuleFlags
) {
84 // Ignore flags with 'Require' behaviour.
85 if (MFE
.Behavior
== Module::Require
)
88 StringRef Key
= MFE
.Key
->getString();
89 if (Key
== "Objective-C Image Info Version") {
90 Version
= mdconst::extract
<ConstantInt
>(MFE
.Val
)->getZExtValue();
91 } else if (Key
== "Objective-C Garbage Collection" ||
92 Key
== "Objective-C GC Only" ||
93 Key
== "Objective-C Is Simulated" ||
94 Key
== "Objective-C Class Properties" ||
95 Key
== "Objective-C Image Swift Version") {
96 Flags
|= mdconst::extract
<ConstantInt
>(MFE
.Val
)->getZExtValue();
97 } else if (Key
== "Objective-C Image Info Section") {
98 Section
= cast
<MDString
>(MFE
.Val
)->getString();
100 // Backend generates L_OBJC_IMAGE_INFO from Swift ABI version + major + minor +
101 // "Objective-C Garbage Collection".
102 else if (Key
== "Swift ABI Version") {
103 Flags
|= (mdconst::extract
<ConstantInt
>(MFE
.Val
)->getZExtValue()) << 8;
104 } else if (Key
== "Swift Major Version") {
105 Flags
|= (mdconst::extract
<ConstantInt
>(MFE
.Val
)->getZExtValue()) << 24;
106 } else if (Key
== "Swift Minor Version") {
107 Flags
|= (mdconst::extract
<ConstantInt
>(MFE
.Val
)->getZExtValue()) << 16;
112 //===----------------------------------------------------------------------===//
114 //===----------------------------------------------------------------------===//
116 TargetLoweringObjectFileELF::TargetLoweringObjectFileELF() {
117 SupportDSOLocalEquivalentLowering
= true;
120 void TargetLoweringObjectFileELF::Initialize(MCContext
&Ctx
,
121 const TargetMachine
&TgtM
) {
122 TargetLoweringObjectFile::Initialize(Ctx
, TgtM
);
124 CodeModel::Model CM
= TgtM
.getCodeModel();
125 InitializeELF(TgtM
.Options
.UseInitArray
);
127 switch (TgtM
.getTargetTriple().getArch()) {
131 case Triple::thumbeb
:
132 if (Ctx
.getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM
)
134 // Fallthrough if not using EHABI
139 PersonalityEncoding
= isPositionIndependent()
140 ? dwarf::DW_EH_PE_indirect
|
141 dwarf::DW_EH_PE_pcrel
|
142 dwarf::DW_EH_PE_sdata4
143 : dwarf::DW_EH_PE_absptr
;
144 LSDAEncoding
= isPositionIndependent()
145 ? dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
146 : dwarf::DW_EH_PE_absptr
;
147 TTypeEncoding
= isPositionIndependent()
148 ? dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
149 dwarf::DW_EH_PE_sdata4
150 : dwarf::DW_EH_PE_absptr
;
153 if (isPositionIndependent()) {
154 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
155 ((CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
156 ? dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_sdata8
);
157 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
|
158 (CM
== CodeModel::Small
159 ? dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_sdata8
);
160 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
161 ((CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
162 ? dwarf::DW_EH_PE_sdata4
: dwarf::DW_EH_PE_sdata8
);
164 PersonalityEncoding
=
165 (CM
== CodeModel::Small
|| CM
== CodeModel::Medium
)
166 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
167 LSDAEncoding
= (CM
== CodeModel::Small
)
168 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
169 TTypeEncoding
= (CM
== CodeModel::Small
)
170 ? dwarf::DW_EH_PE_udata4
: dwarf::DW_EH_PE_absptr
;
173 case Triple::hexagon
:
174 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
175 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
176 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
177 if (isPositionIndependent()) {
178 PersonalityEncoding
|= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
;
179 LSDAEncoding
|= dwarf::DW_EH_PE_pcrel
;
180 TTypeEncoding
|= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
;
183 case Triple::aarch64
:
184 case Triple::aarch64_be
:
185 case Triple::aarch64_32
:
186 // The small model guarantees static code/data size < 4GB, but not where it
187 // will be in memory. Most of these could end up >2GB away so even a signed
188 // pc-relative 32-bit address is insufficient, theoretically.
190 // Use DW_EH_PE_indirect even for -fno-pic to avoid copy relocations.
191 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
|
192 (TgtM
.getTargetTriple().getEnvironment() == Triple::GNUILP32
193 ? dwarf::DW_EH_PE_sdata4
194 : dwarf::DW_EH_PE_sdata8
);
195 PersonalityEncoding
= LSDAEncoding
| dwarf::DW_EH_PE_indirect
;
196 TTypeEncoding
= LSDAEncoding
| dwarf::DW_EH_PE_indirect
;
199 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
200 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
201 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
206 case Triple::mips64el
:
207 // MIPS uses indirect pointer to refer personality functions and types, so
208 // that the eh_frame section can be read-only. DW.ref.personality will be
209 // generated for relocation.
210 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
;
211 // FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
212 // identify N64 from just a triple.
213 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
214 dwarf::DW_EH_PE_sdata4
;
215 // We don't support PC-relative LSDA references in GAS so we use the default
216 // DW_EH_PE_absptr for those.
218 // FreeBSD must be explicit about the data size and using pcrel since it's
219 // assembler/linker won't do the automatic conversion that the Linux tools
221 if (TgtM
.getTargetTriple().isOSFreeBSD()) {
222 PersonalityEncoding
|= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
223 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
227 case Triple::ppc64le
:
228 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
229 dwarf::DW_EH_PE_udata8
;
230 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_udata8
;
231 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
232 dwarf::DW_EH_PE_udata8
;
234 case Triple::sparcel
:
236 if (isPositionIndependent()) {
237 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
238 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
239 dwarf::DW_EH_PE_sdata4
;
240 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
241 dwarf::DW_EH_PE_sdata4
;
243 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
244 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
245 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
247 CallSiteEncoding
= dwarf::DW_EH_PE_udata4
;
249 case Triple::riscv32
:
250 case Triple::riscv64
:
251 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
252 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
253 dwarf::DW_EH_PE_sdata4
;
254 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
255 dwarf::DW_EH_PE_sdata4
;
256 CallSiteEncoding
= dwarf::DW_EH_PE_udata4
;
258 case Triple::sparcv9
:
259 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
260 if (isPositionIndependent()) {
261 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
262 dwarf::DW_EH_PE_sdata4
;
263 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
264 dwarf::DW_EH_PE_sdata4
;
266 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
267 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
270 case Triple::systemz
:
271 // All currently-defined code models guarantee that 4-byte PC-relative
272 // values will be in range.
273 if (isPositionIndependent()) {
274 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
275 dwarf::DW_EH_PE_sdata4
;
276 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
277 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
278 dwarf::DW_EH_PE_sdata4
;
280 PersonalityEncoding
= dwarf::DW_EH_PE_absptr
;
281 LSDAEncoding
= dwarf::DW_EH_PE_absptr
;
282 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
285 case Triple::loongarch32
:
286 case Triple::loongarch64
:
287 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
288 PersonalityEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
289 dwarf::DW_EH_PE_sdata4
;
290 TTypeEncoding
= dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
|
291 dwarf::DW_EH_PE_sdata4
;
298 void TargetLoweringObjectFileELF::getModuleMetadata(Module
&M
) {
299 SmallVector
<GlobalValue
*, 4> Vec
;
300 collectUsedGlobalVariables(M
, Vec
, false);
301 for (GlobalValue
*GV
: Vec
)
302 if (auto *GO
= dyn_cast
<GlobalObject
>(GV
))
306 void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer
&Streamer
,
308 auto &C
= getContext();
310 if (NamedMDNode
*LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
311 auto *S
= C
.getELFSection(".linker-options", ELF::SHT_LLVM_LINKER_OPTIONS
,
314 Streamer
.switchSection(S
);
316 for (const auto *Operand
: LinkerOptions
->operands()) {
317 if (cast
<MDNode
>(Operand
)->getNumOperands() != 2)
318 report_fatal_error("invalid llvm.linker.options");
319 for (const auto &Option
: cast
<MDNode
>(Operand
)->operands()) {
320 Streamer
.emitBytes(cast
<MDString
>(Option
)->getString());
321 Streamer
.emitInt8(0);
326 if (NamedMDNode
*DependentLibraries
= M
.getNamedMetadata("llvm.dependent-libraries")) {
327 auto *S
= C
.getELFSection(".deplibs", ELF::SHT_LLVM_DEPENDENT_LIBRARIES
,
328 ELF::SHF_MERGE
| ELF::SHF_STRINGS
, 1);
330 Streamer
.switchSection(S
);
332 for (const auto *Operand
: DependentLibraries
->operands()) {
334 cast
<MDString
>(cast
<MDNode
>(Operand
)->getOperand(0))->getString());
335 Streamer
.emitInt8(0);
339 if (NamedMDNode
*FuncInfo
= M
.getNamedMetadata(PseudoProbeDescMetadataName
)) {
340 // Emit a descriptor for every function including functions that have an
341 // available external linkage. We may not want this for imported functions
342 // that has code in another thinLTO module but we don't have a good way to
343 // tell them apart from inline functions defined in header files. Therefore
344 // we put each descriptor in a separate comdat section and rely on the
345 // linker to deduplicate.
346 for (const auto *Operand
: FuncInfo
->operands()) {
347 const auto *MD
= cast
<MDNode
>(Operand
);
348 auto *GUID
= mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(0));
349 auto *Hash
= mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(1));
350 auto *Name
= cast
<MDString
>(MD
->getOperand(2));
351 auto *S
= C
.getObjectFileInfo()->getPseudoProbeDescSection(
352 TM
->getFunctionSections() ? Name
->getString() : StringRef());
354 Streamer
.switchSection(S
);
355 Streamer
.emitInt64(GUID
->getZExtValue());
356 Streamer
.emitInt64(Hash
->getZExtValue());
357 Streamer
.emitULEB128IntValue(Name
->getString().size());
358 Streamer
.emitBytes(Name
->getString());
362 if (NamedMDNode
*LLVMStats
= M
.getNamedMetadata("llvm.stats")) {
363 // Emit the metadata for llvm statistics into .llvm_stats section, which is
364 // formatted as a list of key/value pair, the value is base64 encoded.
365 auto *S
= C
.getObjectFileInfo()->getLLVMStatsSection();
366 Streamer
.switchSection(S
);
367 for (const auto *Operand
: LLVMStats
->operands()) {
368 const auto *MD
= cast
<MDNode
>(Operand
);
369 assert(MD
->getNumOperands() % 2 == 0 &&
370 ("Operand num should be even for a list of key/value pair"));
371 for (size_t I
= 0; I
< MD
->getNumOperands(); I
+= 2) {
372 // Encode the key string size.
373 auto *Key
= cast
<MDString
>(MD
->getOperand(I
));
374 Streamer
.emitULEB128IntValue(Key
->getString().size());
375 Streamer
.emitBytes(Key
->getString());
376 // Encode the value into a Base64 string.
377 std::string Value
= encodeBase64(
378 Twine(mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(I
+ 1))
381 Streamer
.emitULEB128IntValue(Value
.size());
382 Streamer
.emitBytes(Value
);
387 unsigned Version
= 0;
391 GetObjCImageInfo(M
, Version
, Flags
, Section
);
392 if (!Section
.empty()) {
393 auto *S
= C
.getELFSection(Section
, ELF::SHT_PROGBITS
, ELF::SHF_ALLOC
);
394 Streamer
.switchSection(S
);
395 Streamer
.emitLabel(C
.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
396 Streamer
.emitInt32(Version
);
397 Streamer
.emitInt32(Flags
);
398 Streamer
.addBlankLine();
401 emitCGProfileMetadata(Streamer
, M
);
404 MCSymbol
*TargetLoweringObjectFileELF::getCFIPersonalitySymbol(
405 const GlobalValue
*GV
, const TargetMachine
&TM
,
406 MachineModuleInfo
*MMI
) const {
407 unsigned Encoding
= getPersonalityEncoding();
408 if ((Encoding
& 0x80) == DW_EH_PE_indirect
)
409 return getContext().getOrCreateSymbol(StringRef("DW.ref.") +
410 TM
.getSymbol(GV
)->getName());
411 if ((Encoding
& 0x70) == DW_EH_PE_absptr
)
412 return TM
.getSymbol(GV
);
413 report_fatal_error("We do not support this DWARF encoding yet!");
416 void TargetLoweringObjectFileELF::emitPersonalityValue(
417 MCStreamer
&Streamer
, const DataLayout
&DL
, const MCSymbol
*Sym
) const {
418 SmallString
<64> NameData("DW.ref.");
419 NameData
+= Sym
->getName();
421 cast
<MCSymbolELF
>(getContext().getOrCreateSymbol(NameData
));
422 Streamer
.emitSymbolAttribute(Label
, MCSA_Hidden
);
423 Streamer
.emitSymbolAttribute(Label
, MCSA_Weak
);
424 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_WRITE
| ELF::SHF_GROUP
;
425 MCSection
*Sec
= getContext().getELFNamedSection(".data", Label
->getName(),
426 ELF::SHT_PROGBITS
, Flags
, 0);
427 unsigned Size
= DL
.getPointerSize();
428 Streamer
.switchSection(Sec
);
429 Streamer
.emitValueToAlignment(DL
.getPointerABIAlignment(0));
430 Streamer
.emitSymbolAttribute(Label
, MCSA_ELF_TypeObject
);
431 const MCExpr
*E
= MCConstantExpr::create(Size
, getContext());
432 Streamer
.emitELFSize(Label
, E
);
433 Streamer
.emitLabel(Label
);
435 Streamer
.emitSymbolValue(Sym
, Size
);
438 const MCExpr
*TargetLoweringObjectFileELF::getTTypeGlobalReference(
439 const GlobalValue
*GV
, unsigned Encoding
, const TargetMachine
&TM
,
440 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
441 if (Encoding
& DW_EH_PE_indirect
) {
442 MachineModuleInfoELF
&ELFMMI
= MMI
->getObjFileInfo
<MachineModuleInfoELF
>();
444 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, ".DW.stub", TM
);
446 // Add information about the stub reference to ELFMMI so that the stub
447 // gets emitted by the asmprinter.
448 MachineModuleInfoImpl::StubValueTy
&StubSym
= ELFMMI
.getGVStubEntry(SSym
);
449 if (!StubSym
.getPointer()) {
450 MCSymbol
*Sym
= TM
.getSymbol(GV
);
451 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
454 return TargetLoweringObjectFile::
455 getTTypeReference(MCSymbolRefExpr::create(SSym
, getContext()),
456 Encoding
& ~DW_EH_PE_indirect
, Streamer
);
459 return TargetLoweringObjectFile::getTTypeGlobalReference(GV
, Encoding
, TM
,
463 static SectionKind
getELFKindForNamedSection(StringRef Name
, SectionKind K
) {
464 // N.B.: The defaults used in here are not the same ones used in MC.
465 // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
466 // both gas and MC will produce a section with no flags. Given
467 // section(".eh_frame") gcc will produce:
469 // .section .eh_frame,"a",@progbits
471 if (Name
== getInstrProfSectionName(IPSK_covmap
, Triple::ELF
,
472 /*AddSegmentInfo=*/false) ||
473 Name
== getInstrProfSectionName(IPSK_covfun
, Triple::ELF
,
474 /*AddSegmentInfo=*/false) ||
475 Name
== ".llvmbc" || Name
== ".llvmcmd")
476 return SectionKind::getMetadata();
478 if (Name
.empty() || Name
[0] != '.') return K
;
480 // Default implementation based on some magic section names.
481 if (Name
== ".bss" ||
482 Name
.startswith(".bss.") ||
483 Name
.startswith(".gnu.linkonce.b.") ||
484 Name
.startswith(".llvm.linkonce.b.") ||
486 Name
.startswith(".sbss.") ||
487 Name
.startswith(".gnu.linkonce.sb.") ||
488 Name
.startswith(".llvm.linkonce.sb."))
489 return SectionKind::getBSS();
491 if (Name
== ".tdata" ||
492 Name
.startswith(".tdata.") ||
493 Name
.startswith(".gnu.linkonce.td.") ||
494 Name
.startswith(".llvm.linkonce.td."))
495 return SectionKind::getThreadData();
497 if (Name
== ".tbss" ||
498 Name
.startswith(".tbss.") ||
499 Name
.startswith(".gnu.linkonce.tb.") ||
500 Name
.startswith(".llvm.linkonce.tb."))
501 return SectionKind::getThreadBSS();
506 static bool hasPrefix(StringRef SectionName
, StringRef Prefix
) {
507 return SectionName
.consume_front(Prefix
) &&
508 (SectionName
.empty() || SectionName
[0] == '.');
511 static unsigned getELFSectionType(StringRef Name
, SectionKind K
) {
512 // Use SHT_NOTE for section whose name starts with ".note" to allow
513 // emitting ELF notes from C variable declaration.
514 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
515 if (Name
.startswith(".note"))
516 return ELF::SHT_NOTE
;
518 if (hasPrefix(Name
, ".init_array"))
519 return ELF::SHT_INIT_ARRAY
;
521 if (hasPrefix(Name
, ".fini_array"))
522 return ELF::SHT_FINI_ARRAY
;
524 if (hasPrefix(Name
, ".preinit_array"))
525 return ELF::SHT_PREINIT_ARRAY
;
527 if (hasPrefix(Name
, ".llvm.offloading"))
528 return ELF::SHT_LLVM_OFFLOADING
;
530 if (K
.isBSS() || K
.isThreadBSS())
531 return ELF::SHT_NOBITS
;
533 return ELF::SHT_PROGBITS
;
536 static unsigned getELFSectionFlags(SectionKind K
) {
539 if (!K
.isMetadata() && !K
.isExclude())
540 Flags
|= ELF::SHF_ALLOC
;
543 Flags
|= ELF::SHF_EXCLUDE
;
546 Flags
|= ELF::SHF_EXECINSTR
;
548 if (K
.isExecuteOnly())
549 Flags
|= ELF::SHF_ARM_PURECODE
;
552 Flags
|= ELF::SHF_WRITE
;
554 if (K
.isThreadLocal())
555 Flags
|= ELF::SHF_TLS
;
557 if (K
.isMergeableCString() || K
.isMergeableConst())
558 Flags
|= ELF::SHF_MERGE
;
560 if (K
.isMergeableCString())
561 Flags
|= ELF::SHF_STRINGS
;
566 static const Comdat
*getELFComdat(const GlobalValue
*GV
) {
567 const Comdat
*C
= GV
->getComdat();
571 if (C
->getSelectionKind() != Comdat::Any
&&
572 C
->getSelectionKind() != Comdat::NoDeduplicate
)
573 report_fatal_error("ELF COMDATs only support SelectionKind::Any and "
574 "SelectionKind::NoDeduplicate, '" +
575 C
->getName() + "' cannot be lowered.");
580 static const MCSymbolELF
*getLinkedToSymbol(const GlobalObject
*GO
,
581 const TargetMachine
&TM
) {
582 MDNode
*MD
= GO
->getMetadata(LLVMContext::MD_associated
);
586 auto *VM
= cast
<ValueAsMetadata
>(MD
->getOperand(0).get());
587 auto *OtherGV
= dyn_cast
<GlobalValue
>(VM
->getValue());
588 return OtherGV
? dyn_cast
<MCSymbolELF
>(TM
.getSymbol(OtherGV
)) : nullptr;
591 static unsigned getEntrySizeForKind(SectionKind Kind
) {
592 if (Kind
.isMergeable1ByteCString())
594 else if (Kind
.isMergeable2ByteCString())
596 else if (Kind
.isMergeable4ByteCString())
598 else if (Kind
.isMergeableConst4())
600 else if (Kind
.isMergeableConst8())
602 else if (Kind
.isMergeableConst16())
604 else if (Kind
.isMergeableConst32())
607 // We shouldn't have mergeable C strings or mergeable constants that we
608 // didn't handle above.
609 assert(!Kind
.isMergeableCString() && "unknown string width");
610 assert(!Kind
.isMergeableConst() && "unknown data width");
615 /// Return the section prefix name used by options FunctionsSections and
617 static StringRef
getSectionPrefixForGlobal(SectionKind Kind
, bool IsLarge
) {
620 if (Kind
.isReadOnly())
621 return IsLarge
? ".lrodata" : ".rodata";
623 return IsLarge
? ".lbss" : ".bss";
624 if (Kind
.isThreadData())
626 if (Kind
.isThreadBSS())
629 return IsLarge
? ".ldata" : ".data";
630 if (Kind
.isReadOnlyWithRel())
631 return IsLarge
? ".ldata.rel.ro" : ".data.rel.ro";
632 llvm_unreachable("Unknown section kind");
635 static SmallString
<128>
636 getELFSectionNameForGlobal(const GlobalObject
*GO
, SectionKind Kind
,
637 Mangler
&Mang
, const TargetMachine
&TM
,
638 unsigned EntrySize
, bool UniqueSectionName
) {
639 SmallString
<128> Name
;
640 if (Kind
.isMergeableCString()) {
641 // We also need alignment here.
642 // FIXME: this is getting the alignment of the character, not the
643 // alignment of the global!
644 Align Alignment
= GO
->getParent()->getDataLayout().getPreferredAlign(
645 cast
<GlobalVariable
>(GO
));
647 std::string SizeSpec
= ".rodata.str" + utostr(EntrySize
) + ".";
648 Name
= SizeSpec
+ utostr(Alignment
.value());
649 } else if (Kind
.isMergeableConst()) {
650 Name
= ".rodata.cst";
651 Name
+= utostr(EntrySize
);
653 bool IsLarge
= false;
654 if (isa
<GlobalVariable
>(GO
))
655 IsLarge
= TM
.isLargeData();
656 Name
= getSectionPrefixForGlobal(Kind
, IsLarge
);
659 bool HasPrefix
= false;
660 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
661 if (std::optional
<StringRef
> Prefix
= F
->getSectionPrefix()) {
662 raw_svector_ostream(Name
) << '.' << *Prefix
;
667 if (UniqueSectionName
) {
669 TM
.getNameWithPrefix(Name
, GO
, Mang
, /*MayAlwaysUsePrivate*/true);
670 } else if (HasPrefix
)
671 // For distinguishing between .text.${text-section-prefix}. (with trailing
672 // dot) and .text.${function-name}
678 class LoweringDiagnosticInfo
: public DiagnosticInfo
{
682 LoweringDiagnosticInfo(const Twine
&DiagMsg
,
683 DiagnosticSeverity Severity
= DS_Error
)
684 : DiagnosticInfo(DK_Lowering
, Severity
), Msg(DiagMsg
) {}
685 void print(DiagnosticPrinter
&DP
) const override
{ DP
<< Msg
; }
689 /// Calculate an appropriate unique ID for a section, and update Flags,
690 /// EntrySize and NextUniqueID where appropriate.
692 calcUniqueIDUpdateFlagsAndSize(const GlobalObject
*GO
, StringRef SectionName
,
693 SectionKind Kind
, const TargetMachine
&TM
,
694 MCContext
&Ctx
, Mangler
&Mang
, unsigned &Flags
,
695 unsigned &EntrySize
, unsigned &NextUniqueID
,
696 const bool Retain
, const bool ForceUnique
) {
697 // Increment uniqueID if we are forced to emit a unique section.
698 // This works perfectly fine with section attribute or pragma section as the
699 // sections with the same name are grouped together by the assembler.
701 return NextUniqueID
++;
703 // A section can have at most one associated section. Put each global with
704 // MD_associated in a unique section.
705 const bool Associated
= GO
->getMetadata(LLVMContext::MD_associated
);
707 Flags
|= ELF::SHF_LINK_ORDER
;
708 return NextUniqueID
++;
712 if (TM
.getTargetTriple().isOSSolaris())
713 Flags
|= ELF::SHF_SUNW_NODISCARD
;
714 else if (Ctx
.getAsmInfo()->useIntegratedAssembler() ||
715 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 36))
716 Flags
|= ELF::SHF_GNU_RETAIN
;
717 return NextUniqueID
++;
720 // If two symbols with differing sizes end up in the same mergeable section
721 // that section can be assigned an incorrect entry size. To avoid this we
722 // usually put symbols of the same size into distinct mergeable sections with
723 // the same name. Doing so relies on the ",unique ," assembly feature. This
724 // feature is not avalible until bintuils version 2.35
725 // (https://sourceware.org/bugzilla/show_bug.cgi?id=25380).
726 const bool SupportsUnique
= Ctx
.getAsmInfo()->useIntegratedAssembler() ||
727 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 35);
728 if (!SupportsUnique
) {
729 Flags
&= ~ELF::SHF_MERGE
;
731 return MCContext::GenericSectionID
;
734 const bool SymbolMergeable
= Flags
& ELF::SHF_MERGE
;
735 const bool SeenSectionNameBefore
=
736 Ctx
.isELFGenericMergeableSection(SectionName
);
737 // If this is the first ocurrence of this section name, treat it as the
739 if (!SymbolMergeable
&& !SeenSectionNameBefore
)
740 return MCContext::GenericSectionID
;
742 // Symbols must be placed into sections with compatible entry sizes. Generate
743 // unique sections for symbols that have not been assigned to compatible
745 const auto PreviousID
=
746 Ctx
.getELFUniqueIDForEntsize(SectionName
, Flags
, EntrySize
);
750 // If the user has specified the same section name as would be created
751 // implicitly for this symbol e.g. .rodata.str1.1, then we don't need
752 // to unique the section as the entry size for this symbol will be
753 // compatible with implicitly created sections.
754 SmallString
<128> ImplicitSectionNameStem
=
755 getELFSectionNameForGlobal(GO
, Kind
, Mang
, TM
, EntrySize
, false);
756 if (SymbolMergeable
&&
757 Ctx
.isELFImplicitMergeableSectionNamePrefix(SectionName
) &&
758 SectionName
.startswith(ImplicitSectionNameStem
))
759 return MCContext::GenericSectionID
;
761 // We have seen this section name before, but with different flags or entity
762 // size. Create a new unique ID.
763 return NextUniqueID
++;
766 static MCSection
*selectExplicitSectionGlobal(
767 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
,
768 MCContext
&Ctx
, Mangler
&Mang
, unsigned &NextUniqueID
,
769 bool Retain
, bool ForceUnique
) {
770 StringRef SectionName
= GO
->getSection();
772 // Check if '#pragma clang section' name is applicable.
773 // Note that pragma directive overrides -ffunction-section, -fdata-section
774 // and so section name is exactly as user specified and not uniqued.
775 const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(GO
);
776 if (GV
&& GV
->hasImplicitSection()) {
777 auto Attrs
= GV
->getAttributes();
778 if (Attrs
.hasAttribute("bss-section") && Kind
.isBSS()) {
779 SectionName
= Attrs
.getAttribute("bss-section").getValueAsString();
780 } else if (Attrs
.hasAttribute("rodata-section") && Kind
.isReadOnly()) {
781 SectionName
= Attrs
.getAttribute("rodata-section").getValueAsString();
782 } else if (Attrs
.hasAttribute("relro-section") && Kind
.isReadOnlyWithRel()) {
783 SectionName
= Attrs
.getAttribute("relro-section").getValueAsString();
784 } else if (Attrs
.hasAttribute("data-section") && Kind
.isData()) {
785 SectionName
= Attrs
.getAttribute("data-section").getValueAsString();
788 const Function
*F
= dyn_cast
<Function
>(GO
);
789 if (F
&& F
->hasFnAttribute("implicit-section-name")) {
790 SectionName
= F
->getFnAttribute("implicit-section-name").getValueAsString();
793 // Infer section flags from the section name if we can.
794 Kind
= getELFKindForNamedSection(SectionName
, Kind
);
796 StringRef Group
= "";
797 bool IsComdat
= false;
798 unsigned Flags
= getELFSectionFlags(Kind
);
799 if (const Comdat
*C
= getELFComdat(GO
)) {
800 Group
= C
->getName();
801 IsComdat
= C
->getSelectionKind() == Comdat::Any
;
802 Flags
|= ELF::SHF_GROUP
;
805 unsigned EntrySize
= getEntrySizeForKind(Kind
);
806 const unsigned UniqueID
= calcUniqueIDUpdateFlagsAndSize(
807 GO
, SectionName
, Kind
, TM
, Ctx
, Mang
, Flags
, EntrySize
, NextUniqueID
,
808 Retain
, ForceUnique
);
810 const MCSymbolELF
*LinkedToSym
= getLinkedToSymbol(GO
, TM
);
811 MCSectionELF
*Section
= Ctx
.getELFSection(
812 SectionName
, getELFSectionType(SectionName
, Kind
), Flags
, EntrySize
,
813 Group
, IsComdat
, UniqueID
, LinkedToSym
);
814 // Make sure that we did not get some other section with incompatible sh_link.
815 // This should not be possible due to UniqueID code above.
816 assert(Section
->getLinkedToSymbol() == LinkedToSym
&&
817 "Associated symbol mismatch between sections");
819 if (!(Ctx
.getAsmInfo()->useIntegratedAssembler() ||
820 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 35))) {
821 // If we are using GNU as before 2.35, then this symbol might have
822 // been placed in an incompatible mergeable section. Emit an error if this
823 // is the case to avoid creating broken output.
824 if ((Section
->getFlags() & ELF::SHF_MERGE
) &&
825 (Section
->getEntrySize() != getEntrySizeForKind(Kind
)))
826 GO
->getContext().diagnose(LoweringDiagnosticInfo(
827 "Symbol '" + GO
->getName() + "' from module '" +
828 (GO
->getParent() ? GO
->getParent()->getSourceFileName() : "unknown") +
829 "' required a section with entry-size=" +
830 Twine(getEntrySizeForKind(Kind
)) + " but was placed in section '" +
831 SectionName
+ "' with entry-size=" + Twine(Section
->getEntrySize()) +
832 ": Explicit assignment by pragma or attribute of an incompatible "
833 "symbol to this section?"));
839 MCSection
*TargetLoweringObjectFileELF::getExplicitSectionGlobal(
840 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
841 return selectExplicitSectionGlobal(GO
, Kind
, TM
, getContext(), getMangler(),
842 NextUniqueID
, Used
.count(GO
),
843 /* ForceUnique = */false);
846 static MCSectionELF
*selectELFSectionForGlobal(
847 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
848 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned Flags
,
849 unsigned *NextUniqueID
, const MCSymbolELF
*AssociatedSymbol
) {
851 StringRef Group
= "";
852 bool IsComdat
= false;
853 if (const Comdat
*C
= getELFComdat(GO
)) {
854 Flags
|= ELF::SHF_GROUP
;
855 Group
= C
->getName();
856 IsComdat
= C
->getSelectionKind() == Comdat::Any
;
858 if (isa
<GlobalVariable
>(GO
)) {
859 if (TM
.isLargeData()) {
860 assert(TM
.getTargetTriple().getArch() == Triple::x86_64
);
861 Flags
|= ELF::SHF_X86_64_LARGE
;
865 // Get the section entry size based on the kind.
866 unsigned EntrySize
= getEntrySizeForKind(Kind
);
868 bool UniqueSectionName
= false;
869 unsigned UniqueID
= MCContext::GenericSectionID
;
870 if (EmitUniqueSection
) {
871 if (TM
.getUniqueSectionNames()) {
872 UniqueSectionName
= true;
874 UniqueID
= *NextUniqueID
;
878 SmallString
<128> Name
= getELFSectionNameForGlobal(
879 GO
, Kind
, Mang
, TM
, EntrySize
, UniqueSectionName
);
881 // Use 0 as the unique ID for execute-only text.
882 if (Kind
.isExecuteOnly())
884 return Ctx
.getELFSection(Name
, getELFSectionType(Name
, Kind
), Flags
,
885 EntrySize
, Group
, IsComdat
, UniqueID
,
889 static MCSection
*selectELFSectionForGlobal(
890 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
891 const TargetMachine
&TM
, bool Retain
, bool EmitUniqueSection
,
892 unsigned Flags
, unsigned *NextUniqueID
) {
893 const MCSymbolELF
*LinkedToSym
= getLinkedToSymbol(GO
, TM
);
895 EmitUniqueSection
= true;
896 Flags
|= ELF::SHF_LINK_ORDER
;
899 if (TM
.getTargetTriple().isOSSolaris()) {
900 EmitUniqueSection
= true;
901 Flags
|= ELF::SHF_SUNW_NODISCARD
;
902 } else if (Ctx
.getAsmInfo()->useIntegratedAssembler() ||
903 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 36)) {
904 EmitUniqueSection
= true;
905 Flags
|= ELF::SHF_GNU_RETAIN
;
909 MCSectionELF
*Section
= selectELFSectionForGlobal(
910 Ctx
, GO
, Kind
, Mang
, TM
, EmitUniqueSection
, Flags
,
911 NextUniqueID
, LinkedToSym
);
912 assert(Section
->getLinkedToSymbol() == LinkedToSym
);
916 MCSection
*TargetLoweringObjectFileELF::SelectSectionForGlobal(
917 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
918 unsigned Flags
= getELFSectionFlags(Kind
);
920 // If we have -ffunction-section or -fdata-section then we should emit the
921 // global value to a uniqued section specifically for it.
922 bool EmitUniqueSection
= false;
923 if (!(Flags
& ELF::SHF_MERGE
) && !Kind
.isCommon()) {
925 EmitUniqueSection
= TM
.getFunctionSections();
927 EmitUniqueSection
= TM
.getDataSections();
929 EmitUniqueSection
|= GO
->hasComdat();
930 return selectELFSectionForGlobal(getContext(), GO
, Kind
, getMangler(), TM
,
931 Used
.count(GO
), EmitUniqueSection
, Flags
,
935 MCSection
*TargetLoweringObjectFileELF::getUniqueSectionForFunction(
936 const Function
&F
, const TargetMachine
&TM
) const {
937 SectionKind Kind
= SectionKind::getText();
938 unsigned Flags
= getELFSectionFlags(Kind
);
939 // If the function's section names is pre-determined via pragma or a
940 // section attribute, call selectExplicitSectionGlobal.
941 if (F
.hasSection() || F
.hasFnAttribute("implicit-section-name"))
942 return selectExplicitSectionGlobal(
943 &F
, Kind
, TM
, getContext(), getMangler(), NextUniqueID
,
944 Used
.count(&F
), /* ForceUnique = */true);
946 return selectELFSectionForGlobal(
947 getContext(), &F
, Kind
, getMangler(), TM
, Used
.count(&F
),
948 /*EmitUniqueSection=*/true, Flags
, &NextUniqueID
);
951 MCSection
*TargetLoweringObjectFileELF::getSectionForJumpTable(
952 const Function
&F
, const TargetMachine
&TM
) const {
953 // If the function can be removed, produce a unique section so that
954 // the table doesn't prevent the removal.
955 const Comdat
*C
= F
.getComdat();
956 bool EmitUniqueSection
= TM
.getFunctionSections() || C
;
957 if (!EmitUniqueSection
)
958 return ReadOnlySection
;
960 return selectELFSectionForGlobal(getContext(), &F
, SectionKind::getReadOnly(),
961 getMangler(), TM
, EmitUniqueSection
,
962 ELF::SHF_ALLOC
, &NextUniqueID
,
963 /* AssociatedSymbol */ nullptr);
966 MCSection
*TargetLoweringObjectFileELF::getSectionForLSDA(
967 const Function
&F
, const MCSymbol
&FnSym
, const TargetMachine
&TM
) const {
968 // If neither COMDAT nor function sections, use the monolithic LSDA section.
969 // Re-use this path if LSDASection is null as in the Arm EHABI.
970 if (!LSDASection
|| (!F
.hasComdat() && !TM
.getFunctionSections()))
973 const auto *LSDA
= cast
<MCSectionELF
>(LSDASection
);
974 unsigned Flags
= LSDA
->getFlags();
975 const MCSymbolELF
*LinkedToSym
= nullptr;
977 bool IsComdat
= false;
978 if (const Comdat
*C
= getELFComdat(&F
)) {
979 Flags
|= ELF::SHF_GROUP
;
980 Group
= C
->getName();
981 IsComdat
= C
->getSelectionKind() == Comdat::Any
;
983 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
984 // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
985 if (TM
.getFunctionSections() &&
986 (getContext().getAsmInfo()->useIntegratedAssembler() &&
987 getContext().getAsmInfo()->binutilsIsAtLeast(2, 36))) {
988 Flags
|= ELF::SHF_LINK_ORDER
;
989 LinkedToSym
= cast
<MCSymbolELF
>(&FnSym
);
992 // Append the function name as the suffix like GCC, assuming
993 // -funique-section-names applies to .gcc_except_table sections.
994 return getContext().getELFSection(
995 (TM
.getUniqueSectionNames() ? LSDA
->getName() + "." + F
.getName()
997 LSDA
->getType(), Flags
, 0, Group
, IsComdat
, MCSection::NonUniqueID
,
1001 bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(
1002 bool UsesLabelDifference
, const Function
&F
) const {
1003 // We can always create relative relocations, so use another section
1004 // that can be marked non-executable.
1008 /// Given a mergeable constant with the specified size and relocation
1009 /// information, return a section that it should be placed in.
1010 MCSection
*TargetLoweringObjectFileELF::getSectionForConstant(
1011 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1012 Align
&Alignment
) const {
1013 if (Kind
.isMergeableConst4() && MergeableConst4Section
)
1014 return MergeableConst4Section
;
1015 if (Kind
.isMergeableConst8() && MergeableConst8Section
)
1016 return MergeableConst8Section
;
1017 if (Kind
.isMergeableConst16() && MergeableConst16Section
)
1018 return MergeableConst16Section
;
1019 if (Kind
.isMergeableConst32() && MergeableConst32Section
)
1020 return MergeableConst32Section
;
1021 if (Kind
.isReadOnly())
1022 return ReadOnlySection
;
1024 assert(Kind
.isReadOnlyWithRel() && "Unknown section kind");
1025 return DataRelROSection
;
1028 /// Returns a unique section for the given machine basic block.
1029 MCSection
*TargetLoweringObjectFileELF::getSectionForMachineBasicBlock(
1030 const Function
&F
, const MachineBasicBlock
&MBB
,
1031 const TargetMachine
&TM
) const {
1032 assert(MBB
.isBeginSection() && "Basic block does not start a section!");
1033 unsigned UniqueID
= MCContext::GenericSectionID
;
1035 // For cold sections use the .text.split. prefix along with the parent
1036 // function name. All cold blocks for the same function go to the same
1037 // section. Similarly all exception blocks are grouped by symbol name
1038 // under the .text.eh prefix. For regular sections, we either use a unique
1039 // name, or a unique ID for the section.
1040 SmallString
<128> Name
;
1041 if (MBB
.getSectionID() == MBBSectionID::ColdSectionID
) {
1042 Name
+= BBSectionsColdTextPrefix
;
1043 Name
+= MBB
.getParent()->getName();
1044 } else if (MBB
.getSectionID() == MBBSectionID::ExceptionSectionID
) {
1045 Name
+= ".text.eh.";
1046 Name
+= MBB
.getParent()->getName();
1048 Name
+= MBB
.getParent()->getSection()->getName();
1049 if (TM
.getUniqueBasicBlockSectionNames()) {
1050 if (!Name
.endswith("."))
1052 Name
+= MBB
.getSymbol()->getName();
1054 UniqueID
= NextUniqueID
++;
1058 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_EXECINSTR
;
1059 std::string GroupName
;
1060 if (F
.hasComdat()) {
1061 Flags
|= ELF::SHF_GROUP
;
1062 GroupName
= F
.getComdat()->getName().str();
1064 return getContext().getELFSection(Name
, ELF::SHT_PROGBITS
, Flags
,
1065 0 /* Entry Size */, GroupName
,
1066 F
.hasComdat(), UniqueID
, nullptr);
1069 static MCSectionELF
*getStaticStructorSection(MCContext
&Ctx
, bool UseInitArray
,
1070 bool IsCtor
, unsigned Priority
,
1071 const MCSymbol
*KeySym
) {
1074 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_WRITE
;
1075 StringRef Comdat
= KeySym
? KeySym
->getName() : "";
1078 Flags
|= ELF::SHF_GROUP
;
1082 Type
= ELF::SHT_INIT_ARRAY
;
1083 Name
= ".init_array";
1085 Type
= ELF::SHT_FINI_ARRAY
;
1086 Name
= ".fini_array";
1088 if (Priority
!= 65535) {
1090 Name
+= utostr(Priority
);
1093 // The default scheme is .ctor / .dtor, so we have to invert the priority
1099 if (Priority
!= 65535)
1100 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
1101 Type
= ELF::SHT_PROGBITS
;
1104 return Ctx
.getELFSection(Name
, Type
, Flags
, 0, Comdat
, /*IsComdat=*/true);
1107 MCSection
*TargetLoweringObjectFileELF::getStaticCtorSection(
1108 unsigned Priority
, const MCSymbol
*KeySym
) const {
1109 return getStaticStructorSection(getContext(), UseInitArray
, true, Priority
,
1113 MCSection
*TargetLoweringObjectFileELF::getStaticDtorSection(
1114 unsigned Priority
, const MCSymbol
*KeySym
) const {
1115 return getStaticStructorSection(getContext(), UseInitArray
, false, Priority
,
1119 const MCExpr
*TargetLoweringObjectFileELF::lowerRelativeReference(
1120 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
1121 const TargetMachine
&TM
) const {
1122 // We may only use a PLT-relative relocation to refer to unnamed_addr
1124 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
1127 // Basic correctness checks.
1128 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
1129 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
1130 RHS
->isThreadLocal())
1133 return MCBinaryExpr::createSub(
1134 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), PLTRelativeVariantKind
,
1136 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
1139 const MCExpr
*TargetLoweringObjectFileELF::lowerDSOLocalEquivalent(
1140 const DSOLocalEquivalent
*Equiv
, const TargetMachine
&TM
) const {
1141 assert(supportDSOLocalEquivalentLowering());
1143 const auto *GV
= Equiv
->getGlobalValue();
1145 // A PLT entry is not needed for dso_local globals.
1146 if (GV
->isDSOLocal() || GV
->isImplicitDSOLocal())
1147 return MCSymbolRefExpr::create(TM
.getSymbol(GV
), getContext());
1149 return MCSymbolRefExpr::create(TM
.getSymbol(GV
), PLTRelativeVariantKind
,
1153 MCSection
*TargetLoweringObjectFileELF::getSectionForCommandLines() const {
1154 // Use ".GCC.command.line" since this feature is to support clang's
1155 // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
1157 return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS
,
1158 ELF::SHF_MERGE
| ELF::SHF_STRINGS
, 1);
1162 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_
) {
1163 UseInitArray
= UseInitArray_
;
1164 MCContext
&Ctx
= getContext();
1165 if (!UseInitArray
) {
1166 StaticCtorSection
= Ctx
.getELFSection(".ctors", ELF::SHT_PROGBITS
,
1167 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
1169 StaticDtorSection
= Ctx
.getELFSection(".dtors", ELF::SHT_PROGBITS
,
1170 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
1174 StaticCtorSection
= Ctx
.getELFSection(".init_array", ELF::SHT_INIT_ARRAY
,
1175 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1176 StaticDtorSection
= Ctx
.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY
,
1177 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1180 //===----------------------------------------------------------------------===//
1182 //===----------------------------------------------------------------------===//
1184 TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO() {
1185 SupportIndirectSymViaGOTPCRel
= true;
1188 void TargetLoweringObjectFileMachO::Initialize(MCContext
&Ctx
,
1189 const TargetMachine
&TM
) {
1190 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
1191 if (TM
.getRelocationModel() == Reloc::Static
) {
1192 StaticCtorSection
= Ctx
.getMachOSection("__TEXT", "__constructor", 0,
1193 SectionKind::getData());
1194 StaticDtorSection
= Ctx
.getMachOSection("__TEXT", "__destructor", 0,
1195 SectionKind::getData());
1197 StaticCtorSection
= Ctx
.getMachOSection("__DATA", "__mod_init_func",
1198 MachO::S_MOD_INIT_FUNC_POINTERS
,
1199 SectionKind::getData());
1200 StaticDtorSection
= Ctx
.getMachOSection("__DATA", "__mod_term_func",
1201 MachO::S_MOD_TERM_FUNC_POINTERS
,
1202 SectionKind::getData());
1205 PersonalityEncoding
=
1206 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
1207 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
;
1209 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
1212 MCSection
*TargetLoweringObjectFileMachO::getStaticDtorSection(
1213 unsigned Priority
, const MCSymbol
*KeySym
) const {
1214 return StaticDtorSection
;
1215 // In userspace, we lower global destructors via atexit(), but kernel/kext
1216 // environments do not provide this function so we still need to support the
1218 // See the -disable-atexit-based-global-dtor-lowering CodeGen flag for more
1222 void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer
&Streamer
,
1224 // Emit the linker options if present.
1225 if (auto *LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
1226 for (const auto *Option
: LinkerOptions
->operands()) {
1227 SmallVector
<std::string
, 4> StrOptions
;
1228 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands())
1229 StrOptions
.push_back(std::string(cast
<MDString
>(Piece
)->getString()));
1230 Streamer
.emitLinkerOptions(StrOptions
);
1234 unsigned VersionVal
= 0;
1235 unsigned ImageInfoFlags
= 0;
1236 StringRef SectionVal
;
1238 GetObjCImageInfo(M
, VersionVal
, ImageInfoFlags
, SectionVal
);
1239 emitCGProfileMetadata(Streamer
, M
);
1241 // The section is mandatory. If we don't have it, then we don't have GC info.
1242 if (SectionVal
.empty())
1245 StringRef Segment
, Section
;
1246 unsigned TAA
= 0, StubSize
= 0;
1248 if (Error E
= MCSectionMachO::ParseSectionSpecifier(
1249 SectionVal
, Segment
, Section
, TAA
, TAAParsed
, StubSize
)) {
1250 // If invalid, report the error with report_fatal_error.
1251 report_fatal_error("Invalid section specifier '" + Section
+
1252 "': " + toString(std::move(E
)) + ".");
1256 MCSectionMachO
*S
= getContext().getMachOSection(
1257 Segment
, Section
, TAA
, StubSize
, SectionKind::getData());
1258 Streamer
.switchSection(S
);
1259 Streamer
.emitLabel(getContext().
1260 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
1261 Streamer
.emitInt32(VersionVal
);
1262 Streamer
.emitInt32(ImageInfoFlags
);
1263 Streamer
.addBlankLine();
1266 static void checkMachOComdat(const GlobalValue
*GV
) {
1267 const Comdat
*C
= GV
->getComdat();
1271 report_fatal_error("MachO doesn't support COMDATs, '" + C
->getName() +
1272 "' cannot be lowered.");
1275 MCSection
*TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
1276 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1278 StringRef SectionName
= GO
->getSection();
1280 const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(GO
);
1281 if (GV
&& GV
->hasImplicitSection()) {
1282 auto Attrs
= GV
->getAttributes();
1283 if (Attrs
.hasAttribute("bss-section") && Kind
.isBSS()) {
1284 SectionName
= Attrs
.getAttribute("bss-section").getValueAsString();
1285 } else if (Attrs
.hasAttribute("rodata-section") && Kind
.isReadOnly()) {
1286 SectionName
= Attrs
.getAttribute("rodata-section").getValueAsString();
1287 } else if (Attrs
.hasAttribute("relro-section") && Kind
.isReadOnlyWithRel()) {
1288 SectionName
= Attrs
.getAttribute("relro-section").getValueAsString();
1289 } else if (Attrs
.hasAttribute("data-section") && Kind
.isData()) {
1290 SectionName
= Attrs
.getAttribute("data-section").getValueAsString();
1294 const Function
*F
= dyn_cast
<Function
>(GO
);
1295 if (F
&& F
->hasFnAttribute("implicit-section-name")) {
1296 SectionName
= F
->getFnAttribute("implicit-section-name").getValueAsString();
1299 // Parse the section specifier and create it if valid.
1300 StringRef Segment
, Section
;
1301 unsigned TAA
= 0, StubSize
= 0;
1304 checkMachOComdat(GO
);
1306 if (Error E
= MCSectionMachO::ParseSectionSpecifier(
1307 SectionName
, Segment
, Section
, TAA
, TAAParsed
, StubSize
)) {
1308 // If invalid, report the error with report_fatal_error.
1309 report_fatal_error("Global variable '" + GO
->getName() +
1310 "' has an invalid section specifier '" +
1311 GO
->getSection() + "': " + toString(std::move(E
)) + ".");
1316 getContext().getMachOSection(Segment
, Section
, TAA
, StubSize
, Kind
);
1318 // If TAA wasn't set by ParseSectionSpecifier() above,
1319 // use the value returned by getMachOSection() as a default.
1321 TAA
= S
->getTypeAndAttributes();
1323 // Okay, now that we got the section, verify that the TAA & StubSize agree.
1324 // If the user declared multiple globals with different section flags, we need
1325 // to reject it here.
1326 if (S
->getTypeAndAttributes() != TAA
|| S
->getStubSize() != StubSize
) {
1327 // If invalid, report the error with report_fatal_error.
1328 report_fatal_error("Global variable '" + GO
->getName() +
1329 "' section type or attributes does not match previous"
1330 " section specifier");
1336 MCSection
*TargetLoweringObjectFileMachO::SelectSectionForGlobal(
1337 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1338 checkMachOComdat(GO
);
1340 // Handle thread local data.
1341 if (Kind
.isThreadBSS()) return TLSBSSSection
;
1342 if (Kind
.isThreadData()) return TLSDataSection
;
1345 return GO
->isWeakForLinker() ? TextCoalSection
: TextSection
;
1347 // If this is weak/linkonce, put this in a coalescable section, either in text
1348 // or data depending on if it is writable.
1349 if (GO
->isWeakForLinker()) {
1350 if (Kind
.isReadOnly())
1351 return ConstTextCoalSection
;
1352 if (Kind
.isReadOnlyWithRel())
1353 return ConstDataCoalSection
;
1354 return DataCoalSection
;
1357 // FIXME: Alignment check should be handled by section classifier.
1358 if (Kind
.isMergeable1ByteCString() &&
1359 GO
->getParent()->getDataLayout().getPreferredAlign(
1360 cast
<GlobalVariable
>(GO
)) < Align(32))
1361 return CStringSection
;
1363 // Do not put 16-bit arrays in the UString section if they have an
1364 // externally visible label, this runs into issues with certain linker
1366 if (Kind
.isMergeable2ByteCString() && !GO
->hasExternalLinkage() &&
1367 GO
->getParent()->getDataLayout().getPreferredAlign(
1368 cast
<GlobalVariable
>(GO
)) < Align(32))
1369 return UStringSection
;
1371 // With MachO only variables whose corresponding symbol starts with 'l' or
1372 // 'L' can be merged, so we only try merging GVs with private linkage.
1373 if (GO
->hasPrivateLinkage() && Kind
.isMergeableConst()) {
1374 if (Kind
.isMergeableConst4())
1375 return FourByteConstantSection
;
1376 if (Kind
.isMergeableConst8())
1377 return EightByteConstantSection
;
1378 if (Kind
.isMergeableConst16())
1379 return SixteenByteConstantSection
;
1382 // Otherwise, if it is readonly, but not something we can specially optimize,
1383 // just drop it in .const.
1384 if (Kind
.isReadOnly())
1385 return ReadOnlySection
;
1387 // If this is marked const, put it into a const section. But if the dynamic
1388 // linker needs to write to it, put it in the data segment.
1389 if (Kind
.isReadOnlyWithRel())
1390 return ConstDataSection
;
1392 // Put zero initialized globals with strong external linkage in the
1393 // DATA, __common section with the .zerofill directive.
1394 if (Kind
.isBSSExtern())
1395 return DataCommonSection
;
1397 // Put zero initialized globals with local linkage in __DATA,__bss directive
1398 // with the .zerofill directive (aka .lcomm).
1399 if (Kind
.isBSSLocal())
1400 return DataBSSSection
;
1402 // Otherwise, just drop the variable in the normal data section.
1406 MCSection
*TargetLoweringObjectFileMachO::getSectionForConstant(
1407 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1408 Align
&Alignment
) const {
1409 // If this constant requires a relocation, we have to put it in the data
1410 // segment, not in the text segment.
1411 if (Kind
.isData() || Kind
.isReadOnlyWithRel())
1412 return ConstDataSection
;
1414 if (Kind
.isMergeableConst4())
1415 return FourByteConstantSection
;
1416 if (Kind
.isMergeableConst8())
1417 return EightByteConstantSection
;
1418 if (Kind
.isMergeableConst16())
1419 return SixteenByteConstantSection
;
1420 return ReadOnlySection
; // .const
1423 const MCExpr
*TargetLoweringObjectFileMachO::getTTypeGlobalReference(
1424 const GlobalValue
*GV
, unsigned Encoding
, const TargetMachine
&TM
,
1425 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1426 // The mach-o version of this method defaults to returning a stub reference.
1428 if (Encoding
& DW_EH_PE_indirect
) {
1429 MachineModuleInfoMachO
&MachOMMI
=
1430 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1432 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1434 // Add information about the stub reference to MachOMMI so that the stub
1435 // gets emitted by the asmprinter.
1436 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1437 if (!StubSym
.getPointer()) {
1438 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1439 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1442 return TargetLoweringObjectFile::
1443 getTTypeReference(MCSymbolRefExpr::create(SSym
, getContext()),
1444 Encoding
& ~DW_EH_PE_indirect
, Streamer
);
1447 return TargetLoweringObjectFile::getTTypeGlobalReference(GV
, Encoding
, TM
,
1451 MCSymbol
*TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
1452 const GlobalValue
*GV
, const TargetMachine
&TM
,
1453 MachineModuleInfo
*MMI
) const {
1454 // The mach-o version of this method defaults to returning a stub reference.
1455 MachineModuleInfoMachO
&MachOMMI
=
1456 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1458 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1460 // Add information about the stub reference to MachOMMI so that the stub
1461 // gets emitted by the asmprinter.
1462 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1463 if (!StubSym
.getPointer()) {
1464 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1465 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1471 const MCExpr
*TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
1472 const GlobalValue
*GV
, const MCSymbol
*Sym
, const MCValue
&MV
,
1473 int64_t Offset
, MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1474 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1475 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1476 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1477 // computation of deltas to final external symbols. Example:
1483 // .long _extgotequiv-_delta
1485 // is transformed to:
1488 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1490 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1491 // L_extfoo$non_lazy_ptr:
1492 // .indirect_symbol _extfoo
1495 // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1496 // may point to both local (same translation unit) and global (other
1497 // translation units) symbols. Example:
1499 // .section __DATA,__pointers,non_lazy_symbol_pointers
1501 // .indirect_symbol _myGlobal
1504 // .indirect_symbol _myLocal
1507 // If the symbol is local, instead of the symbol's index, the assembler
1508 // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1509 // Then the linker will notice the constant in the table and will look at the
1510 // content of the symbol.
1511 MachineModuleInfoMachO
&MachOMMI
=
1512 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1513 MCContext
&Ctx
= getContext();
1515 // The offset must consider the original displacement from the base symbol
1516 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1517 Offset
= -MV
.getConstant();
1518 const MCSymbol
*BaseSym
= &MV
.getSymB()->getSymbol();
1520 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1521 // non_lazy_ptr stubs.
1522 SmallString
<128> Name
;
1523 StringRef Suffix
= "$non_lazy_ptr";
1524 Name
+= MMI
->getModule()->getDataLayout().getPrivateGlobalPrefix();
1525 Name
+= Sym
->getName();
1527 MCSymbol
*Stub
= Ctx
.getOrCreateSymbol(Name
);
1529 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(Stub
);
1531 if (!StubSym
.getPointer())
1532 StubSym
= MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol
*>(Sym
),
1533 !GV
->hasLocalLinkage());
1535 const MCExpr
*BSymExpr
=
1536 MCSymbolRefExpr::create(BaseSym
, MCSymbolRefExpr::VK_None
, Ctx
);
1538 MCSymbolRefExpr::create(Stub
, MCSymbolRefExpr::VK_None
, Ctx
);
1541 return MCBinaryExpr::createSub(LHS
, BSymExpr
, Ctx
);
1544 MCBinaryExpr::createAdd(BSymExpr
, MCConstantExpr::create(Offset
, Ctx
), Ctx
);
1545 return MCBinaryExpr::createSub(LHS
, RHS
, Ctx
);
1548 static bool canUsePrivateLabel(const MCAsmInfo
&AsmInfo
,
1549 const MCSection
&Section
) {
1550 if (!AsmInfo
.isSectionAtomizableBySymbols(Section
))
1553 // FIXME: we should be able to use private labels for sections that can't be
1554 // dead-stripped (there's no issue with blocking atomization there), but `ld
1555 // -r` sometimes drops the no_dead_strip attribute from sections so for safety
1556 // we don't allow it.
1560 void TargetLoweringObjectFileMachO::getNameWithPrefix(
1561 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1562 const TargetMachine
&TM
) const {
1563 bool CannotUsePrivateLabel
= true;
1564 if (auto *GO
= GV
->getAliaseeObject()) {
1565 SectionKind GOKind
= TargetLoweringObjectFile::getKindForGlobal(GO
, TM
);
1566 const MCSection
*TheSection
= SectionForGlobal(GO
, GOKind
, TM
);
1567 CannotUsePrivateLabel
=
1568 !canUsePrivateLabel(*TM
.getMCAsmInfo(), *TheSection
);
1570 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1573 //===----------------------------------------------------------------------===//
1575 //===----------------------------------------------------------------------===//
1578 getCOFFSectionFlags(SectionKind K
, const TargetMachine
&TM
) {
1580 bool isThumb
= TM
.getTargetTriple().getArch() == Triple::thumb
;
1584 COFF::IMAGE_SCN_MEM_DISCARDABLE
;
1585 else if (K
.isExclude())
1587 COFF::IMAGE_SCN_LNK_REMOVE
| COFF::IMAGE_SCN_MEM_DISCARDABLE
;
1588 else if (K
.isText())
1590 COFF::IMAGE_SCN_MEM_EXECUTE
|
1591 COFF::IMAGE_SCN_MEM_READ
|
1592 COFF::IMAGE_SCN_CNT_CODE
|
1593 (isThumb
? COFF::IMAGE_SCN_MEM_16BIT
: (COFF::SectionCharacteristics
)0);
1596 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
|
1597 COFF::IMAGE_SCN_MEM_READ
|
1598 COFF::IMAGE_SCN_MEM_WRITE
;
1599 else if (K
.isThreadLocal())
1601 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1602 COFF::IMAGE_SCN_MEM_READ
|
1603 COFF::IMAGE_SCN_MEM_WRITE
;
1604 else if (K
.isReadOnly() || K
.isReadOnlyWithRel())
1606 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1607 COFF::IMAGE_SCN_MEM_READ
;
1608 else if (K
.isWriteable())
1610 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1611 COFF::IMAGE_SCN_MEM_READ
|
1612 COFF::IMAGE_SCN_MEM_WRITE
;
1617 static const GlobalValue
*getComdatGVForCOFF(const GlobalValue
*GV
) {
1618 const Comdat
*C
= GV
->getComdat();
1619 assert(C
&& "expected GV to have a Comdat!");
1621 StringRef ComdatGVName
= C
->getName();
1622 const GlobalValue
*ComdatGV
= GV
->getParent()->getNamedValue(ComdatGVName
);
1624 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1625 "' does not exist.");
1627 if (ComdatGV
->getComdat() != C
)
1628 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1629 "' is not a key for its COMDAT.");
1634 static int getSelectionForCOFF(const GlobalValue
*GV
) {
1635 if (const Comdat
*C
= GV
->getComdat()) {
1636 const GlobalValue
*ComdatKey
= getComdatGVForCOFF(GV
);
1637 if (const auto *GA
= dyn_cast
<GlobalAlias
>(ComdatKey
))
1638 ComdatKey
= GA
->getAliaseeObject();
1639 if (ComdatKey
== GV
) {
1640 switch (C
->getSelectionKind()) {
1642 return COFF::IMAGE_COMDAT_SELECT_ANY
;
1643 case Comdat::ExactMatch
:
1644 return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH
;
1645 case Comdat::Largest
:
1646 return COFF::IMAGE_COMDAT_SELECT_LARGEST
;
1647 case Comdat::NoDeduplicate
:
1648 return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1649 case Comdat::SameSize
:
1650 return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE
;
1653 return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
;
1659 MCSection
*TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
1660 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1662 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1663 StringRef Name
= GO
->getSection();
1664 StringRef COMDATSymName
= "";
1665 if (GO
->hasComdat()) {
1666 Selection
= getSelectionForCOFF(GO
);
1667 const GlobalValue
*ComdatGV
;
1668 if (Selection
== COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
)
1669 ComdatGV
= getComdatGVForCOFF(GO
);
1673 if (!ComdatGV
->hasPrivateLinkage()) {
1674 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1675 COMDATSymName
= Sym
->getName();
1676 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1682 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, COMDATSymName
,
1686 static StringRef
getCOFFSectionNameForUniqueGlobal(SectionKind Kind
) {
1691 if (Kind
.isThreadLocal())
1693 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1698 MCSection
*TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
1699 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1700 // If we have -ffunction-sections then we should emit the global value to a
1701 // uniqued section specifically for it.
1702 bool EmitUniquedSection
;
1704 EmitUniquedSection
= TM
.getFunctionSections();
1706 EmitUniquedSection
= TM
.getDataSections();
1708 if ((EmitUniquedSection
&& !Kind
.isCommon()) || GO
->hasComdat()) {
1709 SmallString
<256> Name
= getCOFFSectionNameForUniqueGlobal(Kind
);
1711 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1713 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1714 int Selection
= getSelectionForCOFF(GO
);
1716 Selection
= COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1717 const GlobalValue
*ComdatGV
;
1718 if (GO
->hasComdat())
1719 ComdatGV
= getComdatGVForCOFF(GO
);
1723 unsigned UniqueID
= MCContext::GenericSectionID
;
1724 if (EmitUniquedSection
)
1725 UniqueID
= NextUniqueID
++;
1727 if (!ComdatGV
->hasPrivateLinkage()) {
1728 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1729 StringRef COMDATSymName
= Sym
->getName();
1731 if (const auto *F
= dyn_cast
<Function
>(GO
))
1732 if (std::optional
<StringRef
> Prefix
= F
->getSectionPrefix())
1733 raw_svector_ostream(Name
) << '$' << *Prefix
;
1735 // Append "$symbol" to the section name *before* IR-level mangling is
1736 // applied when targetting mingw. This is what GCC does, and the ld.bfd
1737 // COFF linker will not properly handle comdats otherwise.
1738 if (getContext().getTargetTriple().isWindowsGNUEnvironment())
1739 raw_svector_ostream(Name
) << '$' << ComdatGV
->getName();
1741 return getContext().getCOFFSection(Name
, Characteristics
, Kind
,
1742 COMDATSymName
, Selection
, UniqueID
);
1744 SmallString
<256> TmpData
;
1745 getMangler().getNameWithPrefix(TmpData
, GO
, /*CannotUsePrivateLabel=*/true);
1746 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, TmpData
,
1747 Selection
, UniqueID
);
1754 if (Kind
.isThreadLocal())
1755 return TLSDataSection
;
1757 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1758 return ReadOnlySection
;
1760 // Note: we claim that common symbols are put in BSSSection, but they are
1761 // really emitted with the magic .comm directive, which creates a symbol table
1762 // entry but not a section.
1763 if (Kind
.isBSS() || Kind
.isCommon())
1769 void TargetLoweringObjectFileCOFF::getNameWithPrefix(
1770 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1771 const TargetMachine
&TM
) const {
1772 bool CannotUsePrivateLabel
= false;
1773 if (GV
->hasPrivateLinkage() &&
1774 ((isa
<Function
>(GV
) && TM
.getFunctionSections()) ||
1775 (isa
<GlobalVariable
>(GV
) && TM
.getDataSections())))
1776 CannotUsePrivateLabel
= true;
1778 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1781 MCSection
*TargetLoweringObjectFileCOFF::getSectionForJumpTable(
1782 const Function
&F
, const TargetMachine
&TM
) const {
1783 // If the function can be removed, produce a unique section so that
1784 // the table doesn't prevent the removal.
1785 const Comdat
*C
= F
.getComdat();
1786 bool EmitUniqueSection
= TM
.getFunctionSections() || C
;
1787 if (!EmitUniqueSection
)
1788 return ReadOnlySection
;
1790 // FIXME: we should produce a symbol for F instead.
1791 if (F
.hasPrivateLinkage())
1792 return ReadOnlySection
;
1794 MCSymbol
*Sym
= TM
.getSymbol(&F
);
1795 StringRef COMDATSymName
= Sym
->getName();
1797 SectionKind Kind
= SectionKind::getReadOnly();
1798 StringRef SecName
= getCOFFSectionNameForUniqueGlobal(Kind
);
1799 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1800 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1801 unsigned UniqueID
= NextUniqueID
++;
1803 return getContext().getCOFFSection(
1804 SecName
, Characteristics
, Kind
, COMDATSymName
,
1805 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
, UniqueID
);
1808 bool TargetLoweringObjectFileCOFF::shouldPutJumpTableInFunctionSection(
1809 bool UsesLabelDifference
, const Function
&F
) const {
1810 if (TM
->getTargetTriple().getArch() == Triple::x86_64
) {
1811 if (!JumpTableInFunctionSection
) {
1812 // We can always create relative relocations, so use another section
1813 // that can be marked non-executable.
1817 return TargetLoweringObjectFile::shouldPutJumpTableInFunctionSection(
1818 UsesLabelDifference
, F
);
1821 void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer
&Streamer
,
1823 emitLinkerDirectives(Streamer
, M
);
1825 unsigned Version
= 0;
1829 GetObjCImageInfo(M
, Version
, Flags
, Section
);
1830 if (!Section
.empty()) {
1831 auto &C
= getContext();
1832 auto *S
= C
.getCOFFSection(Section
,
1833 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1834 COFF::IMAGE_SCN_MEM_READ
,
1835 SectionKind::getReadOnly());
1836 Streamer
.switchSection(S
);
1837 Streamer
.emitLabel(C
.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1838 Streamer
.emitInt32(Version
);
1839 Streamer
.emitInt32(Flags
);
1840 Streamer
.addBlankLine();
1843 emitCGProfileMetadata(Streamer
, M
);
1846 void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
1847 MCStreamer
&Streamer
, Module
&M
) const {
1848 if (NamedMDNode
*LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
1849 // Emit the linker options to the linker .drectve section. According to the
1850 // spec, this section is a space-separated string containing flags for
1852 MCSection
*Sec
= getDrectveSection();
1853 Streamer
.switchSection(Sec
);
1854 for (const auto *Option
: LinkerOptions
->operands()) {
1855 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands()) {
1856 // Lead with a space for consistency with our dllexport implementation.
1857 std::string
Directive(" ");
1858 Directive
.append(std::string(cast
<MDString
>(Piece
)->getString()));
1859 Streamer
.emitBytes(Directive
);
1864 // Emit /EXPORT: flags for each exported global as necessary.
1866 for (const GlobalValue
&GV
: M
.global_values()) {
1867 raw_string_ostream
OS(Flags
);
1868 emitLinkerFlagsForGlobalCOFF(OS
, &GV
, getContext().getTargetTriple(),
1871 if (!Flags
.empty()) {
1872 Streamer
.switchSection(getDrectveSection());
1873 Streamer
.emitBytes(Flags
);
1878 // Emit /INCLUDE: flags for each used global as necessary.
1879 if (const auto *LU
= M
.getNamedGlobal("llvm.used")) {
1880 assert(LU
->hasInitializer() && "expected llvm.used to have an initializer");
1881 assert(isa
<ArrayType
>(LU
->getValueType()) &&
1882 "expected llvm.used to be an array type");
1883 if (const auto *A
= cast
<ConstantArray
>(LU
->getInitializer())) {
1884 for (const Value
*Op
: A
->operands()) {
1885 const auto *GV
= cast
<GlobalValue
>(Op
->stripPointerCasts());
1886 // Global symbols with internal or private linkage are not visible to
1887 // the linker, and thus would cause an error when the linker tried to
1888 // preserve the symbol due to the `/include:` directive.
1889 if (GV
->hasLocalLinkage())
1892 raw_string_ostream
OS(Flags
);
1893 emitLinkerFlagsForUsedCOFF(OS
, GV
, getContext().getTargetTriple(),
1897 if (!Flags
.empty()) {
1898 Streamer
.switchSection(getDrectveSection());
1899 Streamer
.emitBytes(Flags
);
1907 void TargetLoweringObjectFileCOFF::Initialize(MCContext
&Ctx
,
1908 const TargetMachine
&TM
) {
1909 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
1911 const Triple
&T
= TM
.getTargetTriple();
1912 if (T
.isWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1914 Ctx
.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1915 COFF::IMAGE_SCN_MEM_READ
,
1916 SectionKind::getReadOnly());
1918 Ctx
.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1919 COFF::IMAGE_SCN_MEM_READ
,
1920 SectionKind::getReadOnly());
1922 StaticCtorSection
= Ctx
.getCOFFSection(
1923 ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1924 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1925 SectionKind::getData());
1926 StaticDtorSection
= Ctx
.getCOFFSection(
1927 ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1928 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1929 SectionKind::getData());
1933 static MCSectionCOFF
*getCOFFStaticStructorSection(MCContext
&Ctx
,
1934 const Triple
&T
, bool IsCtor
,
1936 const MCSymbol
*KeySym
,
1937 MCSectionCOFF
*Default
) {
1938 if (T
.isWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1939 // If the priority is the default, use .CRT$XCU, possibly associative.
1940 if (Priority
== 65535)
1941 return Ctx
.getAssociativeCOFFSection(Default
, KeySym
, 0);
1943 // Otherwise, we need to compute a new section name. Low priorities should
1944 // run earlier. The linker will sort sections ASCII-betically, and we need a
1945 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
1946 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
1947 // low priorities need to sort before 'L', since the CRT uses that
1948 // internally, so we use ".CRT$XCA00001" for them. We have a contract with
1949 // the frontend that "init_seg(compiler)" corresponds to priority 200 and
1950 // "init_seg(lib)" corresponds to priority 400, and those respectively use
1951 // 'C' and 'L' without the priority suffix. Priorities between 200 and 400
1952 // use 'C' with the priority as a suffix.
1953 SmallString
<24> Name
;
1954 char LastLetter
= 'T';
1955 bool AddPrioritySuffix
= Priority
!= 200 && Priority
!= 400;
1958 else if (Priority
< 400)
1960 else if (Priority
== 400)
1962 raw_svector_ostream
OS(Name
);
1963 OS
<< ".CRT$X" << (IsCtor
? "C" : "T") << LastLetter
;
1964 if (AddPrioritySuffix
)
1965 OS
<< format("%05u", Priority
);
1966 MCSectionCOFF
*Sec
= Ctx
.getCOFFSection(
1967 Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
| COFF::IMAGE_SCN_MEM_READ
,
1968 SectionKind::getReadOnly());
1969 return Ctx
.getAssociativeCOFFSection(Sec
, KeySym
, 0);
1972 std::string Name
= IsCtor
? ".ctors" : ".dtors";
1973 if (Priority
!= 65535)
1974 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
1976 return Ctx
.getAssociativeCOFFSection(
1977 Ctx
.getCOFFSection(Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1978 COFF::IMAGE_SCN_MEM_READ
|
1979 COFF::IMAGE_SCN_MEM_WRITE
,
1980 SectionKind::getData()),
1984 MCSection
*TargetLoweringObjectFileCOFF::getStaticCtorSection(
1985 unsigned Priority
, const MCSymbol
*KeySym
) const {
1986 return getCOFFStaticStructorSection(
1987 getContext(), getContext().getTargetTriple(), true, Priority
, KeySym
,
1988 cast
<MCSectionCOFF
>(StaticCtorSection
));
1991 MCSection
*TargetLoweringObjectFileCOFF::getStaticDtorSection(
1992 unsigned Priority
, const MCSymbol
*KeySym
) const {
1993 return getCOFFStaticStructorSection(
1994 getContext(), getContext().getTargetTriple(), false, Priority
, KeySym
,
1995 cast
<MCSectionCOFF
>(StaticDtorSection
));
1998 const MCExpr
*TargetLoweringObjectFileCOFF::lowerRelativeReference(
1999 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2000 const TargetMachine
&TM
) const {
2001 const Triple
&T
= TM
.getTargetTriple();
2002 if (T
.isOSCygMing())
2005 // Our symbols should exist in address space zero, cowardly no-op if
2007 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
2008 RHS
->getType()->getPointerAddressSpace() != 0)
2011 // Both ptrtoint instructions must wrap global objects:
2012 // - Only global variables are eligible for image relative relocations.
2013 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
2014 // We expect __ImageBase to be a global variable without a section, externally
2017 // It should look something like this: @__ImageBase = external constant i8
2018 if (!isa
<GlobalObject
>(LHS
) || !isa
<GlobalVariable
>(RHS
) ||
2019 LHS
->isThreadLocal() || RHS
->isThreadLocal() ||
2020 RHS
->getName() != "__ImageBase" || !RHS
->hasExternalLinkage() ||
2021 cast
<GlobalVariable
>(RHS
)->hasInitializer() || RHS
->hasSection())
2024 return MCSymbolRefExpr::create(TM
.getSymbol(LHS
),
2025 MCSymbolRefExpr::VK_COFF_IMGREL32
,
2029 static std::string
APIntToHexString(const APInt
&AI
) {
2030 unsigned Width
= (AI
.getBitWidth() / 8) * 2;
2031 std::string HexString
= toString(AI
, 16, /*Signed=*/false);
2032 llvm::transform(HexString
, HexString
.begin(), tolower
);
2033 unsigned Size
= HexString
.size();
2034 assert(Width
>= Size
&& "hex string is too large!");
2035 HexString
.insert(HexString
.begin(), Width
- Size
, '0');
2040 static std::string
scalarConstantToHexString(const Constant
*C
) {
2041 Type
*Ty
= C
->getType();
2042 if (isa
<UndefValue
>(C
)) {
2043 return APIntToHexString(APInt::getZero(Ty
->getPrimitiveSizeInBits()));
2044 } else if (const auto *CFP
= dyn_cast
<ConstantFP
>(C
)) {
2045 return APIntToHexString(CFP
->getValueAPF().bitcastToAPInt());
2046 } else if (const auto *CI
= dyn_cast
<ConstantInt
>(C
)) {
2047 return APIntToHexString(CI
->getValue());
2049 unsigned NumElements
;
2050 if (auto *VTy
= dyn_cast
<VectorType
>(Ty
))
2051 NumElements
= cast
<FixedVectorType
>(VTy
)->getNumElements();
2053 NumElements
= Ty
->getArrayNumElements();
2054 std::string HexString
;
2055 for (int I
= NumElements
- 1, E
= -1; I
!= E
; --I
)
2056 HexString
+= scalarConstantToHexString(C
->getAggregateElement(I
));
2061 MCSection
*TargetLoweringObjectFileCOFF::getSectionForConstant(
2062 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
2063 Align
&Alignment
) const {
2064 if (Kind
.isMergeableConst() && C
&&
2065 getContext().getAsmInfo()->hasCOFFComdatConstants()) {
2066 // This creates comdat sections with the given symbol name, but unless
2067 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
2068 // will be created with a null storage class, which makes GNU binutils
2070 const unsigned Characteristics
= COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
2071 COFF::IMAGE_SCN_MEM_READ
|
2072 COFF::IMAGE_SCN_LNK_COMDAT
;
2073 std::string COMDATSymName
;
2074 if (Kind
.isMergeableConst4()) {
2075 if (Alignment
<= 4) {
2076 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
2077 Alignment
= Align(4);
2079 } else if (Kind
.isMergeableConst8()) {
2080 if (Alignment
<= 8) {
2081 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
2082 Alignment
= Align(8);
2084 } else if (Kind
.isMergeableConst16()) {
2085 // FIXME: These may not be appropriate for non-x86 architectures.
2086 if (Alignment
<= 16) {
2087 COMDATSymName
= "__xmm@" + scalarConstantToHexString(C
);
2088 Alignment
= Align(16);
2090 } else if (Kind
.isMergeableConst32()) {
2091 if (Alignment
<= 32) {
2092 COMDATSymName
= "__ymm@" + scalarConstantToHexString(C
);
2093 Alignment
= Align(32);
2097 if (!COMDATSymName
.empty())
2098 return getContext().getCOFFSection(".rdata", Characteristics
, Kind
,
2100 COFF::IMAGE_COMDAT_SELECT_ANY
);
2103 return TargetLoweringObjectFile::getSectionForConstant(DL
, Kind
, C
,
2107 //===----------------------------------------------------------------------===//
2109 //===----------------------------------------------------------------------===//
2111 static const Comdat
*getWasmComdat(const GlobalValue
*GV
) {
2112 const Comdat
*C
= GV
->getComdat();
2116 if (C
->getSelectionKind() != Comdat::Any
)
2117 report_fatal_error("WebAssembly COMDATs only support "
2118 "SelectionKind::Any, '" + C
->getName() + "' cannot be "
2124 static unsigned getWasmSectionFlags(SectionKind K
) {
2127 if (K
.isThreadLocal())
2128 Flags
|= wasm::WASM_SEG_FLAG_TLS
;
2130 if (K
.isMergeableCString())
2131 Flags
|= wasm::WASM_SEG_FLAG_STRINGS
;
2133 // TODO(sbc): Add suport for K.isMergeableConst()
2138 MCSection
*TargetLoweringObjectFileWasm::getExplicitSectionGlobal(
2139 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2140 // We don't support explict section names for functions in the wasm object
2141 // format. Each function has to be in its own unique section.
2142 if (isa
<Function
>(GO
)) {
2143 return SelectSectionForGlobal(GO
, Kind
, TM
);
2146 StringRef Name
= GO
->getSection();
2148 // Certain data sections we treat as named custom sections rather than
2149 // segments within the data section.
2150 // This could be avoided if all data segements (the wasm sense) were
2151 // represented as their own sections (in the llvm sense).
2152 // TODO(sbc): https://github.com/WebAssembly/tool-conventions/issues/138
2153 if (Name
== ".llvmcmd" || Name
== ".llvmbc")
2154 Kind
= SectionKind::getMetadata();
2156 StringRef Group
= "";
2157 if (const Comdat
*C
= getWasmComdat(GO
)) {
2158 Group
= C
->getName();
2161 unsigned Flags
= getWasmSectionFlags(Kind
);
2162 MCSectionWasm
*Section
= getContext().getWasmSection(
2163 Name
, Kind
, Flags
, Group
, MCContext::GenericSectionID
);
2168 static MCSectionWasm
*selectWasmSectionForGlobal(
2169 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
2170 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned *NextUniqueID
) {
2171 StringRef Group
= "";
2172 if (const Comdat
*C
= getWasmComdat(GO
)) {
2173 Group
= C
->getName();
2176 bool UniqueSectionNames
= TM
.getUniqueSectionNames();
2177 SmallString
<128> Name
= getSectionPrefixForGlobal(Kind
, /*IsLarge=*/false);
2179 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
2180 const auto &OptionalPrefix
= F
->getSectionPrefix();
2182 raw_svector_ostream(Name
) << '.' << *OptionalPrefix
;
2185 if (EmitUniqueSection
&& UniqueSectionNames
) {
2186 Name
.push_back('.');
2187 TM
.getNameWithPrefix(Name
, GO
, Mang
, true);
2189 unsigned UniqueID
= MCContext::GenericSectionID
;
2190 if (EmitUniqueSection
&& !UniqueSectionNames
) {
2191 UniqueID
= *NextUniqueID
;
2195 unsigned Flags
= getWasmSectionFlags(Kind
);
2196 return Ctx
.getWasmSection(Name
, Kind
, Flags
, Group
, UniqueID
);
2199 MCSection
*TargetLoweringObjectFileWasm::SelectSectionForGlobal(
2200 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2202 if (Kind
.isCommon())
2203 report_fatal_error("mergable sections not supported yet on wasm");
2205 // If we have -ffunction-section or -fdata-section then we should emit the
2206 // global value to a uniqued section specifically for it.
2207 bool EmitUniqueSection
= false;
2209 EmitUniqueSection
= TM
.getFunctionSections();
2211 EmitUniqueSection
= TM
.getDataSections();
2212 EmitUniqueSection
|= GO
->hasComdat();
2214 return selectWasmSectionForGlobal(getContext(), GO
, Kind
, getMangler(), TM
,
2215 EmitUniqueSection
, &NextUniqueID
);
2218 bool TargetLoweringObjectFileWasm::shouldPutJumpTableInFunctionSection(
2219 bool UsesLabelDifference
, const Function
&F
) const {
2220 // We can always create relative relocations, so use another section
2221 // that can be marked non-executable.
2225 const MCExpr
*TargetLoweringObjectFileWasm::lowerRelativeReference(
2226 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2227 const TargetMachine
&TM
) const {
2228 // We may only use a PLT-relative relocation to refer to unnamed_addr
2230 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
2233 // Basic correctness checks.
2234 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
2235 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
2236 RHS
->isThreadLocal())
2239 return MCBinaryExpr::createSub(
2240 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), MCSymbolRefExpr::VK_None
,
2242 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
2245 void TargetLoweringObjectFileWasm::InitializeWasm() {
2247 getContext().getWasmSection(".init_array", SectionKind::getData());
2249 // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
2250 // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
2251 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
2254 MCSection
*TargetLoweringObjectFileWasm::getStaticCtorSection(
2255 unsigned Priority
, const MCSymbol
*KeySym
) const {
2256 return Priority
== UINT16_MAX
?
2258 getContext().getWasmSection(".init_array." + utostr(Priority
),
2259 SectionKind::getData());
2262 MCSection
*TargetLoweringObjectFileWasm::getStaticDtorSection(
2263 unsigned Priority
, const MCSymbol
*KeySym
) const {
2264 report_fatal_error("@llvm.global_dtors should have been lowered already");
2267 //===----------------------------------------------------------------------===//
2269 //===----------------------------------------------------------------------===//
2270 bool TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(
2271 const MachineFunction
*MF
) {
2272 if (!MF
->getLandingPads().empty())
2275 const Function
&F
= MF
->getFunction();
2276 if (!F
.hasPersonalityFn() || !F
.needsUnwindTableEntry())
2279 const GlobalValue
*Per
=
2280 dyn_cast
<GlobalValue
>(F
.getPersonalityFn()->stripPointerCasts());
2281 assert(Per
&& "Personality routine is not a GlobalValue type.");
2282 if (isNoOpWithoutInvoke(classifyEHPersonality(Per
)))
2288 bool TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(
2289 const MachineFunction
*MF
) {
2290 const Function
&F
= MF
->getFunction();
2291 if (!F
.hasStackProtectorFnAttr())
2293 // FIXME: check presence of canary word
2294 // There are cases that the stack protectors are not really inserted even if
2295 // the attributes are on.
2300 TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(const MachineFunction
*MF
) {
2301 return MF
->getMMI().getContext().getOrCreateSymbol(
2302 "__ehinfo." + Twine(MF
->getFunctionNumber()));
2306 TargetLoweringObjectFileXCOFF::getTargetSymbol(const GlobalValue
*GV
,
2307 const TargetMachine
&TM
) const {
2308 // We always use a qualname symbol for a GV that represents
2309 // a declaration, a function descriptor, or a common symbol.
2310 // If a GV represents a GlobalVariable and -fdata-sections is enabled, we
2311 // also return a qualname so that a label symbol could be avoided.
2312 // It is inherently ambiguous when the GO represents the address of a
2313 // function, as the GO could either represent a function descriptor or a
2314 // function entry point. We choose to always return a function descriptor
2316 if (const GlobalObject
*GO
= dyn_cast
<GlobalObject
>(GV
)) {
2317 if (GO
->isDeclarationForLinker())
2318 return cast
<MCSectionXCOFF
>(getSectionForExternalReference(GO
, TM
))
2319 ->getQualNameSymbol();
2321 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GV
))
2322 if (GVar
->hasAttribute("toc-data"))
2323 return cast
<MCSectionXCOFF
>(
2324 SectionForGlobal(GVar
, SectionKind::getData(), TM
))
2325 ->getQualNameSymbol();
2327 SectionKind GOKind
= getKindForGlobal(GO
, TM
);
2328 if (GOKind
.isText())
2329 return cast
<MCSectionXCOFF
>(
2330 getSectionForFunctionDescriptor(cast
<Function
>(GO
), TM
))
2331 ->getQualNameSymbol();
2332 if ((TM
.getDataSections() && !GO
->hasSection()) || GO
->hasCommonLinkage() ||
2333 GOKind
.isBSSLocal() || GOKind
.isThreadBSSLocal())
2334 return cast
<MCSectionXCOFF
>(SectionForGlobal(GO
, GOKind
, TM
))
2335 ->getQualNameSymbol();
2338 // For all other cases, fall back to getSymbol to return the unqualified name.
2342 MCSection
*TargetLoweringObjectFileXCOFF::getExplicitSectionGlobal(
2343 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2344 if (!GO
->hasSection())
2345 report_fatal_error("#pragma clang section is not yet supported");
2347 StringRef SectionName
= GO
->getSection();
2349 // Handle the XCOFF::TD case first, then deal with the rest.
2350 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2351 if (GVar
->hasAttribute("toc-data"))
2352 return getContext().getXCOFFSection(
2354 XCOFF::CsectProperties(/*MappingClass*/ XCOFF::XMC_TD
, XCOFF::XTY_SD
),
2355 /* MultiSymbolsAllowed*/ true);
2357 XCOFF::StorageMappingClass MappingClass
;
2359 MappingClass
= XCOFF::XMC_PR
;
2360 else if (Kind
.isData() || Kind
.isBSS())
2361 MappingClass
= XCOFF::XMC_RW
;
2362 else if (Kind
.isReadOnlyWithRel())
2364 TM
.Options
.XCOFFReadOnlyPointers
? XCOFF::XMC_RO
: XCOFF::XMC_RW
;
2365 else if (Kind
.isReadOnly())
2366 MappingClass
= XCOFF::XMC_RO
;
2368 report_fatal_error("XCOFF other section types not yet implemented.");
2370 return getContext().getXCOFFSection(
2371 SectionName
, Kind
, XCOFF::CsectProperties(MappingClass
, XCOFF::XTY_SD
),
2372 /* MultiSymbolsAllowed*/ true);
2375 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForExternalReference(
2376 const GlobalObject
*GO
, const TargetMachine
&TM
) const {
2377 assert(GO
->isDeclarationForLinker() &&
2378 "Tried to get ER section for a defined global.");
2380 SmallString
<128> Name
;
2381 getNameWithPrefix(Name
, GO
, TM
);
2383 XCOFF::StorageMappingClass SMC
=
2384 isa
<Function
>(GO
) ? XCOFF::XMC_DS
: XCOFF::XMC_UA
;
2385 if (GO
->isThreadLocal())
2386 SMC
= XCOFF::XMC_UL
;
2388 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2389 if (GVar
->hasAttribute("toc-data"))
2390 SMC
= XCOFF::XMC_TD
;
2392 // Externals go into a csect of type ER.
2393 return getContext().getXCOFFSection(
2394 Name
, SectionKind::getMetadata(),
2395 XCOFF::CsectProperties(SMC
, XCOFF::XTY_ER
));
2398 MCSection
*TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
2399 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2400 // Handle the XCOFF::TD case first, then deal with the rest.
2401 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2402 if (GVar
->hasAttribute("toc-data")) {
2403 SmallString
<128> Name
;
2404 getNameWithPrefix(Name
, GO
, TM
);
2405 return getContext().getXCOFFSection(
2406 Name
, Kind
, XCOFF::CsectProperties(XCOFF::XMC_TD
, XCOFF::XTY_SD
),
2407 /* MultiSymbolsAllowed*/ true);
2410 // Common symbols go into a csect with matching name which will get mapped
2411 // into the .bss section.
2412 // Zero-initialized local TLS symbols go into a csect with matching name which
2413 // will get mapped into the .tbss section.
2414 if (Kind
.isBSSLocal() || GO
->hasCommonLinkage() || Kind
.isThreadBSSLocal()) {
2415 SmallString
<128> Name
;
2416 getNameWithPrefix(Name
, GO
, TM
);
2417 XCOFF::StorageMappingClass SMC
= Kind
.isBSSLocal() ? XCOFF::XMC_BS
2418 : Kind
.isCommon() ? XCOFF::XMC_RW
2420 return getContext().getXCOFFSection(
2421 Name
, Kind
, XCOFF::CsectProperties(SMC
, XCOFF::XTY_CM
));
2424 if (Kind
.isMergeableCString()) {
2425 Align Alignment
= GO
->getParent()->getDataLayout().getPreferredAlign(
2426 cast
<GlobalVariable
>(GO
));
2428 unsigned EntrySize
= getEntrySizeForKind(Kind
);
2429 std::string SizeSpec
= ".rodata.str" + utostr(EntrySize
) + ".";
2430 SmallString
<128> Name
;
2431 Name
= SizeSpec
+ utostr(Alignment
.value());
2433 if (TM
.getDataSections())
2434 getNameWithPrefix(Name
, GO
, TM
);
2436 return getContext().getXCOFFSection(
2437 Name
, Kind
, XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
),
2438 /* MultiSymbolsAllowed*/ !TM
.getDataSections());
2441 if (Kind
.isText()) {
2442 if (TM
.getFunctionSections()) {
2443 return cast
<MCSymbolXCOFF
>(getFunctionEntryPointSymbol(GO
, TM
))
2444 ->getRepresentedCsect();
2449 if (TM
.Options
.XCOFFReadOnlyPointers
&& Kind
.isReadOnlyWithRel()) {
2450 if (!TM
.getDataSections())
2452 "ReadOnlyPointers is supported only if data sections is turned on");
2454 SmallString
<128> Name
;
2455 getNameWithPrefix(Name
, GO
, TM
);
2456 return getContext().getXCOFFSection(
2457 Name
, SectionKind::getReadOnly(),
2458 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2461 // For BSS kind, zero initialized data must be emitted to the .data section
2462 // because external linkage control sections that get mapped to the .bss
2463 // section will be linked as tentative defintions, which is only appropriate
2464 // for SectionKind::Common.
2465 if (Kind
.isData() || Kind
.isReadOnlyWithRel() || Kind
.isBSS()) {
2466 if (TM
.getDataSections()) {
2467 SmallString
<128> Name
;
2468 getNameWithPrefix(Name
, GO
, TM
);
2469 return getContext().getXCOFFSection(
2470 Name
, SectionKind::getData(),
2471 XCOFF::CsectProperties(XCOFF::XMC_RW
, XCOFF::XTY_SD
));
2476 if (Kind
.isReadOnly()) {
2477 if (TM
.getDataSections()) {
2478 SmallString
<128> Name
;
2479 getNameWithPrefix(Name
, GO
, TM
);
2480 return getContext().getXCOFFSection(
2481 Name
, SectionKind::getReadOnly(),
2482 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2484 return ReadOnlySection
;
2487 // External/weak TLS data and initialized local TLS data are not eligible
2488 // to be put into common csect. If data sections are enabled, thread
2489 // data are emitted into separate sections. Otherwise, thread data
2490 // are emitted into the .tdata section.
2491 if (Kind
.isThreadLocal()) {
2492 if (TM
.getDataSections()) {
2493 SmallString
<128> Name
;
2494 getNameWithPrefix(Name
, GO
, TM
);
2495 return getContext().getXCOFFSection(
2496 Name
, Kind
, XCOFF::CsectProperties(XCOFF::XMC_TL
, XCOFF::XTY_SD
));
2498 return TLSDataSection
;
2501 report_fatal_error("XCOFF other section types not yet implemented.");
2504 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForJumpTable(
2505 const Function
&F
, const TargetMachine
&TM
) const {
2506 assert (!F
.getComdat() && "Comdat not supported on XCOFF.");
2508 if (!TM
.getFunctionSections())
2509 return ReadOnlySection
;
2511 // If the function can be removed, produce a unique section so that
2512 // the table doesn't prevent the removal.
2513 SmallString
<128> NameStr(".rodata.jmp..");
2514 getNameWithPrefix(NameStr
, &F
, TM
);
2515 return getContext().getXCOFFSection(
2516 NameStr
, SectionKind::getReadOnly(),
2517 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2520 bool TargetLoweringObjectFileXCOFF::shouldPutJumpTableInFunctionSection(
2521 bool UsesLabelDifference
, const Function
&F
) const {
2525 /// Given a mergeable constant with the specified size and relocation
2526 /// information, return a section that it should be placed in.
2527 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForConstant(
2528 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
2529 Align
&Alignment
) const {
2530 // TODO: Enable emiting constant pool to unique sections when we support it.
2531 if (Alignment
> Align(16))
2532 report_fatal_error("Alignments greater than 16 not yet supported.");
2534 if (Alignment
== Align(8)) {
2535 assert(ReadOnly8Section
&& "Section should always be initialized.");
2536 return ReadOnly8Section
;
2539 if (Alignment
== Align(16)) {
2540 assert(ReadOnly16Section
&& "Section should always be initialized.");
2541 return ReadOnly16Section
;
2544 return ReadOnlySection
;
2547 void TargetLoweringObjectFileXCOFF::Initialize(MCContext
&Ctx
,
2548 const TargetMachine
&TgtM
) {
2549 TargetLoweringObjectFile::Initialize(Ctx
, TgtM
);
2551 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_datarel
|
2552 (TgtM
.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4
2553 : dwarf::DW_EH_PE_sdata8
);
2554 PersonalityEncoding
= 0;
2556 CallSiteEncoding
= dwarf::DW_EH_PE_udata4
;
2558 // AIX debug for thread local location is not ready. And for integrated as
2559 // mode, the relocatable address for the thread local variable will cause
2560 // linker error. So disable the location attribute generation for thread local
2561 // variables for now.
2562 // FIXME: when TLS debug on AIX is ready, remove this setting.
2563 SupportDebugThreadLocalLocation
= false;
2566 MCSection
*TargetLoweringObjectFileXCOFF::getStaticCtorSection(
2567 unsigned Priority
, const MCSymbol
*KeySym
) const {
2568 report_fatal_error("no static constructor section on AIX");
2571 MCSection
*TargetLoweringObjectFileXCOFF::getStaticDtorSection(
2572 unsigned Priority
, const MCSymbol
*KeySym
) const {
2573 report_fatal_error("no static destructor section on AIX");
2576 const MCExpr
*TargetLoweringObjectFileXCOFF::lowerRelativeReference(
2577 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2578 const TargetMachine
&TM
) const {
2579 /* Not implemented yet, but don't crash, return nullptr. */
2584 TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(const GlobalValue
*GV
) {
2585 assert(!isa
<GlobalIFunc
>(GV
) && "GlobalIFunc is not supported on AIX.");
2587 switch (GV
->getLinkage()) {
2588 case GlobalValue::InternalLinkage
:
2589 case GlobalValue::PrivateLinkage
:
2590 return XCOFF::C_HIDEXT
;
2591 case GlobalValue::ExternalLinkage
:
2592 case GlobalValue::CommonLinkage
:
2593 case GlobalValue::AvailableExternallyLinkage
:
2594 return XCOFF::C_EXT
;
2595 case GlobalValue::ExternalWeakLinkage
:
2596 case GlobalValue::LinkOnceAnyLinkage
:
2597 case GlobalValue::LinkOnceODRLinkage
:
2598 case GlobalValue::WeakAnyLinkage
:
2599 case GlobalValue::WeakODRLinkage
:
2600 return XCOFF::C_WEAKEXT
;
2601 case GlobalValue::AppendingLinkage
:
2603 "There is no mapping that implements AppendingLinkage for XCOFF.");
2605 llvm_unreachable("Unknown linkage type!");
2608 MCSymbol
*TargetLoweringObjectFileXCOFF::getFunctionEntryPointSymbol(
2609 const GlobalValue
*Func
, const TargetMachine
&TM
) const {
2610 assert((isa
<Function
>(Func
) ||
2611 (isa
<GlobalAlias
>(Func
) &&
2612 isa_and_nonnull
<Function
>(
2613 cast
<GlobalAlias
>(Func
)->getAliaseeObject()))) &&
2614 "Func must be a function or an alias which has a function as base "
2617 SmallString
<128> NameStr
;
2618 NameStr
.push_back('.');
2619 getNameWithPrefix(NameStr
, Func
, TM
);
2621 // When -function-sections is enabled and explicit section is not specified,
2622 // it's not necessary to emit function entry point label any more. We will use
2623 // function entry point csect instead. And for function delcarations, the
2624 // undefined symbols gets treated as csect with XTY_ER property.
2625 if (((TM
.getFunctionSections() && !Func
->hasSection()) ||
2626 Func
->isDeclaration()) &&
2627 isa
<Function
>(Func
)) {
2630 NameStr
, SectionKind::getText(),
2631 XCOFF::CsectProperties(XCOFF::XMC_PR
, Func
->isDeclaration()
2634 ->getQualNameSymbol();
2637 return getContext().getOrCreateSymbol(NameStr
);
2640 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForFunctionDescriptor(
2641 const Function
*F
, const TargetMachine
&TM
) const {
2642 SmallString
<128> NameStr
;
2643 getNameWithPrefix(NameStr
, F
, TM
);
2644 return getContext().getXCOFFSection(
2645 NameStr
, SectionKind::getData(),
2646 XCOFF::CsectProperties(XCOFF::XMC_DS
, XCOFF::XTY_SD
));
2649 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForTOCEntry(
2650 const MCSymbol
*Sym
, const TargetMachine
&TM
) const {
2651 // Use TE storage-mapping class when large code model is enabled so that
2652 // the chance of needing -bbigtoc is decreased.
2653 return getContext().getXCOFFSection(
2654 cast
<MCSymbolXCOFF
>(Sym
)->getSymbolTableName(), SectionKind::getData(),
2655 XCOFF::CsectProperties(
2656 TM
.getCodeModel() == CodeModel::Large
? XCOFF::XMC_TE
: XCOFF::XMC_TC
,
2660 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForLSDA(
2661 const Function
&F
, const MCSymbol
&FnSym
, const TargetMachine
&TM
) const {
2662 auto *LSDA
= cast
<MCSectionXCOFF
>(LSDASection
);
2663 if (TM
.getFunctionSections()) {
2664 // If option -ffunction-sections is on, append the function name to the
2665 // name of the LSDA csect so that each function has its own LSDA csect.
2666 // This helps the linker to garbage-collect EH info of unused functions.
2667 SmallString
<128> NameStr
= LSDA
->getName();
2668 raw_svector_ostream(NameStr
) << '.' << F
.getName();
2669 LSDA
= getContext().getXCOFFSection(NameStr
, LSDA
->getKind(),
2670 LSDA
->getCsectProp());
2674 //===----------------------------------------------------------------------===//
2676 //===----------------------------------------------------------------------===//
2677 TargetLoweringObjectFileGOFF::TargetLoweringObjectFileGOFF() = default;
2679 MCSection
*TargetLoweringObjectFileGOFF::getExplicitSectionGlobal(
2680 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2681 return SelectSectionForGlobal(GO
, Kind
, TM
);
2684 MCSection
*TargetLoweringObjectFileGOFF::SelectSectionForGlobal(
2685 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2686 auto *Symbol
= TM
.getSymbol(GO
);
2688 return getContext().getGOFFSection(Symbol
->getName(), SectionKind::getBSS(),
2691 return getContext().getObjectFileInfo()->getTextSection();