1 //===-- llvm/CodeGen/TargetLoweringObjectFileImpl.cpp - Object File Info --===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements classes used to handle lowerings specific to common 11 // object file formats. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 16 #include "llvm/ADT/SmallString.h" 17 #include "llvm/ADT/StringExtras.h" 18 #include "llvm/ADT/Triple.h" 19 #include "llvm/CodeGen/MachineModuleInfoImpls.h" 20 #include "llvm/IR/Constants.h" 21 #include "llvm/IR/DataLayout.h" 22 #include "llvm/IR/DerivedTypes.h" 23 #include "llvm/IR/Function.h" 24 #include "llvm/IR/GlobalVariable.h" 25 #include "llvm/IR/Mangler.h" 26 #include "llvm/IR/Module.h" 27 #include "llvm/MC/MCAsmInfo.h" 28 #include "llvm/MC/MCContext.h" 29 #include "llvm/MC/MCExpr.h" 30 #include "llvm/MC/MCSectionCOFF.h" 31 #include "llvm/MC/MCSectionELF.h" 32 #include "llvm/MC/MCSectionMachO.h" 33 #include "llvm/MC/MCStreamer.h" 34 #include "llvm/MC/MCSymbolELF.h" 35 #include "llvm/MC/MCValue.h" 36 #include "llvm/Support/COFF.h" 37 #include "llvm/Support/Dwarf.h" 38 #include "llvm/Support/ELF.h" 39 #include "llvm/Support/ErrorHandling.h" 40 #include "llvm/Support/raw_ostream.h" 41 #include "llvm/Target/TargetLowering.h" 42 #include "llvm/Target/TargetMachine.h" 43 #include "llvm/Target/TargetSubtargetInfo.h" 44 using namespace llvm; 45 using namespace dwarf; 46 47 //===----------------------------------------------------------------------===// 48 // ELF 49 //===----------------------------------------------------------------------===// 50 51 MCSymbol *TargetLoweringObjectFileELF::getCFIPersonalitySymbol( 52 const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 53 MachineModuleInfo *MMI) const { 54 unsigned Encoding = getPersonalityEncoding(); 55 if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect) 56 return getContext().getOrCreateSymbol(StringRef("DW.ref.") + 57 TM.getSymbol(GV, Mang)->getName()); 58 if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr) 59 return TM.getSymbol(GV, Mang); 60 report_fatal_error("We do not support this DWARF encoding yet!"); 61 } 62 63 void TargetLoweringObjectFileELF::emitPersonalityValue( 64 MCStreamer &Streamer, const DataLayout &DL, const MCSymbol *Sym) const { 65 SmallString<64> NameData("DW.ref."); 66 NameData += Sym->getName(); 67 MCSymbolELF *Label = 68 cast<MCSymbolELF>(getContext().getOrCreateSymbol(NameData)); 69 Streamer.EmitSymbolAttribute(Label, MCSA_Hidden); 70 Streamer.EmitSymbolAttribute(Label, MCSA_Weak); 71 StringRef Prefix = ".data."; 72 NameData.insert(NameData.begin(), Prefix.begin(), Prefix.end()); 73 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_GROUP; 74 MCSection *Sec = getContext().getELFSection(NameData, ELF::SHT_PROGBITS, 75 Flags, 0, Label->getName()); 76 unsigned Size = DL.getPointerSize(); 77 Streamer.SwitchSection(Sec); 78 Streamer.EmitValueToAlignment(DL.getPointerABIAlignment()); 79 Streamer.EmitSymbolAttribute(Label, MCSA_ELF_TypeObject); 80 const MCExpr *E = MCConstantExpr::create(Size, getContext()); 81 Streamer.emitELFSize(Label, E); 82 Streamer.EmitLabel(Label); 83 84 Streamer.EmitSymbolValue(Sym, Size); 85 } 86 87 const MCExpr *TargetLoweringObjectFileELF::getTTypeGlobalReference( 88 const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 89 const TargetMachine &TM, MachineModuleInfo *MMI, 90 MCStreamer &Streamer) const { 91 92 if (Encoding & dwarf::DW_EH_PE_indirect) { 93 MachineModuleInfoELF &ELFMMI = MMI->getObjFileInfo<MachineModuleInfoELF>(); 94 95 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, ".DW.stub", Mang, TM); 96 97 // Add information about the stub reference to ELFMMI so that the stub 98 // gets emitted by the asmprinter. 99 MachineModuleInfoImpl::StubValueTy &StubSym = ELFMMI.getGVStubEntry(SSym); 100 if (!StubSym.getPointer()) { 101 MCSymbol *Sym = TM.getSymbol(GV, Mang); 102 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 103 } 104 105 return TargetLoweringObjectFile:: 106 getTTypeReference(MCSymbolRefExpr::create(SSym, getContext()), 107 Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 108 } 109 110 return TargetLoweringObjectFile:: 111 getTTypeGlobalReference(GV, Encoding, Mang, TM, MMI, Streamer); 112 } 113 114 static SectionKind 115 getELFKindForNamedSection(StringRef Name, SectionKind K) { 116 // N.B.: The defaults used in here are no the same ones used in MC. 117 // We follow gcc, MC follows gas. For example, given ".section .eh_frame", 118 // both gas and MC will produce a section with no flags. Given 119 // section(".eh_frame") gcc will produce: 120 // 121 // .section .eh_frame,"a",@progbits 122 if (Name.empty() || Name[0] != '.') return K; 123 124 // Some lame default implementation based on some magic section names. 125 if (Name == ".bss" || 126 Name.startswith(".bss.") || 127 Name.startswith(".gnu.linkonce.b.") || 128 Name.startswith(".llvm.linkonce.b.") || 129 Name == ".sbss" || 130 Name.startswith(".sbss.") || 131 Name.startswith(".gnu.linkonce.sb.") || 132 Name.startswith(".llvm.linkonce.sb.")) 133 return SectionKind::getBSS(); 134 135 if (Name == ".tdata" || 136 Name.startswith(".tdata.") || 137 Name.startswith(".gnu.linkonce.td.") || 138 Name.startswith(".llvm.linkonce.td.")) 139 return SectionKind::getThreadData(); 140 141 if (Name == ".tbss" || 142 Name.startswith(".tbss.") || 143 Name.startswith(".gnu.linkonce.tb.") || 144 Name.startswith(".llvm.linkonce.tb.")) 145 return SectionKind::getThreadBSS(); 146 147 return K; 148 } 149 150 151 static unsigned getELFSectionType(StringRef Name, SectionKind K) { 152 153 if (Name == ".init_array") 154 return ELF::SHT_INIT_ARRAY; 155 156 if (Name == ".fini_array") 157 return ELF::SHT_FINI_ARRAY; 158 159 if (Name == ".preinit_array") 160 return ELF::SHT_PREINIT_ARRAY; 161 162 if (K.isBSS() || K.isThreadBSS()) 163 return ELF::SHT_NOBITS; 164 165 return ELF::SHT_PROGBITS; 166 } 167 168 static unsigned getELFSectionFlags(SectionKind K) { 169 unsigned Flags = 0; 170 171 if (!K.isMetadata()) 172 Flags |= ELF::SHF_ALLOC; 173 174 if (K.isText()) 175 Flags |= ELF::SHF_EXECINSTR; 176 177 if (K.isWriteable()) 178 Flags |= ELF::SHF_WRITE; 179 180 if (K.isThreadLocal()) 181 Flags |= ELF::SHF_TLS; 182 183 if (K.isMergeableCString() || K.isMergeableConst()) 184 Flags |= ELF::SHF_MERGE; 185 186 if (K.isMergeableCString()) 187 Flags |= ELF::SHF_STRINGS; 188 189 return Flags; 190 } 191 192 static const Comdat *getELFComdat(const GlobalValue *GV) { 193 const Comdat *C = GV->getComdat(); 194 if (!C) 195 return nullptr; 196 197 if (C->getSelectionKind() != Comdat::Any) 198 report_fatal_error("ELF COMDATs only support SelectionKind::Any, '" + 199 C->getName() + "' cannot be lowered."); 200 201 return C; 202 } 203 204 MCSection *TargetLoweringObjectFileELF::getExplicitSectionGlobal( 205 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 206 const TargetMachine &TM) const { 207 StringRef SectionName = GV->getSection(); 208 209 // Infer section flags from the section name if we can. 210 Kind = getELFKindForNamedSection(SectionName, Kind); 211 212 StringRef Group = ""; 213 unsigned Flags = getELFSectionFlags(Kind); 214 if (const Comdat *C = getELFComdat(GV)) { 215 Group = C->getName(); 216 Flags |= ELF::SHF_GROUP; 217 } 218 return getContext().getELFSection(SectionName, 219 getELFSectionType(SectionName, Kind), Flags, 220 /*EntrySize=*/0, Group); 221 } 222 223 /// Return the section prefix name used by options FunctionsSections and 224 /// DataSections. 225 static StringRef getSectionPrefixForGlobal(SectionKind Kind) { 226 if (Kind.isText()) 227 return ".text"; 228 if (Kind.isReadOnly()) 229 return ".rodata"; 230 if (Kind.isBSS()) 231 return ".bss"; 232 if (Kind.isThreadData()) 233 return ".tdata"; 234 if (Kind.isThreadBSS()) 235 return ".tbss"; 236 if (Kind.isData()) 237 return ".data"; 238 assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 239 return ".data.rel.ro"; 240 } 241 242 static MCSectionELF * 243 selectELFSectionForGlobal(MCContext &Ctx, const GlobalValue *GV, 244 SectionKind Kind, Mangler &Mang, 245 const TargetMachine &TM, bool EmitUniqueSection, 246 unsigned Flags, unsigned *NextUniqueID) { 247 unsigned EntrySize = 0; 248 if (Kind.isMergeableCString()) { 249 if (Kind.isMergeable2ByteCString()) { 250 EntrySize = 2; 251 } else if (Kind.isMergeable4ByteCString()) { 252 EntrySize = 4; 253 } else { 254 EntrySize = 1; 255 assert(Kind.isMergeable1ByteCString() && "unknown string width"); 256 } 257 } else if (Kind.isMergeableConst()) { 258 if (Kind.isMergeableConst4()) { 259 EntrySize = 4; 260 } else if (Kind.isMergeableConst8()) { 261 EntrySize = 8; 262 } else { 263 assert(Kind.isMergeableConst16() && "unknown data width"); 264 EntrySize = 16; 265 } 266 } 267 268 StringRef Group = ""; 269 if (const Comdat *C = getELFComdat(GV)) { 270 Flags |= ELF::SHF_GROUP; 271 Group = C->getName(); 272 } 273 274 bool UniqueSectionNames = TM.getUniqueSectionNames(); 275 SmallString<128> Name; 276 if (Kind.isMergeableCString()) { 277 // We also need alignment here. 278 // FIXME: this is getting the alignment of the character, not the 279 // alignment of the global! 280 unsigned Align = GV->getParent()->getDataLayout().getPreferredAlignment( 281 cast<GlobalVariable>(GV)); 282 283 std::string SizeSpec = ".rodata.str" + utostr(EntrySize) + "."; 284 Name = SizeSpec + utostr(Align); 285 } else if (Kind.isMergeableConst()) { 286 Name = ".rodata.cst"; 287 Name += utostr(EntrySize); 288 } else { 289 Name = getSectionPrefixForGlobal(Kind); 290 } 291 292 if (EmitUniqueSection && UniqueSectionNames) { 293 Name.push_back('.'); 294 TM.getNameWithPrefix(Name, GV, Mang, true); 295 } 296 unsigned UniqueID = ~0; 297 if (EmitUniqueSection && !UniqueSectionNames) { 298 UniqueID = *NextUniqueID; 299 (*NextUniqueID)++; 300 } 301 return Ctx.getELFSection(Name, getELFSectionType(Name, Kind), Flags, 302 EntrySize, Group, UniqueID); 303 } 304 305 MCSection *TargetLoweringObjectFileELF::SelectSectionForGlobal( 306 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 307 const TargetMachine &TM) const { 308 unsigned Flags = getELFSectionFlags(Kind); 309 310 // If we have -ffunction-section or -fdata-section then we should emit the 311 // global value to a uniqued section specifically for it. 312 bool EmitUniqueSection = false; 313 if (!(Flags & ELF::SHF_MERGE) && !Kind.isCommon()) { 314 if (Kind.isText()) 315 EmitUniqueSection = TM.getFunctionSections(); 316 else 317 EmitUniqueSection = TM.getDataSections(); 318 } 319 EmitUniqueSection |= GV->hasComdat(); 320 321 return selectELFSectionForGlobal(getContext(), GV, Kind, Mang, TM, 322 EmitUniqueSection, Flags, &NextUniqueID); 323 } 324 325 MCSection *TargetLoweringObjectFileELF::getSectionForJumpTable( 326 const Function &F, Mangler &Mang, const TargetMachine &TM) const { 327 // If the function can be removed, produce a unique section so that 328 // the table doesn't prevent the removal. 329 const Comdat *C = F.getComdat(); 330 bool EmitUniqueSection = TM.getFunctionSections() || C; 331 if (!EmitUniqueSection) 332 return ReadOnlySection; 333 334 return selectELFSectionForGlobal(getContext(), &F, SectionKind::getReadOnly(), 335 Mang, TM, EmitUniqueSection, ELF::SHF_ALLOC, 336 &NextUniqueID); 337 } 338 339 bool TargetLoweringObjectFileELF::shouldPutJumpTableInFunctionSection( 340 bool UsesLabelDifference, const Function &F) const { 341 // We can always create relative relocations, so use another section 342 // that can be marked non-executable. 343 return false; 344 } 345 346 /// Given a mergeable constant with the specified size and relocation 347 /// information, return a section that it should be placed in. 348 MCSection *TargetLoweringObjectFileELF::getSectionForConstant( 349 const DataLayout &DL, SectionKind Kind, const Constant *C) const { 350 if (Kind.isMergeableConst4() && MergeableConst4Section) 351 return MergeableConst4Section; 352 if (Kind.isMergeableConst8() && MergeableConst8Section) 353 return MergeableConst8Section; 354 if (Kind.isMergeableConst16() && MergeableConst16Section) 355 return MergeableConst16Section; 356 if (Kind.isReadOnly()) 357 return ReadOnlySection; 358 359 assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 360 return DataRelROSection; 361 } 362 363 static MCSectionELF *getStaticStructorSection(MCContext &Ctx, bool UseInitArray, 364 bool IsCtor, unsigned Priority, 365 const MCSymbol *KeySym) { 366 std::string Name; 367 unsigned Type; 368 unsigned Flags = ELF::SHF_ALLOC | ELF::SHF_WRITE; 369 StringRef COMDAT = KeySym ? KeySym->getName() : ""; 370 371 if (KeySym) 372 Flags |= ELF::SHF_GROUP; 373 374 if (UseInitArray) { 375 if (IsCtor) { 376 Type = ELF::SHT_INIT_ARRAY; 377 Name = ".init_array"; 378 } else { 379 Type = ELF::SHT_FINI_ARRAY; 380 Name = ".fini_array"; 381 } 382 if (Priority != 65535) { 383 Name += '.'; 384 Name += utostr(Priority); 385 } 386 } else { 387 // The default scheme is .ctor / .dtor, so we have to invert the priority 388 // numbering. 389 if (IsCtor) 390 Name = ".ctors"; 391 else 392 Name = ".dtors"; 393 if (Priority != 65535) { 394 Name += '.'; 395 Name += utostr(65535 - Priority); 396 } 397 Type = ELF::SHT_PROGBITS; 398 } 399 400 return Ctx.getELFSection(Name, Type, Flags, 0, COMDAT); 401 } 402 403 MCSection *TargetLoweringObjectFileELF::getStaticCtorSection( 404 unsigned Priority, const MCSymbol *KeySym) const { 405 return getStaticStructorSection(getContext(), UseInitArray, true, Priority, 406 KeySym); 407 } 408 409 MCSection *TargetLoweringObjectFileELF::getStaticDtorSection( 410 unsigned Priority, const MCSymbol *KeySym) const { 411 return getStaticStructorSection(getContext(), UseInitArray, false, Priority, 412 KeySym); 413 } 414 415 void 416 TargetLoweringObjectFileELF::InitializeELF(bool UseInitArray_) { 417 UseInitArray = UseInitArray_; 418 if (!UseInitArray) 419 return; 420 421 StaticCtorSection = getContext().getELFSection( 422 ".init_array", ELF::SHT_INIT_ARRAY, ELF::SHF_WRITE | ELF::SHF_ALLOC); 423 StaticDtorSection = getContext().getELFSection( 424 ".fini_array", ELF::SHT_FINI_ARRAY, ELF::SHF_WRITE | ELF::SHF_ALLOC); 425 } 426 427 //===----------------------------------------------------------------------===// 428 // MachO 429 //===----------------------------------------------------------------------===// 430 431 TargetLoweringObjectFileMachO::TargetLoweringObjectFileMachO() 432 : TargetLoweringObjectFile() { 433 SupportIndirectSymViaGOTPCRel = true; 434 } 435 436 /// emitModuleFlags - Perform code emission for module flags. 437 void TargetLoweringObjectFileMachO:: 438 emitModuleFlags(MCStreamer &Streamer, 439 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 440 Mangler &Mang, const TargetMachine &TM) const { 441 unsigned VersionVal = 0; 442 unsigned ImageInfoFlags = 0; 443 MDNode *LinkerOptions = nullptr; 444 StringRef SectionVal; 445 446 for (ArrayRef<Module::ModuleFlagEntry>::iterator 447 i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 448 const Module::ModuleFlagEntry &MFE = *i; 449 450 // Ignore flags with 'Require' behavior. 451 if (MFE.Behavior == Module::Require) 452 continue; 453 454 StringRef Key = MFE.Key->getString(); 455 Metadata *Val = MFE.Val; 456 457 if (Key == "Objective-C Image Info Version") { 458 VersionVal = mdconst::extract<ConstantInt>(Val)->getZExtValue(); 459 } else if (Key == "Objective-C Garbage Collection" || 460 Key == "Objective-C GC Only" || 461 Key == "Objective-C Is Simulated" || 462 Key == "Objective-C Image Swift Version") { 463 ImageInfoFlags |= mdconst::extract<ConstantInt>(Val)->getZExtValue(); 464 } else if (Key == "Objective-C Image Info Section") { 465 SectionVal = cast<MDString>(Val)->getString(); 466 } else if (Key == "Linker Options") { 467 LinkerOptions = cast<MDNode>(Val); 468 } 469 } 470 471 // Emit the linker options if present. 472 if (LinkerOptions) { 473 for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 474 MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 475 SmallVector<std::string, 4> StrOptions; 476 477 // Convert to strings. 478 for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 479 MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 480 StrOptions.push_back(MDOption->getString()); 481 } 482 483 Streamer.EmitLinkerOptions(StrOptions); 484 } 485 } 486 487 // The section is mandatory. If we don't have it, then we don't have GC info. 488 if (SectionVal.empty()) return; 489 490 StringRef Segment, Section; 491 unsigned TAA = 0, StubSize = 0; 492 bool TAAParsed; 493 std::string ErrorCode = 494 MCSectionMachO::ParseSectionSpecifier(SectionVal, Segment, Section, 495 TAA, TAAParsed, StubSize); 496 if (!ErrorCode.empty()) 497 // If invalid, report the error with report_fatal_error. 498 report_fatal_error("Invalid section specifier '" + Section + "': " + 499 ErrorCode + "."); 500 501 // Get the section. 502 MCSectionMachO *S = getContext().getMachOSection( 503 Segment, Section, TAA, StubSize, SectionKind::getData()); 504 Streamer.SwitchSection(S); 505 Streamer.EmitLabel(getContext(). 506 getOrCreateSymbol(StringRef("L_OBJC_IMAGE_INFO"))); 507 Streamer.EmitIntValue(VersionVal, 4); 508 Streamer.EmitIntValue(ImageInfoFlags, 4); 509 Streamer.AddBlankLine(); 510 } 511 512 static void checkMachOComdat(const GlobalValue *GV) { 513 const Comdat *C = GV->getComdat(); 514 if (!C) 515 return; 516 517 report_fatal_error("MachO doesn't support COMDATs, '" + C->getName() + 518 "' cannot be lowered."); 519 } 520 521 MCSection *TargetLoweringObjectFileMachO::getExplicitSectionGlobal( 522 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 523 const TargetMachine &TM) const { 524 // Parse the section specifier and create it if valid. 525 StringRef Segment, Section; 526 unsigned TAA = 0, StubSize = 0; 527 bool TAAParsed; 528 529 checkMachOComdat(GV); 530 531 std::string ErrorCode = 532 MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section, 533 TAA, TAAParsed, StubSize); 534 if (!ErrorCode.empty()) { 535 // If invalid, report the error with report_fatal_error. 536 report_fatal_error("Global variable '" + GV->getName() + 537 "' has an invalid section specifier '" + 538 GV->getSection() + "': " + ErrorCode + "."); 539 } 540 541 // Get the section. 542 MCSectionMachO *S = 543 getContext().getMachOSection(Segment, Section, TAA, StubSize, Kind); 544 545 // If TAA wasn't set by ParseSectionSpecifier() above, 546 // use the value returned by getMachOSection() as a default. 547 if (!TAAParsed) 548 TAA = S->getTypeAndAttributes(); 549 550 // Okay, now that we got the section, verify that the TAA & StubSize agree. 551 // If the user declared multiple globals with different section flags, we need 552 // to reject it here. 553 if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) { 554 // If invalid, report the error with report_fatal_error. 555 report_fatal_error("Global variable '" + GV->getName() + 556 "' section type or attributes does not match previous" 557 " section specifier"); 558 } 559 560 return S; 561 } 562 563 MCSection *TargetLoweringObjectFileMachO::SelectSectionForGlobal( 564 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 565 const TargetMachine &TM) const { 566 checkMachOComdat(GV); 567 568 // Handle thread local data. 569 if (Kind.isThreadBSS()) return TLSBSSSection; 570 if (Kind.isThreadData()) return TLSDataSection; 571 572 if (Kind.isText()) 573 return GV->isWeakForLinker() ? TextCoalSection : TextSection; 574 575 // If this is weak/linkonce, put this in a coalescable section, either in text 576 // or data depending on if it is writable. 577 if (GV->isWeakForLinker()) { 578 if (Kind.isReadOnly()) 579 return ConstTextCoalSection; 580 return DataCoalSection; 581 } 582 583 // FIXME: Alignment check should be handled by section classifier. 584 if (Kind.isMergeable1ByteCString() && 585 GV->getParent()->getDataLayout().getPreferredAlignment( 586 cast<GlobalVariable>(GV)) < 32) 587 return CStringSection; 588 589 // Do not put 16-bit arrays in the UString section if they have an 590 // externally visible label, this runs into issues with certain linker 591 // versions. 592 if (Kind.isMergeable2ByteCString() && !GV->hasExternalLinkage() && 593 GV->getParent()->getDataLayout().getPreferredAlignment( 594 cast<GlobalVariable>(GV)) < 32) 595 return UStringSection; 596 597 // With MachO only variables whose corresponding symbol starts with 'l' or 598 // 'L' can be merged, so we only try merging GVs with private linkage. 599 if (GV->hasPrivateLinkage() && Kind.isMergeableConst()) { 600 if (Kind.isMergeableConst4()) 601 return FourByteConstantSection; 602 if (Kind.isMergeableConst8()) 603 return EightByteConstantSection; 604 if (Kind.isMergeableConst16()) 605 return SixteenByteConstantSection; 606 } 607 608 // Otherwise, if it is readonly, but not something we can specially optimize, 609 // just drop it in .const. 610 if (Kind.isReadOnly()) 611 return ReadOnlySection; 612 613 // If this is marked const, put it into a const section. But if the dynamic 614 // linker needs to write to it, put it in the data segment. 615 if (Kind.isReadOnlyWithRel()) 616 return ConstDataSection; 617 618 // Put zero initialized globals with strong external linkage in the 619 // DATA, __common section with the .zerofill directive. 620 if (Kind.isBSSExtern()) 621 return DataCommonSection; 622 623 // Put zero initialized globals with local linkage in __DATA,__bss directive 624 // with the .zerofill directive (aka .lcomm). 625 if (Kind.isBSSLocal()) 626 return DataBSSSection; 627 628 // Otherwise, just drop the variable in the normal data section. 629 return DataSection; 630 } 631 632 MCSection *TargetLoweringObjectFileMachO::getSectionForConstant( 633 const DataLayout &DL, SectionKind Kind, const Constant *C) const { 634 // If this constant requires a relocation, we have to put it in the data 635 // segment, not in the text segment. 636 if (Kind.isData() || Kind.isReadOnlyWithRel()) 637 return ConstDataSection; 638 639 if (Kind.isMergeableConst4()) 640 return FourByteConstantSection; 641 if (Kind.isMergeableConst8()) 642 return EightByteConstantSection; 643 if (Kind.isMergeableConst16()) 644 return SixteenByteConstantSection; 645 return ReadOnlySection; // .const 646 } 647 648 const MCExpr *TargetLoweringObjectFileMachO::getTTypeGlobalReference( 649 const GlobalValue *GV, unsigned Encoding, Mangler &Mang, 650 const TargetMachine &TM, MachineModuleInfo *MMI, 651 MCStreamer &Streamer) const { 652 // The mach-o version of this method defaults to returning a stub reference. 653 654 if (Encoding & DW_EH_PE_indirect) { 655 MachineModuleInfoMachO &MachOMMI = 656 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 657 658 MCSymbol *SSym = 659 getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 660 661 // Add information about the stub reference to MachOMMI so that the stub 662 // gets emitted by the asmprinter. 663 MachineModuleInfoImpl::StubValueTy &StubSym = 664 GV->hasHiddenVisibility() ? MachOMMI.getHiddenGVStubEntry(SSym) : 665 MachOMMI.getGVStubEntry(SSym); 666 if (!StubSym.getPointer()) { 667 MCSymbol *Sym = TM.getSymbol(GV, Mang); 668 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 669 } 670 671 return TargetLoweringObjectFile:: 672 getTTypeReference(MCSymbolRefExpr::create(SSym, getContext()), 673 Encoding & ~dwarf::DW_EH_PE_indirect, Streamer); 674 } 675 676 return TargetLoweringObjectFile::getTTypeGlobalReference(GV, Encoding, Mang, 677 TM, MMI, Streamer); 678 } 679 680 MCSymbol *TargetLoweringObjectFileMachO::getCFIPersonalitySymbol( 681 const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM, 682 MachineModuleInfo *MMI) const { 683 // The mach-o version of this method defaults to returning a stub reference. 684 MachineModuleInfoMachO &MachOMMI = 685 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 686 687 MCSymbol *SSym = getSymbolWithGlobalValueBase(GV, "$non_lazy_ptr", Mang, TM); 688 689 // Add information about the stub reference to MachOMMI so that the stub 690 // gets emitted by the asmprinter. 691 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(SSym); 692 if (!StubSym.getPointer()) { 693 MCSymbol *Sym = TM.getSymbol(GV, Mang); 694 StubSym = MachineModuleInfoImpl::StubValueTy(Sym, !GV->hasLocalLinkage()); 695 } 696 697 return SSym; 698 } 699 700 const MCExpr *TargetLoweringObjectFileMachO::getIndirectSymViaGOTPCRel( 701 const MCSymbol *Sym, const MCValue &MV, int64_t Offset, 702 MachineModuleInfo *MMI, MCStreamer &Streamer) const { 703 // Although MachO 32-bit targets do not explicitly have a GOTPCREL relocation 704 // as 64-bit do, we replace the GOT equivalent by accessing the final symbol 705 // through a non_lazy_ptr stub instead. One advantage is that it allows the 706 // computation of deltas to final external symbols. Example: 707 // 708 // _extgotequiv: 709 // .long _extfoo 710 // 711 // _delta: 712 // .long _extgotequiv-_delta 713 // 714 // is transformed to: 715 // 716 // _delta: 717 // .long L_extfoo$non_lazy_ptr-(_delta+0) 718 // 719 // .section __IMPORT,__pointers,non_lazy_symbol_pointers 720 // L_extfoo$non_lazy_ptr: 721 // .indirect_symbol _extfoo 722 // .long 0 723 // 724 MachineModuleInfoMachO &MachOMMI = 725 MMI->getObjFileInfo<MachineModuleInfoMachO>(); 726 MCContext &Ctx = getContext(); 727 728 // The offset must consider the original displacement from the base symbol 729 // since 32-bit targets don't have a GOTPCREL to fold the PC displacement. 730 Offset = -MV.getConstant(); 731 const MCSymbol *BaseSym = &MV.getSymB()->getSymbol(); 732 733 // Access the final symbol via sym$non_lazy_ptr and generate the appropriated 734 // non_lazy_ptr stubs. 735 SmallString<128> Name; 736 StringRef Suffix = "$non_lazy_ptr"; 737 Name += MMI->getModule()->getDataLayout().getPrivateGlobalPrefix(); 738 Name += Sym->getName(); 739 Name += Suffix; 740 MCSymbol *Stub = Ctx.getOrCreateSymbol(Name); 741 742 MachineModuleInfoImpl::StubValueTy &StubSym = MachOMMI.getGVStubEntry(Stub); 743 if (!StubSym.getPointer()) 744 StubSym = MachineModuleInfoImpl:: 745 StubValueTy(const_cast<MCSymbol *>(Sym), true /* access indirectly */); 746 747 const MCExpr *BSymExpr = 748 MCSymbolRefExpr::create(BaseSym, MCSymbolRefExpr::VK_None, Ctx); 749 const MCExpr *LHS = 750 MCSymbolRefExpr::create(Stub, MCSymbolRefExpr::VK_None, Ctx); 751 752 if (!Offset) 753 return MCBinaryExpr::createSub(LHS, BSymExpr, Ctx); 754 755 const MCExpr *RHS = 756 MCBinaryExpr::createAdd(BSymExpr, MCConstantExpr::create(Offset, Ctx), Ctx); 757 return MCBinaryExpr::createSub(LHS, RHS, Ctx); 758 } 759 760 static bool canUsePrivateLabel(const MCAsmInfo &AsmInfo, 761 const MCSection &Section) { 762 if (!AsmInfo.isSectionAtomizableBySymbols(Section)) 763 return true; 764 765 // If it is not dead stripped, it is safe to use private labels. 766 const MCSectionMachO &SMO = cast<MCSectionMachO>(Section); 767 if (SMO.hasAttribute(MachO::S_ATTR_NO_DEAD_STRIP)) 768 return true; 769 770 return false; 771 } 772 773 void TargetLoweringObjectFileMachO::getNameWithPrefix( 774 SmallVectorImpl<char> &OutName, const GlobalValue *GV, Mangler &Mang, 775 const TargetMachine &TM) const { 776 SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM); 777 const MCSection *TheSection = SectionForGlobal(GV, GVKind, Mang, TM); 778 bool CannotUsePrivateLabel = 779 !canUsePrivateLabel(*TM.getMCAsmInfo(), *TheSection); 780 Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel); 781 } 782 783 //===----------------------------------------------------------------------===// 784 // COFF 785 //===----------------------------------------------------------------------===// 786 787 static unsigned 788 getCOFFSectionFlags(SectionKind K) { 789 unsigned Flags = 0; 790 791 if (K.isMetadata()) 792 Flags |= 793 COFF::IMAGE_SCN_MEM_DISCARDABLE; 794 else if (K.isText()) 795 Flags |= 796 COFF::IMAGE_SCN_MEM_EXECUTE | 797 COFF::IMAGE_SCN_MEM_READ | 798 COFF::IMAGE_SCN_CNT_CODE; 799 else if (K.isBSS()) 800 Flags |= 801 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 802 COFF::IMAGE_SCN_MEM_READ | 803 COFF::IMAGE_SCN_MEM_WRITE; 804 else if (K.isThreadLocal()) 805 Flags |= 806 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 807 COFF::IMAGE_SCN_MEM_READ | 808 COFF::IMAGE_SCN_MEM_WRITE; 809 else if (K.isReadOnly() || K.isReadOnlyWithRel()) 810 Flags |= 811 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 812 COFF::IMAGE_SCN_MEM_READ; 813 else if (K.isWriteable()) 814 Flags |= 815 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 816 COFF::IMAGE_SCN_MEM_READ | 817 COFF::IMAGE_SCN_MEM_WRITE; 818 819 return Flags; 820 } 821 822 static const GlobalValue *getComdatGVForCOFF(const GlobalValue *GV) { 823 const Comdat *C = GV->getComdat(); 824 assert(C && "expected GV to have a Comdat!"); 825 826 StringRef ComdatGVName = C->getName(); 827 const GlobalValue *ComdatGV = GV->getParent()->getNamedValue(ComdatGVName); 828 if (!ComdatGV) 829 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 830 "' does not exist."); 831 832 if (ComdatGV->getComdat() != C) 833 report_fatal_error("Associative COMDAT symbol '" + ComdatGVName + 834 "' is not a key for its COMDAT."); 835 836 return ComdatGV; 837 } 838 839 static int getSelectionForCOFF(const GlobalValue *GV) { 840 if (const Comdat *C = GV->getComdat()) { 841 const GlobalValue *ComdatKey = getComdatGVForCOFF(GV); 842 if (const auto *GA = dyn_cast<GlobalAlias>(ComdatKey)) 843 ComdatKey = GA->getBaseObject(); 844 if (ComdatKey == GV) { 845 switch (C->getSelectionKind()) { 846 case Comdat::Any: 847 return COFF::IMAGE_COMDAT_SELECT_ANY; 848 case Comdat::ExactMatch: 849 return COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH; 850 case Comdat::Largest: 851 return COFF::IMAGE_COMDAT_SELECT_LARGEST; 852 case Comdat::NoDuplicates: 853 return COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 854 case Comdat::SameSize: 855 return COFF::IMAGE_COMDAT_SELECT_SAME_SIZE; 856 } 857 } else { 858 return COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE; 859 } 860 } 861 return 0; 862 } 863 864 MCSection *TargetLoweringObjectFileCOFF::getExplicitSectionGlobal( 865 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 866 const TargetMachine &TM) const { 867 int Selection = 0; 868 unsigned Characteristics = getCOFFSectionFlags(Kind); 869 StringRef Name = GV->getSection(); 870 StringRef COMDATSymName = ""; 871 if (GV->hasComdat()) { 872 Selection = getSelectionForCOFF(GV); 873 const GlobalValue *ComdatGV; 874 if (Selection == COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE) 875 ComdatGV = getComdatGVForCOFF(GV); 876 else 877 ComdatGV = GV; 878 879 if (!ComdatGV->hasPrivateLinkage()) { 880 MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 881 COMDATSymName = Sym->getName(); 882 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 883 } else { 884 Selection = 0; 885 } 886 } 887 return getContext().getCOFFSection(Name, 888 Characteristics, 889 Kind, 890 COMDATSymName, 891 Selection); 892 } 893 894 static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) { 895 if (Kind.isText()) 896 return ".text"; 897 if (Kind.isBSS()) 898 return ".bss"; 899 if (Kind.isThreadLocal()) 900 return ".tls$"; 901 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel()) 902 return ".rdata"; 903 return ".data"; 904 } 905 906 MCSection *TargetLoweringObjectFileCOFF::SelectSectionForGlobal( 907 const GlobalValue *GV, SectionKind Kind, Mangler &Mang, 908 const TargetMachine &TM) const { 909 // If we have -ffunction-sections then we should emit the global value to a 910 // uniqued section specifically for it. 911 bool EmitUniquedSection; 912 if (Kind.isText()) 913 EmitUniquedSection = TM.getFunctionSections(); 914 else 915 EmitUniquedSection = TM.getDataSections(); 916 917 if ((EmitUniquedSection && !Kind.isCommon()) || GV->hasComdat()) { 918 const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); 919 unsigned Characteristics = getCOFFSectionFlags(Kind); 920 921 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 922 int Selection = getSelectionForCOFF(GV); 923 if (!Selection) 924 Selection = COFF::IMAGE_COMDAT_SELECT_NODUPLICATES; 925 const GlobalValue *ComdatGV; 926 if (GV->hasComdat()) 927 ComdatGV = getComdatGVForCOFF(GV); 928 else 929 ComdatGV = GV; 930 931 if (!ComdatGV->hasPrivateLinkage()) { 932 MCSymbol *Sym = TM.getSymbol(ComdatGV, Mang); 933 StringRef COMDATSymName = Sym->getName(); 934 return getContext().getCOFFSection(Name, Characteristics, Kind, 935 COMDATSymName, Selection); 936 } else { 937 SmallString<256> TmpData; 938 Mang.getNameWithPrefix(TmpData, GV, /*CannotUsePrivateLabel=*/true); 939 return getContext().getCOFFSection(Name, Characteristics, Kind, TmpData, 940 Selection); 941 } 942 } 943 944 if (Kind.isText()) 945 return TextSection; 946 947 if (Kind.isThreadLocal()) 948 return TLSDataSection; 949 950 if (Kind.isReadOnly() || Kind.isReadOnlyWithRel()) 951 return ReadOnlySection; 952 953 // Note: we claim that common symbols are put in BSSSection, but they are 954 // really emitted with the magic .comm directive, which creates a symbol table 955 // entry but not a section. 956 if (Kind.isBSS() || Kind.isCommon()) 957 return BSSSection; 958 959 return DataSection; 960 } 961 962 void TargetLoweringObjectFileCOFF::getNameWithPrefix( 963 SmallVectorImpl<char> &OutName, const GlobalValue *GV, Mangler &Mang, 964 const TargetMachine &TM) const { 965 bool CannotUsePrivateLabel = false; 966 if (GV->hasPrivateLinkage() && 967 ((isa<Function>(GV) && TM.getFunctionSections()) || 968 (isa<GlobalVariable>(GV) && TM.getDataSections()))) 969 CannotUsePrivateLabel = true; 970 971 Mang.getNameWithPrefix(OutName, GV, CannotUsePrivateLabel); 972 } 973 974 MCSection *TargetLoweringObjectFileCOFF::getSectionForJumpTable( 975 const Function &F, Mangler &Mang, const TargetMachine &TM) const { 976 // If the function can be removed, produce a unique section so that 977 // the table doesn't prevent the removal. 978 const Comdat *C = F.getComdat(); 979 bool EmitUniqueSection = TM.getFunctionSections() || C; 980 if (!EmitUniqueSection) 981 return ReadOnlySection; 982 983 // FIXME: we should produce a symbol for F instead. 984 if (F.hasPrivateLinkage()) 985 return ReadOnlySection; 986 987 MCSymbol *Sym = TM.getSymbol(&F, Mang); 988 StringRef COMDATSymName = Sym->getName(); 989 990 SectionKind Kind = SectionKind::getReadOnly(); 991 const char *Name = getCOFFSectionNameForUniqueGlobal(Kind); 992 unsigned Characteristics = getCOFFSectionFlags(Kind); 993 Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT; 994 995 return getContext().getCOFFSection(Name, Characteristics, Kind, COMDATSymName, 996 COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE); 997 } 998 999 void TargetLoweringObjectFileCOFF:: 1000 emitModuleFlags(MCStreamer &Streamer, 1001 ArrayRef<Module::ModuleFlagEntry> ModuleFlags, 1002 Mangler &Mang, const TargetMachine &TM) const { 1003 MDNode *LinkerOptions = nullptr; 1004 1005 // Look for the "Linker Options" flag, since it's the only one we support. 1006 for (ArrayRef<Module::ModuleFlagEntry>::iterator 1007 i = ModuleFlags.begin(), e = ModuleFlags.end(); i != e; ++i) { 1008 const Module::ModuleFlagEntry &MFE = *i; 1009 StringRef Key = MFE.Key->getString(); 1010 Metadata *Val = MFE.Val; 1011 if (Key == "Linker Options") { 1012 LinkerOptions = cast<MDNode>(Val); 1013 break; 1014 } 1015 } 1016 if (!LinkerOptions) 1017 return; 1018 1019 // Emit the linker options to the linker .drectve section. According to the 1020 // spec, this section is a space-separated string containing flags for linker. 1021 MCSection *Sec = getDrectveSection(); 1022 Streamer.SwitchSection(Sec); 1023 for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 1024 MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 1025 for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 1026 MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 1027 // Lead with a space for consistency with our dllexport implementation. 1028 std::string Directive(" "); 1029 Directive.append(MDOption->getString()); 1030 Streamer.EmitBytes(Directive); 1031 } 1032 } 1033 } 1034 1035 MCSection *TargetLoweringObjectFileCOFF::getStaticCtorSection( 1036 unsigned Priority, const MCSymbol *KeySym) const { 1037 return getContext().getAssociativeCOFFSection( 1038 cast<MCSectionCOFF>(StaticCtorSection), KeySym); 1039 } 1040 1041 MCSection *TargetLoweringObjectFileCOFF::getStaticDtorSection( 1042 unsigned Priority, const MCSymbol *KeySym) const { 1043 return getContext().getAssociativeCOFFSection( 1044 cast<MCSectionCOFF>(StaticDtorSection), KeySym); 1045 } 1046 1047 void TargetLoweringObjectFileCOFF::emitLinkerFlagsForGlobal( 1048 raw_ostream &OS, const GlobalValue *GV, const Mangler &Mang) const { 1049 if (!GV->hasDLLExportStorageClass() || GV->isDeclaration()) 1050 return; 1051 1052 const Triple &TT = getTargetTriple(); 1053 1054 if (TT.isKnownWindowsMSVCEnvironment()) 1055 OS << " /EXPORT:"; 1056 else 1057 OS << " -export:"; 1058 1059 if (TT.isWindowsGNUEnvironment() || TT.isWindowsCygwinEnvironment()) { 1060 std::string Flag; 1061 raw_string_ostream FlagOS(Flag); 1062 Mang.getNameWithPrefix(FlagOS, GV, false); 1063 FlagOS.flush(); 1064 if (Flag[0] == GV->getParent()->getDataLayout().getGlobalPrefix()) 1065 OS << Flag.substr(1); 1066 else 1067 OS << Flag; 1068 } else { 1069 Mang.getNameWithPrefix(OS, GV, false); 1070 } 1071 1072 if (!GV->getValueType()->isFunctionTy()) { 1073 if (TT.isKnownWindowsMSVCEnvironment()) 1074 OS << ",DATA"; 1075 else 1076 OS << ",data"; 1077 } 1078 } 1079