TargetLoweringObjectFile.cpp revision 1850e5add1516e945bbabf7e456c305f4bd5cc6f
1//===-- llvm/Target/TargetLoweringObjectFile.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/Target/TargetLoweringObjectFile.h" 16#include "llvm/Constants.h" 17#include "llvm/DerivedTypes.h" 18#include "llvm/GlobalVariable.h" 19#include "llvm/MC/MCContext.h" 20#include "llvm/MC/MCSection.h" 21#include "llvm/Target/TargetMachine.h" 22#include "llvm/Target/TargetData.h" 23#include "llvm/Target/TargetOptions.h" 24#include "llvm/Support/Mangler.h" 25#include "llvm/ADT/StringExtras.h" 26using namespace llvm; 27 28//===----------------------------------------------------------------------===// 29// Generic Code 30//===----------------------------------------------------------------------===// 31 32TargetLoweringObjectFile::TargetLoweringObjectFile() : Ctx(0) { 33 TextSection = 0; 34 DataSection = 0; 35 BSSSection = 0; 36 ReadOnlySection = 0; 37 StaticCtorSection = 0; 38 StaticDtorSection = 0; 39 LSDASection = 0; 40 EHFrameSection = 0; 41 42 DwarfAbbrevSection = 0; 43 DwarfInfoSection = 0; 44 DwarfLineSection = 0; 45 DwarfFrameSection = 0; 46 DwarfPubNamesSection = 0; 47 DwarfPubTypesSection = 0; 48 DwarfDebugInlineSection = 0; 49 DwarfStrSection = 0; 50 DwarfLocSection = 0; 51 DwarfARangesSection = 0; 52 DwarfRangesSection = 0; 53 DwarfMacroInfoSection = 0; 54} 55 56TargetLoweringObjectFile::~TargetLoweringObjectFile() { 57} 58 59static bool isSuitableForBSS(const GlobalVariable *GV) { 60 Constant *C = GV->getInitializer(); 61 62 // Must have zero initializer. 63 if (!C->isNullValue()) 64 return false; 65 66 // Leave constant zeros in readonly constant sections, so they can be shared. 67 if (GV->isConstant()) 68 return false; 69 70 // If the global has an explicit section specified, don't put it in BSS. 71 if (!GV->getSection().empty()) 72 return false; 73 74 // If -nozero-initialized-in-bss is specified, don't ever use BSS. 75 if (NoZerosInBSS) 76 return false; 77 78 // Otherwise, put it in BSS! 79 return true; 80} 81 82/// IsNullTerminatedString - Return true if the specified constant (which is 83/// known to have a type that is an array of 1/2/4 byte elements) ends with a 84/// nul value and contains no other nuls in it. 85static bool IsNullTerminatedString(const Constant *C) { 86 const ArrayType *ATy = cast<ArrayType>(C->getType()); 87 88 // First check: is we have constant array of i8 terminated with zero 89 if (const ConstantArray *CVA = dyn_cast<ConstantArray>(C)) { 90 if (ATy->getNumElements() == 0) return false; 91 92 ConstantInt *Null = 93 dyn_cast<ConstantInt>(CVA->getOperand(ATy->getNumElements()-1)); 94 if (Null == 0 || Null->getZExtValue() != 0) 95 return false; // Not null terminated. 96 97 // Verify that the null doesn't occur anywhere else in the string. 98 for (unsigned i = 0, e = ATy->getNumElements()-1; i != e; ++i) 99 // Reject constantexpr elements etc. 100 if (!isa<ConstantInt>(CVA->getOperand(i)) || 101 CVA->getOperand(i) == Null) 102 return false; 103 return true; 104 } 105 106 // Another possibility: [1 x i8] zeroinitializer 107 if (isa<ConstantAggregateZero>(C)) 108 return ATy->getNumElements() == 1; 109 110 return false; 111} 112 113/// SectionKindForGlobal - This is a top-level target-independent classifier for 114/// a global variable. Given an global variable and information from TM, it 115/// classifies the global in a variety of ways that make various target 116/// implementations simpler. The target implementation is free to ignore this 117/// extra info of course. 118static SectionKind SectionKindForGlobal(const GlobalValue *GV, 119 const TargetMachine &TM) { 120 Reloc::Model ReloModel = TM.getRelocationModel(); 121 122 // Early exit - functions should be always in text sections. 123 const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV); 124 if (GVar == 0) 125 return SectionKind::getText(); 126 127 128 // Handle thread-local data first. 129 if (GVar->isThreadLocal()) { 130 if (isSuitableForBSS(GVar)) 131 return SectionKind::getThreadBSS(); 132 return SectionKind::getThreadData(); 133 } 134 135 // Variable can be easily put to BSS section. 136 if (isSuitableForBSS(GVar)) 137 return SectionKind::getBSS(); 138 139 Constant *C = GVar->getInitializer(); 140 141 // If the global is marked constant, we can put it into a mergable section, 142 // a mergable string section, or general .data if it contains relocations. 143 if (GVar->isConstant()) { 144 // If the initializer for the global contains something that requires a 145 // relocation, then we may have to drop this into a wriable data section 146 // even though it is marked const. 147 switch (C->getRelocationInfo()) { 148 default: llvm_unreachable("unknown relocation info kind"); 149 case Constant::NoRelocation: 150 // If initializer is a null-terminated string, put it in a "cstring" 151 // section of the right width. 152 if (const ArrayType *ATy = dyn_cast<ArrayType>(C->getType())) { 153 if (const IntegerType *ITy = 154 dyn_cast<IntegerType>(ATy->getElementType())) { 155 if ((ITy->getBitWidth() == 8 || ITy->getBitWidth() == 16 || 156 ITy->getBitWidth() == 32) && 157 IsNullTerminatedString(C)) { 158 if (ITy->getBitWidth() == 8) 159 return SectionKind::getMergeable1ByteCString(); 160 if (ITy->getBitWidth() == 16) 161 return SectionKind::getMergeable2ByteCString(); 162 163 assert(ITy->getBitWidth() == 32 && "Unknown width"); 164 return SectionKind::getMergeable4ByteCString(); 165 } 166 } 167 } 168 169 // Otherwise, just drop it into a mergable constant section. If we have 170 // a section for this size, use it, otherwise use the arbitrary sized 171 // mergable section. 172 switch (TM.getTargetData()->getTypeAllocSize(C->getType())) { 173 case 4: return SectionKind::getMergeableConst4(); 174 case 8: return SectionKind::getMergeableConst8(); 175 case 16: return SectionKind::getMergeableConst16(); 176 default: return SectionKind::getMergeableConst(); 177 } 178 179 case Constant::LocalRelocation: 180 // In static relocation model, the linker will resolve all addresses, so 181 // the relocation entries will actually be constants by the time the app 182 // starts up. However, we can't put this into a mergable section, because 183 // the linker doesn't take relocations into consideration when it tries to 184 // merge entries in the section. 185 if (ReloModel == Reloc::Static) 186 return SectionKind::getReadOnly(); 187 188 // Otherwise, the dynamic linker needs to fix it up, put it in the 189 // writable data.rel.local section. 190 return SectionKind::getReadOnlyWithRelLocal(); 191 192 case Constant::GlobalRelocations: 193 // In static relocation model, the linker will resolve all addresses, so 194 // the relocation entries will actually be constants by the time the app 195 // starts up. However, we can't put this into a mergable section, because 196 // the linker doesn't take relocations into consideration when it tries to 197 // merge entries in the section. 198 if (ReloModel == Reloc::Static) 199 return SectionKind::getReadOnly(); 200 201 // Otherwise, the dynamic linker needs to fix it up, put it in the 202 // writable data.rel section. 203 return SectionKind::getReadOnlyWithRel(); 204 } 205 } 206 207 // Okay, this isn't a constant. If the initializer for the global is going 208 // to require a runtime relocation by the dynamic linker, put it into a more 209 // specific section to improve startup time of the app. This coalesces these 210 // globals together onto fewer pages, improving the locality of the dynamic 211 // linker. 212 if (ReloModel == Reloc::Static) 213 return SectionKind::getDataNoRel(); 214 215 switch (C->getRelocationInfo()) { 216 default: llvm_unreachable("unknown relocation info kind"); 217 case Constant::NoRelocation: 218 return SectionKind::getDataNoRel(); 219 case Constant::LocalRelocation: 220 return SectionKind::getDataRelLocal(); 221 case Constant::GlobalRelocations: 222 return SectionKind::getDataRel(); 223 } 224} 225 226/// SectionForGlobal - This method computes the appropriate section to emit 227/// the specified global variable or function definition. This should not 228/// be passed external (or available externally) globals. 229const MCSection *TargetLoweringObjectFile:: 230SectionForGlobal(const GlobalValue *GV, Mangler *Mang, 231 const TargetMachine &TM) const { 232 assert(!GV->isDeclaration() && !GV->hasAvailableExternallyLinkage() && 233 "Can only be used for global definitions"); 234 235 SectionKind Kind = SectionKindForGlobal(GV, TM); 236 237 // Select section name. 238 if (GV->hasSection()) { 239 // If the target has special section hacks for specifically named globals, 240 // return them now. 241 if (const MCSection *TS = getSpecialCasedSectionGlobals(GV, Mang, Kind)) 242 return TS; 243 244 // If the target has magic semantics for certain section names, make sure to 245 // pick up the flags. This allows the user to write things with attribute 246 // section and still get the appropriate section flags printed. 247 Kind = getKindForNamedSection(GV->getSection().c_str(), Kind); 248 249 return getOrCreateSection(GV->getSection().c_str(), false, Kind); 250 } 251 252 253 // Use default section depending on the 'type' of global 254 return SelectSectionForGlobal(GV, Kind, Mang, TM); 255} 256 257// Lame default implementation. Calculate the section name for global. 258const MCSection * 259TargetLoweringObjectFile::SelectSectionForGlobal(const GlobalValue *GV, 260 SectionKind Kind, 261 Mangler *Mang, 262 const TargetMachine &TM) const{ 263 assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 264 265 if (Kind.isText()) 266 return getTextSection(); 267 268 if (Kind.isBSS() && BSSSection != 0) 269 return BSSSection; 270 271 if (Kind.isReadOnly() && ReadOnlySection != 0) 272 return ReadOnlySection; 273 274 return getDataSection(); 275} 276 277/// getSectionForConstant - Given a mergable constant with the 278/// specified size and relocation information, return a section that it 279/// should be placed in. 280const MCSection * 281TargetLoweringObjectFile::getSectionForConstant(SectionKind Kind) const { 282 if (Kind.isReadOnly() && ReadOnlySection != 0) 283 return ReadOnlySection; 284 285 return DataSection; 286} 287 288 289const MCSection *TargetLoweringObjectFile:: 290getOrCreateSection(const char *Name, bool isDirective, SectionKind Kind) const { 291 if (MCSection *S = Ctx->GetSection(Name)) 292 return S; 293 return MCSection::Create(Name, isDirective, Kind, *Ctx); 294} 295 296 297 298//===----------------------------------------------------------------------===// 299// ELF 300//===----------------------------------------------------------------------===// 301 302void TargetLoweringObjectFileELF::Initialize(MCContext &Ctx, 303 const TargetMachine &TM) { 304 TargetLoweringObjectFile::Initialize(Ctx, TM); 305 if (!HasCrazyBSS) 306 BSSSection = getOrCreateSection("\t.bss", true, SectionKind::getBSS()); 307 else 308 // PPC/Linux doesn't support the .bss directive, it needs .section .bss. 309 // FIXME: Does .section .bss work everywhere?? 310 // FIXME2: this should just be handle by the section printer. We should get 311 // away from syntactic view of the sections and MCSection should just be a 312 // semantic view. 313 BSSSection = getOrCreateSection("\t.bss", false, SectionKind::getBSS()); 314 315 316 TextSection = getOrCreateSection("\t.text", true, SectionKind::getText()); 317 DataSection = getOrCreateSection("\t.data", true, SectionKind::getDataRel()); 318 ReadOnlySection = 319 getOrCreateSection("\t.rodata", false, SectionKind::getReadOnly()); 320 TLSDataSection = 321 getOrCreateSection("\t.tdata", false, SectionKind::getThreadData()); 322 323 // FIXME: No reason to make this. 324 CStringSection = getOrCreateSection("\t.rodata.str", true, 325 SectionKind::getMergeable1ByteCString()); 326 327 TLSBSSSection = getOrCreateSection("\t.tbss", false, 328 SectionKind::getThreadBSS()); 329 330 DataRelSection = getOrCreateSection("\t.data.rel", false, 331 SectionKind::getDataRel()); 332 DataRelLocalSection = getOrCreateSection("\t.data.rel.local", false, 333 SectionKind::getDataRelLocal()); 334 DataRelROSection = getOrCreateSection("\t.data.rel.ro", false, 335 SectionKind::getReadOnlyWithRel()); 336 DataRelROLocalSection = 337 getOrCreateSection("\t.data.rel.ro.local", false, 338 SectionKind::getReadOnlyWithRelLocal()); 339 340 MergeableConst4Section = getOrCreateSection(".rodata.cst4", false, 341 SectionKind::getMergeableConst4()); 342 MergeableConst8Section = getOrCreateSection(".rodata.cst8", false, 343 SectionKind::getMergeableConst8()); 344 MergeableConst16Section = getOrCreateSection(".rodata.cst16", false, 345 SectionKind::getMergeableConst16()); 346 347 StaticCtorSection = 348 getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 349 StaticDtorSection = 350 getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 351 352 // Exception Handling Sections. 353 354 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 355 // it contains relocatable pointers. In PIC mode, this is probably a big 356 // runtime hit for C++ apps. Either the contents of the LSDA need to be 357 // adjusted or this should be a data section. 358 LSDASection = 359 getOrCreateSection(".gcc_except_table", false, SectionKind::getReadOnly()); 360 EHFrameSection = 361 getOrCreateSection(".eh_frame", false, SectionKind::getDataRel()); 362 363 // Debug Info Sections. 364 DwarfAbbrevSection = 365 getOrCreateSection(".debug_abbrev", false, SectionKind::getMetadata()); 366 DwarfInfoSection = 367 getOrCreateSection(".debug_info", false, SectionKind::getMetadata()); 368 DwarfLineSection = 369 getOrCreateSection(".debug_line", false, SectionKind::getMetadata()); 370 DwarfFrameSection = 371 getOrCreateSection(".debug_frame", false, SectionKind::getMetadata()); 372 DwarfPubNamesSection = 373 getOrCreateSection(".debug_pubnames", false, SectionKind::getMetadata()); 374 DwarfPubTypesSection = 375 getOrCreateSection(".debug_pubtypes", false, SectionKind::getMetadata()); 376 DwarfStrSection = 377 getOrCreateSection(".debug_str", false, SectionKind::getMetadata()); 378 DwarfLocSection = 379 getOrCreateSection(".debug_loc", false, SectionKind::getMetadata()); 380 DwarfARangesSection = 381 getOrCreateSection(".debug_aranges", false, SectionKind::getMetadata()); 382 DwarfRangesSection = 383 getOrCreateSection(".debug_ranges", false, SectionKind::getMetadata()); 384 DwarfMacroInfoSection = 385 getOrCreateSection(".debug_macinfo", false, SectionKind::getMetadata()); 386} 387 388 389SectionKind TargetLoweringObjectFileELF:: 390getKindForNamedSection(const char *Name, SectionKind K) const { 391 if (Name[0] != '.') return K; 392 393 // Some lame default implementation based on some magic section names. 394 if (strncmp(Name, ".gnu.linkonce.b.", 16) == 0 || 395 strncmp(Name, ".llvm.linkonce.b.", 17) == 0 || 396 strncmp(Name, ".gnu.linkonce.sb.", 17) == 0 || 397 strncmp(Name, ".llvm.linkonce.sb.", 18) == 0) 398 return SectionKind::getBSS(); 399 400 if (strcmp(Name, ".tdata") == 0 || 401 strncmp(Name, ".tdata.", 7) == 0 || 402 strncmp(Name, ".gnu.linkonce.td.", 17) == 0 || 403 strncmp(Name, ".llvm.linkonce.td.", 18) == 0) 404 return SectionKind::getThreadData(); 405 406 if (strcmp(Name, ".tbss") == 0 || 407 strncmp(Name, ".tbss.", 6) == 0 || 408 strncmp(Name, ".gnu.linkonce.tb.", 17) == 0 || 409 strncmp(Name, ".llvm.linkonce.tb.", 18) == 0) 410 return SectionKind::getThreadBSS(); 411 412 return K; 413} 414 415void TargetLoweringObjectFileELF:: 416getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 417 Str.push_back(','); 418 Str.push_back('"'); 419 420 if (!Kind.isMetadata()) 421 Str.push_back('a'); 422 if (Kind.isText()) 423 Str.push_back('x'); 424 if (Kind.isWriteable()) 425 Str.push_back('w'); 426 if (Kind.isMergeable1ByteCString() || 427 Kind.isMergeable2ByteCString() || 428 Kind.isMergeable4ByteCString() || 429 Kind.isMergeableConst4() || 430 Kind.isMergeableConst8() || 431 Kind.isMergeableConst16()) 432 Str.push_back('M'); 433 if (Kind.isMergeable1ByteCString() || 434 Kind.isMergeable2ByteCString() || 435 Kind.isMergeable4ByteCString()) 436 Str.push_back('S'); 437 if (Kind.isThreadLocal()) 438 Str.push_back('T'); 439 440 Str.push_back('"'); 441 Str.push_back(','); 442 443 // If comment string is '@', e.g. as on ARM - use '%' instead 444 if (AtIsCommentChar) 445 Str.push_back('%'); 446 else 447 Str.push_back('@'); 448 449 const char *KindStr; 450 if (Kind.isBSS() || Kind.isThreadBSS()) 451 KindStr = "nobits"; 452 else 453 KindStr = "progbits"; 454 455 Str.append(KindStr, KindStr+strlen(KindStr)); 456 457 if (Kind.isMergeable1ByteCString()) { 458 Str.push_back(','); 459 Str.push_back('1'); 460 } else if (Kind.isMergeable2ByteCString()) { 461 Str.push_back(','); 462 Str.push_back('2'); 463 } else if (Kind.isMergeable4ByteCString()) { 464 Str.push_back(','); 465 Str.push_back('4'); 466 } else if (Kind.isMergeableConst4()) { 467 Str.push_back(','); 468 Str.push_back('4'); 469 } else if (Kind.isMergeableConst8()) { 470 Str.push_back(','); 471 Str.push_back('8'); 472 } else if (Kind.isMergeableConst16()) { 473 Str.push_back(','); 474 Str.push_back('1'); 475 Str.push_back('6'); 476 } 477} 478 479 480static const char *getSectionPrefixForUniqueGlobal(SectionKind Kind) { 481 if (Kind.isText()) return ".gnu.linkonce.t."; 482 if (Kind.isReadOnly()) return ".gnu.linkonce.r."; 483 484 if (Kind.isThreadData()) return ".gnu.linkonce.td."; 485 if (Kind.isThreadBSS()) return ".gnu.linkonce.tb."; 486 487 if (Kind.isBSS()) return ".gnu.linkonce.b."; 488 if (Kind.isDataNoRel()) return ".gnu.linkonce.d."; 489 if (Kind.isDataRelLocal()) return ".gnu.linkonce.d.rel.local."; 490 if (Kind.isDataRel()) return ".gnu.linkonce.d.rel."; 491 if (Kind.isReadOnlyWithRelLocal()) return ".gnu.linkonce.d.rel.ro.local."; 492 493 assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 494 return ".gnu.linkonce.d.rel.ro."; 495} 496 497const MCSection *TargetLoweringObjectFileELF:: 498SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 499 Mangler *Mang, const TargetMachine &TM) const { 500 501 // If this global is linkonce/weak and the target handles this by emitting it 502 // into a 'uniqued' section name, create and return the section now. 503 if (GV->isWeakForLinker()) { 504 const char *Prefix = getSectionPrefixForUniqueGlobal(Kind); 505 std::string Name = Mang->makeNameProper(GV->getNameStr()); 506 return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 507 } 508 509 if (Kind.isText()) return TextSection; 510 511 if (Kind.isMergeable1ByteCString() || 512 Kind.isMergeable2ByteCString() || 513 Kind.isMergeable4ByteCString()) { 514 assert(CStringSection && "Should have string section prefix"); 515 516 // We also need alignment here. 517 // FIXME: this is getting the alignment of the character, not the 518 // alignment of the global! 519 unsigned Align = 520 TM.getTargetData()->getPreferredAlignment(cast<GlobalVariable>(GV)); 521 522 const char *SizeSpec = "1."; 523 if (Kind.isMergeable2ByteCString()) 524 SizeSpec = "2."; 525 else if (Kind.isMergeable4ByteCString()) 526 SizeSpec = "4."; 527 else 528 assert(Kind.isMergeable1ByteCString() && "unknown string width"); 529 530 531 std::string Name = CStringSection->getName() + SizeSpec + utostr(Align); 532 return getOrCreateSection(Name.c_str(), false, Kind); 533 } 534 535 if (Kind.isMergeableConst()) { 536 if (Kind.isMergeableConst4()) 537 return MergeableConst4Section; 538 if (Kind.isMergeableConst8()) 539 return MergeableConst8Section; 540 if (Kind.isMergeableConst16()) 541 return MergeableConst16Section; 542 return ReadOnlySection; // .const 543 } 544 545 if (Kind.isReadOnly()) return ReadOnlySection; 546 547 if (Kind.isThreadData()) return TLSDataSection; 548 if (Kind.isThreadBSS()) return TLSBSSSection; 549 550 if (Kind.isBSS()) return BSSSection; 551 552 if (Kind.isDataNoRel()) return DataSection; 553 if (Kind.isDataRelLocal()) return DataRelLocalSection; 554 if (Kind.isDataRel()) return DataRelSection; 555 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 556 557 assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 558 return DataRelROSection; 559} 560 561/// getSectionForConstant - Given a mergeable constant with the 562/// specified size and relocation information, return a section that it 563/// should be placed in. 564const MCSection *TargetLoweringObjectFileELF:: 565getSectionForConstant(SectionKind Kind) const { 566 if (Kind.isMergeableConst4()) 567 return MergeableConst4Section; 568 if (Kind.isMergeableConst8()) 569 return MergeableConst8Section; 570 if (Kind.isMergeableConst16()) 571 return MergeableConst16Section; 572 if (Kind.isReadOnly()) 573 return ReadOnlySection; 574 575 if (Kind.isReadOnlyWithRelLocal()) return DataRelROLocalSection; 576 assert(Kind.isReadOnlyWithRel() && "Unknown section kind"); 577 return DataRelROSection; 578} 579 580//===----------------------------------------------------------------------===// 581// MachO 582//===----------------------------------------------------------------------===// 583 584const MCSection *TargetLoweringObjectFileMachO:: 585getMachOSection(const char *Name, bool isDirective, SectionKind K) { 586 // FOR NOW, Just forward. 587 return getOrCreateSection(Name, isDirective, K); 588} 589 590 591 592void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx, 593 const TargetMachine &TM) { 594 TargetLoweringObjectFile::Initialize(Ctx, TM); 595 TextSection = getOrCreateSection("\t.text", true, 596 SectionKind::getText()); 597 DataSection = getOrCreateSection("\t.data", true, 598 SectionKind::getDataRel()); 599 600 CStringSection = getOrCreateSection("\t.cstring", true, 601 SectionKind::getMergeable1ByteCString()); 602 FourByteConstantSection = getOrCreateSection("\t.literal4\n", true, 603 SectionKind::getMergeableConst4()); 604 EightByteConstantSection = getOrCreateSection("\t.literal8\n", true, 605 SectionKind::getMergeableConst8()); 606 607 // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 608 // to using it in -static mode. 609 if (TM.getRelocationModel() != Reloc::Static && 610 TM.getTargetData()->getPointerSize() == 32) 611 SixteenByteConstantSection = 612 getOrCreateSection("\t.literal16\n", true, 613 SectionKind::getMergeableConst16()); 614 else 615 SixteenByteConstantSection = 0; 616 617 ReadOnlySection = getOrCreateSection("\t.const", true, 618 SectionKind::getReadOnly()); 619 620 TextCoalSection = 621 getOrCreateSection("\t__TEXT,__textcoal_nt,coalesced,pure_instructions", 622 false, SectionKind::getText()); 623 ConstTextCoalSection = getOrCreateSection("\t__TEXT,__const_coal,coalesced", 624 false, 625 SectionKind::getText()); 626 ConstDataCoalSection = getOrCreateSection("\t__DATA,__const_coal,coalesced", 627 false, 628 SectionKind::getText()); 629 ConstDataSection = getOrCreateSection("\t.const_data", true, 630 SectionKind::getReadOnlyWithRel()); 631 DataCoalSection = getOrCreateSection("\t__DATA,__datacoal_nt,coalesced", 632 false, 633 SectionKind::getDataRel()); 634 635 if (TM.getRelocationModel() == Reloc::Static) { 636 StaticCtorSection = 637 getOrCreateSection(".constructor", true, SectionKind::getDataRel()); 638 StaticDtorSection = 639 getOrCreateSection(".destructor", true, SectionKind::getDataRel()); 640 } else { 641 StaticCtorSection = 642 getOrCreateSection(".mod_init_func", true, SectionKind::getDataRel()); 643 StaticDtorSection = 644 getOrCreateSection(".mod_term_func", true, SectionKind::getDataRel()); 645 } 646 647 // Exception Handling. 648 LSDASection = getOrCreateSection("__DATA,__gcc_except_tab", false, 649 SectionKind::getDataRel()); 650 EHFrameSection = 651 getOrCreateSection("__TEXT,__eh_frame,coalesced,no_toc+strip_static_syms" 652 "+live_support", false, SectionKind::getReadOnly()); 653 654 // Debug Information. 655 // FIXME: Don't use 'directive' syntax: need flags for debug/regular?? 656 // FIXME: Need __DWARF segment. 657 DwarfAbbrevSection = 658 getOrCreateSection(".section __DWARF,__debug_abbrev,regular,debug", true, 659 SectionKind::getMetadata()); 660 DwarfInfoSection = 661 getOrCreateSection(".section __DWARF,__debug_info,regular,debug", true, 662 SectionKind::getMetadata()); 663 DwarfLineSection = 664 getOrCreateSection(".section __DWARF,__debug_line,regular,debug", true, 665 SectionKind::getMetadata()); 666 DwarfFrameSection = 667 getOrCreateSection(".section __DWARF,__debug_frame,regular,debug", true, 668 SectionKind::getMetadata()); 669 DwarfPubNamesSection = 670 getOrCreateSection(".section __DWARF,__debug_pubnames,regular,debug", true, 671 SectionKind::getMetadata()); 672 DwarfPubTypesSection = 673 getOrCreateSection(".section __DWARF,__debug_pubtypes,regular,debug", true, 674 SectionKind::getMetadata()); 675 DwarfStrSection = 676 getOrCreateSection(".section __DWARF,__debug_str,regular,debug", true, 677 SectionKind::getMetadata()); 678 DwarfLocSection = 679 getOrCreateSection(".section __DWARF,__debug_loc,regular,debug", true, 680 SectionKind::getMetadata()); 681 DwarfARangesSection = 682 getOrCreateSection(".section __DWARF,__debug_aranges,regular,debug", true, 683 SectionKind::getMetadata()); 684 DwarfRangesSection = 685 getOrCreateSection(".section __DWARF,__debug_ranges,regular,debug", true, 686 SectionKind::getMetadata()); 687 DwarfMacroInfoSection = 688 getOrCreateSection(".section __DWARF,__debug_macinfo,regular,debug", true, 689 SectionKind::getMetadata()); 690 DwarfDebugInlineSection = 691 getOrCreateSection(".section __DWARF,__debug_inlined,regular,debug", true, 692 SectionKind::getMetadata()); 693} 694 695const MCSection *TargetLoweringObjectFileMachO:: 696SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 697 Mangler *Mang, const TargetMachine &TM) const { 698 assert(!Kind.isThreadLocal() && "Darwin doesn't support TLS"); 699 700 if (Kind.isText()) 701 return GV->isWeakForLinker() ? TextCoalSection : TextSection; 702 703 // If this is weak/linkonce, put this in a coalescable section, either in text 704 // or data depending on if it is writable. 705 if (GV->isWeakForLinker()) { 706 if (Kind.isReadOnly()) 707 return ConstTextCoalSection; 708 return DataCoalSection; 709 } 710 711 // FIXME: Alignment check should be handled by section classifier. 712 if (Kind.isMergeable1ByteCString()) { 713 Constant *C = cast<GlobalVariable>(GV)->getInitializer(); 714 const Type *Ty = cast<ArrayType>(C->getType())->getElementType(); 715 const TargetData &TD = *TM.getTargetData(); 716 unsigned Size = TD.getTypeAllocSize(Ty); 717 if (Size) { 718 unsigned Align = TD.getPreferredAlignment(cast<GlobalVariable>(GV)); 719 if (Align <= 32) 720 return CStringSection; 721 } 722 723 return ReadOnlySection; 724 } 725 726 if (Kind.isMergeableConst()) { 727 if (Kind.isMergeableConst4()) 728 return FourByteConstantSection; 729 if (Kind.isMergeableConst8()) 730 return EightByteConstantSection; 731 if (Kind.isMergeableConst16() && SixteenByteConstantSection) 732 return SixteenByteConstantSection; 733 return ReadOnlySection; // .const 734 } 735 736 // FIXME: ROData -> const in -static mode that is relocatable but they happen 737 // by the static linker. Why not mergeable? 738 if (Kind.isReadOnly()) 739 return ReadOnlySection; 740 741 // If this is marked const, put it into a const section. But if the dynamic 742 // linker needs to write to it, put it in the data segment. 743 if (Kind.isReadOnlyWithRel()) 744 return ConstDataSection; 745 746 // Otherwise, just drop the variable in the normal data section. 747 return DataSection; 748} 749 750const MCSection * 751TargetLoweringObjectFileMachO::getSectionForConstant(SectionKind Kind) const { 752 // If this constant requires a relocation, we have to put it in the data 753 // segment, not in the text segment. 754 if (Kind.isDataRel()) 755 return ConstDataSection; 756 757 if (Kind.isMergeableConst4()) 758 return FourByteConstantSection; 759 if (Kind.isMergeableConst8()) 760 return EightByteConstantSection; 761 if (Kind.isMergeableConst16() && SixteenByteConstantSection) 762 return SixteenByteConstantSection; 763 return ReadOnlySection; // .const 764} 765 766/// shouldEmitUsedDirectiveFor - This hook allows targets to selectively decide 767/// not to emit the UsedDirective for some symbols in llvm.used. 768// FIXME: REMOVE this (rdar://7071300) 769bool TargetLoweringObjectFileMachO:: 770shouldEmitUsedDirectiveFor(const GlobalValue *GV, Mangler *Mang) const { 771 /// On Darwin, internally linked data beginning with "L" or "l" does not have 772 /// the directive emitted (this occurs in ObjC metadata). 773 if (!GV) return false; 774 775 // Check whether the mangled name has the "Private" or "LinkerPrivate" prefix. 776 if (GV->hasLocalLinkage() && !isa<Function>(GV)) { 777 // FIXME: ObjC metadata is currently emitted as internal symbols that have 778 // \1L and \0l prefixes on them. Fix them to be Private/LinkerPrivate and 779 // this horrible hack can go away. 780 const std::string &Name = Mang->getMangledName(GV); 781 if (Name[0] == 'L' || Name[0] == 'l') 782 return false; 783 } 784 785 return true; 786} 787 788 789//===----------------------------------------------------------------------===// 790// COFF 791//===----------------------------------------------------------------------===// 792 793const MCSection *TargetLoweringObjectFileCOFF:: 794getCOFFSection(const char *Name, bool isDirective, SectionKind K) { 795 return getOrCreateSection(Name, isDirective, K); 796} 797 798void TargetLoweringObjectFileCOFF::Initialize(MCContext &Ctx, 799 const TargetMachine &TM) { 800 TargetLoweringObjectFile::Initialize(Ctx, TM); 801 TextSection = getOrCreateSection("\t.text", true, 802 SectionKind::getText()); 803 DataSection = getOrCreateSection("\t.data", true, 804 SectionKind::getDataRel()); 805 StaticCtorSection = 806 getOrCreateSection(".ctors", false, SectionKind::getDataRel()); 807 StaticDtorSection = 808 getOrCreateSection(".dtors", false, SectionKind::getDataRel()); 809 810 811 // Debug info. 812 // FIXME: Don't use 'directive' mode here. 813 DwarfAbbrevSection = 814 getOrCreateSection("\t.section\t.debug_abbrev,\"dr\"", 815 true, SectionKind::getMetadata()); 816 DwarfInfoSection = 817 getOrCreateSection("\t.section\t.debug_info,\"dr\"", 818 true, SectionKind::getMetadata()); 819 DwarfLineSection = 820 getOrCreateSection("\t.section\t.debug_line,\"dr\"", 821 true, SectionKind::getMetadata()); 822 DwarfFrameSection = 823 getOrCreateSection("\t.section\t.debug_frame,\"dr\"", 824 true, SectionKind::getMetadata()); 825 DwarfPubNamesSection = 826 getOrCreateSection("\t.section\t.debug_pubnames,\"dr\"", 827 true, SectionKind::getMetadata()); 828 DwarfPubTypesSection = 829 getOrCreateSection("\t.section\t.debug_pubtypes,\"dr\"", 830 true, SectionKind::getMetadata()); 831 DwarfStrSection = 832 getOrCreateSection("\t.section\t.debug_str,\"dr\"", 833 true, SectionKind::getMetadata()); 834 DwarfLocSection = 835 getOrCreateSection("\t.section\t.debug_loc,\"dr\"", 836 true, SectionKind::getMetadata()); 837 DwarfARangesSection = 838 getOrCreateSection("\t.section\t.debug_aranges,\"dr\"", 839 true, SectionKind::getMetadata()); 840 DwarfRangesSection = 841 getOrCreateSection("\t.section\t.debug_ranges,\"dr\"", 842 true, SectionKind::getMetadata()); 843 DwarfMacroInfoSection = 844 getOrCreateSection("\t.section\t.debug_macinfo,\"dr\"", 845 true, SectionKind::getMetadata()); 846} 847 848void TargetLoweringObjectFileCOFF:: 849getSectionFlagsAsString(SectionKind Kind, SmallVectorImpl<char> &Str) const { 850 // FIXME: Inefficient. 851 std::string Res = ",\""; 852 if (Kind.isText()) 853 Res += 'x'; 854 if (Kind.isWriteable()) 855 Res += 'w'; 856 Res += "\""; 857 858 Str.append(Res.begin(), Res.end()); 859} 860 861static const char *getCOFFSectionPrefixForUniqueGlobal(SectionKind Kind) { 862 if (Kind.isText()) 863 return ".text$linkonce"; 864 if (Kind.isWriteable()) 865 return ".data$linkonce"; 866 return ".rdata$linkonce"; 867} 868 869 870const MCSection *TargetLoweringObjectFileCOFF:: 871SelectSectionForGlobal(const GlobalValue *GV, SectionKind Kind, 872 Mangler *Mang, const TargetMachine &TM) const { 873 assert(!Kind.isThreadLocal() && "Doesn't support TLS"); 874 875 // If this global is linkonce/weak and the target handles this by emitting it 876 // into a 'uniqued' section name, create and return the section now. 877 if (GV->isWeakForLinker()) { 878 const char *Prefix = getCOFFSectionPrefixForUniqueGlobal(Kind); 879 std::string Name = Mang->makeNameProper(GV->getNameStr()); 880 return getOrCreateSection((Prefix+Name).c_str(), false, Kind); 881 } 882 883 if (Kind.isText()) 884 return getTextSection(); 885 886 return getDataSection(); 887} 888 889