[AMDGPU][AsmParser][NFC] Translate parsed MIMG instructions to MCInsts automatically.
[llvm-project.git] / llvm / lib / CodeGen / TargetLoweringObjectFileImpl.cpp
blob9e0914f667f02bf69a0f48d73da8cf99912eb23f
1 //===- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info ---===//
2 //
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
6 //
7 //===----------------------------------------------------------------------===//
8 //
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"
68 #include <cassert>
69 #include <string>
71 using namespace llvm;
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,
79 StringRef &Section) {
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)
86 continue;
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 //===----------------------------------------------------------------------===//
113 // ELF
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()) {
128 case Triple::arm:
129 case Triple::armeb:
130 case Triple::thumb:
131 case Triple::thumbeb:
132 if (Ctx.getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
133 break;
134 // Fallthrough if not using EHABI
135 [[fallthrough]];
136 case Triple::ppc:
137 case Triple::ppcle:
138 case Triple::x86:
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;
151 break;
152 case Triple::x86_64:
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);
163 } else {
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;
172 break;
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;
182 break;
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;
197 break;
198 case Triple::lanai:
199 LSDAEncoding = dwarf::DW_EH_PE_absptr;
200 PersonalityEncoding = dwarf::DW_EH_PE_absptr;
201 TTypeEncoding = dwarf::DW_EH_PE_absptr;
202 break;
203 case Triple::mips:
204 case Triple::mipsel:
205 case Triple::mips64:
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
220 // do.
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;
225 break;
226 case Triple::ppc64:
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;
233 break;
234 case Triple::sparcel:
235 case Triple::sparc:
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;
242 } else {
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;
248 break;
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;
257 break;
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;
265 } else {
266 PersonalityEncoding = dwarf::DW_EH_PE_absptr;
267 TTypeEncoding = dwarf::DW_EH_PE_absptr;
269 break;
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;
279 } else {
280 PersonalityEncoding = dwarf::DW_EH_PE_absptr;
281 LSDAEncoding = dwarf::DW_EH_PE_absptr;
282 TTypeEncoding = dwarf::DW_EH_PE_absptr;
284 break;
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;
292 break;
293 default:
294 break;
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))
303 Used.insert(GO);
306 void TargetLoweringObjectFileELF::emitModuleMetadata(MCStreamer &Streamer,
307 Module &M) const {
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,
312 ELF::SHF_EXCLUDE);
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()) {
333 Streamer.emitBytes(
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))
379 ->getZExtValue())
380 .str());
381 Streamer.emitULEB128IntValue(Value.size());
382 Streamer.emitBytes(Value);
387 unsigned Version = 0;
388 unsigned Flags = 0;
389 StringRef Section;
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();
420 MCSymbolELF *Label =
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,
460 MMI, Streamer);
463 static SectionKind getELFKindForNamedSection(StringRef Name, SectionKind K) {
464 // N.B.: The defaults used in here are not the same ones used in MC.
465 // We follow gcc, MC follows gas. For example, given ".section .eh_frame",
466 // both gas and MC will produce a section with no flags. Given
467 // section(".eh_frame") gcc will produce:
469 // .section .eh_frame,"a",@progbits
471 if (Name == getInstrProfSectionName(IPSK_covmap, Triple::ELF,
472 /*AddSegmentInfo=*/false) ||
473 Name == getInstrProfSectionName(IPSK_covfun, Triple::ELF,
474 /*AddSegmentInfo=*/false) ||
475 Name == ".llvmbc" || Name == ".llvmcmd")
476 return SectionKind::getMetadata();
478 if (Name.empty() || Name[0] != '.') return K;
480 // Default implementation based on some magic section names.
481 if (Name == ".bss" ||
482 Name.startswith(".bss.") ||
483 Name.startswith(".gnu.linkonce.b.") ||
484 Name.startswith(".llvm.linkonce.b.") ||
485 Name == ".sbss" ||
486 Name.startswith(".sbss.") ||
487 Name.startswith(".gnu.linkonce.sb.") ||
488 Name.startswith(".llvm.linkonce.sb."))
489 return SectionKind::getBSS();
491 if (Name == ".tdata" ||
492 Name.startswith(".tdata.") ||
493 Name.startswith(".gnu.linkonce.td.") ||
494 Name.startswith(".llvm.linkonce.td."))
495 return SectionKind::getThreadData();
497 if (Name == ".tbss" ||
498 Name.startswith(".tbss.") ||
499 Name.startswith(".gnu.linkonce.tb.") ||
500 Name.startswith(".llvm.linkonce.tb."))
501 return SectionKind::getThreadBSS();
503 return K;
506 static bool hasPrefix(StringRef SectionName, StringRef Prefix) {
507 return SectionName.consume_front(Prefix) &&
508 (SectionName.empty() || SectionName[0] == '.');
511 static unsigned getELFSectionType(StringRef Name, SectionKind K) {
512 // Use SHT_NOTE for section whose name starts with ".note" to allow
513 // emitting ELF notes from C variable declaration.
514 // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77609
515 if (Name.startswith(".note"))
516 return ELF::SHT_NOTE;
518 if (hasPrefix(Name, ".init_array"))
519 return ELF::SHT_INIT_ARRAY;
521 if (hasPrefix(Name, ".fini_array"))
522 return ELF::SHT_FINI_ARRAY;
524 if (hasPrefix(Name, ".preinit_array"))
525 return ELF::SHT_PREINIT_ARRAY;
527 if (hasPrefix(Name, ".llvm.offloading"))
528 return ELF::SHT_LLVM_OFFLOADING;
530 if (K.isBSS() || K.isThreadBSS())
531 return ELF::SHT_NOBITS;
533 return ELF::SHT_PROGBITS;
536 static unsigned getELFSectionFlags(SectionKind K) {
537 unsigned Flags = 0;
539 if (!K.isMetadata() && !K.isExclude())
540 Flags |= ELF::SHF_ALLOC;
542 if (K.isExclude())
543 Flags |= ELF::SHF_EXCLUDE;
545 if (K.isText())
546 Flags |= ELF::SHF_EXECINSTR;
548 if (K.isExecuteOnly())
549 Flags |= ELF::SHF_ARM_PURECODE;
551 if (K.isWriteable())
552 Flags |= ELF::SHF_WRITE;
554 if (K.isThreadLocal())
555 Flags |= ELF::SHF_TLS;
557 if (K.isMergeableCString() || K.isMergeableConst())
558 Flags |= ELF::SHF_MERGE;
560 if (K.isMergeableCString())
561 Flags |= ELF::SHF_STRINGS;
563 return Flags;
566 static const Comdat *getELFComdat(const GlobalValue *GV) {
567 const Comdat *C = GV->getComdat();
568 if (!C)
569 return nullptr;
571 if (C->getSelectionKind() != Comdat::Any &&
572 C->getSelectionKind() != Comdat::NoDeduplicate)
573 report_fatal_error("ELF COMDATs only support SelectionKind::Any and "
574 "SelectionKind::NoDeduplicate, '" +
575 C->getName() + "' cannot be lowered.");
577 return C;
580 static const MCSymbolELF *getLinkedToSymbol(const GlobalObject *GO,
581 const TargetMachine &TM) {
582 MDNode *MD = GO->getMetadata(LLVMContext::MD_associated);
583 if (!MD)
584 return nullptr;
586 auto *VM = cast<ValueAsMetadata>(MD->getOperand(0).get());
587 auto *OtherGV = dyn_cast<GlobalValue>(VM->getValue());
588 return OtherGV ? dyn_cast<MCSymbolELF>(TM.getSymbol(OtherGV)) : nullptr;
591 static unsigned getEntrySizeForKind(SectionKind Kind) {
592 if (Kind.isMergeable1ByteCString())
593 return 1;
594 else if (Kind.isMergeable2ByteCString())
595 return 2;
596 else if (Kind.isMergeable4ByteCString())
597 return 4;
598 else if (Kind.isMergeableConst4())
599 return 4;
600 else if (Kind.isMergeableConst8())
601 return 8;
602 else if (Kind.isMergeableConst16())
603 return 16;
604 else if (Kind.isMergeableConst32())
605 return 32;
606 else {
607 // We shouldn't have mergeable C strings or mergeable constants that we
608 // didn't handle above.
609 assert(!Kind.isMergeableCString() && "unknown string width");
610 assert(!Kind.isMergeableConst() && "unknown data width");
611 return 0;
615 /// Return the section prefix name used by options FunctionsSections and
616 /// DataSections.
617 static StringRef getSectionPrefixForGlobal(SectionKind Kind, bool IsLarge) {
618 if (Kind.isText())
619 return ".text";
620 if (Kind.isReadOnly())
621 return IsLarge ? ".lrodata" : ".rodata";
622 if (Kind.isBSS())
623 return IsLarge ? ".lbss" : ".bss";
624 if (Kind.isThreadData())
625 return ".tdata";
626 if (Kind.isThreadBSS())
627 return ".tbss";
628 if (Kind.isData())
629 return IsLarge ? ".ldata" : ".data";
630 if (Kind.isReadOnlyWithRel())
631 return IsLarge ? ".ldata.rel.ro" : ".data.rel.ro";
632 llvm_unreachable("Unknown section kind");
635 static SmallString<128>
636 getELFSectionNameForGlobal(const GlobalObject *GO, SectionKind Kind,
637 Mangler &Mang, const TargetMachine &TM,
638 unsigned EntrySize, bool UniqueSectionName) {
639 SmallString<128> Name;
640 if (Kind.isMergeableCString()) {
641 // We also need alignment here.
642 // FIXME: this is getting the alignment of the character, not the
643 // alignment of the global!
644 Align Alignment = GO->getParent()->getDataLayout().getPreferredAlign(
645 cast<GlobalVariable>(GO));
647 std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + ".";
648 Name = SizeSpec + utostr(Alignment.value());
649 } else if (Kind.isMergeableConst()) {
650 Name = ".rodata.cst";
651 Name += utostr(EntrySize);
652 } else {
653 bool IsLarge = false;
654 if (isa<GlobalVariable>(GO))
655 IsLarge = TM.isLargeData();
656 Name = getSectionPrefixForGlobal(Kind, IsLarge);
659 bool HasPrefix = false;
660 if (const auto *F = dyn_cast<Function>(GO)) {
661 if (std::optional<StringRef> Prefix = F->getSectionPrefix()) {
662 raw_svector_ostream(Name) << '.' << *Prefix;
663 HasPrefix = true;
667 if (UniqueSectionName) {
668 Name.push_back('.');
669 TM.getNameWithPrefix(Name, GO, Mang, /*MayAlwaysUsePrivate*/true);
670 } else if (HasPrefix)
671 // For distinguishing between .text.${text-section-prefix}. (with trailing
672 // dot) and .text.${function-name}
673 Name.push_back('.');
674 return Name;
677 namespace {
678 class LoweringDiagnosticInfo : public DiagnosticInfo {
679 const Twine &Msg;
681 public:
682 LoweringDiagnosticInfo(const Twine &DiagMsg,
683 DiagnosticSeverity Severity = DS_Error)
684 : DiagnosticInfo(DK_Lowering, Severity), Msg(DiagMsg) {}
685 void print(DiagnosticPrinter &DP) const override { DP << Msg; }
689 /// Calculate an appropriate unique ID for a section, and update Flags,
690 /// EntrySize and NextUniqueID where appropriate.
691 static unsigned
692 calcUniqueIDUpdateFlagsAndSize(const GlobalObject *GO, StringRef SectionName,
693 SectionKind Kind, const TargetMachine &TM,
694 MCContext &Ctx, Mangler &Mang, unsigned &Flags,
695 unsigned &EntrySize, unsigned &NextUniqueID,
696 const bool Retain, const bool ForceUnique) {
697 // Increment uniqueID if we are forced to emit a unique section.
698 // This works perfectly fine with section attribute or pragma section as the
699 // sections with the same name are grouped together by the assembler.
700 if (ForceUnique)
701 return NextUniqueID++;
703 // A section can have at most one associated section. Put each global with
704 // MD_associated in a unique section.
705 const bool Associated = GO->getMetadata(LLVMContext::MD_associated);
706 if (Associated) {
707 Flags |= ELF::SHF_LINK_ORDER;
708 return NextUniqueID++;
711 if (Retain) {
712 if (TM.getTargetTriple().isOSSolaris())
713 Flags |= ELF::SHF_SUNW_NODISCARD;
714 else if (Ctx.getAsmInfo()->useIntegratedAssembler() ||
715 Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36))
716 Flags |= ELF::SHF_GNU_RETAIN;
717 return NextUniqueID++;
720 // If two symbols with differing sizes end up in the same mergeable section
721 // that section can be assigned an incorrect entry size. To avoid this we
722 // usually put symbols of the same size into distinct mergeable sections with
723 // the same name. Doing so relies on the ",unique ," assembly feature. This
724 // feature is not avalible until bintuils version 2.35
725 // (https://sourceware.org/bugzilla/show_bug.cgi?id=25380).
726 const bool SupportsUnique = Ctx.getAsmInfo()->useIntegratedAssembler() ||
727 Ctx.getAsmInfo()->binutilsIsAtLeast(2, 35);
728 if (!SupportsUnique) {
729 Flags &= ~ELF::SHF_MERGE;
730 EntrySize = 0;
731 return MCContext::GenericSectionID;
734 const bool SymbolMergeable = Flags & ELF::SHF_MERGE;
735 const bool SeenSectionNameBefore =
736 Ctx.isELFGenericMergeableSection(SectionName);
737 // If this is the first ocurrence of this section name, treat it as the
738 // generic section
739 if (!SymbolMergeable && !SeenSectionNameBefore)
740 return MCContext::GenericSectionID;
742 // Symbols must be placed into sections with compatible entry sizes. Generate
743 // unique sections for symbols that have not been assigned to compatible
744 // sections.
745 const auto PreviousID =
746 Ctx.getELFUniqueIDForEntsize(SectionName, Flags, EntrySize);
747 if (PreviousID)
748 return *PreviousID;
750 // If the user has specified the same section name as would be created
751 // implicitly for this symbol e.g. .rodata.str1.1, then we don't need
752 // to unique the section as the entry size for this symbol will be
753 // compatible with implicitly created sections.
754 SmallString<128> ImplicitSectionNameStem =
755 getELFSectionNameForGlobal(GO, Kind, Mang, TM, EntrySize, false);
756 if (SymbolMergeable &&
757 Ctx.isELFImplicitMergeableSectionNamePrefix(SectionName) &&
758 SectionName.startswith(ImplicitSectionNameStem))
759 return MCContext::GenericSectionID;
761 // We have seen this section name before, but with different flags or entity
762 // size. Create a new unique ID.
763 return NextUniqueID++;
766 static MCSection *selectExplicitSectionGlobal(
767 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM,
768 MCContext &Ctx, Mangler &Mang, unsigned &NextUniqueID,
769 bool Retain, bool ForceUnique) {
770 StringRef SectionName = GO->getSection();
772 // Check if '#pragma clang section' name is applicable.
773 // Note that pragma directive overrides -ffunction-section, -fdata-section
774 // and so section name is exactly as user specified and not uniqued.
775 const GlobalVariable *GV = dyn_cast<GlobalVariable>(GO);
776 if (GV && GV->hasImplicitSection()) {
777 auto Attrs = GV->getAttributes();
778 if (Attrs.hasAttribute("bss-section") && Kind.isBSS()) {
779 SectionName = Attrs.getAttribute("bss-section").getValueAsString();
780 } else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly()) {
781 SectionName = Attrs.getAttribute("rodata-section").getValueAsString();
782 } else if (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel()) {
783 SectionName = Attrs.getAttribute("relro-section").getValueAsString();
784 } else if (Attrs.hasAttribute("data-section") && Kind.isData()) {
785 SectionName = Attrs.getAttribute("data-section").getValueAsString();
788 const Function *F = dyn_cast<Function>(GO);
789 if (F && F->hasFnAttribute("implicit-section-name")) {
790 SectionName = F->getFnAttribute("implicit-section-name").getValueAsString();
793 // Infer section flags from the section name if we can.
794 Kind = getELFKindForNamedSection(SectionName, Kind);
796 StringRef Group = "";
797 bool IsComdat = false;
798 unsigned Flags = getELFSectionFlags(Kind);
799 if (const Comdat *C = getELFComdat(GO)) {
800 Group = C->getName();
801 IsComdat = C->getSelectionKind() == Comdat::Any;
802 Flags |= ELF::SHF_GROUP;
805 unsigned EntrySize = getEntrySizeForKind(Kind);
806 const unsigned UniqueID = calcUniqueIDUpdateFlagsAndSize(
807 GO, SectionName, Kind, TM, Ctx, Mang, Flags, EntrySize, NextUniqueID,
808 Retain, ForceUnique);
810 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
811 MCSectionELF *Section = Ctx.getELFSection(
812 SectionName, getELFSectionType(SectionName, Kind), Flags, EntrySize,
813 Group, IsComdat, UniqueID, LinkedToSym);
814 // Make sure that we did not get some other section with incompatible sh_link.
815 // This should not be possible due to UniqueID code above.
816 assert(Section->getLinkedToSymbol() == LinkedToSym &&
817 "Associated symbol mismatch between sections");
819 if (!(Ctx.getAsmInfo()->useIntegratedAssembler() ||
820 Ctx.getAsmInfo()->binutilsIsAtLeast(2, 35))) {
821 // If we are using GNU as before 2.35, then this symbol might have
822 // been placed in an incompatible mergeable section. Emit an error if this
823 // is the case to avoid creating broken output.
824 if ((Section->getFlags() & ELF::SHF_MERGE) &&
825 (Section->getEntrySize() != getEntrySizeForKind(Kind)))
826 GO->getContext().diagnose(LoweringDiagnosticInfo(
827 "Symbol '" + GO->getName() + "' from module '" +
828 (GO->getParent() ? GO->getParent()->getSourceFileName() : "unknown") +
829 "' required a section with entry-size=" +
830 Twine(getEntrySizeForKind(Kind)) + " but was placed in section '" +
831 SectionName + "' with entry-size=" + Twine(Section->getEntrySize()) +
832 ": Explicit assignment by pragma or attribute of an incompatible "
833 "symbol to this section?"));
836 return Section;
839 MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal(
840 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
841 return selectExplicitSectionGlobal(GO, Kind, TM, getContext(), getMangler(),
842 NextUniqueID, Used.count(GO),
843 /* ForceUnique = */false);
846 static MCSectionELF *selectELFSectionForGlobal(
847 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
848 const TargetMachine &TM, bool EmitUniqueSection, unsigned Flags,
849 unsigned *NextUniqueID, const MCSymbolELF *AssociatedSymbol) {
851 StringRef Group = "";
852 bool IsComdat = false;
853 if (const Comdat *C = getELFComdat(GO)) {
854 Flags |= ELF::SHF_GROUP;
855 Group = C->getName();
856 IsComdat = C->getSelectionKind() == Comdat::Any;
858 if (isa<GlobalVariable>(GO)) {
859 if (TM.isLargeData()) {
860 assert(TM.getTargetTriple().getArch() == Triple::x86_64);
861 Flags |= ELF::SHF_X86_64_LARGE;
865 // Get the section entry size based on the kind.
866 unsigned EntrySize = getEntrySizeForKind(Kind);
868 bool UniqueSectionName = false;
869 unsigned UniqueID = MCContext::GenericSectionID;
870 if (EmitUniqueSection) {
871 if (TM.getUniqueSectionNames()) {
872 UniqueSectionName = true;
873 } else {
874 UniqueID = *NextUniqueID;
875 (*NextUniqueID)++;
878 SmallString<128> Name = getELFSectionNameForGlobal(
879 GO, Kind, Mang, TM, EntrySize, UniqueSectionName);
881 // Use 0 as the unique ID for execute-only text.
882 if (Kind.isExecuteOnly())
883 UniqueID = 0;
884 return Ctx.getELFSection(Name, getELFSectionType(Name, Kind), Flags,
885 EntrySize, Group, IsComdat, UniqueID,
886 AssociatedSymbol);
889 static MCSection *selectELFSectionForGlobal(
890 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
891 const TargetMachine &TM, bool Retain, bool EmitUniqueSection,
892 unsigned Flags, unsigned *NextUniqueID) {
893 const MCSymbolELF *LinkedToSym = getLinkedToSymbol(GO, TM);
894 if (LinkedToSym) {
895 EmitUniqueSection = true;
896 Flags |= ELF::SHF_LINK_ORDER;
898 if (Retain) {
899 if (TM.getTargetTriple().isOSSolaris()) {
900 EmitUniqueSection = true;
901 Flags |= ELF::SHF_SUNW_NODISCARD;
902 } else if (Ctx.getAsmInfo()->useIntegratedAssembler() ||
903 Ctx.getAsmInfo()->binutilsIsAtLeast(2, 36)) {
904 EmitUniqueSection = true;
905 Flags |= ELF::SHF_GNU_RETAIN;
909 MCSectionELF *Section = selectELFSectionForGlobal(
910 Ctx, GO, Kind, Mang, TM, EmitUniqueSection, Flags,
911 NextUniqueID, LinkedToSym);
912 assert(Section->getLinkedToSymbol() == LinkedToSym);
913 return Section;
916 MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal(
917 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
918 unsigned Flags = getELFSectionFlags(Kind);
920 // If we have -ffunction-section or -fdata-section then we should emit the
921 // global value to a uniqued section specifically for it.
922 bool EmitUniqueSection = false;
923 if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) {
924 if (Kind.isText())
925 EmitUniqueSection = TM.getFunctionSections();
926 else
927 EmitUniqueSection = TM.getDataSections();
929 EmitUniqueSection |= GO->hasComdat();
930 return selectELFSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
931 Used.count(GO), EmitUniqueSection, Flags,
932 &NextUniqueID);
935 MCSection *TargetLoweringObjectFileELF::getUniqueSectionForFunction(
936 const Function &F, const TargetMachine &TM) const {
937 SectionKind Kind = SectionKind::getText();
938 unsigned Flags = getELFSectionFlags(Kind);
939 // If the function's section names is pre-determined via pragma or a
940 // section attribute, call selectExplicitSectionGlobal.
941 if (F.hasSection() || F.hasFnAttribute("implicit-section-name"))
942 return selectExplicitSectionGlobal(
943 &F, Kind, TM, getContext(), getMangler(), NextUniqueID,
944 Used.count(&F), /* ForceUnique = */true);
945 else
946 return selectELFSectionForGlobal(
947 getContext(), &F, Kind, getMangler(), TM, Used.count(&F),
948 /*EmitUniqueSection=*/true, Flags, &NextUniqueID);
951 MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable(
952 const Function &F, const TargetMachine &TM) const {
953 // If the function can be removed, produce a unique section so that
954 // the table doesn't prevent the removal.
955 const Comdat *C = F.getComdat();
956 bool EmitUniqueSection = TM.getFunctionSections() || C;
957 if (!EmitUniqueSection)
958 return ReadOnlySection;
960 return selectELFSectionForGlobal(getContext(), &F, SectionKind::getReadOnly(),
961 getMangler(), TM, EmitUniqueSection,
962 ELF::SHF_ALLOC, &NextUniqueID,
963 /* AssociatedSymbol */ nullptr);
966 MCSection *TargetLoweringObjectFileELF::getSectionForLSDA(
967 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
968 // If neither COMDAT nor function sections, use the monolithic LSDA section.
969 // Re-use this path if LSDASection is null as in the Arm EHABI.
970 if (!LSDASection || (!F.hasComdat() && !TM.getFunctionSections()))
971 return LSDASection;
973 const auto *LSDA = cast<MCSectionELF>(LSDASection);
974 unsigned Flags = LSDA->getFlags();
975 const MCSymbolELF *LinkedToSym = nullptr;
976 StringRef Group;
977 bool IsComdat = false;
978 if (const Comdat *C = getELFComdat(&F)) {
979 Flags |= ELF::SHF_GROUP;
980 Group = C->getName();
981 IsComdat = C->getSelectionKind() == Comdat::Any;
983 // Use SHF_LINK_ORDER to facilitate --gc-sections if we can use GNU ld>=2.36
984 // or LLD, which support mixed SHF_LINK_ORDER & non-SHF_LINK_ORDER.
985 if (TM.getFunctionSections() &&
986 (getContext().getAsmInfo()->useIntegratedAssembler() &&
987 getContext().getAsmInfo()->binutilsIsAtLeast(2, 36))) {
988 Flags |= ELF::SHF_LINK_ORDER;
989 LinkedToSym = cast<MCSymbolELF>(&FnSym);
992 // Append the function name as the suffix like GCC, assuming
993 // -funique-section-names applies to .gcc_except_table sections.
994 return getContext().getELFSection(
995 (TM.getUniqueSectionNames() ? LSDA->getName() + "." + F.getName()
996 : LSDA->getName()),
997 LSDA->getType(), Flags, 0, Group, IsComdat, MCSection::NonUniqueID,
998 LinkedToSym);
1001 bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection(
1002 bool UsesLabelDifference, const Function &F) const {
1003 // We can always create relative relocations, so use another section
1004 // that can be marked non-executable.
1005 return false;
1008 /// Given a mergeable constant with the specified size and relocation
1009 /// information, return a section that it should be placed in.
1010 MCSection *TargetLoweringObjectFileELF::getSectionForConstant(
1011 const DataLayout &DL, SectionKind Kind, const Constant *C,
1012 Align &Alignment) const {
1013 if (Kind.isMergeableConst4() && MergeableConst4Section)
1014 return MergeableConst4Section;
1015 if (Kind.isMergeableConst8() && MergeableConst8Section)
1016 return MergeableConst8Section;
1017 if (Kind.isMergeableConst16() && MergeableConst16Section)
1018 return MergeableConst16Section;
1019 if (Kind.isMergeableConst32() && MergeableConst32Section)
1020 return MergeableConst32Section;
1021 if (Kind.isReadOnly())
1022 return ReadOnlySection;
1024 assert(Kind.isReadOnlyWithRel() && "Unknown section kind");
1025 return DataRelROSection;
1028 /// Returns a unique section for the given machine basic block.
1029 MCSection *TargetLoweringObjectFileELF::getSectionForMachineBasicBlock(
1030 const Function &F, const MachineBasicBlock &MBB,
1031 const TargetMachine &TM) const {
1032 assert(MBB.isBeginSection() && "Basic block does not start a section!");
1033 unsigned UniqueID = MCContext::GenericSectionID;
1035 // For cold sections use the .text.split. prefix along with the parent
1036 // function name. All cold blocks for the same function go to the same
1037 // section. Similarly all exception blocks are grouped by symbol name
1038 // under the .text.eh prefix. For regular sections, we either use a unique
1039 // name, or a unique ID for the section.
1040 SmallString<128> Name;
1041 if (MBB.getSectionID() == MBBSectionID::ColdSectionID) {
1042 Name += BBSectionsColdTextPrefix;
1043 Name += MBB.getParent()->getName();
1044 } else if (MBB.getSectionID() == MBBSectionID::ExceptionSectionID) {
1045 Name += ".text.eh.";
1046 Name += MBB.getParent()->getName();
1047 } else {
1048 Name += MBB.getParent()->getSection()->getName();
1049 if (TM.getUniqueBasicBlockSectionNames()) {
1050 if (!Name.endswith("."))
1051 Name += ".";
1052 Name += MBB.getSymbol()->getName();
1053 } else {
1054 UniqueID = NextUniqueID++;
1058 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
1059 std::string GroupName;
1060 if (F.hasComdat()) {
1061 Flags |= ELF::SHF_GROUP;
1062 GroupName = F.getComdat()->getName().str();
1064 return getContext().getELFSection(Name, ELF::SHT_PROGBITS, Flags,
1065 0 /* Entry Size */, GroupName,
1066 F.hasComdat(), UniqueID, nullptr);
1069 static MCSectionELF *getStaticStructorSection(MCContext &Ctx, bool UseInitArray,
1070 bool IsCtor, unsigned Priority,
1071 const MCSymbol *KeySym) {
1072 std::string Name;
1073 unsigned Type;
1074 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE;
1075 StringRef Comdat = KeySym ? KeySym->getName() : "";
1077 if (KeySym)
1078 Flags |= ELF::SHF_GROUP;
1080 if (UseInitArray) {
1081 if (IsCtor) {
1082 Type = ELF::SHT_INIT_ARRAY;
1083 Name = ".init_array";
1084 } else {
1085 Type = ELF::SHT_FINI_ARRAY;
1086 Name = ".fini_array";
1088 if (Priority != 65535) {
1089 Name += '.';
1090 Name += utostr(Priority);
1092 } else {
1093 // The default scheme is .ctor / .dtor, so we have to invert the priority
1094 // numbering.
1095 if (IsCtor)
1096 Name = ".ctors";
1097 else
1098 Name = ".dtors";
1099 if (Priority != 65535)
1100 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
1101 Type = ELF::SHT_PROGBITS;
1104 return Ctx.getELFSection(Name, Type, Flags, 0, Comdat, /*IsComdat=*/true);
1107 MCSection *TargetLoweringObjectFileELF::getStaticCtorSection(
1108 unsigned Priority, const MCSymbol *KeySym) const {
1109 return getStaticStructorSection(getContext(), UseInitArray, true, Priority,
1110 KeySym);
1113 MCSection *TargetLoweringObjectFileELF::getStaticDtorSection(
1114 unsigned Priority, const MCSymbol *KeySym) const {
1115 return getStaticStructorSection(getContext(), UseInitArray, false, Priority,
1116 KeySym);
1119 const MCExpr *TargetLoweringObjectFileELF::lowerRelativeReference(
1120 const GlobalValue *LHS, const GlobalValue *RHS,
1121 const TargetMachine &TM) const {
1122 // We may only use a PLT-relative relocation to refer to unnamed_addr
1123 // functions.
1124 if (!LHS->hasGlobalUnnamedAddr() || !LHS->getValueType()->isFunctionTy())
1125 return nullptr;
1127 // Basic correctness checks.
1128 if (LHS->getType()->getPointerAddressSpace() != 0 ||
1129 RHS->getType()->getPointerAddressSpace() != 0 || LHS->isThreadLocal() ||
1130 RHS->isThreadLocal())
1131 return nullptr;
1133 return MCBinaryExpr::createSub(
1134 MCSymbolRefExpr::create(TM.getSymbol(LHS), PLTRelativeVariantKind,
1135 getContext()),
1136 MCSymbolRefExpr::create(TM.getSymbol(RHS), getContext()), getContext());
1139 const MCExpr *TargetLoweringObjectFileELF::lowerDSOLocalEquivalent(
1140 const DSOLocalEquivalent *Equiv, const TargetMachine &TM) const {
1141 assert(supportDSOLocalEquivalentLowering());
1143 const auto *GV = Equiv->getGlobalValue();
1145 // A PLT entry is not needed for dso_local globals.
1146 if (GV->isDSOLocal() || GV->isImplicitDSOLocal())
1147 return MCSymbolRefExpr::create(TM.getSymbol(GV), getContext());
1149 return MCSymbolRefExpr::create(TM.getSymbol(GV), PLTRelativeVariantKind,
1150 getContext());
1153 MCSection *TargetLoweringObjectFileELF::getSectionForCommandLines() const {
1154 // Use ".GCC.command.line" since this feature is to support clang's
1155 // -frecord-gcc-switches which in turn attempts to mimic GCC's switch of the
1156 // same name.
1157 return getContext().getELFSection(".GCC.command.line", ELF::SHT_PROGBITS,
1158 ELF::SHF_MERGE | ELF::SHF_STRINGS, 1);
1161 void
1162 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) {
1163 UseInitArray = UseInitArray_;
1164 MCContext &Ctx = getContext();
1165 if (!UseInitArray) {
1166 StaticCtorSection = Ctx.getELFSection(".ctors", ELF::SHT_PROGBITS,
1167 ELF::SHF_ALLOC | ELF::SHF_WRITE);
1169 StaticDtorSection = Ctx.getELFSection(".dtors", ELF::SHT_PROGBITS,
1170 ELF::SHF_ALLOC | ELF::SHF_WRITE);
1171 return;
1174 StaticCtorSection = Ctx.getELFSection(".init_array", ELF::SHT_INIT_ARRAY,
1175 ELF::SHF_WRITE | ELF::SHF_ALLOC);
1176 StaticDtorSection = Ctx.getELFSection(".fini_array", ELF::SHT_FINI_ARRAY,
1177 ELF::SHF_WRITE | ELF::SHF_ALLOC);
1180 //===----------------------------------------------------------------------===//
1181 // MachO
1182 //===----------------------------------------------------------------------===//
1184 TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO() {
1185 SupportIndirectSymViaGOTPCRel = true;
1188 void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
1189 const TargetMachine &TM) {
1190 TargetLoweringObjectFile::Initialize(Ctx, TM);
1191 if (TM.getRelocationModel() == Reloc::Static) {
1192 StaticCtorSection = Ctx.getMachOSection("__TEXT", "__constructor", 0,
1193 SectionKind::getData());
1194 StaticDtorSection = Ctx.getMachOSection("__TEXT", "__destructor", 0,
1195 SectionKind::getData());
1196 } else {
1197 StaticCtorSection = Ctx.getMachOSection("__DATA", "__mod_init_func",
1198 MachO::S_MOD_INIT_FUNC_POINTERS,
1199 SectionKind::getData());
1200 StaticDtorSection = Ctx.getMachOSection("__DATA", "__mod_term_func",
1201 MachO::S_MOD_TERM_FUNC_POINTERS,
1202 SectionKind::getData());
1205 PersonalityEncoding =
1206 dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
1207 LSDAEncoding = dwarf::DW_EH_PE_pcrel;
1208 TTypeEncoding =
1209 dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
1212 MCSection *TargetLoweringObjectFileMachO::getStaticDtorSection(
1213 unsigned Priority, const MCSymbol *KeySym) const {
1214 return StaticDtorSection;
1215 // In userspace, we lower global destructors via atexit(), but kernel/kext
1216 // environments do not provide this function so we still need to support the
1217 // legacy way here.
1218 // See the -disable-atexit-based-global-dtor-lowering CodeGen flag for more
1219 // context.
1222 void TargetLoweringObjectFileMachO::emitModuleMetadata(MCStreamer &Streamer,
1223 Module &M) const {
1224 // Emit the linker options if present.
1225 if (auto *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1226 for (const auto *Option : LinkerOptions->operands()) {
1227 SmallVector<std::string, 4> StrOptions;
1228 for (const auto &Piece : cast<MDNode>(Option)->operands())
1229 StrOptions.push_back(std::string(cast<MDString>(Piece)->getString()));
1230 Streamer.emitLinkerOptions(StrOptions);
1234 unsigned VersionVal = 0;
1235 unsigned ImageInfoFlags = 0;
1236 StringRef SectionVal;
1238 GetObjCImageInfo(M, VersionVal, ImageInfoFlags, SectionVal);
1239 emitCGProfileMetadata(Streamer, M);
1241 // The section is mandatory. If we don't have it, then we don't have GC info.
1242 if (SectionVal.empty())
1243 return;
1245 StringRef Segment, Section;
1246 unsigned TAA = 0, StubSize = 0;
1247 bool TAAParsed;
1248 if (Error E = MCSectionMachO::ParseSectionSpecifier(
1249 SectionVal, Segment, Section, TAA, TAAParsed, StubSize)) {
1250 // If invalid, report the error with report_fatal_error.
1251 report_fatal_error("Invalid section specifier '" + Section +
1252 "': " + toString(std::move(E)) + ".");
1255 // Get the section.
1256 MCSectionMachO *S = getContext().getMachOSection(
1257 Segment, Section, TAA, StubSize, SectionKind::getData());
1258 Streamer.switchSection(S);
1259 Streamer.emitLabel(getContext().
1260 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO")));
1261 Streamer.emitInt32(VersionVal);
1262 Streamer.emitInt32(ImageInfoFlags);
1263 Streamer.addBlankLine();
1266 static void checkMachOComdat(const GlobalValue *GV) {
1267 const Comdat *C = GV->getComdat();
1268 if (!C)
1269 return;
1271 report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() +
1272 "' cannot be lowered.");
1275 MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal(
1276 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1278 StringRef SectionName = GO->getSection();
1280 const GlobalVariable *GV = dyn_cast<GlobalVariable>(GO);
1281 if (GV && GV->hasImplicitSection()) {
1282 auto Attrs = GV->getAttributes();
1283 if (Attrs.hasAttribute("bss-section") && Kind.isBSS()) {
1284 SectionName = Attrs.getAttribute("bss-section").getValueAsString();
1285 } else if (Attrs.hasAttribute("rodata-section") && Kind.isReadOnly()) {
1286 SectionName = Attrs.getAttribute("rodata-section").getValueAsString();
1287 } else if (Attrs.hasAttribute("relro-section") && Kind.isReadOnlyWithRel()) {
1288 SectionName = Attrs.getAttribute("relro-section").getValueAsString();
1289 } else if (Attrs.hasAttribute("data-section") && Kind.isData()) {
1290 SectionName = Attrs.getAttribute("data-section").getValueAsString();
1294 const Function *F = dyn_cast<Function>(GO);
1295 if (F && F->hasFnAttribute("implicit-section-name")) {
1296 SectionName = F->getFnAttribute("implicit-section-name").getValueAsString();
1299 // Parse the section specifier and create it if valid.
1300 StringRef Segment, Section;
1301 unsigned TAA = 0, StubSize = 0;
1302 bool TAAParsed;
1304 checkMachOComdat(GO);
1306 if (Error E = MCSectionMachO::ParseSectionSpecifier(
1307 SectionName, Segment, Section, TAA, TAAParsed, StubSize)) {
1308 // If invalid, report the error with report_fatal_error.
1309 report_fatal_error("Global variable '" + GO->getName() +
1310 "' has an invalid section specifier '" +
1311 GO->getSection() + "': " + toString(std::move(E)) + ".");
1314 // Get the section.
1315 MCSectionMachO *S =
1316 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind);
1318 // If TAA wasn't set by ParseSectionSpecifier() above,
1319 // use the value returned by getMachOSection() as a default.
1320 if (!TAAParsed)
1321 TAA = S->getTypeAndAttributes();
1323 // Okay, now that we got the section, verify that the TAA & StubSize agree.
1324 // If the user declared multiple globals with different section flags, we need
1325 // to reject it here.
1326 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
1327 // If invalid, report the error with report_fatal_error.
1328 report_fatal_error("Global variable '" + GO->getName() +
1329 "' section type or attributes does not match previous"
1330 " section specifier");
1333 return S;
1336 MCSection *TargetLoweringObjectFileMachO::SelectSectionForGlobal(
1337 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1338 checkMachOComdat(GO);
1340 // Handle thread local data.
1341 if (Kind.isThreadBSS()) return TLSBSSSection;
1342 if (Kind.isThreadData()) return TLSDataSection;
1344 if (Kind.isText())
1345 return GO->isWeakForLinker() ? TextCoalSection : TextSection;
1347 // If this is weak/linkonce, put this in a coalescable section, either in text
1348 // or data depending on if it is writable.
1349 if (GO->isWeakForLinker()) {
1350 if (Kind.isReadOnly())
1351 return ConstTextCoalSection;
1352 if (Kind.isReadOnlyWithRel())
1353 return ConstDataCoalSection;
1354 return DataCoalSection;
1357 // FIXME: Alignment check should be handled by section classifier.
1358 if (Kind.isMergeable1ByteCString() &&
1359 GO->getParent()->getDataLayout().getPreferredAlign(
1360 cast<GlobalVariable>(GO)) < Align(32))
1361 return CStringSection;
1363 // Do not put 16-bit arrays in the UString section if they have an
1364 // externally visible label, this runs into issues with certain linker
1365 // versions.
1366 if (Kind.isMergeable2ByteCString() && !GO->hasExternalLinkage() &&
1367 GO->getParent()->getDataLayout().getPreferredAlign(
1368 cast<GlobalVariable>(GO)) < Align(32))
1369 return UStringSection;
1371 // With MachO only variables whose corresponding symbol starts with 'l' or
1372 // 'L' can be merged, so we only try merging GVs with private linkage.
1373 if (GO->hasPrivateLinkage() && Kind.isMergeableConst()) {
1374 if (Kind.isMergeableConst4())
1375 return FourByteConstantSection;
1376 if (Kind.isMergeableConst8())
1377 return EightByteConstantSection;
1378 if (Kind.isMergeableConst16())
1379 return SixteenByteConstantSection;
1382 // Otherwise, if it is readonly, but not something we can specially optimize,
1383 // just drop it in .const.
1384 if (Kind.isReadOnly())
1385 return ReadOnlySection;
1387 // If this is marked const, put it into a const section. But if the dynamic
1388 // linker needs to write to it, put it in the data segment.
1389 if (Kind.isReadOnlyWithRel())
1390 return ConstDataSection;
1392 // Put zero initialized globals with strong external linkage in the
1393 // DATA, __common section with the .zerofill directive.
1394 if (Kind.isBSSExtern())
1395 return DataCommonSection;
1397 // Put zero initialized globals with local linkage in __DATA,__bss directive
1398 // with the .zerofill directive (aka .lcomm).
1399 if (Kind.isBSSLocal())
1400 return DataBSSSection;
1402 // Otherwise, just drop the variable in the normal data section.
1403 return DataSection;
1406 MCSection *TargetLoweringObjectFileMachO::getSectionForConstant(
1407 const DataLayout &DL, SectionKind Kind, const Constant *C,
1408 Align &Alignment) const {
1409 // If this constant requires a relocation, we have to put it in the data
1410 // segment, not in the text segment.
1411 if (Kind.isData() || Kind.isReadOnlyWithRel())
1412 return ConstDataSection;
1414 if (Kind.isMergeableConst4())
1415 return FourByteConstantSection;
1416 if (Kind.isMergeableConst8())
1417 return EightByteConstantSection;
1418 if (Kind.isMergeableConst16())
1419 return SixteenByteConstantSection;
1420 return ReadOnlySection; // .const
1423 const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference(
1424 const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
1425 MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1426 // The mach-o version of this method defaults to returning a stub reference.
1428 if (Encoding & DW_EH_PE_indirect) {
1429 MachineModuleInfoMachO &MachOMMI =
1430 MMI->getObjFileInfo<MachineModuleInfoMachO>();
1432 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1434 // Add information about the stub reference to MachOMMI so that the stub
1435 // gets emitted by the asmprinter.
1436 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1437 if (!StubSym.getPointer()) {
1438 MCSymbol *Sym = TM.getSymbol(GV);
1439 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
1442 return TargetLoweringObjectFile::
1443 getTTypeReference(MCSymbolRefExpr::create(SSym, getContext()),
1444 Encoding & ~DW_EH_PE_indirect, Streamer);
1447 return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, TM,
1448 MMI, Streamer);
1451 MCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol(
1452 const GlobalValue *GV, const TargetMachine &TM,
1453 MachineModuleInfo *MMI) const {
1454 // The mach-o version of this method defaults to returning a stub reference.
1455 MachineModuleInfoMachO &MachOMMI =
1456 MMI->getObjFileInfo<MachineModuleInfoMachO>();
1458 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", TM);
1460 // Add information about the stub reference to MachOMMI so that the stub
1461 // gets emitted by the asmprinter.
1462 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym);
1463 if (!StubSym.getPointer()) {
1464 MCSymbol *Sym = TM.getSymbol(GV);
1465 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage());
1468 return SSym;
1471 const MCExpr *TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel(
1472 const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV,
1473 int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const {
1474 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation
1475 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol
1476 // through a non_lazy_ptr stub instead. One advantage is that it allows the
1477 // computation of deltas to final external symbols. Example:
1479 // _extgotequiv:
1480 // .long _extfoo
1482 // _delta:
1483 // .long _extgotequiv-_delta
1485 // is transformed to:
1487 // _delta:
1488 // .long L_extfoo$non_lazy_ptr-(_delta+0)
1490 // .section __IMPORT,__pointers,non_lazy_symbol_pointers
1491 // L_extfoo$non_lazy_ptr:
1492 // .indirect_symbol _extfoo
1493 // .long 0
1495 // The indirect symbol table (and sections of non_lazy_symbol_pointers type)
1496 // may point to both local (same translation unit) and global (other
1497 // translation units) symbols. Example:
1499 // .section __DATA,__pointers,non_lazy_symbol_pointers
1500 // L1:
1501 // .indirect_symbol _myGlobal
1502 // .long 0
1503 // L2:
1504 // .indirect_symbol _myLocal
1505 // .long _myLocal
1507 // If the symbol is local, instead of the symbol's index, the assembler
1508 // places the constant INDIRECT_SYMBOL_LOCAL into the indirect symbol table.
1509 // Then the linker will notice the constant in the table and will look at the
1510 // content of the symbol.
1511 MachineModuleInfoMachO &MachOMMI =
1512 MMI->getObjFileInfo<MachineModuleInfoMachO>();
1513 MCContext &Ctx = getContext();
1515 // The offset must consider the original displacement from the base symbol
1516 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement.
1517 Offset = -MV.getConstant();
1518 const MCSymbol *BaseSym = &MV.getSymB()->getSymbol();
1520 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated
1521 // non_lazy_ptr stubs.
1522 SmallString<128> Name;
1523 StringRef Suffix = "$non_lazy_ptr";
1524 Name += MMI->getModule()->getDataLayout().getPrivateGlobalPrefix();
1525 Name += Sym->getName();
1526 Name += Suffix;
1527 MCSymbol *Stub = Ctx.getOrCreateSymbol(Name);
1529 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub);
1531 if (!StubSym.getPointer())
1532 StubSym = MachineModuleInfoImpl::StubValueTy(const_cast<MCSymbol *>(Sym),
1533 !GV->hasLocalLinkage());
1535 const MCExpr *BSymExpr =
1536 MCSymbolRefExpr::create(BaseSym, MCSymbolRefExpr::VK_None, Ctx);
1537 const MCExpr *LHS =
1538 MCSymbolRefExpr::create(Stub, MCSymbolRefExpr::VK_None, Ctx);
1540 if (!Offset)
1541 return MCBinaryExpr::createSub(LHS, BSymExpr, Ctx);
1543 const MCExpr *RHS =
1544 MCBinaryExpr::createAdd(BSymExpr, MCConstantExpr::create(Offset, Ctx), Ctx);
1545 return MCBinaryExpr::createSub(LHS, RHS, Ctx);
1548 static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo,
1549 const MCSection &Section) {
1550 if (!AsmInfo.isSectionAtomizableBySymbols(Section))
1551 return true;
1553 // FIXME: we should be able to use private labels for sections that can't be
1554 // dead-stripped (there's no issue with blocking atomization there), but `ld
1555 // -r` sometimes drops the no_dead_strip attribute from sections so for safety
1556 // we don't allow it.
1557 return false;
1560 void TargetLoweringObjectFileMachO::getNameWithPrefix(
1561 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1562 const TargetMachine &TM) const {
1563 bool CannotUsePrivateLabel = true;
1564 if (auto *GO = GV->getAliaseeObject()) {
1565 SectionKind GOKind = TargetLoweringObjectFile::getKindForGlobal(GO, TM);
1566 const MCSection *TheSection = SectionForGlobal(GO, GOKind, TM);
1567 CannotUsePrivateLabel =
1568 !canUsePrivateLabel(*TM.getMCAsmInfo(), *TheSection);
1570 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1573 //===----------------------------------------------------------------------===//
1574 // COFF
1575 //===----------------------------------------------------------------------===//
1577 static unsigned
1578 getCOFFSectionFlags(SectionKind K, const TargetMachine &TM) {
1579 unsigned Flags = 0;
1580 bool isThumb = TM.getTargetTriple().getArch() == Triple::thumb;
1582 if (K.isMetadata())
1583 Flags |=
1584 COFF::IMAGE_SCN_MEM_DISCARDABLE;
1585 else if (K.isExclude())
1586 Flags |=
1587 COFF::IMAGE_SCN_LNK_REMOVE | COFF::IMAGE_SCN_MEM_DISCARDABLE;
1588 else if (K.isText())
1589 Flags |=
1590 COFF::IMAGE_SCN_MEM_EXECUTE |
1591 COFF::IMAGE_SCN_MEM_READ |
1592 COFF::IMAGE_SCN_CNT_CODE |
1593 (isThumb ? COFF::IMAGE_SCN_MEM_16BIT : (COFF::SectionCharacteristics)0);
1594 else if (K.isBSS())
1595 Flags |=
1596 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA |
1597 COFF::IMAGE_SCN_MEM_READ |
1598 COFF::IMAGE_SCN_MEM_WRITE;
1599 else if (K.isThreadLocal())
1600 Flags |=
1601 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1602 COFF::IMAGE_SCN_MEM_READ |
1603 COFF::IMAGE_SCN_MEM_WRITE;
1604 else if (K.isReadOnly() || K.isReadOnlyWithRel())
1605 Flags |=
1606 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1607 COFF::IMAGE_SCN_MEM_READ;
1608 else if (K.isWriteable())
1609 Flags |=
1610 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1611 COFF::IMAGE_SCN_MEM_READ |
1612 COFF::IMAGE_SCN_MEM_WRITE;
1614 return Flags;
1617 static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) {
1618 const Comdat *C = GV->getComdat();
1619 assert(C && "expected GV to have a Comdat!");
1621 StringRef ComdatGVName = C->getName();
1622 const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName);
1623 if (!ComdatGV)
1624 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1625 "' does not exist.");
1627 if (ComdatGV->getComdat() != C)
1628 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName +
1629 "' is not a key for its COMDAT.");
1631 return ComdatGV;
1634 static int getSelectionForCOFF(const GlobalValue *GV) {
1635 if (const Comdat *C = GV->getComdat()) {
1636 const GlobalValue *ComdatKey = getComdatGVForCOFF(GV);
1637 if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey))
1638 ComdatKey = GA->getAliaseeObject();
1639 if (ComdatKey == GV) {
1640 switch (C->getSelectionKind()) {
1641 case Comdat::Any:
1642 return COFF::IMAGE_COMDAT_SELECT_ANY;
1643 case Comdat::ExactMatch:
1644 return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH;
1645 case Comdat::Largest:
1646 return COFF::IMAGE_COMDAT_SELECT_LARGEST;
1647 case Comdat::NoDeduplicate:
1648 return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES;
1649 case Comdat::SameSize:
1650 return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE;
1652 } else {
1653 return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE;
1656 return 0;
1659 MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal(
1660 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1661 int Selection = 0;
1662 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1663 StringRef Name = GO->getSection();
1664 StringRef COMDATSymName = "";
1665 if (GO->hasComdat()) {
1666 Selection = getSelectionForCOFF(GO);
1667 const GlobalValue *ComdatGV;
1668 if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE)
1669 ComdatGV = getComdatGVForCOFF(GO);
1670 else
1671 ComdatGV = GO;
1673 if (!ComdatGV->hasPrivateLinkage()) {
1674 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1675 COMDATSymName = Sym->getName();
1676 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1677 } else {
1678 Selection = 0;
1682 return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName,
1683 Selection);
1686 static StringRef getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
1687 if (Kind.isText())
1688 return ".text";
1689 if (Kind.isBSS())
1690 return ".bss";
1691 if (Kind.isThreadLocal())
1692 return ".tls$";
1693 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1694 return ".rdata";
1695 return ".data";
1698 MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal(
1699 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
1700 // If we have -ffunction-sections then we should emit the global value to a
1701 // uniqued section specifically for it.
1702 bool EmitUniquedSection;
1703 if (Kind.isText())
1704 EmitUniquedSection = TM.getFunctionSections();
1705 else
1706 EmitUniquedSection = TM.getDataSections();
1708 if ((EmitUniquedSection && !Kind.isCommon()) || GO->hasComdat()) {
1709 SmallString<256> Name = getCOFFSectionNameForUniqueGlobal(Kind);
1711 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1713 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1714 int Selection = getSelectionForCOFF(GO);
1715 if (!Selection)
1716 Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES;
1717 const GlobalValue *ComdatGV;
1718 if (GO->hasComdat())
1719 ComdatGV = getComdatGVForCOFF(GO);
1720 else
1721 ComdatGV = GO;
1723 unsigned UniqueID = MCContext::GenericSectionID;
1724 if (EmitUniquedSection)
1725 UniqueID = NextUniqueID++;
1727 if (!ComdatGV->hasPrivateLinkage()) {
1728 MCSymbol *Sym = TM.getSymbol(ComdatGV);
1729 StringRef COMDATSymName = Sym->getName();
1731 if (const auto *F = dyn_cast<Function>(GO))
1732 if (std::optional<StringRef> Prefix = F->getSectionPrefix())
1733 raw_svector_ostream(Name) << '$' << *Prefix;
1735 // Append "$symbol" to the section name *before* IR-level mangling is
1736 // applied when targetting mingw. This is what GCC does, and the ld.bfd
1737 // COFF linker will not properly handle comdats otherwise.
1738 if (getContext().getTargetTriple().isWindowsGNUEnvironment())
1739 raw_svector_ostream(Name) << '$' << ComdatGV->getName();
1741 return getContext().getCOFFSection(Name, Characteristics, Kind,
1742 COMDATSymName, Selection, UniqueID);
1743 } else {
1744 SmallString<256> TmpData;
1745 getMangler().getNameWithPrefix(TmpData, GO, /*CannotUsePrivateLabel=*/true);
1746 return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData,
1747 Selection, UniqueID);
1751 if (Kind.isText())
1752 return TextSection;
1754 if (Kind.isThreadLocal())
1755 return TLSDataSection;
1757 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel())
1758 return ReadOnlySection;
1760 // Note: we claim that common symbols are put in BSSSection, but they are
1761 // really emitted with the magic .comm directive, which creates a symbol table
1762 // entry but not a section.
1763 if (Kind.isBSS() || Kind.isCommon())
1764 return BSSSection;
1766 return DataSection;
1769 void TargetLoweringObjectFileCOFF::getNameWithPrefix(
1770 SmallVectorImpl<char> &OutName, const GlobalValue *GV,
1771 const TargetMachine &TM) const {
1772 bool CannotUsePrivateLabel = false;
1773 if (GV->hasPrivateLinkage() &&
1774 ((isa<Function>(GV) && TM.getFunctionSections()) ||
1775 (isa<GlobalVariable>(GV) && TM.getDataSections())))
1776 CannotUsePrivateLabel = true;
1778 getMangler().getNameWithPrefix(OutName, GV, CannotUsePrivateLabel);
1781 MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable(
1782 const Function &F, const TargetMachine &TM) const {
1783 // If the function can be removed, produce a unique section so that
1784 // the table doesn't prevent the removal.
1785 const Comdat *C = F.getComdat();
1786 bool EmitUniqueSection = TM.getFunctionSections() || C;
1787 if (!EmitUniqueSection)
1788 return ReadOnlySection;
1790 // FIXME: we should produce a symbol for F instead.
1791 if (F.hasPrivateLinkage())
1792 return ReadOnlySection;
1794 MCSymbol *Sym = TM.getSymbol(&F);
1795 StringRef COMDATSymName = Sym->getName();
1797 SectionKind Kind = SectionKind::getReadOnly();
1798 StringRef SecName = getCOFFSectionNameForUniqueGlobal(Kind);
1799 unsigned Characteristics = getCOFFSectionFlags(Kind, TM);
1800 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
1801 unsigned UniqueID = NextUniqueID++;
1803 return getContext().getCOFFSection(
1804 SecName, Characteristics, Kind, COMDATSymName,
1805 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE, UniqueID);
1808 bool TargetLoweringObjectFileCOFF::shouldPutJumpTableInFunctionSection(
1809 bool UsesLabelDifference, const Function &F) const {
1810 if (TM->getTargetTriple().getArch() == Triple::x86_64) {
1811 if (!JumpTableInFunctionSection) {
1812 // We can always create relative relocations, so use another section
1813 // that can be marked non-executable.
1814 return false;
1817 return TargetLoweringObjectFile::shouldPutJumpTableInFunctionSection(
1818 UsesLabelDifference, F);
1821 void TargetLoweringObjectFileCOFF::emitModuleMetadata(MCStreamer &Streamer,
1822 Module &M) const {
1823 emitLinkerDirectives(Streamer, M);
1825 unsigned Version = 0;
1826 unsigned Flags = 0;
1827 StringRef Section;
1829 GetObjCImageInfo(M, Version, Flags, Section);
1830 if (!Section.empty()) {
1831 auto &C = getContext();
1832 auto *S = C.getCOFFSection(Section,
1833 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1834 COFF::IMAGE_SCN_MEM_READ,
1835 SectionKind::getReadOnly());
1836 Streamer.switchSection(S);
1837 Streamer.emitLabel(C.getOrCreateSymbol(StringRef("OBJC_IMAGE_INFO")));
1838 Streamer.emitInt32(Version);
1839 Streamer.emitInt32(Flags);
1840 Streamer.addBlankLine();
1843 emitCGProfileMetadata(Streamer, M);
1846 void TargetLoweringObjectFileCOFF::emitLinkerDirectives(
1847 MCStreamer &Streamer, Module &M) const {
1848 if (NamedMDNode *LinkerOptions = M.getNamedMetadata("llvm.linker.options")) {
1849 // Emit the linker options to the linker .drectve section. According to the
1850 // spec, this section is a space-separated string containing flags for
1851 // linker.
1852 MCSection *Sec = getDrectveSection();
1853 Streamer.switchSection(Sec);
1854 for (const auto *Option : LinkerOptions->operands()) {
1855 for (const auto &Piece : cast<MDNode>(Option)->operands()) {
1856 // Lead with a space for consistency with our dllexport implementation.
1857 std::string Directive(" ");
1858 Directive.append(std::string(cast<MDString>(Piece)->getString()));
1859 Streamer.emitBytes(Directive);
1864 // Emit /EXPORT: flags for each exported global as necessary.
1865 std::string Flags;
1866 for (const GlobalValue &GV : M.global_values()) {
1867 raw_string_ostream OS(Flags);
1868 emitLinkerFlagsForGlobalCOFF(OS, &GV, getContext().getTargetTriple(),
1869 getMangler());
1870 OS.flush();
1871 if (!Flags.empty()) {
1872 Streamer.switchSection(getDrectveSection());
1873 Streamer.emitBytes(Flags);
1875 Flags.clear();
1878 // Emit /INCLUDE: flags for each used global as necessary.
1879 if (const auto *LU = M.getNamedGlobal("llvm.used")) {
1880 assert(LU->hasInitializer() && "expected llvm.used to have an initializer");
1881 assert(isa<ArrayType>(LU->getValueType()) &&
1882 "expected llvm.used to be an array type");
1883 if (const auto *A = cast<ConstantArray>(LU->getInitializer())) {
1884 for (const Value *Op : A->operands()) {
1885 const auto *GV = cast<GlobalValue>(Op->stripPointerCasts());
1886 // Global symbols with internal or private linkage are not visible to
1887 // the linker, and thus would cause an error when the linker tried to
1888 // preserve the symbol due to the `/include:` directive.
1889 if (GV->hasLocalLinkage())
1890 continue;
1892 raw_string_ostream OS(Flags);
1893 emitLinkerFlagsForUsedCOFF(OS, GV, getContext().getTargetTriple(),
1894 getMangler());
1895 OS.flush();
1897 if (!Flags.empty()) {
1898 Streamer.switchSection(getDrectveSection());
1899 Streamer.emitBytes(Flags);
1901 Flags.clear();
1907 void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx,
1908 const TargetMachine &TM) {
1909 TargetLoweringObjectFile::Initialize(Ctx, TM);
1910 this->TM = &TM;
1911 const Triple &T = TM.getTargetTriple();
1912 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
1913 StaticCtorSection =
1914 Ctx.getCOFFSection(".CRT$XCU", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1915 COFF::IMAGE_SCN_MEM_READ,
1916 SectionKind::getReadOnly());
1917 StaticDtorSection =
1918 Ctx.getCOFFSection(".CRT$XTX", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1919 COFF::IMAGE_SCN_MEM_READ,
1920 SectionKind::getReadOnly());
1921 } else {
1922 StaticCtorSection = Ctx.getCOFFSection(
1923 ".ctors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1924 COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
1925 SectionKind::getData());
1926 StaticDtorSection = Ctx.getCOFFSection(
1927 ".dtors", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1928 COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
1929 SectionKind::getData());
1933 static MCSectionCOFF *getCOFFStaticStructorSection(MCContext &Ctx,
1934 const Triple &T, bool IsCtor,
1935 unsigned Priority,
1936 const MCSymbol *KeySym,
1937 MCSectionCOFF *Default) {
1938 if (T.isWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) {
1939 // If the priority is the default, use .CRT$XCU, possibly associative.
1940 if (Priority == 65535)
1941 return Ctx.getAssociativeCOFFSection(Default, KeySym, 0);
1943 // Otherwise, we need to compute a new section name. Low priorities should
1944 // run earlier. The linker will sort sections ASCII-betically, and we need a
1945 // string that sorts between .CRT$XCA and .CRT$XCU. In the general case, we
1946 // make a name like ".CRT$XCT12345", since that runs before .CRT$XCU. Really
1947 // low priorities need to sort before 'L', since the CRT uses that
1948 // internally, so we use ".CRT$XCA00001" for them. We have a contract with
1949 // the frontend that "init_seg(compiler)" corresponds to priority 200 and
1950 // "init_seg(lib)" corresponds to priority 400, and those respectively use
1951 // 'C' and 'L' without the priority suffix. Priorities between 200 and 400
1952 // use 'C' with the priority as a suffix.
1953 SmallString<24> Name;
1954 char LastLetter = 'T';
1955 bool AddPrioritySuffix = Priority != 200 && Priority != 400;
1956 if (Priority < 200)
1957 LastLetter = 'A';
1958 else if (Priority < 400)
1959 LastLetter = 'C';
1960 else if (Priority == 400)
1961 LastLetter = 'L';
1962 raw_svector_ostream OS(Name);
1963 OS << ".CRT$X" << (IsCtor ? "C" : "T") << LastLetter;
1964 if (AddPrioritySuffix)
1965 OS << format("%05u", Priority);
1966 MCSectionCOFF *Sec = Ctx.getCOFFSection(
1967 Name, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ,
1968 SectionKind::getReadOnly());
1969 return Ctx.getAssociativeCOFFSection(Sec, KeySym, 0);
1972 std::string Name = IsCtor ? ".ctors" : ".dtors";
1973 if (Priority != 65535)
1974 raw_string_ostream(Name) << format(".%05u", 65535 - Priority);
1976 return Ctx.getAssociativeCOFFSection(
1977 Ctx.getCOFFSection(Name, COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
1978 COFF::IMAGE_SCN_MEM_READ |
1979 COFF::IMAGE_SCN_MEM_WRITE,
1980 SectionKind::getData()),
1981 KeySym, 0);
1984 MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection(
1985 unsigned Priority, const MCSymbol *KeySym) const {
1986 return getCOFFStaticStructorSection(
1987 getContext(), getContext().getTargetTriple(), true, Priority, KeySym,
1988 cast<MCSectionCOFF>(StaticCtorSection));
1991 MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection(
1992 unsigned Priority, const MCSymbol *KeySym) const {
1993 return getCOFFStaticStructorSection(
1994 getContext(), getContext().getTargetTriple(), false, Priority, KeySym,
1995 cast<MCSectionCOFF>(StaticDtorSection));
1998 const MCExpr *TargetLoweringObjectFileCOFF::lowerRelativeReference(
1999 const GlobalValue *LHS, const GlobalValue *RHS,
2000 const TargetMachine &TM) const {
2001 const Triple &T = TM.getTargetTriple();
2002 if (T.isOSCygMing())
2003 return nullptr;
2005 // Our symbols should exist in address space zero, cowardly no-op if
2006 // otherwise.
2007 if (LHS->getType()->getPointerAddressSpace() != 0 ||
2008 RHS->getType()->getPointerAddressSpace() != 0)
2009 return nullptr;
2011 // Both ptrtoint instructions must wrap global objects:
2012 // - Only global variables are eligible for image relative relocations.
2013 // - The subtrahend refers to the special symbol __ImageBase, a GlobalVariable.
2014 // We expect __ImageBase to be a global variable without a section, externally
2015 // defined.
2017 // It should look something like this: @__ImageBase = external constant i8
2018 if (!isa<GlobalObject>(LHS) || !isa<GlobalVariable>(RHS) ||
2019 LHS->isThreadLocal() || RHS->isThreadLocal() ||
2020 RHS->getName() != "__ImageBase" || !RHS->hasExternalLinkage() ||
2021 cast<GlobalVariable>(RHS)->hasInitializer() || RHS->hasSection())
2022 return nullptr;
2024 return MCSymbolRefExpr::create(TM.getSymbol(LHS),
2025 MCSymbolRefExpr::VK_COFF_IMGREL32,
2026 getContext());
2029 static std::string APIntToHexString(const APInt &AI) {
2030 unsigned Width = (AI.getBitWidth() / 8) * 2;
2031 std::string HexString = toString(AI, 16, /*Signed=*/false);
2032 llvm::transform(HexString, HexString.begin(), tolower);
2033 unsigned Size = HexString.size();
2034 assert(Width >= Size && "hex string is too large!");
2035 HexString.insert(HexString.begin(), Width - Size, '0');
2037 return HexString;
2040 static std::string scalarConstantToHexString(const Constant *C) {
2041 Type *Ty = C->getType();
2042 if (isa<UndefValue>(C)) {
2043 return APIntToHexString(APInt::getZero(Ty->getPrimitiveSizeInBits()));
2044 } else if (const auto *CFP = dyn_cast<ConstantFP>(C)) {
2045 return APIntToHexString(CFP->getValueAPF().bitcastToAPInt());
2046 } else if (const auto *CI = dyn_cast<ConstantInt>(C)) {
2047 return APIntToHexString(CI->getValue());
2048 } else {
2049 unsigned NumElements;
2050 if (auto *VTy = dyn_cast<VectorType>(Ty))
2051 NumElements = cast<FixedVectorType>(VTy)->getNumElements();
2052 else
2053 NumElements = Ty->getArrayNumElements();
2054 std::string HexString;
2055 for (int I = NumElements - 1, E = -1; I != E; --I)
2056 HexString += scalarConstantToHexString(C->getAggregateElement(I));
2057 return HexString;
2061 MCSection *TargetLoweringObjectFileCOFF::getSectionForConstant(
2062 const DataLayout &DL, SectionKind Kind, const Constant *C,
2063 Align &Alignment) const {
2064 if (Kind.isMergeableConst() && C &&
2065 getContext().getAsmInfo()->hasCOFFComdatConstants()) {
2066 // This creates comdat sections with the given symbol name, but unless
2067 // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol
2068 // will be created with a null storage class, which makes GNU binutils
2069 // error out.
2070 const unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
2071 COFF::IMAGE_SCN_MEM_READ |
2072 COFF::IMAGE_SCN_LNK_COMDAT;
2073 std::string COMDATSymName;
2074 if (Kind.isMergeableConst4()) {
2075 if (Alignment <= 4) {
2076 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2077 Alignment = Align(4);
2079 } else if (Kind.isMergeableConst8()) {
2080 if (Alignment <= 8) {
2081 COMDATSymName = "__real@" + scalarConstantToHexString(C);
2082 Alignment = Align(8);
2084 } else if (Kind.isMergeableConst16()) {
2085 // FIXME: These may not be appropriate for non-x86 architectures.
2086 if (Alignment <= 16) {
2087 COMDATSymName = "__xmm@" + scalarConstantToHexString(C);
2088 Alignment = Align(16);
2090 } else if (Kind.isMergeableConst32()) {
2091 if (Alignment <= 32) {
2092 COMDATSymName = "__ymm@" + scalarConstantToHexString(C);
2093 Alignment = Align(32);
2097 if (!COMDATSymName.empty())
2098 return getContext().getCOFFSection(".rdata", Characteristics, Kind,
2099 COMDATSymName,
2100 COFF::IMAGE_COMDAT_SELECT_ANY);
2103 return TargetLoweringObjectFile::getSectionForConstant(DL, Kind, C,
2104 Alignment);
2107 //===----------------------------------------------------------------------===//
2108 // Wasm
2109 //===----------------------------------------------------------------------===//
2111 static const Comdat *getWasmComdat(const GlobalValue *GV) {
2112 const Comdat *C = GV->getComdat();
2113 if (!C)
2114 return nullptr;
2116 if (C->getSelectionKind() != Comdat::Any)
2117 report_fatal_error("WebAssembly COMDATs only support "
2118 "SelectionKind::Any, '" + C->getName() + "' cannot be "
2119 "lowered.");
2121 return C;
2124 static unsigned getWasmSectionFlags(SectionKind K) {
2125 unsigned Flags = 0;
2127 if (K.isThreadLocal())
2128 Flags |= wasm::WASM_SEG_FLAG_TLS;
2130 if (K.isMergeableCString())
2131 Flags |= wasm::WASM_SEG_FLAG_STRINGS;
2133 // TODO(sbc): Add suport for K.isMergeableConst()
2135 return Flags;
2138 MCSection *TargetLoweringObjectFileWasm::getExplicitSectionGlobal(
2139 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2140 // We don't support explict section names for functions in the wasm object
2141 // format. Each function has to be in its own unique section.
2142 if (isa<Function>(GO)) {
2143 return SelectSectionForGlobal(GO, Kind, TM);
2146 StringRef Name = GO->getSection();
2148 // Certain data sections we treat as named custom sections rather than
2149 // segments within the data section.
2150 // This could be avoided if all data segements (the wasm sense) were
2151 // represented as their own sections (in the llvm sense).
2152 // TODO(sbc): https://github.com/WebAssembly/tool-conventions/issues/138
2153 if (Name == ".llvmcmd" || Name == ".llvmbc")
2154 Kind = SectionKind::getMetadata();
2156 StringRef Group = "";
2157 if (const Comdat *C = getWasmComdat(GO)) {
2158 Group = C->getName();
2161 unsigned Flags = getWasmSectionFlags(Kind);
2162 MCSectionWasm *Section = getContext().getWasmSection(
2163 Name, Kind, Flags, Group, MCContext::GenericSectionID);
2165 return Section;
2168 static MCSectionWasm *selectWasmSectionForGlobal(
2169 MCContext &Ctx, const GlobalObject *GO, SectionKind Kind, Mangler &Mang,
2170 const TargetMachine &TM, bool EmitUniqueSection, unsigned *NextUniqueID) {
2171 StringRef Group = "";
2172 if (const Comdat *C = getWasmComdat(GO)) {
2173 Group = C->getName();
2176 bool UniqueSectionNames = TM.getUniqueSectionNames();
2177 SmallString<128> Name = getSectionPrefixForGlobal(Kind, /*IsLarge=*/false);
2179 if (const auto *F = dyn_cast<Function>(GO)) {
2180 const auto &OptionalPrefix = F->getSectionPrefix();
2181 if (OptionalPrefix)
2182 raw_svector_ostream(Name) << '.' << *OptionalPrefix;
2185 if (EmitUniqueSection && UniqueSectionNames) {
2186 Name.push_back('.');
2187 TM.getNameWithPrefix(Name, GO, Mang, true);
2189 unsigned UniqueID = MCContext::GenericSectionID;
2190 if (EmitUniqueSection && !UniqueSectionNames) {
2191 UniqueID = *NextUniqueID;
2192 (*NextUniqueID)++;
2195 unsigned Flags = getWasmSectionFlags(Kind);
2196 return Ctx.getWasmSection(Name, Kind, Flags, Group, UniqueID);
2199 MCSection *TargetLoweringObjectFileWasm::SelectSectionForGlobal(
2200 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2202 if (Kind.isCommon())
2203 report_fatal_error("mergable sections not supported yet on wasm");
2205 // If we have -ffunction-section or -fdata-section then we should emit the
2206 // global value to a uniqued section specifically for it.
2207 bool EmitUniqueSection = false;
2208 if (Kind.isText())
2209 EmitUniqueSection = TM.getFunctionSections();
2210 else
2211 EmitUniqueSection = TM.getDataSections();
2212 EmitUniqueSection |= GO->hasComdat();
2214 return selectWasmSectionForGlobal(getContext(), GO, Kind, getMangler(), TM,
2215 EmitUniqueSection, &NextUniqueID);
2218 bool TargetLoweringObjectFileWasm::shouldPutJumpTableInFunctionSection(
2219 bool UsesLabelDifference, const Function &F) const {
2220 // We can always create relative relocations, so use another section
2221 // that can be marked non-executable.
2222 return false;
2225 const MCExpr *TargetLoweringObjectFileWasm::lowerRelativeReference(
2226 const GlobalValue *LHS, const GlobalValue *RHS,
2227 const TargetMachine &TM) const {
2228 // We may only use a PLT-relative relocation to refer to unnamed_addr
2229 // functions.
2230 if (!LHS->hasGlobalUnnamedAddr() || !LHS->getValueType()->isFunctionTy())
2231 return nullptr;
2233 // Basic correctness checks.
2234 if (LHS->getType()->getPointerAddressSpace() != 0 ||
2235 RHS->getType()->getPointerAddressSpace() != 0 || LHS->isThreadLocal() ||
2236 RHS->isThreadLocal())
2237 return nullptr;
2239 return MCBinaryExpr::createSub(
2240 MCSymbolRefExpr::create(TM.getSymbol(LHS), MCSymbolRefExpr::VK_None,
2241 getContext()),
2242 MCSymbolRefExpr::create(TM.getSymbol(RHS), getContext()), getContext());
2245 void TargetLoweringObjectFileWasm::InitializeWasm() {
2246 StaticCtorSection =
2247 getContext().getWasmSection(".init_array", SectionKind::getData());
2249 // We don't use PersonalityEncoding and LSDAEncoding because we don't emit
2250 // .cfi directives. We use TTypeEncoding to encode typeinfo global variables.
2251 TTypeEncoding = dwarf::DW_EH_PE_absptr;
2254 MCSection *TargetLoweringObjectFileWasm::getStaticCtorSection(
2255 unsigned Priority, const MCSymbol *KeySym) const {
2256 return Priority == UINT16_MAX ?
2257 StaticCtorSection :
2258 getContext().getWasmSection(".init_array." + utostr(Priority),
2259 SectionKind::getData());
2262 MCSection *TargetLoweringObjectFileWasm::getStaticDtorSection(
2263 unsigned Priority, const MCSymbol *KeySym) const {
2264 report_fatal_error("@llvm.global_dtors should have been lowered already");
2267 //===----------------------------------------------------------------------===//
2268 // XCOFF
2269 //===----------------------------------------------------------------------===//
2270 bool TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock(
2271 const MachineFunction *MF) {
2272 if (!MF->getLandingPads().empty())
2273 return true;
2275 const Function &F = MF->getFunction();
2276 if (!F.hasPersonalityFn() || !F.needsUnwindTableEntry())
2277 return false;
2279 const GlobalValue *Per =
2280 dyn_cast<GlobalValue>(F.getPersonalityFn()->stripPointerCasts());
2281 assert(Per && "Personality routine is not a GlobalValue type.");
2282 if (isNoOpWithoutInvoke(classifyEHPersonality(Per)))
2283 return false;
2285 return true;
2288 bool TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(
2289 const MachineFunction *MF) {
2290 const Function &F = MF->getFunction();
2291 if (!F.hasStackProtectorFnAttr())
2292 return false;
2293 // FIXME: check presence of canary word
2294 // There are cases that the stack protectors are not really inserted even if
2295 // the attributes are on.
2296 return true;
2299 MCSymbol *
2300 TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(const MachineFunction *MF) {
2301 return MF->getMMI().getContext().getOrCreateSymbol(
2302 "__ehinfo." + Twine(MF->getFunctionNumber()));
2305 MCSymbol *
2306 TargetLoweringObjectFileXCOFF::getTargetSymbol(const GlobalValue *GV,
2307 const TargetMachine &TM) const {
2308 // We always use a qualname symbol for a GV that represents
2309 // a declaration, a function descriptor, or a common symbol.
2310 // If a GV represents a GlobalVariable and -fdata-sections is enabled, we
2311 // also return a qualname so that a label symbol could be avoided.
2312 // It is inherently ambiguous when the GO represents the address of a
2313 // function, as the GO could either represent a function descriptor or a
2314 // function entry point. We choose to always return a function descriptor
2315 // here.
2316 if (const GlobalObject *GO = dyn_cast<GlobalObject>(GV)) {
2317 if (GO->isDeclarationForLinker())
2318 return cast<MCSectionXCOFF>(getSectionForExternalReference(GO, TM))
2319 ->getQualNameSymbol();
2321 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
2322 if (GVar->hasAttribute("toc-data"))
2323 return cast<MCSectionXCOFF>(
2324 SectionForGlobal(GVar, SectionKind::getData(), TM))
2325 ->getQualNameSymbol();
2327 SectionKind GOKind = getKindForGlobal(GO, TM);
2328 if (GOKind.isText())
2329 return cast<MCSectionXCOFF>(
2330 getSectionForFunctionDescriptor(cast<Function>(GO), TM))
2331 ->getQualNameSymbol();
2332 if ((TM.getDataSections() && !GO->hasSection()) || GO->hasCommonLinkage() ||
2333 GOKind.isBSSLocal() || GOKind.isThreadBSSLocal())
2334 return cast<MCSectionXCOFF>(SectionForGlobal(GO, GOKind, TM))
2335 ->getQualNameSymbol();
2338 // For all other cases, fall back to getSymbol to return the unqualified name.
2339 return nullptr;
2342 MCSection *TargetLoweringObjectFileXCOFF::getExplicitSectionGlobal(
2343 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2344 if (!GO->hasSection())
2345 report_fatal_error("#pragma clang section is not yet supported");
2347 StringRef SectionName = GO->getSection();
2349 // Handle the XCOFF::TD case first, then deal with the rest.
2350 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2351 if (GVar->hasAttribute("toc-data"))
2352 return getContext().getXCOFFSection(
2353 SectionName, Kind,
2354 XCOFF::CsectProperties(/*MappingClass*/ XCOFF::XMC_TD, XCOFF::XTY_SD),
2355 /* MultiSymbolsAllowed*/ true);
2357 XCOFF::StorageMappingClass MappingClass;
2358 if (Kind.isText())
2359 MappingClass = XCOFF::XMC_PR;
2360 else if (Kind.isData() || Kind.isBSS())
2361 MappingClass = XCOFF::XMC_RW;
2362 else if (Kind.isReadOnlyWithRel())
2363 MappingClass =
2364 TM.Options.XCOFFReadOnlyPointers ? XCOFF::XMC_RO : XCOFF::XMC_RW;
2365 else if (Kind.isReadOnly())
2366 MappingClass = XCOFF::XMC_RO;
2367 else
2368 report_fatal_error("XCOFF other section types not yet implemented.");
2370 return getContext().getXCOFFSection(
2371 SectionName, Kind, XCOFF::CsectProperties(MappingClass, XCOFF::XTY_SD),
2372 /* MultiSymbolsAllowed*/ true);
2375 MCSection *TargetLoweringObjectFileXCOFF::getSectionForExternalReference(
2376 const GlobalObject *GO, const TargetMachine &TM) const {
2377 assert(GO->isDeclarationForLinker() &&
2378 "Tried to get ER section for a defined global.");
2380 SmallString<128> Name;
2381 getNameWithPrefix(Name, GO, TM);
2383 XCOFF::StorageMappingClass SMC =
2384 isa<Function>(GO) ? XCOFF::XMC_DS : XCOFF::XMC_UA;
2385 if (GO->isThreadLocal())
2386 SMC = XCOFF::XMC_UL;
2388 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2389 if (GVar->hasAttribute("toc-data"))
2390 SMC = XCOFF::XMC_TD;
2392 // Externals go into a csect of type ER.
2393 return getContext().getXCOFFSection(
2394 Name, SectionKind::getMetadata(),
2395 XCOFF::CsectProperties(SMC, XCOFF::XTY_ER));
2398 MCSection *TargetLoweringObjectFileXCOFF::SelectSectionForGlobal(
2399 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2400 // Handle the XCOFF::TD case first, then deal with the rest.
2401 if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GO))
2402 if (GVar->hasAttribute("toc-data")) {
2403 SmallString<128> Name;
2404 getNameWithPrefix(Name, GO, TM);
2405 return getContext().getXCOFFSection(
2406 Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_TD, XCOFF::XTY_SD),
2407 /* MultiSymbolsAllowed*/ true);
2410 // Common symbols go into a csect with matching name which will get mapped
2411 // into the .bss section.
2412 // Zero-initialized local TLS symbols go into a csect with matching name which
2413 // will get mapped into the .tbss section.
2414 if (Kind.isBSSLocal() || GO->hasCommonLinkage() || Kind.isThreadBSSLocal()) {
2415 SmallString<128> Name;
2416 getNameWithPrefix(Name, GO, TM);
2417 XCOFF::StorageMappingClass SMC = Kind.isBSSLocal() ? XCOFF::XMC_BS
2418 : Kind.isCommon() ? XCOFF::XMC_RW
2419 : XCOFF::XMC_UL;
2420 return getContext().getXCOFFSection(
2421 Name, Kind, XCOFF::CsectProperties(SMC, XCOFF::XTY_CM));
2424 if (Kind.isMergeableCString()) {
2425 Align Alignment = GO->getParent()->getDataLayout().getPreferredAlign(
2426 cast<GlobalVariable>(GO));
2428 unsigned EntrySize = getEntrySizeForKind(Kind);
2429 std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + ".";
2430 SmallString<128> Name;
2431 Name = SizeSpec + utostr(Alignment.value());
2433 if (TM.getDataSections())
2434 getNameWithPrefix(Name, GO, TM);
2436 return getContext().getXCOFFSection(
2437 Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_RO, XCOFF::XTY_SD),
2438 /* MultiSymbolsAllowed*/ !TM.getDataSections());
2441 if (Kind.isText()) {
2442 if (TM.getFunctionSections()) {
2443 return cast<MCSymbolXCOFF>(getFunctionEntryPointSymbol(GO, TM))
2444 ->getRepresentedCsect();
2446 return TextSection;
2449 if (TM.Options.XCOFFReadOnlyPointers && Kind.isReadOnlyWithRel()) {
2450 if (!TM.getDataSections())
2451 report_fatal_error(
2452 "ReadOnlyPointers is supported only if data sections is turned on");
2454 SmallString<128> Name;
2455 getNameWithPrefix(Name, GO, TM);
2456 return getContext().getXCOFFSection(
2457 Name, SectionKind::getReadOnly(),
2458 XCOFF::CsectProperties(XCOFF::XMC_RO, XCOFF::XTY_SD));
2461 // For BSS kind, zero initialized data must be emitted to the .data section
2462 // because external linkage control sections that get mapped to the .bss
2463 // section will be linked as tentative defintions, which is only appropriate
2464 // for SectionKind::Common.
2465 if (Kind.isData() || Kind.isReadOnlyWithRel() || Kind.isBSS()) {
2466 if (TM.getDataSections()) {
2467 SmallString<128> Name;
2468 getNameWithPrefix(Name, GO, TM);
2469 return getContext().getXCOFFSection(
2470 Name, SectionKind::getData(),
2471 XCOFF::CsectProperties(XCOFF::XMC_RW, XCOFF::XTY_SD));
2473 return DataSection;
2476 if (Kind.isReadOnly()) {
2477 if (TM.getDataSections()) {
2478 SmallString<128> Name;
2479 getNameWithPrefix(Name, GO, TM);
2480 return getContext().getXCOFFSection(
2481 Name, SectionKind::getReadOnly(),
2482 XCOFF::CsectProperties(XCOFF::XMC_RO, XCOFF::XTY_SD));
2484 return ReadOnlySection;
2487 // External/weak TLS data and initialized local TLS data are not eligible
2488 // to be put into common csect. If data sections are enabled, thread
2489 // data are emitted into separate sections. Otherwise, thread data
2490 // are emitted into the .tdata section.
2491 if (Kind.isThreadLocal()) {
2492 if (TM.getDataSections()) {
2493 SmallString<128> Name;
2494 getNameWithPrefix(Name, GO, TM);
2495 return getContext().getXCOFFSection(
2496 Name, Kind, XCOFF::CsectProperties(XCOFF::XMC_TL, XCOFF::XTY_SD));
2498 return TLSDataSection;
2501 report_fatal_error("XCOFF other section types not yet implemented.");
2504 MCSection *TargetLoweringObjectFileXCOFF::getSectionForJumpTable(
2505 const Function &F, const TargetMachine &TM) const {
2506 assert (!F.getComdat() && "Comdat not supported on XCOFF.");
2508 if (!TM.getFunctionSections())
2509 return ReadOnlySection;
2511 // If the function can be removed, produce a unique section so that
2512 // the table doesn't prevent the removal.
2513 SmallString<128> NameStr(".rodata.jmp..");
2514 getNameWithPrefix(NameStr, &F, TM);
2515 return getContext().getXCOFFSection(
2516 NameStr, SectionKind::getReadOnly(),
2517 XCOFF::CsectProperties(XCOFF::XMC_RO, XCOFF::XTY_SD));
2520 bool TargetLoweringObjectFileXCOFF::shouldPutJumpTableInFunctionSection(
2521 bool UsesLabelDifference, const Function &F) const {
2522 return false;
2525 /// Given a mergeable constant with the specified size and relocation
2526 /// information, return a section that it should be placed in.
2527 MCSection *TargetLoweringObjectFileXCOFF::getSectionForConstant(
2528 const DataLayout &DL, SectionKind Kind, const Constant *C,
2529 Align &Alignment) const {
2530 // TODO: Enable emiting constant pool to unique sections when we support it.
2531 if (Alignment > Align(16))
2532 report_fatal_error("Alignments greater than 16 not yet supported.");
2534 if (Alignment == Align(8)) {
2535 assert(ReadOnly8Section && "Section should always be initialized.");
2536 return ReadOnly8Section;
2539 if (Alignment == Align(16)) {
2540 assert(ReadOnly16Section && "Section should always be initialized.");
2541 return ReadOnly16Section;
2544 return ReadOnlySection;
2547 void TargetLoweringObjectFileXCOFF::Initialize(MCContext &Ctx,
2548 const TargetMachine &TgtM) {
2549 TargetLoweringObjectFile::Initialize(Ctx, TgtM);
2550 TTypeEncoding =
2551 dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_datarel |
2552 (TgtM.getTargetTriple().isArch32Bit() ? dwarf::DW_EH_PE_sdata4
2553 : dwarf::DW_EH_PE_sdata8);
2554 PersonalityEncoding = 0;
2555 LSDAEncoding = 0;
2556 CallSiteEncoding = dwarf::DW_EH_PE_udata4;
2558 // AIX debug for thread local location is not ready. And for integrated as
2559 // mode, the relocatable address for the thread local variable will cause
2560 // linker error. So disable the location attribute generation for thread local
2561 // variables for now.
2562 // FIXME: when TLS debug on AIX is ready, remove this setting.
2563 SupportDebugThreadLocalLocation = false;
2566 MCSection *TargetLoweringObjectFileXCOFF::getStaticCtorSection(
2567 unsigned Priority, const MCSymbol *KeySym) const {
2568 report_fatal_error("no static constructor section on AIX");
2571 MCSection *TargetLoweringObjectFileXCOFF::getStaticDtorSection(
2572 unsigned Priority, const MCSymbol *KeySym) const {
2573 report_fatal_error("no static destructor section on AIX");
2576 const MCExpr *TargetLoweringObjectFileXCOFF::lowerRelativeReference(
2577 const GlobalValue *LHS, const GlobalValue *RHS,
2578 const TargetMachine &TM) const {
2579 /* Not implemented yet, but don't crash, return nullptr. */
2580 return nullptr;
2583 XCOFF::StorageClass
2584 TargetLoweringObjectFileXCOFF::getStorageClassForGlobal(const GlobalValue *GV) {
2585 assert(!isa<GlobalIFunc>(GV) && "GlobalIFunc is not supported on AIX.");
2587 switch (GV->getLinkage()) {
2588 case GlobalValue::InternalLinkage:
2589 case GlobalValue::PrivateLinkage:
2590 return XCOFF::C_HIDEXT;
2591 case GlobalValue::ExternalLinkage:
2592 case GlobalValue::CommonLinkage:
2593 case GlobalValue::AvailableExternallyLinkage:
2594 return XCOFF::C_EXT;
2595 case GlobalValue::ExternalWeakLinkage:
2596 case GlobalValue::LinkOnceAnyLinkage:
2597 case GlobalValue::LinkOnceODRLinkage:
2598 case GlobalValue::WeakAnyLinkage:
2599 case GlobalValue::WeakODRLinkage:
2600 return XCOFF::C_WEAKEXT;
2601 case GlobalValue::AppendingLinkage:
2602 report_fatal_error(
2603 "There is no mapping that implements AppendingLinkage for XCOFF.");
2605 llvm_unreachable("Unknown linkage type!");
2608 MCSymbol *TargetLoweringObjectFileXCOFF::getFunctionEntryPointSymbol(
2609 const GlobalValue *Func, const TargetMachine &TM) const {
2610 assert((isa<Function>(Func) ||
2611 (isa<GlobalAlias>(Func) &&
2612 isa_and_nonnull<Function>(
2613 cast<GlobalAlias>(Func)->getAliaseeObject()))) &&
2614 "Func must be a function or an alias which has a function as base "
2615 "object.");
2617 SmallString<128> NameStr;
2618 NameStr.push_back('.');
2619 getNameWithPrefix(NameStr, Func, TM);
2621 // When -function-sections is enabled and explicit section is not specified,
2622 // it's not necessary to emit function entry point label any more. We will use
2623 // function entry point csect instead. And for function delcarations, the
2624 // undefined symbols gets treated as csect with XTY_ER property.
2625 if (((TM.getFunctionSections() && !Func->hasSection()) ||
2626 Func->isDeclaration()) &&
2627 isa<Function>(Func)) {
2628 return getContext()
2629 .getXCOFFSection(
2630 NameStr, SectionKind::getText(),
2631 XCOFF::CsectProperties(XCOFF::XMC_PR, Func->isDeclaration()
2632 ? XCOFF::XTY_ER
2633 : XCOFF::XTY_SD))
2634 ->getQualNameSymbol();
2637 return getContext().getOrCreateSymbol(NameStr);
2640 MCSection *TargetLoweringObjectFileXCOFF::getSectionForFunctionDescriptor(
2641 const Function *F, const TargetMachine &TM) const {
2642 SmallString<128> NameStr;
2643 getNameWithPrefix(NameStr, F, TM);
2644 return getContext().getXCOFFSection(
2645 NameStr, SectionKind::getData(),
2646 XCOFF::CsectProperties(XCOFF::XMC_DS, XCOFF::XTY_SD));
2649 MCSection *TargetLoweringObjectFileXCOFF::getSectionForTOCEntry(
2650 const MCSymbol *Sym, const TargetMachine &TM) const {
2651 // Use TE storage-mapping class when large code model is enabled so that
2652 // the chance of needing -bbigtoc is decreased.
2653 return getContext().getXCOFFSection(
2654 cast<MCSymbolXCOFF>(Sym)->getSymbolTableName(), SectionKind::getData(),
2655 XCOFF::CsectProperties(
2656 TM.getCodeModel() == CodeModel::Large ? XCOFF::XMC_TE : XCOFF::XMC_TC,
2657 XCOFF::XTY_SD));
2660 MCSection *TargetLoweringObjectFileXCOFF::getSectionForLSDA(
2661 const Function &F, const MCSymbol &FnSym, const TargetMachine &TM) const {
2662 auto *LSDA = cast<MCSectionXCOFF>(LSDASection);
2663 if (TM.getFunctionSections()) {
2664 // If option -ffunction-sections is on, append the function name to the
2665 // name of the LSDA csect so that each function has its own LSDA csect.
2666 // This helps the linker to garbage-collect EH info of unused functions.
2667 SmallString<128> NameStr = LSDA->getName();
2668 raw_svector_ostream(NameStr) << '.' << F.getName();
2669 LSDA = getContext().getXCOFFSection(NameStr, LSDA->getKind(),
2670 LSDA->getCsectProp());
2672 return LSDA;
2674 //===----------------------------------------------------------------------===//
2675 // GOFF
2676 //===----------------------------------------------------------------------===//
2677 TargetLoweringObjectFileGOFF::TargetLoweringObjectFileGOFF() = default;
2679 MCSection *TargetLoweringObjectFileGOFF::getExplicitSectionGlobal(
2680 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2681 return SelectSectionForGlobal(GO, Kind, TM);
2684 MCSection *TargetLoweringObjectFileGOFF::SelectSectionForGlobal(
2685 const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const {
2686 auto *Symbol = TM.getSymbol(GO);
2687 if (Kind.isBSS())
2688 return getContext().getGOFFSection(Symbol->getName(), SectionKind::getBSS(),
2689 nullptr, nullptr);
2691 return getContext().getObjectFileInfo()->getTextSection();