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
== getInstrProfSectionName(IPSK_covdata
, Triple::ELF
,
476 /*AddSegmentInfo=*/false) ||
477 Name
== getInstrProfSectionName(IPSK_covname
, Triple::ELF
,
478 /*AddSegmentInfo=*/false) ||
479 Name
== ".llvmbc" || Name
== ".llvmcmd")
480 return SectionKind::getMetadata();
482 if (Name
.empty() || Name
[0] != '.') return K
;
484 // Default implementation based on some magic section names.
485 if (Name
== ".bss" || Name
.starts_with(".bss.") ||
486 Name
.starts_with(".gnu.linkonce.b.") ||
487 Name
.starts_with(".llvm.linkonce.b.") || Name
== ".sbss" ||
488 Name
.starts_with(".sbss.") || Name
.starts_with(".gnu.linkonce.sb.") ||
489 Name
.starts_with(".llvm.linkonce.sb."))
490 return SectionKind::getBSS();
492 if (Name
== ".tdata" || Name
.starts_with(".tdata.") ||
493 Name
.starts_with(".gnu.linkonce.td.") ||
494 Name
.starts_with(".llvm.linkonce.td."))
495 return SectionKind::getThreadData();
497 if (Name
== ".tbss" || Name
.starts_with(".tbss.") ||
498 Name
.starts_with(".gnu.linkonce.tb.") ||
499 Name
.starts_with(".llvm.linkonce.tb."))
500 return SectionKind::getThreadBSS();
505 static bool hasPrefix(StringRef SectionName
, StringRef Prefix
) {
506 return SectionName
.consume_front(Prefix
) &&
507 (SectionName
.empty() || SectionName
[0] == '.');
510 static unsigned getELFSectionType(StringRef Name
, SectionKind K
) {
511 // Use SHT_NOTE for section whose name starts with ".note" to allow
512 // emitting ELF notes from C variable declaration.
513 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
514 if (Name
.starts_with(".note"))
515 return ELF::SHT_NOTE
;
517 if (hasPrefix(Name
, ".init_array"))
518 return ELF::SHT_INIT_ARRAY
;
520 if (hasPrefix(Name
, ".fini_array"))
521 return ELF::SHT_FINI_ARRAY
;
523 if (hasPrefix(Name
, ".preinit_array"))
524 return ELF::SHT_PREINIT_ARRAY
;
526 if (hasPrefix(Name
, ".llvm.offloading"))
527 return ELF::SHT_LLVM_OFFLOADING
;
529 if (K
.isBSS() || K
.isThreadBSS())
530 return ELF::SHT_NOBITS
;
532 return ELF::SHT_PROGBITS
;
535 static unsigned getELFSectionFlags(SectionKind K
) {
538 if (!K
.isMetadata() && !K
.isExclude())
539 Flags
|= ELF::SHF_ALLOC
;
542 Flags
|= ELF::SHF_EXCLUDE
;
545 Flags
|= ELF::SHF_EXECINSTR
;
547 if (K
.isExecuteOnly())
548 Flags
|= ELF::SHF_ARM_PURECODE
;
551 Flags
|= ELF::SHF_WRITE
;
553 if (K
.isThreadLocal())
554 Flags
|= ELF::SHF_TLS
;
556 if (K
.isMergeableCString() || K
.isMergeableConst())
557 Flags
|= ELF::SHF_MERGE
;
559 if (K
.isMergeableCString())
560 Flags
|= ELF::SHF_STRINGS
;
565 static const Comdat
*getELFComdat(const GlobalValue
*GV
) {
566 const Comdat
*C
= GV
->getComdat();
570 if (C
->getSelectionKind() != Comdat::Any
&&
571 C
->getSelectionKind() != Comdat::NoDeduplicate
)
572 report_fatal_error("ELF COMDATs only support SelectionKind::Any and "
573 "SelectionKind::NoDeduplicate, '" +
574 C
->getName() + "' cannot be lowered.");
579 static const MCSymbolELF
*getLinkedToSymbol(const GlobalObject
*GO
,
580 const TargetMachine
&TM
) {
581 MDNode
*MD
= GO
->getMetadata(LLVMContext::MD_associated
);
585 auto *VM
= cast
<ValueAsMetadata
>(MD
->getOperand(0).get());
586 auto *OtherGV
= dyn_cast
<GlobalValue
>(VM
->getValue());
587 return OtherGV
? dyn_cast
<MCSymbolELF
>(TM
.getSymbol(OtherGV
)) : nullptr;
590 static unsigned getEntrySizeForKind(SectionKind Kind
) {
591 if (Kind
.isMergeable1ByteCString())
593 else if (Kind
.isMergeable2ByteCString())
595 else if (Kind
.isMergeable4ByteCString())
597 else if (Kind
.isMergeableConst4())
599 else if (Kind
.isMergeableConst8())
601 else if (Kind
.isMergeableConst16())
603 else if (Kind
.isMergeableConst32())
606 // We shouldn't have mergeable C strings or mergeable constants that we
607 // didn't handle above.
608 assert(!Kind
.isMergeableCString() && "unknown string width");
609 assert(!Kind
.isMergeableConst() && "unknown data width");
614 /// Return the section prefix name used by options FunctionsSections and
616 static StringRef
getSectionPrefixForGlobal(SectionKind Kind
, bool IsLarge
) {
618 return IsLarge
? ".ltext" : ".text";
619 if (Kind
.isReadOnly())
620 return IsLarge
? ".lrodata" : ".rodata";
622 return IsLarge
? ".lbss" : ".bss";
623 if (Kind
.isThreadData())
625 if (Kind
.isThreadBSS())
628 return IsLarge
? ".ldata" : ".data";
629 if (Kind
.isReadOnlyWithRel())
630 return IsLarge
? ".ldata.rel.ro" : ".data.rel.ro";
631 llvm_unreachable("Unknown section kind");
634 static SmallString
<128>
635 getELFSectionNameForGlobal(const GlobalObject
*GO
, SectionKind Kind
,
636 Mangler
&Mang
, const TargetMachine
&TM
,
637 unsigned EntrySize
, bool UniqueSectionName
) {
638 SmallString
<128> Name
;
639 if (Kind
.isMergeableCString()) {
640 // We also need alignment here.
641 // FIXME: this is getting the alignment of the character, not the
642 // alignment of the global!
643 Align Alignment
= GO
->getParent()->getDataLayout().getPreferredAlign(
644 cast
<GlobalVariable
>(GO
));
646 std::string SizeSpec
= ".rodata.str" + utostr(EntrySize
) + ".";
647 Name
= SizeSpec
+ utostr(Alignment
.value());
648 } else if (Kind
.isMergeableConst()) {
649 Name
= ".rodata.cst";
650 Name
+= utostr(EntrySize
);
652 Name
= getSectionPrefixForGlobal(Kind
, TM
.isLargeGlobalValue(GO
));
655 bool HasPrefix
= false;
656 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
657 if (std::optional
<StringRef
> Prefix
= F
->getSectionPrefix()) {
658 raw_svector_ostream(Name
) << '.' << *Prefix
;
663 if (UniqueSectionName
) {
665 TM
.getNameWithPrefix(Name
, GO
, Mang
, /*MayAlwaysUsePrivate*/true);
666 } else if (HasPrefix
)
667 // For distinguishing between .text.${text-section-prefix}. (with trailing
668 // dot) and .text.${function-name}
674 class LoweringDiagnosticInfo
: public DiagnosticInfo
{
678 LoweringDiagnosticInfo(const Twine
&DiagMsg
,
679 DiagnosticSeverity Severity
= DS_Error
)
680 : DiagnosticInfo(DK_Lowering
, Severity
), Msg(DiagMsg
) {}
681 void print(DiagnosticPrinter
&DP
) const override
{ DP
<< Msg
; }
685 /// Calculate an appropriate unique ID for a section, and update Flags,
686 /// EntrySize and NextUniqueID where appropriate.
688 calcUniqueIDUpdateFlagsAndSize(const GlobalObject
*GO
, StringRef SectionName
,
689 SectionKind Kind
, const TargetMachine
&TM
,
690 MCContext
&Ctx
, Mangler
&Mang
, unsigned &Flags
,
691 unsigned &EntrySize
, unsigned &NextUniqueID
,
692 const bool Retain
, const bool ForceUnique
) {
693 // Increment uniqueID if we are forced to emit a unique section.
694 // This works perfectly fine with section attribute or pragma section as the
695 // sections with the same name are grouped together by the assembler.
697 return NextUniqueID
++;
699 // A section can have at most one associated section. Put each global with
700 // MD_associated in a unique section.
701 const bool Associated
= GO
->getMetadata(LLVMContext::MD_associated
);
703 Flags
|= ELF::SHF_LINK_ORDER
;
704 return NextUniqueID
++;
708 if (TM
.getTargetTriple().isOSSolaris())
709 Flags
|= ELF::SHF_SUNW_NODISCARD
;
710 else if (Ctx
.getAsmInfo()->useIntegratedAssembler() ||
711 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 36))
712 Flags
|= ELF::SHF_GNU_RETAIN
;
713 return NextUniqueID
++;
716 // If two symbols with differing sizes end up in the same mergeable section
717 // that section can be assigned an incorrect entry size. To avoid this we
718 // usually put symbols of the same size into distinct mergeable sections with
719 // the same name. Doing so relies on the ",unique ," assembly feature. This
720 // feature is not avalible until bintuils version 2.35
721 // (https://sourceware.org/bugzilla/show_bug.cgi?id=25380).
722 const bool SupportsUnique
= Ctx
.getAsmInfo()->useIntegratedAssembler() ||
723 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 35);
724 if (!SupportsUnique
) {
725 Flags
&= ~ELF::SHF_MERGE
;
727 return MCContext::GenericSectionID
;
730 const bool SymbolMergeable
= Flags
& ELF::SHF_MERGE
;
731 const bool SeenSectionNameBefore
=
732 Ctx
.isELFGenericMergeableSection(SectionName
);
733 // If this is the first ocurrence of this section name, treat it as the
735 if (!SymbolMergeable
&& !SeenSectionNameBefore
)
736 return MCContext::GenericSectionID
;
738 // Symbols must be placed into sections with compatible entry sizes. Generate
739 // unique sections for symbols that have not been assigned to compatible
741 const auto PreviousID
=
742 Ctx
.getELFUniqueIDForEntsize(SectionName
, Flags
, EntrySize
);
746 // If the user has specified the same section name as would be created
747 // implicitly for this symbol e.g. .rodata.str1.1, then we don't need
748 // to unique the section as the entry size for this symbol will be
749 // compatible with implicitly created sections.
750 SmallString
<128> ImplicitSectionNameStem
=
751 getELFSectionNameForGlobal(GO
, Kind
, Mang
, TM
, EntrySize
, false);
752 if (SymbolMergeable
&&
753 Ctx
.isELFImplicitMergeableSectionNamePrefix(SectionName
) &&
754 SectionName
.starts_with(ImplicitSectionNameStem
))
755 return MCContext::GenericSectionID
;
757 // We have seen this section name before, but with different flags or entity
758 // size. Create a new unique ID.
759 return NextUniqueID
++;
762 static std::tuple
<StringRef
, bool, unsigned>
763 getGlobalObjectInfo(const GlobalObject
*GO
, const TargetMachine
&TM
) {
764 StringRef Group
= "";
765 bool IsComdat
= false;
767 if (const Comdat
*C
= getELFComdat(GO
)) {
768 Flags
|= ELF::SHF_GROUP
;
769 Group
= C
->getName();
770 IsComdat
= C
->getSelectionKind() == Comdat::Any
;
772 if (TM
.isLargeGlobalValue(GO
))
773 Flags
|= ELF::SHF_X86_64_LARGE
;
774 return {Group
, IsComdat
, Flags
};
777 static MCSection
*selectExplicitSectionGlobal(
778 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
,
779 MCContext
&Ctx
, Mangler
&Mang
, unsigned &NextUniqueID
,
780 bool Retain
, bool ForceUnique
) {
781 StringRef SectionName
= GO
->getSection();
783 // Check if '#pragma clang section' name is applicable.
784 // Note that pragma directive overrides -ffunction-section, -fdata-section
785 // and so section name is exactly as user specified and not uniqued.
786 const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(GO
);
787 if (GV
&& GV
->hasImplicitSection()) {
788 auto Attrs
= GV
->getAttributes();
789 if (Attrs
.hasAttribute("bss-section") && Kind
.isBSS()) {
790 SectionName
= Attrs
.getAttribute("bss-section").getValueAsString();
791 } else if (Attrs
.hasAttribute("rodata-section") && Kind
.isReadOnly()) {
792 SectionName
= Attrs
.getAttribute("rodata-section").getValueAsString();
793 } else if (Attrs
.hasAttribute("relro-section") && Kind
.isReadOnlyWithRel()) {
794 SectionName
= Attrs
.getAttribute("relro-section").getValueAsString();
795 } else if (Attrs
.hasAttribute("data-section") && Kind
.isData()) {
796 SectionName
= Attrs
.getAttribute("data-section").getValueAsString();
799 const Function
*F
= dyn_cast
<Function
>(GO
);
800 if (F
&& F
->hasFnAttribute("implicit-section-name")) {
801 SectionName
= F
->getFnAttribute("implicit-section-name").getValueAsString();
804 // Infer section flags from the section name if we can.
805 Kind
= getELFKindForNamedSection(SectionName
, Kind
);
807 unsigned Flags
= getELFSectionFlags(Kind
);
808 auto [Group
, IsComdat
, ExtraFlags
] = getGlobalObjectInfo(GO
, TM
);
811 unsigned EntrySize
= getEntrySizeForKind(Kind
);
812 const unsigned UniqueID
= calcUniqueIDUpdateFlagsAndSize(
813 GO
, SectionName
, Kind
, TM
, Ctx
, Mang
, Flags
, EntrySize
, NextUniqueID
,
814 Retain
, ForceUnique
);
816 const MCSymbolELF
*LinkedToSym
= getLinkedToSymbol(GO
, TM
);
817 MCSectionELF
*Section
= Ctx
.getELFSection(
818 SectionName
, getELFSectionType(SectionName
, Kind
), Flags
, EntrySize
,
819 Group
, IsComdat
, UniqueID
, LinkedToSym
);
820 // Make sure that we did not get some other section with incompatible sh_link.
821 // This should not be possible due to UniqueID code above.
822 assert(Section
->getLinkedToSymbol() == LinkedToSym
&&
823 "Associated symbol mismatch between sections");
825 if (!(Ctx
.getAsmInfo()->useIntegratedAssembler() ||
826 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 35))) {
827 // If we are using GNU as before 2.35, then this symbol might have
828 // been placed in an incompatible mergeable section. Emit an error if this
829 // is the case to avoid creating broken output.
830 if ((Section
->getFlags() & ELF::SHF_MERGE
) &&
831 (Section
->getEntrySize() != getEntrySizeForKind(Kind
)))
832 GO
->getContext().diagnose(LoweringDiagnosticInfo(
833 "Symbol '" + GO
->getName() + "' from module '" +
834 (GO
->getParent() ? GO
->getParent()->getSourceFileName() : "unknown") +
835 "' required a section with entry-size=" +
836 Twine(getEntrySizeForKind(Kind
)) + " but was placed in section '" +
837 SectionName
+ "' with entry-size=" + Twine(Section
->getEntrySize()) +
838 ": Explicit assignment by pragma or attribute of an incompatible "
839 "symbol to this section?"));
845 MCSection
*TargetLoweringObjectFileELF::getExplicitSectionGlobal(
846 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
847 return selectExplicitSectionGlobal(GO
, Kind
, TM
, getContext(), getMangler(),
848 NextUniqueID
, Used
.count(GO
),
849 /* ForceUnique = */false);
852 static MCSectionELF
*selectELFSectionForGlobal(
853 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
854 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned Flags
,
855 unsigned *NextUniqueID
, const MCSymbolELF
*AssociatedSymbol
) {
857 auto [Group
, IsComdat
, ExtraFlags
] = getGlobalObjectInfo(GO
, TM
);
860 // Get the section entry size based on the kind.
861 unsigned EntrySize
= getEntrySizeForKind(Kind
);
863 bool UniqueSectionName
= false;
864 unsigned UniqueID
= MCContext::GenericSectionID
;
865 if (EmitUniqueSection
) {
866 if (TM
.getUniqueSectionNames()) {
867 UniqueSectionName
= true;
869 UniqueID
= *NextUniqueID
;
873 SmallString
<128> Name
= getELFSectionNameForGlobal(
874 GO
, Kind
, Mang
, TM
, EntrySize
, UniqueSectionName
);
876 // Use 0 as the unique ID for execute-only text.
877 if (Kind
.isExecuteOnly())
879 return Ctx
.getELFSection(Name
, getELFSectionType(Name
, Kind
), Flags
,
880 EntrySize
, Group
, IsComdat
, UniqueID
,
884 static MCSection
*selectELFSectionForGlobal(
885 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
886 const TargetMachine
&TM
, bool Retain
, bool EmitUniqueSection
,
887 unsigned Flags
, unsigned *NextUniqueID
) {
888 const MCSymbolELF
*LinkedToSym
= getLinkedToSymbol(GO
, TM
);
890 EmitUniqueSection
= true;
891 Flags
|= ELF::SHF_LINK_ORDER
;
894 if (TM
.getTargetTriple().isOSSolaris()) {
895 EmitUniqueSection
= true;
896 Flags
|= ELF::SHF_SUNW_NODISCARD
;
897 } else if (Ctx
.getAsmInfo()->useIntegratedAssembler() ||
898 Ctx
.getAsmInfo()->binutilsIsAtLeast(2, 36)) {
899 EmitUniqueSection
= true;
900 Flags
|= ELF::SHF_GNU_RETAIN
;
904 MCSectionELF
*Section
= selectELFSectionForGlobal(
905 Ctx
, GO
, Kind
, Mang
, TM
, EmitUniqueSection
, Flags
,
906 NextUniqueID
, LinkedToSym
);
907 assert(Section
->getLinkedToSymbol() == LinkedToSym
);
911 MCSection
*TargetLoweringObjectFileELF::SelectSectionForGlobal(
912 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
913 unsigned Flags
= getELFSectionFlags(Kind
);
915 // If we have -ffunction-section or -fdata-section then we should emit the
916 // global value to a uniqued section specifically for it.
917 bool EmitUniqueSection
= false;
918 if (!(Flags
& ELF::SHF_MERGE
) && !Kind
.isCommon()) {
920 EmitUniqueSection
= TM
.getFunctionSections();
922 EmitUniqueSection
= TM
.getDataSections();
924 EmitUniqueSection
|= GO
->hasComdat();
925 return selectELFSectionForGlobal(getContext(), GO
, Kind
, getMangler(), TM
,
926 Used
.count(GO
), EmitUniqueSection
, Flags
,
930 MCSection
*TargetLoweringObjectFileELF::getUniqueSectionForFunction(
931 const Function
&F
, const TargetMachine
&TM
) const {
932 SectionKind Kind
= SectionKind::getText();
933 unsigned Flags
= getELFSectionFlags(Kind
);
934 // If the function's section names is pre-determined via pragma or a
935 // section attribute, call selectExplicitSectionGlobal.
936 if (F
.hasSection() || F
.hasFnAttribute("implicit-section-name"))
937 return selectExplicitSectionGlobal(
938 &F
, Kind
, TM
, getContext(), getMangler(), NextUniqueID
,
939 Used
.count(&F
), /* ForceUnique = */true);
941 return selectELFSectionForGlobal(
942 getContext(), &F
, Kind
, getMangler(), TM
, Used
.count(&F
),
943 /*EmitUniqueSection=*/true, Flags
, &NextUniqueID
);
946 MCSection
*TargetLoweringObjectFileELF::getSectionForJumpTable(
947 const Function
&F
, const TargetMachine
&TM
) const {
948 // If the function can be removed, produce a unique section so that
949 // the table doesn't prevent the removal.
950 const Comdat
*C
= F
.getComdat();
951 bool EmitUniqueSection
= TM
.getFunctionSections() || C
;
952 if (!EmitUniqueSection
)
953 return ReadOnlySection
;
955 return selectELFSectionForGlobal(getContext(), &F
, SectionKind::getReadOnly(),
956 getMangler(), TM
, EmitUniqueSection
,
957 ELF::SHF_ALLOC
, &NextUniqueID
,
958 /* AssociatedSymbol */ nullptr);
961 MCSection
*TargetLoweringObjectFileELF::getSectionForLSDA(
962 const Function
&F
, const MCSymbol
&FnSym
, const TargetMachine
&TM
) const {
963 // If neither COMDAT nor function sections, use the monolithic LSDA section.
964 // Re-use this path if LSDASection is null as in the Arm EHABI.
965 if (!LSDASection
|| (!F
.hasComdat() && !TM
.getFunctionSections()))
968 const auto *LSDA
= cast
<MCSectionELF
>(LSDASection
);
969 unsigned Flags
= LSDA
->getFlags();
970 const MCSymbolELF
*LinkedToSym
= nullptr;
972 bool IsComdat
= false;
973 if (const Comdat
*C
= getELFComdat(&F
)) {
974 Flags
|= ELF::SHF_GROUP
;
975 Group
= C
->getName();
976 IsComdat
= C
->getSelectionKind() == Comdat::Any
;
978 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
979 // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
980 if (TM
.getFunctionSections() &&
981 (getContext().getAsmInfo()->useIntegratedAssembler() &&
982 getContext().getAsmInfo()->binutilsIsAtLeast(2, 36))) {
983 Flags
|= ELF::SHF_LINK_ORDER
;
984 LinkedToSym
= cast
<MCSymbolELF
>(&FnSym
);
987 // Append the function name as the suffix like GCC, assuming
988 // -funique-section-names applies to .gcc_except_table sections.
989 return getContext().getELFSection(
990 (TM
.getUniqueSectionNames() ? LSDA
->getName() + "." + F
.getName()
992 LSDA
->getType(), Flags
, 0, Group
, IsComdat
, MCSection::NonUniqueID
,
996 bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(
997 bool UsesLabelDifference
, const Function
&F
) const {
998 // We can always create relative relocations, so use another section
999 // that can be marked non-executable.
1003 /// Given a mergeable constant with the specified size and relocation
1004 /// information, return a section that it should be placed in.
1005 MCSection
*TargetLoweringObjectFileELF::getSectionForConstant(
1006 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1007 Align
&Alignment
) const {
1008 if (Kind
.isMergeableConst4() && MergeableConst4Section
)
1009 return MergeableConst4Section
;
1010 if (Kind
.isMergeableConst8() && MergeableConst8Section
)
1011 return MergeableConst8Section
;
1012 if (Kind
.isMergeableConst16() && MergeableConst16Section
)
1013 return MergeableConst16Section
;
1014 if (Kind
.isMergeableConst32() && MergeableConst32Section
)
1015 return MergeableConst32Section
;
1016 if (Kind
.isReadOnly())
1017 return ReadOnlySection
;
1019 assert(Kind
.isReadOnlyWithRel() && "Unknown section kind");
1020 return DataRelROSection
;
1023 /// Returns a unique section for the given machine basic block.
1024 MCSection
*TargetLoweringObjectFileELF::getSectionForMachineBasicBlock(
1025 const Function
&F
, const MachineBasicBlock
&MBB
,
1026 const TargetMachine
&TM
) const {
1027 assert(MBB
.isBeginSection() && "Basic block does not start a section!");
1028 unsigned UniqueID
= MCContext::GenericSectionID
;
1030 // For cold sections use the .text.split. prefix along with the parent
1031 // function name. All cold blocks for the same function go to the same
1032 // section. Similarly all exception blocks are grouped by symbol name
1033 // under the .text.eh prefix. For regular sections, we either use a unique
1034 // name, or a unique ID for the section.
1035 SmallString
<128> Name
;
1036 StringRef FunctionSectionName
= MBB
.getParent()->getSection()->getName();
1037 if (FunctionSectionName
.equals(".text") ||
1038 FunctionSectionName
.starts_with(".text.")) {
1039 // Function is in a regular .text section.
1040 StringRef FunctionName
= MBB
.getParent()->getName();
1041 if (MBB
.getSectionID() == MBBSectionID::ColdSectionID
) {
1042 Name
+= BBSectionsColdTextPrefix
;
1043 Name
+= FunctionName
;
1044 } else if (MBB
.getSectionID() == MBBSectionID::ExceptionSectionID
) {
1045 Name
+= ".text.eh.";
1046 Name
+= FunctionName
;
1048 Name
+= FunctionSectionName
;
1049 if (TM
.getUniqueBasicBlockSectionNames()) {
1050 if (!Name
.ends_with("."))
1052 Name
+= MBB
.getSymbol()->getName();
1054 UniqueID
= NextUniqueID
++;
1058 // If the original function has a custom non-dot-text section, then emit
1059 // all basic block sections into that section too, each with a unique id.
1060 Name
= FunctionSectionName
;
1061 UniqueID
= NextUniqueID
++;
1064 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_EXECINSTR
;
1065 std::string GroupName
;
1066 if (F
.hasComdat()) {
1067 Flags
|= ELF::SHF_GROUP
;
1068 GroupName
= F
.getComdat()->getName().str();
1070 return getContext().getELFSection(Name
, ELF::SHT_PROGBITS
, Flags
,
1071 0 /* Entry Size */, GroupName
,
1072 F
.hasComdat(), UniqueID
, nullptr);
1075 static MCSectionELF
*getStaticStructorSection(MCContext
&Ctx
, bool UseInitArray
,
1076 bool IsCtor
, unsigned Priority
,
1077 const MCSymbol
*KeySym
) {
1080 unsigned Flags
= ELF::SHF_ALLOC
| ELF::SHF_WRITE
;
1081 StringRef Comdat
= KeySym
? KeySym
->getName() : "";
1084 Flags
|= ELF::SHF_GROUP
;
1088 Type
= ELF::SHT_INIT_ARRAY
;
1089 Name
= ".init_array";
1091 Type
= ELF::SHT_FINI_ARRAY
;
1092 Name
= ".fini_array";
1094 if (Priority
!= 65535) {
1096 Name
+= utostr(Priority
);
1099 // The default scheme is .ctor / .dtor, so we have to invert the priority
1105 if (Priority
!= 65535)
1106 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
1107 Type
= ELF::SHT_PROGBITS
;
1110 return Ctx
.getELFSection(Name
, Type
, Flags
, 0, Comdat
, /*IsComdat=*/true);
1113 MCSection
*TargetLoweringObjectFileELF::getStaticCtorSection(
1114 unsigned Priority
, const MCSymbol
*KeySym
) const {
1115 return getStaticStructorSection(getContext(), UseInitArray
, true, Priority
,
1119 MCSection
*TargetLoweringObjectFileELF::getStaticDtorSection(
1120 unsigned Priority
, const MCSymbol
*KeySym
) const {
1121 return getStaticStructorSection(getContext(), UseInitArray
, false, Priority
,
1125 const MCExpr
*TargetLoweringObjectFileELF::lowerRelativeReference(
1126 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
1127 const TargetMachine
&TM
) const {
1128 // We may only use a PLT-relative relocation to refer to unnamed_addr
1130 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
1133 // Basic correctness checks.
1134 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
1135 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
1136 RHS
->isThreadLocal())
1139 return MCBinaryExpr::createSub(
1140 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), PLTRelativeVariantKind
,
1142 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
1145 const MCExpr
*TargetLoweringObjectFileELF::lowerDSOLocalEquivalent(
1146 const DSOLocalEquivalent
*Equiv
, const TargetMachine
&TM
) const {
1147 assert(supportDSOLocalEquivalentLowering());
1149 const auto *GV
= Equiv
->getGlobalValue();
1151 // A PLT entry is not needed for dso_local globals.
1152 if (GV
->isDSOLocal() || GV
->isImplicitDSOLocal())
1153 return MCSymbolRefExpr::create(TM
.getSymbol(GV
), getContext());
1155 return MCSymbolRefExpr::create(TM
.getSymbol(GV
), PLTRelativeVariantKind
,
1159 MCSection
*TargetLoweringObjectFileELF::getSectionForCommandLines() const {
1160 // Use ".GCC.command.line" since this feature is to support clang's
1161 // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
1163 return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS
,
1164 ELF::SHF_MERGE
| ELF::SHF_STRINGS
, 1);
1168 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_
) {
1169 UseInitArray
= UseInitArray_
;
1170 MCContext
&Ctx
= getContext();
1171 if (!UseInitArray
) {
1172 StaticCtorSection
= Ctx
.getELFSection(".ctors", ELF::SHT_PROGBITS
,
1173 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
1175 StaticDtorSection
= Ctx
.getELFSection(".dtors", ELF::SHT_PROGBITS
,
1176 ELF::SHF_ALLOC
| ELF::SHF_WRITE
);
1180 StaticCtorSection
= Ctx
.getELFSection(".init_array", ELF::SHT_INIT_ARRAY
,
1181 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1182 StaticDtorSection
= Ctx
.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY
,
1183 ELF::SHF_WRITE
| ELF::SHF_ALLOC
);
1186 //===----------------------------------------------------------------------===//
1188 //===----------------------------------------------------------------------===//
1190 TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO() {
1191 SupportIndirectSymViaGOTPCRel
= true;
1194 void TargetLoweringObjectFileMachO::Initialize(MCContext
&Ctx
,
1195 const TargetMachine
&TM
) {
1196 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
1197 if (TM
.getRelocationModel() == Reloc::Static
) {
1198 StaticCtorSection
= Ctx
.getMachOSection("__TEXT", "__constructor", 0,
1199 SectionKind::getData());
1200 StaticDtorSection
= Ctx
.getMachOSection("__TEXT", "__destructor", 0,
1201 SectionKind::getData());
1203 StaticCtorSection
= Ctx
.getMachOSection("__DATA", "__mod_init_func",
1204 MachO::S_MOD_INIT_FUNC_POINTERS
,
1205 SectionKind::getData());
1206 StaticDtorSection
= Ctx
.getMachOSection("__DATA", "__mod_term_func",
1207 MachO::S_MOD_TERM_FUNC_POINTERS
,
1208 SectionKind::getData());
1211 PersonalityEncoding
=
1212 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
1213 LSDAEncoding
= dwarf::DW_EH_PE_pcrel
;
1215 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_pcrel
| dwarf::DW_EH_PE_sdata4
;
1218 MCSection
*TargetLoweringObjectFileMachO::getStaticDtorSection(
1219 unsigned Priority
, const MCSymbol
*KeySym
) const {
1220 return StaticDtorSection
;
1221 // In userspace, we lower global destructors via atexit(), but kernel/kext
1222 // environments do not provide this function so we still need to support the
1224 // See the -disable-atexit-based-global-dtor-lowering CodeGen flag for more
1228 void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer
&Streamer
,
1230 // Emit the linker options if present.
1231 if (auto *LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
1232 for (const auto *Option
: LinkerOptions
->operands()) {
1233 SmallVector
<std::string
, 4> StrOptions
;
1234 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands())
1235 StrOptions
.push_back(std::string(cast
<MDString
>(Piece
)->getString()));
1236 Streamer
.emitLinkerOptions(StrOptions
);
1240 unsigned VersionVal
= 0;
1241 unsigned ImageInfoFlags
= 0;
1242 StringRef SectionVal
;
1244 GetObjCImageInfo(M
, VersionVal
, ImageInfoFlags
, SectionVal
);
1245 emitCGProfileMetadata(Streamer
, M
);
1247 // The section is mandatory. If we don't have it, then we don't have GC info.
1248 if (SectionVal
.empty())
1251 StringRef Segment
, Section
;
1252 unsigned TAA
= 0, StubSize
= 0;
1254 if (Error E
= MCSectionMachO::ParseSectionSpecifier(
1255 SectionVal
, Segment
, Section
, TAA
, TAAParsed
, StubSize
)) {
1256 // If invalid, report the error with report_fatal_error.
1257 report_fatal_error("Invalid section specifier '" + Section
+
1258 "': " + toString(std::move(E
)) + ".");
1262 MCSectionMachO
*S
= getContext().getMachOSection(
1263 Segment
, Section
, TAA
, StubSize
, SectionKind::getData());
1264 Streamer
.switchSection(S
);
1265 Streamer
.emitLabel(getContext().
1266 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
1267 Streamer
.emitInt32(VersionVal
);
1268 Streamer
.emitInt32(ImageInfoFlags
);
1269 Streamer
.addBlankLine();
1272 static void checkMachOComdat(const GlobalValue
*GV
) {
1273 const Comdat
*C
= GV
->getComdat();
1277 report_fatal_error("MachO doesn't support COMDATs, '" + C
->getName() +
1278 "' cannot be lowered.");
1281 MCSection
*TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
1282 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1284 StringRef SectionName
= GO
->getSection();
1286 const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(GO
);
1287 if (GV
&& GV
->hasImplicitSection()) {
1288 auto Attrs
= GV
->getAttributes();
1289 if (Attrs
.hasAttribute("bss-section") && Kind
.isBSS()) {
1290 SectionName
= Attrs
.getAttribute("bss-section").getValueAsString();
1291 } else if (Attrs
.hasAttribute("rodata-section") && Kind
.isReadOnly()) {
1292 SectionName
= Attrs
.getAttribute("rodata-section").getValueAsString();
1293 } else if (Attrs
.hasAttribute("relro-section") && Kind
.isReadOnlyWithRel()) {
1294 SectionName
= Attrs
.getAttribute("relro-section").getValueAsString();
1295 } else if (Attrs
.hasAttribute("data-section") && Kind
.isData()) {
1296 SectionName
= Attrs
.getAttribute("data-section").getValueAsString();
1300 const Function
*F
= dyn_cast
<Function
>(GO
);
1301 if (F
&& F
->hasFnAttribute("implicit-section-name")) {
1302 SectionName
= F
->getFnAttribute("implicit-section-name").getValueAsString();
1305 // Parse the section specifier and create it if valid.
1306 StringRef Segment
, Section
;
1307 unsigned TAA
= 0, StubSize
= 0;
1310 checkMachOComdat(GO
);
1312 if (Error E
= MCSectionMachO::ParseSectionSpecifier(
1313 SectionName
, Segment
, Section
, TAA
, TAAParsed
, StubSize
)) {
1314 // If invalid, report the error with report_fatal_error.
1315 report_fatal_error("Global variable '" + GO
->getName() +
1316 "' has an invalid section specifier '" +
1317 GO
->getSection() + "': " + toString(std::move(E
)) + ".");
1322 getContext().getMachOSection(Segment
, Section
, TAA
, StubSize
, Kind
);
1324 // If TAA wasn't set by ParseSectionSpecifier() above,
1325 // use the value returned by getMachOSection() as a default.
1327 TAA
= S
->getTypeAndAttributes();
1329 // Okay, now that we got the section, verify that the TAA & StubSize agree.
1330 // If the user declared multiple globals with different section flags, we need
1331 // to reject it here.
1332 if (S
->getTypeAndAttributes() != TAA
|| S
->getStubSize() != StubSize
) {
1333 // If invalid, report the error with report_fatal_error.
1334 report_fatal_error("Global variable '" + GO
->getName() +
1335 "' section type or attributes does not match previous"
1336 " section specifier");
1342 MCSection
*TargetLoweringObjectFileMachO::SelectSectionForGlobal(
1343 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1344 checkMachOComdat(GO
);
1346 // Handle thread local data.
1347 if (Kind
.isThreadBSS()) return TLSBSSSection
;
1348 if (Kind
.isThreadData()) return TLSDataSection
;
1351 return GO
->isWeakForLinker() ? TextCoalSection
: TextSection
;
1353 // If this is weak/linkonce, put this in a coalescable section, either in text
1354 // or data depending on if it is writable.
1355 if (GO
->isWeakForLinker()) {
1356 if (Kind
.isReadOnly())
1357 return ConstTextCoalSection
;
1358 if (Kind
.isReadOnlyWithRel())
1359 return ConstDataCoalSection
;
1360 return DataCoalSection
;
1363 // FIXME: Alignment check should be handled by section classifier.
1364 if (Kind
.isMergeable1ByteCString() &&
1365 GO
->getParent()->getDataLayout().getPreferredAlign(
1366 cast
<GlobalVariable
>(GO
)) < Align(32))
1367 return CStringSection
;
1369 // Do not put 16-bit arrays in the UString section if they have an
1370 // externally visible label, this runs into issues with certain linker
1372 if (Kind
.isMergeable2ByteCString() && !GO
->hasExternalLinkage() &&
1373 GO
->getParent()->getDataLayout().getPreferredAlign(
1374 cast
<GlobalVariable
>(GO
)) < Align(32))
1375 return UStringSection
;
1377 // With MachO only variables whose corresponding symbol starts with 'l' or
1378 // 'L' can be merged, so we only try merging GVs with private linkage.
1379 if (GO
->hasPrivateLinkage() && Kind
.isMergeableConst()) {
1380 if (Kind
.isMergeableConst4())
1381 return FourByteConstantSection
;
1382 if (Kind
.isMergeableConst8())
1383 return EightByteConstantSection
;
1384 if (Kind
.isMergeableConst16())
1385 return SixteenByteConstantSection
;
1388 // Otherwise, if it is readonly, but not something we can specially optimize,
1389 // just drop it in .const.
1390 if (Kind
.isReadOnly())
1391 return ReadOnlySection
;
1393 // If this is marked const, put it into a const section. But if the dynamic
1394 // linker needs to write to it, put it in the data segment.
1395 if (Kind
.isReadOnlyWithRel())
1396 return ConstDataSection
;
1398 // Put zero initialized globals with strong external linkage in the
1399 // DATA, __common section with the .zerofill directive.
1400 if (Kind
.isBSSExtern())
1401 return DataCommonSection
;
1403 // Put zero initialized globals with local linkage in __DATA,__bss directive
1404 // with the .zerofill directive (aka .lcomm).
1405 if (Kind
.isBSSLocal())
1406 return DataBSSSection
;
1408 // Otherwise, just drop the variable in the normal data section.
1412 MCSection
*TargetLoweringObjectFileMachO::getSectionForConstant(
1413 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
1414 Align
&Alignment
) const {
1415 // If this constant requires a relocation, we have to put it in the data
1416 // segment, not in the text segment.
1417 if (Kind
.isData() || Kind
.isReadOnlyWithRel())
1418 return ConstDataSection
;
1420 if (Kind
.isMergeableConst4())
1421 return FourByteConstantSection
;
1422 if (Kind
.isMergeableConst8())
1423 return EightByteConstantSection
;
1424 if (Kind
.isMergeableConst16())
1425 return SixteenByteConstantSection
;
1426 return ReadOnlySection
; // .const
1429 MCSection
*TargetLoweringObjectFileMachO::getSectionForCommandLines() const {
1430 return getContext().getMachOSection("__TEXT", "__command_line", 0,
1431 SectionKind::getReadOnly());
1434 const MCExpr
*TargetLoweringObjectFileMachO::getTTypeGlobalReference(
1435 const GlobalValue
*GV
, unsigned Encoding
, const TargetMachine
&TM
,
1436 MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1437 // The mach-o version of this method defaults to returning a stub reference.
1439 if (Encoding
& DW_EH_PE_indirect
) {
1440 MachineModuleInfoMachO
&MachOMMI
=
1441 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1443 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1445 // Add information about the stub reference to MachOMMI so that the stub
1446 // gets emitted by the asmprinter.
1447 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1448 if (!StubSym
.getPointer()) {
1449 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1450 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1453 return TargetLoweringObjectFile::
1454 getTTypeReference(MCSymbolRefExpr::create(SSym
, getContext()),
1455 Encoding
& ~DW_EH_PE_indirect
, Streamer
);
1458 return TargetLoweringObjectFile::getTTypeGlobalReference(GV
, Encoding
, TM
,
1462 MCSymbol
*TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
1463 const GlobalValue
*GV
, const TargetMachine
&TM
,
1464 MachineModuleInfo
*MMI
) const {
1465 // The mach-o version of this method defaults to returning a stub reference.
1466 MachineModuleInfoMachO
&MachOMMI
=
1467 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1469 MCSymbol
*SSym
= getSymbolWithGlobalValueBase(GV
, "$non_lazy_ptr", TM
);
1471 // Add information about the stub reference to MachOMMI so that the stub
1472 // gets emitted by the asmprinter.
1473 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(SSym
);
1474 if (!StubSym
.getPointer()) {
1475 MCSymbol
*Sym
= TM
.getSymbol(GV
);
1476 StubSym
= MachineModuleInfoImpl::StubValueTy(Sym
, !GV
->hasLocalLinkage());
1482 const MCExpr
*TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
1483 const GlobalValue
*GV
, const MCSymbol
*Sym
, const MCValue
&MV
,
1484 int64_t Offset
, MachineModuleInfo
*MMI
, MCStreamer
&Streamer
) const {
1485 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1486 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1487 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1488 // computation of deltas to final external symbols. Example:
1494 // .long _extgotequiv-_delta
1496 // is transformed to:
1499 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1501 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1502 // L_extfoo$non_lazy_ptr:
1503 // .indirect_symbol _extfoo
1506 // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1507 // may point to both local (same translation unit) and global (other
1508 // translation units) symbols. Example:
1510 // .section __DATA,__pointers,non_lazy_symbol_pointers
1512 // .indirect_symbol _myGlobal
1515 // .indirect_symbol _myLocal
1518 // If the symbol is local, instead of the symbol's index, the assembler
1519 // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1520 // Then the linker will notice the constant in the table and will look at the
1521 // content of the symbol.
1522 MachineModuleInfoMachO
&MachOMMI
=
1523 MMI
->getObjFileInfo
<MachineModuleInfoMachO
>();
1524 MCContext
&Ctx
= getContext();
1526 // The offset must consider the original displacement from the base symbol
1527 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1528 Offset
= -MV
.getConstant();
1529 const MCSymbol
*BaseSym
= &MV
.getSymB()->getSymbol();
1531 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1532 // non_lazy_ptr stubs.
1533 SmallString
<128> Name
;
1534 StringRef Suffix
= "$non_lazy_ptr";
1535 Name
+= MMI
->getModule()->getDataLayout().getPrivateGlobalPrefix();
1536 Name
+= Sym
->getName();
1538 MCSymbol
*Stub
= Ctx
.getOrCreateSymbol(Name
);
1540 MachineModuleInfoImpl::StubValueTy
&StubSym
= MachOMMI
.getGVStubEntry(Stub
);
1542 if (!StubSym
.getPointer())
1543 StubSym
= MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol
*>(Sym
),
1544 !GV
->hasLocalLinkage());
1546 const MCExpr
*BSymExpr
=
1547 MCSymbolRefExpr::create(BaseSym
, MCSymbolRefExpr::VK_None
, Ctx
);
1549 MCSymbolRefExpr::create(Stub
, MCSymbolRefExpr::VK_None
, Ctx
);
1552 return MCBinaryExpr::createSub(LHS
, BSymExpr
, Ctx
);
1555 MCBinaryExpr::createAdd(BSymExpr
, MCConstantExpr::create(Offset
, Ctx
), Ctx
);
1556 return MCBinaryExpr::createSub(LHS
, RHS
, Ctx
);
1559 static bool canUsePrivateLabel(const MCAsmInfo
&AsmInfo
,
1560 const MCSection
&Section
) {
1561 if (!AsmInfo
.isSectionAtomizableBySymbols(Section
))
1564 // FIXME: we should be able to use private labels for sections that can't be
1565 // dead-stripped (there's no issue with blocking atomization there), but `ld
1566 // -r` sometimes drops the no_dead_strip attribute from sections so for safety
1567 // we don't allow it.
1571 void TargetLoweringObjectFileMachO::getNameWithPrefix(
1572 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1573 const TargetMachine
&TM
) const {
1574 bool CannotUsePrivateLabel
= true;
1575 if (auto *GO
= GV
->getAliaseeObject()) {
1576 SectionKind GOKind
= TargetLoweringObjectFile::getKindForGlobal(GO
, TM
);
1577 const MCSection
*TheSection
= SectionForGlobal(GO
, GOKind
, TM
);
1578 CannotUsePrivateLabel
=
1579 !canUsePrivateLabel(*TM
.getMCAsmInfo(), *TheSection
);
1581 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1584 //===----------------------------------------------------------------------===//
1586 //===----------------------------------------------------------------------===//
1589 getCOFFSectionFlags(SectionKind K
, const TargetMachine
&TM
) {
1591 bool isThumb
= TM
.getTargetTriple().getArch() == Triple::thumb
;
1595 COFF::IMAGE_SCN_MEM_DISCARDABLE
;
1596 else if (K
.isExclude())
1598 COFF::IMAGE_SCN_LNK_REMOVE
| COFF::IMAGE_SCN_MEM_DISCARDABLE
;
1599 else if (K
.isText())
1601 COFF::IMAGE_SCN_MEM_EXECUTE
|
1602 COFF::IMAGE_SCN_MEM_READ
|
1603 COFF::IMAGE_SCN_CNT_CODE
|
1604 (isThumb
? COFF::IMAGE_SCN_MEM_16BIT
: (COFF::SectionCharacteristics
)0);
1607 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA
|
1608 COFF::IMAGE_SCN_MEM_READ
|
1609 COFF::IMAGE_SCN_MEM_WRITE
;
1610 else if (K
.isThreadLocal())
1612 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1613 COFF::IMAGE_SCN_MEM_READ
|
1614 COFF::IMAGE_SCN_MEM_WRITE
;
1615 else if (K
.isReadOnly() || K
.isReadOnlyWithRel())
1617 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1618 COFF::IMAGE_SCN_MEM_READ
;
1619 else if (K
.isWriteable())
1621 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1622 COFF::IMAGE_SCN_MEM_READ
|
1623 COFF::IMAGE_SCN_MEM_WRITE
;
1628 static const GlobalValue
*getComdatGVForCOFF(const GlobalValue
*GV
) {
1629 const Comdat
*C
= GV
->getComdat();
1630 assert(C
&& "expected GV to have a Comdat!");
1632 StringRef ComdatGVName
= C
->getName();
1633 const GlobalValue
*ComdatGV
= GV
->getParent()->getNamedValue(ComdatGVName
);
1635 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1636 "' does not exist.");
1638 if (ComdatGV
->getComdat() != C
)
1639 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName
+
1640 "' is not a key for its COMDAT.");
1645 static int getSelectionForCOFF(const GlobalValue
*GV
) {
1646 if (const Comdat
*C
= GV
->getComdat()) {
1647 const GlobalValue
*ComdatKey
= getComdatGVForCOFF(GV
);
1648 if (const auto *GA
= dyn_cast
<GlobalAlias
>(ComdatKey
))
1649 ComdatKey
= GA
->getAliaseeObject();
1650 if (ComdatKey
== GV
) {
1651 switch (C
->getSelectionKind()) {
1653 return COFF::IMAGE_COMDAT_SELECT_ANY
;
1654 case Comdat::ExactMatch
:
1655 return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH
;
1656 case Comdat::Largest
:
1657 return COFF::IMAGE_COMDAT_SELECT_LARGEST
;
1658 case Comdat::NoDeduplicate
:
1659 return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1660 case Comdat::SameSize
:
1661 return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE
;
1664 return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
;
1670 MCSection
*TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
1671 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1672 StringRef Name
= GO
->getSection();
1673 if (Name
== getInstrProfSectionName(IPSK_covmap
, Triple::COFF
,
1674 /*AddSegmentInfo=*/false) ||
1675 Name
== getInstrProfSectionName(IPSK_covfun
, Triple::COFF
,
1676 /*AddSegmentInfo=*/false) ||
1677 Name
== getInstrProfSectionName(IPSK_covdata
, Triple::COFF
,
1678 /*AddSegmentInfo=*/false) ||
1679 Name
== getInstrProfSectionName(IPSK_covname
, Triple::COFF
,
1680 /*AddSegmentInfo=*/false))
1681 Kind
= SectionKind::getMetadata();
1683 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1684 StringRef COMDATSymName
= "";
1685 if (GO
->hasComdat()) {
1686 Selection
= getSelectionForCOFF(GO
);
1687 const GlobalValue
*ComdatGV
;
1688 if (Selection
== COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
)
1689 ComdatGV
= getComdatGVForCOFF(GO
);
1693 if (!ComdatGV
->hasPrivateLinkage()) {
1694 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1695 COMDATSymName
= Sym
->getName();
1696 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1702 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, COMDATSymName
,
1706 static StringRef
getCOFFSectionNameForUniqueGlobal(SectionKind Kind
) {
1711 if (Kind
.isThreadLocal())
1713 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1718 MCSection
*TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
1719 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
1720 // If we have -ffunction-sections then we should emit the global value to a
1721 // uniqued section specifically for it.
1722 bool EmitUniquedSection
;
1724 EmitUniquedSection
= TM
.getFunctionSections();
1726 EmitUniquedSection
= TM
.getDataSections();
1728 if ((EmitUniquedSection
&& !Kind
.isCommon()) || GO
->hasComdat()) {
1729 SmallString
<256> Name
= getCOFFSectionNameForUniqueGlobal(Kind
);
1731 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1733 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1734 int Selection
= getSelectionForCOFF(GO
);
1736 Selection
= COFF::IMAGE_COMDAT_SELECT_NODUPLICATES
;
1737 const GlobalValue
*ComdatGV
;
1738 if (GO
->hasComdat())
1739 ComdatGV
= getComdatGVForCOFF(GO
);
1743 unsigned UniqueID
= MCContext::GenericSectionID
;
1744 if (EmitUniquedSection
)
1745 UniqueID
= NextUniqueID
++;
1747 if (!ComdatGV
->hasPrivateLinkage()) {
1748 MCSymbol
*Sym
= TM
.getSymbol(ComdatGV
);
1749 StringRef COMDATSymName
= Sym
->getName();
1751 if (const auto *F
= dyn_cast
<Function
>(GO
))
1752 if (std::optional
<StringRef
> Prefix
= F
->getSectionPrefix())
1753 raw_svector_ostream(Name
) << '$' << *Prefix
;
1755 // Append "$symbol" to the section name *before* IR-level mangling is
1756 // applied when targetting mingw. This is what GCC does, and the ld.bfd
1757 // COFF linker will not properly handle comdats otherwise.
1758 if (getContext().getTargetTriple().isWindowsGNUEnvironment())
1759 raw_svector_ostream(Name
) << '$' << ComdatGV
->getName();
1761 return getContext().getCOFFSection(Name
, Characteristics
, Kind
,
1762 COMDATSymName
, Selection
, UniqueID
);
1764 SmallString
<256> TmpData
;
1765 getMangler().getNameWithPrefix(TmpData
, GO
, /*CannotUsePrivateLabel=*/true);
1766 return getContext().getCOFFSection(Name
, Characteristics
, Kind
, TmpData
,
1767 Selection
, UniqueID
);
1774 if (Kind
.isThreadLocal())
1775 return TLSDataSection
;
1777 if (Kind
.isReadOnly() || Kind
.isReadOnlyWithRel())
1778 return ReadOnlySection
;
1780 // Note: we claim that common symbols are put in BSSSection, but they are
1781 // really emitted with the magic .comm directive, which creates a symbol table
1782 // entry but not a section.
1783 if (Kind
.isBSS() || Kind
.isCommon())
1789 void TargetLoweringObjectFileCOFF::getNameWithPrefix(
1790 SmallVectorImpl
<char> &OutName
, const GlobalValue
*GV
,
1791 const TargetMachine
&TM
) const {
1792 bool CannotUsePrivateLabel
= false;
1793 if (GV
->hasPrivateLinkage() &&
1794 ((isa
<Function
>(GV
) && TM
.getFunctionSections()) ||
1795 (isa
<GlobalVariable
>(GV
) && TM
.getDataSections())))
1796 CannotUsePrivateLabel
= true;
1798 getMangler().getNameWithPrefix(OutName
, GV
, CannotUsePrivateLabel
);
1801 MCSection
*TargetLoweringObjectFileCOFF::getSectionForJumpTable(
1802 const Function
&F
, const TargetMachine
&TM
) const {
1803 // If the function can be removed, produce a unique section so that
1804 // the table doesn't prevent the removal.
1805 const Comdat
*C
= F
.getComdat();
1806 bool EmitUniqueSection
= TM
.getFunctionSections() || C
;
1807 if (!EmitUniqueSection
)
1808 return ReadOnlySection
;
1810 // FIXME: we should produce a symbol for F instead.
1811 if (F
.hasPrivateLinkage())
1812 return ReadOnlySection
;
1814 MCSymbol
*Sym
= TM
.getSymbol(&F
);
1815 StringRef COMDATSymName
= Sym
->getName();
1817 SectionKind Kind
= SectionKind::getReadOnly();
1818 StringRef SecName
= getCOFFSectionNameForUniqueGlobal(Kind
);
1819 unsigned Characteristics
= getCOFFSectionFlags(Kind
, TM
);
1820 Characteristics
|= COFF::IMAGE_SCN_LNK_COMDAT
;
1821 unsigned UniqueID
= NextUniqueID
++;
1823 return getContext().getCOFFSection(
1824 SecName
, Characteristics
, Kind
, COMDATSymName
,
1825 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE
, UniqueID
);
1828 bool TargetLoweringObjectFileCOFF::shouldPutJumpTableInFunctionSection(
1829 bool UsesLabelDifference
, const Function
&F
) const {
1830 if (TM
->getTargetTriple().getArch() == Triple::x86_64
) {
1831 if (!JumpTableInFunctionSection
) {
1832 // We can always create relative relocations, so use another section
1833 // that can be marked non-executable.
1837 return TargetLoweringObjectFile::shouldPutJumpTableInFunctionSection(
1838 UsesLabelDifference
, F
);
1841 void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer
&Streamer
,
1843 emitLinkerDirectives(Streamer
, M
);
1845 unsigned Version
= 0;
1849 GetObjCImageInfo(M
, Version
, Flags
, Section
);
1850 if (!Section
.empty()) {
1851 auto &C
= getContext();
1852 auto *S
= C
.getCOFFSection(Section
,
1853 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1854 COFF::IMAGE_SCN_MEM_READ
,
1855 SectionKind::getReadOnly());
1856 Streamer
.switchSection(S
);
1857 Streamer
.emitLabel(C
.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1858 Streamer
.emitInt32(Version
);
1859 Streamer
.emitInt32(Flags
);
1860 Streamer
.addBlankLine();
1863 emitCGProfileMetadata(Streamer
, M
);
1866 void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
1867 MCStreamer
&Streamer
, Module
&M
) const {
1868 if (NamedMDNode
*LinkerOptions
= M
.getNamedMetadata("llvm.linker.options")) {
1869 // Emit the linker options to the linker .drectve section. According to the
1870 // spec, this section is a space-separated string containing flags for
1872 MCSection
*Sec
= getDrectveSection();
1873 Streamer
.switchSection(Sec
);
1874 for (const auto *Option
: LinkerOptions
->operands()) {
1875 for (const auto &Piece
: cast
<MDNode
>(Option
)->operands()) {
1876 // Lead with a space for consistency with our dllexport implementation.
1877 std::string
Directive(" ");
1878 Directive
.append(std::string(cast
<MDString
>(Piece
)->getString()));
1879 Streamer
.emitBytes(Directive
);
1884 // Emit /EXPORT: flags for each exported global as necessary.
1886 for (const GlobalValue
&GV
: M
.global_values()) {
1887 raw_string_ostream
OS(Flags
);
1888 emitLinkerFlagsForGlobalCOFF(OS
, &GV
, getContext().getTargetTriple(),
1891 if (!Flags
.empty()) {
1892 Streamer
.switchSection(getDrectveSection());
1893 Streamer
.emitBytes(Flags
);
1898 // Emit /INCLUDE: flags for each used global as necessary.
1899 if (const auto *LU
= M
.getNamedGlobal("llvm.used")) {
1900 assert(LU
->hasInitializer() && "expected llvm.used to have an initializer");
1901 assert(isa
<ArrayType
>(LU
->getValueType()) &&
1902 "expected llvm.used to be an array type");
1903 if (const auto *A
= cast
<ConstantArray
>(LU
->getInitializer())) {
1904 for (const Value
*Op
: A
->operands()) {
1905 const auto *GV
= cast
<GlobalValue
>(Op
->stripPointerCasts());
1906 // Global symbols with internal or private linkage are not visible to
1907 // the linker, and thus would cause an error when the linker tried to
1908 // preserve the symbol due to the `/include:` directive.
1909 if (GV
->hasLocalLinkage())
1912 raw_string_ostream
OS(Flags
);
1913 emitLinkerFlagsForUsedCOFF(OS
, GV
, getContext().getTargetTriple(),
1917 if (!Flags
.empty()) {
1918 Streamer
.switchSection(getDrectveSection());
1919 Streamer
.emitBytes(Flags
);
1927 void TargetLoweringObjectFileCOFF::Initialize(MCContext
&Ctx
,
1928 const TargetMachine
&TM
) {
1929 TargetLoweringObjectFile::Initialize(Ctx
, TM
);
1931 const Triple
&T
= TM
.getTargetTriple();
1932 if (T
.isWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1934 Ctx
.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1935 COFF::IMAGE_SCN_MEM_READ
,
1936 SectionKind::getReadOnly());
1938 Ctx
.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1939 COFF::IMAGE_SCN_MEM_READ
,
1940 SectionKind::getReadOnly());
1942 StaticCtorSection
= Ctx
.getCOFFSection(
1943 ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1944 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1945 SectionKind::getData());
1946 StaticDtorSection
= Ctx
.getCOFFSection(
1947 ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1948 COFF::IMAGE_SCN_MEM_READ
| COFF::IMAGE_SCN_MEM_WRITE
,
1949 SectionKind::getData());
1953 static MCSectionCOFF
*getCOFFStaticStructorSection(MCContext
&Ctx
,
1954 const Triple
&T
, bool IsCtor
,
1956 const MCSymbol
*KeySym
,
1957 MCSectionCOFF
*Default
) {
1958 if (T
.isWindowsMSVCEnvironment() || T
.isWindowsItaniumEnvironment()) {
1959 // If the priority is the default, use .CRT$XCU, possibly associative.
1960 if (Priority
== 65535)
1961 return Ctx
.getAssociativeCOFFSection(Default
, KeySym
, 0);
1963 // Otherwise, we need to compute a new section name. Low priorities should
1964 // run earlier. The linker will sort sections ASCII-betically, and we need a
1965 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
1966 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
1967 // low priorities need to sort before 'L', since the CRT uses that
1968 // internally, so we use ".CRT$XCA00001" for them. We have a contract with
1969 // the frontend that "init_seg(compiler)" corresponds to priority 200 and
1970 // "init_seg(lib)" corresponds to priority 400, and those respectively use
1971 // 'C' and 'L' without the priority suffix. Priorities between 200 and 400
1972 // use 'C' with the priority as a suffix.
1973 SmallString
<24> Name
;
1974 char LastLetter
= 'T';
1975 bool AddPrioritySuffix
= Priority
!= 200 && Priority
!= 400;
1978 else if (Priority
< 400)
1980 else if (Priority
== 400)
1982 raw_svector_ostream
OS(Name
);
1983 OS
<< ".CRT$X" << (IsCtor
? "C" : "T") << LastLetter
;
1984 if (AddPrioritySuffix
)
1985 OS
<< format("%05u", Priority
);
1986 MCSectionCOFF
*Sec
= Ctx
.getCOFFSection(
1987 Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
| COFF::IMAGE_SCN_MEM_READ
,
1988 SectionKind::getReadOnly());
1989 return Ctx
.getAssociativeCOFFSection(Sec
, KeySym
, 0);
1992 std::string Name
= IsCtor
? ".ctors" : ".dtors";
1993 if (Priority
!= 65535)
1994 raw_string_ostream(Name
) << format(".%05u", 65535 - Priority
);
1996 return Ctx
.getAssociativeCOFFSection(
1997 Ctx
.getCOFFSection(Name
, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
1998 COFF::IMAGE_SCN_MEM_READ
|
1999 COFF::IMAGE_SCN_MEM_WRITE
,
2000 SectionKind::getData()),
2004 MCSection
*TargetLoweringObjectFileCOFF::getStaticCtorSection(
2005 unsigned Priority
, const MCSymbol
*KeySym
) const {
2006 return getCOFFStaticStructorSection(
2007 getContext(), getContext().getTargetTriple(), true, Priority
, KeySym
,
2008 cast
<MCSectionCOFF
>(StaticCtorSection
));
2011 MCSection
*TargetLoweringObjectFileCOFF::getStaticDtorSection(
2012 unsigned Priority
, const MCSymbol
*KeySym
) const {
2013 return getCOFFStaticStructorSection(
2014 getContext(), getContext().getTargetTriple(), false, Priority
, KeySym
,
2015 cast
<MCSectionCOFF
>(StaticDtorSection
));
2018 const MCExpr
*TargetLoweringObjectFileCOFF::lowerRelativeReference(
2019 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2020 const TargetMachine
&TM
) const {
2021 const Triple
&T
= TM
.getTargetTriple();
2022 if (T
.isOSCygMing())
2025 // Our symbols should exist in address space zero, cowardly no-op if
2027 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
2028 RHS
->getType()->getPointerAddressSpace() != 0)
2031 // Both ptrtoint instructions must wrap global objects:
2032 // - Only global variables are eligible for image relative relocations.
2033 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
2034 // We expect __ImageBase to be a global variable without a section, externally
2037 // It should look something like this: @__ImageBase = external constant i8
2038 if (!isa
<GlobalObject
>(LHS
) || !isa
<GlobalVariable
>(RHS
) ||
2039 LHS
->isThreadLocal() || RHS
->isThreadLocal() ||
2040 RHS
->getName() != "__ImageBase" || !RHS
->hasExternalLinkage() ||
2041 cast
<GlobalVariable
>(RHS
)->hasInitializer() || RHS
->hasSection())
2044 return MCSymbolRefExpr::create(TM
.getSymbol(LHS
),
2045 MCSymbolRefExpr::VK_COFF_IMGREL32
,
2049 static std::string
APIntToHexString(const APInt
&AI
) {
2050 unsigned Width
= (AI
.getBitWidth() / 8) * 2;
2051 std::string HexString
= toString(AI
, 16, /*Signed=*/false);
2052 llvm::transform(HexString
, HexString
.begin(), tolower
);
2053 unsigned Size
= HexString
.size();
2054 assert(Width
>= Size
&& "hex string is too large!");
2055 HexString
.insert(HexString
.begin(), Width
- Size
, '0');
2060 static std::string
scalarConstantToHexString(const Constant
*C
) {
2061 Type
*Ty
= C
->getType();
2062 if (isa
<UndefValue
>(C
)) {
2063 return APIntToHexString(APInt::getZero(Ty
->getPrimitiveSizeInBits()));
2064 } else if (const auto *CFP
= dyn_cast
<ConstantFP
>(C
)) {
2065 return APIntToHexString(CFP
->getValueAPF().bitcastToAPInt());
2066 } else if (const auto *CI
= dyn_cast
<ConstantInt
>(C
)) {
2067 return APIntToHexString(CI
->getValue());
2069 unsigned NumElements
;
2070 if (auto *VTy
= dyn_cast
<VectorType
>(Ty
))
2071 NumElements
= cast
<FixedVectorType
>(VTy
)->getNumElements();
2073 NumElements
= Ty
->getArrayNumElements();
2074 std::string HexString
;
2075 for (int I
= NumElements
- 1, E
= -1; I
!= E
; --I
)
2076 HexString
+= scalarConstantToHexString(C
->getAggregateElement(I
));
2081 MCSection
*TargetLoweringObjectFileCOFF::getSectionForConstant(
2082 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
2083 Align
&Alignment
) const {
2084 if (Kind
.isMergeableConst() && C
&&
2085 getContext().getAsmInfo()->hasCOFFComdatConstants()) {
2086 // This creates comdat sections with the given symbol name, but unless
2087 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
2088 // will be created with a null storage class, which makes GNU binutils
2090 const unsigned Characteristics
= COFF::IMAGE_SCN_CNT_INITIALIZED_DATA
|
2091 COFF::IMAGE_SCN_MEM_READ
|
2092 COFF::IMAGE_SCN_LNK_COMDAT
;
2093 std::string COMDATSymName
;
2094 if (Kind
.isMergeableConst4()) {
2095 if (Alignment
<= 4) {
2096 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
2097 Alignment
= Align(4);
2099 } else if (Kind
.isMergeableConst8()) {
2100 if (Alignment
<= 8) {
2101 COMDATSymName
= "__real@" + scalarConstantToHexString(C
);
2102 Alignment
= Align(8);
2104 } else if (Kind
.isMergeableConst16()) {
2105 // FIXME: These may not be appropriate for non-x86 architectures.
2106 if (Alignment
<= 16) {
2107 COMDATSymName
= "__xmm@" + scalarConstantToHexString(C
);
2108 Alignment
= Align(16);
2110 } else if (Kind
.isMergeableConst32()) {
2111 if (Alignment
<= 32) {
2112 COMDATSymName
= "__ymm@" + scalarConstantToHexString(C
);
2113 Alignment
= Align(32);
2117 if (!COMDATSymName
.empty())
2118 return getContext().getCOFFSection(".rdata", Characteristics
, Kind
,
2120 COFF::IMAGE_COMDAT_SELECT_ANY
);
2123 return TargetLoweringObjectFile::getSectionForConstant(DL
, Kind
, C
,
2127 //===----------------------------------------------------------------------===//
2129 //===----------------------------------------------------------------------===//
2131 static const Comdat
*getWasmComdat(const GlobalValue
*GV
) {
2132 const Comdat
*C
= GV
->getComdat();
2136 if (C
->getSelectionKind() != Comdat::Any
)
2137 report_fatal_error("WebAssembly COMDATs only support "
2138 "SelectionKind::Any, '" + C
->getName() + "' cannot be "
2144 static unsigned getWasmSectionFlags(SectionKind K
) {
2147 if (K
.isThreadLocal())
2148 Flags
|= wasm::WASM_SEG_FLAG_TLS
;
2150 if (K
.isMergeableCString())
2151 Flags
|= wasm::WASM_SEG_FLAG_STRINGS
;
2153 // TODO(sbc): Add suport for K.isMergeableConst()
2158 MCSection
*TargetLoweringObjectFileWasm::getExplicitSectionGlobal(
2159 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2160 // We don't support explict section names for functions in the wasm object
2161 // format. Each function has to be in its own unique section.
2162 if (isa
<Function
>(GO
)) {
2163 return SelectSectionForGlobal(GO
, Kind
, TM
);
2166 StringRef Name
= GO
->getSection();
2168 // Certain data sections we treat as named custom sections rather than
2169 // segments within the data section.
2170 // This could be avoided if all data segements (the wasm sense) were
2171 // represented as their own sections (in the llvm sense).
2172 // TODO(sbc): https://github.com/WebAssembly/tool-conventions/issues/138
2173 if (Name
== ".llvmcmd" || Name
== ".llvmbc")
2174 Kind
= SectionKind::getMetadata();
2176 StringRef Group
= "";
2177 if (const Comdat
*C
= getWasmComdat(GO
)) {
2178 Group
= C
->getName();
2181 unsigned Flags
= getWasmSectionFlags(Kind
);
2182 MCSectionWasm
*Section
= getContext().getWasmSection(
2183 Name
, Kind
, Flags
, Group
, MCContext::GenericSectionID
);
2188 static MCSectionWasm
*selectWasmSectionForGlobal(
2189 MCContext
&Ctx
, const GlobalObject
*GO
, SectionKind Kind
, Mangler
&Mang
,
2190 const TargetMachine
&TM
, bool EmitUniqueSection
, unsigned *NextUniqueID
) {
2191 StringRef Group
= "";
2192 if (const Comdat
*C
= getWasmComdat(GO
)) {
2193 Group
= C
->getName();
2196 bool UniqueSectionNames
= TM
.getUniqueSectionNames();
2197 SmallString
<128> Name
= getSectionPrefixForGlobal(Kind
, /*IsLarge=*/false);
2199 if (const auto *F
= dyn_cast
<Function
>(GO
)) {
2200 const auto &OptionalPrefix
= F
->getSectionPrefix();
2202 raw_svector_ostream(Name
) << '.' << *OptionalPrefix
;
2205 if (EmitUniqueSection
&& UniqueSectionNames
) {
2206 Name
.push_back('.');
2207 TM
.getNameWithPrefix(Name
, GO
, Mang
, true);
2209 unsigned UniqueID
= MCContext::GenericSectionID
;
2210 if (EmitUniqueSection
&& !UniqueSectionNames
) {
2211 UniqueID
= *NextUniqueID
;
2215 unsigned Flags
= getWasmSectionFlags(Kind
);
2216 return Ctx
.getWasmSection(Name
, Kind
, Flags
, Group
, UniqueID
);
2219 MCSection
*TargetLoweringObjectFileWasm::SelectSectionForGlobal(
2220 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2222 if (Kind
.isCommon())
2223 report_fatal_error("mergable sections not supported yet on wasm");
2225 // If we have -ffunction-section or -fdata-section then we should emit the
2226 // global value to a uniqued section specifically for it.
2227 bool EmitUniqueSection
= false;
2229 EmitUniqueSection
= TM
.getFunctionSections();
2231 EmitUniqueSection
= TM
.getDataSections();
2232 EmitUniqueSection
|= GO
->hasComdat();
2234 return selectWasmSectionForGlobal(getContext(), GO
, Kind
, getMangler(), TM
,
2235 EmitUniqueSection
, &NextUniqueID
);
2238 bool TargetLoweringObjectFileWasm::shouldPutJumpTableInFunctionSection(
2239 bool UsesLabelDifference
, const Function
&F
) const {
2240 // We can always create relative relocations, so use another section
2241 // that can be marked non-executable.
2245 const MCExpr
*TargetLoweringObjectFileWasm::lowerRelativeReference(
2246 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2247 const TargetMachine
&TM
) const {
2248 // We may only use a PLT-relative relocation to refer to unnamed_addr
2250 if (!LHS
->hasGlobalUnnamedAddr() || !LHS
->getValueType()->isFunctionTy())
2253 // Basic correctness checks.
2254 if (LHS
->getType()->getPointerAddressSpace() != 0 ||
2255 RHS
->getType()->getPointerAddressSpace() != 0 || LHS
->isThreadLocal() ||
2256 RHS
->isThreadLocal())
2259 return MCBinaryExpr::createSub(
2260 MCSymbolRefExpr::create(TM
.getSymbol(LHS
), MCSymbolRefExpr::VK_None
,
2262 MCSymbolRefExpr::create(TM
.getSymbol(RHS
), getContext()), getContext());
2265 void TargetLoweringObjectFileWasm::InitializeWasm() {
2267 getContext().getWasmSection(".init_array", SectionKind::getData());
2269 // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
2270 // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
2271 TTypeEncoding
= dwarf::DW_EH_PE_absptr
;
2274 MCSection
*TargetLoweringObjectFileWasm::getStaticCtorSection(
2275 unsigned Priority
, const MCSymbol
*KeySym
) const {
2276 return Priority
== UINT16_MAX
?
2278 getContext().getWasmSection(".init_array." + utostr(Priority
),
2279 SectionKind::getData());
2282 MCSection
*TargetLoweringObjectFileWasm::getStaticDtorSection(
2283 unsigned Priority
, const MCSymbol
*KeySym
) const {
2284 report_fatal_error("@llvm.global_dtors should have been lowered already");
2287 //===----------------------------------------------------------------------===//
2289 //===----------------------------------------------------------------------===//
2290 bool TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(
2291 const MachineFunction
*MF
) {
2292 if (!MF
->getLandingPads().empty())
2295 const Function
&F
= MF
->getFunction();
2296 if (!F
.hasPersonalityFn() || !F
.needsUnwindTableEntry())
2299 const GlobalValue
*Per
=
2300 dyn_cast
<GlobalValue
>(F
.getPersonalityFn()->stripPointerCasts());
2301 assert(Per
&& "Personality routine is not a GlobalValue type.");
2302 if (isNoOpWithoutInvoke(classifyEHPersonality(Per
)))
2308 bool TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(
2309 const MachineFunction
*MF
) {
2310 const Function
&F
= MF
->getFunction();
2311 if (!F
.hasStackProtectorFnAttr())
2313 // FIXME: check presence of canary word
2314 // There are cases that the stack protectors are not really inserted even if
2315 // the attributes are on.
2320 TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(const MachineFunction
*MF
) {
2321 MCSymbol
*EHInfoSym
= MF
->getMMI().getContext().getOrCreateSymbol(
2322 "__ehinfo." + Twine(MF
->getFunctionNumber()));
2323 cast
<MCSymbolXCOFF
>(EHInfoSym
)->setEHInfo();
2328 TargetLoweringObjectFileXCOFF::getTargetSymbol(const GlobalValue
*GV
,
2329 const TargetMachine
&TM
) const {
2330 // We always use a qualname symbol for a GV that represents
2331 // a declaration, a function descriptor, or a common symbol.
2332 // If a GV represents a GlobalVariable and -fdata-sections is enabled, we
2333 // also return a qualname so that a label symbol could be avoided.
2334 // It is inherently ambiguous when the GO represents the address of a
2335 // function, as the GO could either represent a function descriptor or a
2336 // function entry point. We choose to always return a function descriptor
2338 if (const GlobalObject
*GO
= dyn_cast
<GlobalObject
>(GV
)) {
2339 if (GO
->isDeclarationForLinker())
2340 return cast
<MCSectionXCOFF
>(getSectionForExternalReference(GO
, TM
))
2341 ->getQualNameSymbol();
2343 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GV
))
2344 if (GVar
->hasAttribute("toc-data"))
2345 return cast
<MCSectionXCOFF
>(
2346 SectionForGlobal(GVar
, SectionKind::getData(), TM
))
2347 ->getQualNameSymbol();
2349 SectionKind GOKind
= getKindForGlobal(GO
, TM
);
2350 if (GOKind
.isText())
2351 return cast
<MCSectionXCOFF
>(
2352 getSectionForFunctionDescriptor(cast
<Function
>(GO
), TM
))
2353 ->getQualNameSymbol();
2354 if ((TM
.getDataSections() && !GO
->hasSection()) || GO
->hasCommonLinkage() ||
2355 GOKind
.isBSSLocal() || GOKind
.isThreadBSSLocal())
2356 return cast
<MCSectionXCOFF
>(SectionForGlobal(GO
, GOKind
, TM
))
2357 ->getQualNameSymbol();
2360 // For all other cases, fall back to getSymbol to return the unqualified name.
2364 MCSection
*TargetLoweringObjectFileXCOFF::getExplicitSectionGlobal(
2365 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2366 if (!GO
->hasSection())
2367 report_fatal_error("#pragma clang section is not yet supported");
2369 StringRef SectionName
= GO
->getSection();
2371 // Handle the XCOFF::TD case first, then deal with the rest.
2372 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2373 if (GVar
->hasAttribute("toc-data"))
2374 return getContext().getXCOFFSection(
2376 XCOFF::CsectProperties(/*MappingClass*/ XCOFF::XMC_TD
, XCOFF::XTY_SD
),
2377 /* MultiSymbolsAllowed*/ true);
2379 XCOFF::StorageMappingClass MappingClass
;
2381 MappingClass
= XCOFF::XMC_PR
;
2382 else if (Kind
.isData() || Kind
.isBSS())
2383 MappingClass
= XCOFF::XMC_RW
;
2384 else if (Kind
.isReadOnlyWithRel())
2386 TM
.Options
.XCOFFReadOnlyPointers
? XCOFF::XMC_RO
: XCOFF::XMC_RW
;
2387 else if (Kind
.isReadOnly())
2388 MappingClass
= XCOFF::XMC_RO
;
2390 report_fatal_error("XCOFF other section types not yet implemented.");
2392 return getContext().getXCOFFSection(
2393 SectionName
, Kind
, XCOFF::CsectProperties(MappingClass
, XCOFF::XTY_SD
),
2394 /* MultiSymbolsAllowed*/ true);
2397 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForExternalReference(
2398 const GlobalObject
*GO
, const TargetMachine
&TM
) const {
2399 assert(GO
->isDeclarationForLinker() &&
2400 "Tried to get ER section for a defined global.");
2402 SmallString
<128> Name
;
2403 getNameWithPrefix(Name
, GO
, TM
);
2405 XCOFF::StorageMappingClass SMC
=
2406 isa
<Function
>(GO
) ? XCOFF::XMC_DS
: XCOFF::XMC_UA
;
2407 if (GO
->isThreadLocal())
2408 SMC
= XCOFF::XMC_UL
;
2410 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2411 if (GVar
->hasAttribute("toc-data"))
2412 SMC
= XCOFF::XMC_TD
;
2414 // Externals go into a csect of type ER.
2415 return getContext().getXCOFFSection(
2416 Name
, SectionKind::getMetadata(),
2417 XCOFF::CsectProperties(SMC
, XCOFF::XTY_ER
));
2420 MCSection
*TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
2421 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2422 // Handle the XCOFF::TD case first, then deal with the rest.
2423 if (const GlobalVariable
*GVar
= dyn_cast
<GlobalVariable
>(GO
))
2424 if (GVar
->hasAttribute("toc-data")) {
2425 SmallString
<128> Name
;
2426 getNameWithPrefix(Name
, GO
, TM
);
2427 return getContext().getXCOFFSection(
2428 Name
, Kind
, XCOFF::CsectProperties(XCOFF::XMC_TD
, XCOFF::XTY_SD
),
2429 /* MultiSymbolsAllowed*/ true);
2432 // Common symbols go into a csect with matching name which will get mapped
2433 // into the .bss section.
2434 // Zero-initialized local TLS symbols go into a csect with matching name which
2435 // will get mapped into the .tbss section.
2436 if (Kind
.isBSSLocal() || GO
->hasCommonLinkage() || Kind
.isThreadBSSLocal()) {
2437 SmallString
<128> Name
;
2438 getNameWithPrefix(Name
, GO
, TM
);
2439 XCOFF::StorageMappingClass SMC
= Kind
.isBSSLocal() ? XCOFF::XMC_BS
2440 : Kind
.isCommon() ? XCOFF::XMC_RW
2442 return getContext().getXCOFFSection(
2443 Name
, Kind
, XCOFF::CsectProperties(SMC
, XCOFF::XTY_CM
));
2446 if (Kind
.isText()) {
2447 if (TM
.getFunctionSections()) {
2448 return cast
<MCSymbolXCOFF
>(getFunctionEntryPointSymbol(GO
, TM
))
2449 ->getRepresentedCsect();
2454 if (TM
.Options
.XCOFFReadOnlyPointers
&& Kind
.isReadOnlyWithRel()) {
2455 if (!TM
.getDataSections())
2457 "ReadOnlyPointers is supported only if data sections is turned on");
2459 SmallString
<128> Name
;
2460 getNameWithPrefix(Name
, GO
, TM
);
2461 return getContext().getXCOFFSection(
2462 Name
, SectionKind::getReadOnly(),
2463 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2466 // For BSS kind, zero initialized data must be emitted to the .data section
2467 // because external linkage control sections that get mapped to the .bss
2468 // section will be linked as tentative defintions, which is only appropriate
2469 // for SectionKind::Common.
2470 if (Kind
.isData() || Kind
.isReadOnlyWithRel() || Kind
.isBSS()) {
2471 if (TM
.getDataSections()) {
2472 SmallString
<128> Name
;
2473 getNameWithPrefix(Name
, GO
, TM
);
2474 return getContext().getXCOFFSection(
2475 Name
, SectionKind::getData(),
2476 XCOFF::CsectProperties(XCOFF::XMC_RW
, XCOFF::XTY_SD
));
2481 if (Kind
.isReadOnly()) {
2482 if (TM
.getDataSections()) {
2483 SmallString
<128> Name
;
2484 getNameWithPrefix(Name
, GO
, TM
);
2485 return getContext().getXCOFFSection(
2486 Name
, SectionKind::getReadOnly(),
2487 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2489 return ReadOnlySection
;
2492 // External/weak TLS data and initialized local TLS data are not eligible
2493 // to be put into common csect. If data sections are enabled, thread
2494 // data are emitted into separate sections. Otherwise, thread data
2495 // are emitted into the .tdata section.
2496 if (Kind
.isThreadLocal()) {
2497 if (TM
.getDataSections()) {
2498 SmallString
<128> Name
;
2499 getNameWithPrefix(Name
, GO
, TM
);
2500 return getContext().getXCOFFSection(
2501 Name
, Kind
, XCOFF::CsectProperties(XCOFF::XMC_TL
, XCOFF::XTY_SD
));
2503 return TLSDataSection
;
2506 report_fatal_error("XCOFF other section types not yet implemented.");
2509 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForJumpTable(
2510 const Function
&F
, const TargetMachine
&TM
) const {
2511 assert (!F
.getComdat() && "Comdat not supported on XCOFF.");
2513 if (!TM
.getFunctionSections())
2514 return ReadOnlySection
;
2516 // If the function can be removed, produce a unique section so that
2517 // the table doesn't prevent the removal.
2518 SmallString
<128> NameStr(".rodata.jmp..");
2519 getNameWithPrefix(NameStr
, &F
, TM
);
2520 return getContext().getXCOFFSection(
2521 NameStr
, SectionKind::getReadOnly(),
2522 XCOFF::CsectProperties(XCOFF::XMC_RO
, XCOFF::XTY_SD
));
2525 bool TargetLoweringObjectFileXCOFF::shouldPutJumpTableInFunctionSection(
2526 bool UsesLabelDifference
, const Function
&F
) const {
2530 /// Given a mergeable constant with the specified size and relocation
2531 /// information, return a section that it should be placed in.
2532 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForConstant(
2533 const DataLayout
&DL
, SectionKind Kind
, const Constant
*C
,
2534 Align
&Alignment
) const {
2535 // TODO: Enable emiting constant pool to unique sections when we support it.
2536 if (Alignment
> Align(16))
2537 report_fatal_error("Alignments greater than 16 not yet supported.");
2539 if (Alignment
== Align(8)) {
2540 assert(ReadOnly8Section
&& "Section should always be initialized.");
2541 return ReadOnly8Section
;
2544 if (Alignment
== Align(16)) {
2545 assert(ReadOnly16Section
&& "Section should always be initialized.");
2546 return ReadOnly16Section
;
2549 return ReadOnlySection
;
2552 void TargetLoweringObjectFileXCOFF::Initialize(MCContext
&Ctx
,
2553 const TargetMachine
&TgtM
) {
2554 TargetLoweringObjectFile::Initialize(Ctx
, TgtM
);
2556 dwarf::DW_EH_PE_indirect
| dwarf::DW_EH_PE_datarel
|
2557 (TgtM
.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4
2558 : dwarf::DW_EH_PE_sdata8
);
2559 PersonalityEncoding
= 0;
2561 CallSiteEncoding
= dwarf::DW_EH_PE_udata4
;
2563 // AIX debug for thread local location is not ready. And for integrated as
2564 // mode, the relocatable address for the thread local variable will cause
2565 // linker error. So disable the location attribute generation for thread local
2566 // variables for now.
2567 // FIXME: when TLS debug on AIX is ready, remove this setting.
2568 SupportDebugThreadLocalLocation
= false;
2571 MCSection
*TargetLoweringObjectFileXCOFF::getStaticCtorSection(
2572 unsigned Priority
, const MCSymbol
*KeySym
) const {
2573 report_fatal_error("no static constructor section on AIX");
2576 MCSection
*TargetLoweringObjectFileXCOFF::getStaticDtorSection(
2577 unsigned Priority
, const MCSymbol
*KeySym
) const {
2578 report_fatal_error("no static destructor section on AIX");
2581 const MCExpr
*TargetLoweringObjectFileXCOFF::lowerRelativeReference(
2582 const GlobalValue
*LHS
, const GlobalValue
*RHS
,
2583 const TargetMachine
&TM
) const {
2584 /* Not implemented yet, but don't crash, return nullptr. */
2589 TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(const GlobalValue
*GV
) {
2590 assert(!isa
<GlobalIFunc
>(GV
) && "GlobalIFunc is not supported on AIX.");
2592 switch (GV
->getLinkage()) {
2593 case GlobalValue::InternalLinkage
:
2594 case GlobalValue::PrivateLinkage
:
2595 return XCOFF::C_HIDEXT
;
2596 case GlobalValue::ExternalLinkage
:
2597 case GlobalValue::CommonLinkage
:
2598 case GlobalValue::AvailableExternallyLinkage
:
2599 return XCOFF::C_EXT
;
2600 case GlobalValue::ExternalWeakLinkage
:
2601 case GlobalValue::LinkOnceAnyLinkage
:
2602 case GlobalValue::LinkOnceODRLinkage
:
2603 case GlobalValue::WeakAnyLinkage
:
2604 case GlobalValue::WeakODRLinkage
:
2605 return XCOFF::C_WEAKEXT
;
2606 case GlobalValue::AppendingLinkage
:
2608 "There is no mapping that implements AppendingLinkage for XCOFF.");
2610 llvm_unreachable("Unknown linkage type!");
2613 MCSymbol
*TargetLoweringObjectFileXCOFF::getFunctionEntryPointSymbol(
2614 const GlobalValue
*Func
, const TargetMachine
&TM
) const {
2615 assert((isa
<Function
>(Func
) ||
2616 (isa
<GlobalAlias
>(Func
) &&
2617 isa_and_nonnull
<Function
>(
2618 cast
<GlobalAlias
>(Func
)->getAliaseeObject()))) &&
2619 "Func must be a function or an alias which has a function as base "
2622 SmallString
<128> NameStr
;
2623 NameStr
.push_back('.');
2624 getNameWithPrefix(NameStr
, Func
, TM
);
2626 // When -function-sections is enabled and explicit section is not specified,
2627 // it's not necessary to emit function entry point label any more. We will use
2628 // function entry point csect instead. And for function delcarations, the
2629 // undefined symbols gets treated as csect with XTY_ER property.
2630 if (((TM
.getFunctionSections() && !Func
->hasSection()) ||
2631 Func
->isDeclarationForLinker()) &&
2632 isa
<Function
>(Func
)) {
2635 NameStr
, SectionKind::getText(),
2636 XCOFF::CsectProperties(XCOFF::XMC_PR
, Func
->isDeclarationForLinker()
2639 ->getQualNameSymbol();
2642 return getContext().getOrCreateSymbol(NameStr
);
2645 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForFunctionDescriptor(
2646 const Function
*F
, const TargetMachine
&TM
) const {
2647 SmallString
<128> NameStr
;
2648 getNameWithPrefix(NameStr
, F
, TM
);
2649 return getContext().getXCOFFSection(
2650 NameStr
, SectionKind::getData(),
2651 XCOFF::CsectProperties(XCOFF::XMC_DS
, XCOFF::XTY_SD
));
2654 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForTOCEntry(
2655 const MCSymbol
*Sym
, const TargetMachine
&TM
) const {
2656 // Use TE storage-mapping class when large code model is enabled so that
2657 // the chance of needing -bbigtoc is decreased. Also, the toc-entry for
2658 // EH info is never referenced directly using instructions so it can be
2659 // allocated with TE storage-mapping class.
2660 return getContext().getXCOFFSection(
2661 cast
<MCSymbolXCOFF
>(Sym
)->getSymbolTableName(), SectionKind::getData(),
2662 XCOFF::CsectProperties((TM
.getCodeModel() == CodeModel::Large
||
2663 cast
<MCSymbolXCOFF
>(Sym
)->isEHInfo())
2669 MCSection
*TargetLoweringObjectFileXCOFF::getSectionForLSDA(
2670 const Function
&F
, const MCSymbol
&FnSym
, const TargetMachine
&TM
) const {
2671 auto *LSDA
= cast
<MCSectionXCOFF
>(LSDASection
);
2672 if (TM
.getFunctionSections()) {
2673 // If option -ffunction-sections is on, append the function name to the
2674 // name of the LSDA csect so that each function has its own LSDA csect.
2675 // This helps the linker to garbage-collect EH info of unused functions.
2676 SmallString
<128> NameStr
= LSDA
->getName();
2677 raw_svector_ostream(NameStr
) << '.' << F
.getName();
2678 LSDA
= getContext().getXCOFFSection(NameStr
, LSDA
->getKind(),
2679 LSDA
->getCsectProp());
2683 //===----------------------------------------------------------------------===//
2685 //===----------------------------------------------------------------------===//
2686 TargetLoweringObjectFileGOFF::TargetLoweringObjectFileGOFF() = default;
2688 MCSection
*TargetLoweringObjectFileGOFF::getExplicitSectionGlobal(
2689 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2690 return SelectSectionForGlobal(GO
, Kind
, TM
);
2693 MCSection
*TargetLoweringObjectFileGOFF::getSectionForLSDA(
2694 const Function
&F
, const MCSymbol
&FnSym
, const TargetMachine
&TM
) const {
2695 std::string Name
= ".gcc_exception_table." + F
.getName().str();
2696 return getContext().getGOFFSection(Name
, SectionKind::getData(), nullptr,
2700 MCSection
*TargetLoweringObjectFileGOFF::SelectSectionForGlobal(
2701 const GlobalObject
*GO
, SectionKind Kind
, const TargetMachine
&TM
) const {
2702 auto *Symbol
= TM
.getSymbol(GO
);
2704 return getContext().getGOFFSection(Symbol
->getName(), SectionKind::getBSS(),
2707 return getContext().getObjectFileInfo()->getTextSection();