1 //===-- MObjectFileInfo.cpp - Object File Information ---------------------===// 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 #include "llvm/MC/MCObjectFileInfo.h" 11 #include "llvm/ADT/StringExtras.h" 12 #include "llvm/ADT/Triple.h" 13 #include "llvm/MC/MCAsmInfo.h" 14 #include "llvm/MC/MCContext.h" 15 #include "llvm/MC/MCSection.h" 16 #include "llvm/MC/MCSectionCOFF.h" 17 #include "llvm/MC/MCSectionELF.h" 18 #include "llvm/MC/MCSectionMachO.h" 19 using namespace llvm; 20 21 static bool useCompactUnwind(const Triple &T) { 22 // Only on darwin. 23 if (!T.isOSDarwin()) 24 return false; 25 26 // aarch64 always has it. 27 if (T.getArch() == Triple::aarch64) 28 return true; 29 30 // Use it on newer version of OS X. 31 if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) 32 return true; 33 34 // And the iOS simulator. 35 if (T.isiOS() && 36 (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86)) 37 return true; 38 39 return false; 40 } 41 42 void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) { 43 // MachO 44 SupportsWeakOmittedEHFrame = false; 45 46 if (T.isOSDarwin() && T.getArch() == Triple::aarch64) 47 SupportsCompactUnwindWithoutEHFrame = true; 48 49 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel 50 | dwarf::DW_EH_PE_sdata4; 51 LSDAEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel; 52 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 53 dwarf::DW_EH_PE_sdata4; 54 55 // .comm doesn't support alignment before Leopard. 56 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5)) 57 CommDirectiveSupportsAlignment = false; 58 59 TextSection // .text 60 = Ctx->getMachOSection("__TEXT", "__text", 61 MachO::S_ATTR_PURE_INSTRUCTIONS, 62 SectionKind::getText()); 63 DataSection // .data 64 = Ctx->getMachOSection("__DATA", "__data", 0, 65 SectionKind::getDataRel()); 66 67 // BSSSection might not be expected initialized on msvc. 68 BSSSection = nullptr; 69 70 TLSDataSection // .tdata 71 = Ctx->getMachOSection("__DATA", "__thread_data", 72 MachO::S_THREAD_LOCAL_REGULAR, 73 SectionKind::getDataRel()); 74 TLSBSSSection // .tbss 75 = Ctx->getMachOSection("__DATA", "__thread_bss", 76 MachO::S_THREAD_LOCAL_ZEROFILL, 77 SectionKind::getThreadBSS()); 78 79 // TODO: Verify datarel below. 80 TLSTLVSection // .tlv 81 = Ctx->getMachOSection("__DATA", "__thread_vars", 82 MachO::S_THREAD_LOCAL_VARIABLES, 83 SectionKind::getDataRel()); 84 85 TLSThreadInitSection 86 = Ctx->getMachOSection("__DATA", "__thread_init", 87 MachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, 88 SectionKind::getDataRel()); 89 90 CStringSection // .cstring 91 = Ctx->getMachOSection("__TEXT", "__cstring", 92 MachO::S_CSTRING_LITERALS, 93 SectionKind::getMergeable1ByteCString()); 94 UStringSection 95 = Ctx->getMachOSection("__TEXT","__ustring", 0, 96 SectionKind::getMergeable2ByteCString()); 97 FourByteConstantSection // .literal4 98 = Ctx->getMachOSection("__TEXT", "__literal4", 99 MachO::S_4BYTE_LITERALS, 100 SectionKind::getMergeableConst4()); 101 EightByteConstantSection // .literal8 102 = Ctx->getMachOSection("__TEXT", "__literal8", 103 MachO::S_8BYTE_LITERALS, 104 SectionKind::getMergeableConst8()); 105 106 SixteenByteConstantSection // .literal16 107 = Ctx->getMachOSection("__TEXT", "__literal16", 108 MachO::S_16BYTE_LITERALS, 109 SectionKind::getMergeableConst16()); 110 111 ReadOnlySection // .const 112 = Ctx->getMachOSection("__TEXT", "__const", 0, 113 SectionKind::getReadOnly()); 114 115 TextCoalSection 116 = Ctx->getMachOSection("__TEXT", "__textcoal_nt", 117 MachO::S_COALESCED | 118 MachO::S_ATTR_PURE_INSTRUCTIONS, 119 SectionKind::getText()); 120 ConstTextCoalSection 121 = Ctx->getMachOSection("__TEXT", "__const_coal", 122 MachO::S_COALESCED, 123 SectionKind::getReadOnly()); 124 ConstDataSection // .const_data 125 = Ctx->getMachOSection("__DATA", "__const", 0, 126 SectionKind::getReadOnlyWithRel()); 127 DataCoalSection 128 = Ctx->getMachOSection("__DATA","__datacoal_nt", 129 MachO::S_COALESCED, 130 SectionKind::getDataRel()); 131 DataCommonSection 132 = Ctx->getMachOSection("__DATA","__common", 133 MachO::S_ZEROFILL, 134 SectionKind::getBSS()); 135 DataBSSSection 136 = Ctx->getMachOSection("__DATA","__bss", MachO::S_ZEROFILL, 137 SectionKind::getBSS()); 138 139 140 LazySymbolPointerSection 141 = Ctx->getMachOSection("__DATA", "__la_symbol_ptr", 142 MachO::S_LAZY_SYMBOL_POINTERS, 143 SectionKind::getMetadata()); 144 NonLazySymbolPointerSection 145 = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr", 146 MachO::S_NON_LAZY_SYMBOL_POINTERS, 147 SectionKind::getMetadata()); 148 149 if (RelocM == Reloc::Static) { 150 StaticCtorSection 151 = Ctx->getMachOSection("__TEXT", "__constructor", 0, 152 SectionKind::getDataRel()); 153 StaticDtorSection 154 = Ctx->getMachOSection("__TEXT", "__destructor", 0, 155 SectionKind::getDataRel()); 156 } else { 157 StaticCtorSection 158 = Ctx->getMachOSection("__DATA", "__mod_init_func", 159 MachO::S_MOD_INIT_FUNC_POINTERS, 160 SectionKind::getDataRel()); 161 StaticDtorSection 162 = Ctx->getMachOSection("__DATA", "__mod_term_func", 163 MachO::S_MOD_TERM_FUNC_POINTERS, 164 SectionKind::getDataRel()); 165 } 166 167 // Exception Handling. 168 LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0, 169 SectionKind::getReadOnlyWithRel()); 170 171 COFFDebugSymbolsSection = nullptr; 172 173 if (useCompactUnwind(T)) { 174 CompactUnwindSection = 175 Ctx->getMachOSection("__LD", "__compact_unwind", MachO::S_ATTR_DEBUG, 176 SectionKind::getReadOnly()); 177 178 if (T.getArch() == Triple::x86_64 || T.getArch() == Triple::x86) 179 CompactUnwindDwarfEHFrameOnly = 0x04000000; 180 else if (T.getArch() == Triple::aarch64) 181 CompactUnwindDwarfEHFrameOnly = 0x03000000; 182 } 183 184 // Debug Information. 185 DwarfAccelNamesSection = 186 Ctx->getMachOSection("__DWARF", "__apple_names", 187 MachO::S_ATTR_DEBUG, 188 SectionKind::getMetadata()); 189 DwarfAccelObjCSection = 190 Ctx->getMachOSection("__DWARF", "__apple_objc", 191 MachO::S_ATTR_DEBUG, 192 SectionKind::getMetadata()); 193 // 16 character section limit... 194 DwarfAccelNamespaceSection = 195 Ctx->getMachOSection("__DWARF", "__apple_namespac", 196 MachO::S_ATTR_DEBUG, 197 SectionKind::getMetadata()); 198 DwarfAccelTypesSection = 199 Ctx->getMachOSection("__DWARF", "__apple_types", 200 MachO::S_ATTR_DEBUG, 201 SectionKind::getMetadata()); 202 203 DwarfAbbrevSection = 204 Ctx->getMachOSection("__DWARF", "__debug_abbrev", 205 MachO::S_ATTR_DEBUG, 206 SectionKind::getMetadata()); 207 DwarfInfoSection = 208 Ctx->getMachOSection("__DWARF", "__debug_info", 209 MachO::S_ATTR_DEBUG, 210 SectionKind::getMetadata()); 211 DwarfLineSection = 212 Ctx->getMachOSection("__DWARF", "__debug_line", 213 MachO::S_ATTR_DEBUG, 214 SectionKind::getMetadata()); 215 DwarfFrameSection = 216 Ctx->getMachOSection("__DWARF", "__debug_frame", 217 MachO::S_ATTR_DEBUG, 218 SectionKind::getMetadata()); 219 DwarfPubNamesSection = 220 Ctx->getMachOSection("__DWARF", "__debug_pubnames", 221 MachO::S_ATTR_DEBUG, 222 SectionKind::getMetadata()); 223 DwarfPubTypesSection = 224 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", 225 MachO::S_ATTR_DEBUG, 226 SectionKind::getMetadata()); 227 DwarfGnuPubNamesSection = 228 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubn", 229 MachO::S_ATTR_DEBUG, 230 SectionKind::getMetadata()); 231 DwarfGnuPubTypesSection = 232 Ctx->getMachOSection("__DWARF", "__debug_gnu_pubt", 233 MachO::S_ATTR_DEBUG, 234 SectionKind::getMetadata()); 235 DwarfStrSection = 236 Ctx->getMachOSection("__DWARF", "__debug_str", 237 MachO::S_ATTR_DEBUG, 238 SectionKind::getMetadata()); 239 DwarfLocSection = 240 Ctx->getMachOSection("__DWARF", "__debug_loc", 241 MachO::S_ATTR_DEBUG, 242 SectionKind::getMetadata()); 243 DwarfARangesSection = 244 Ctx->getMachOSection("__DWARF", "__debug_aranges", 245 MachO::S_ATTR_DEBUG, 246 SectionKind::getMetadata()); 247 DwarfRangesSection = 248 Ctx->getMachOSection("__DWARF", "__debug_ranges", 249 MachO::S_ATTR_DEBUG, 250 SectionKind::getMetadata()); 251 DwarfMacroInfoSection = 252 Ctx->getMachOSection("__DWARF", "__debug_macinfo", 253 MachO::S_ATTR_DEBUG, 254 SectionKind::getMetadata()); 255 DwarfDebugInlineSection = 256 Ctx->getMachOSection("__DWARF", "__debug_inlined", 257 MachO::S_ATTR_DEBUG, 258 SectionKind::getMetadata()); 259 StackMapSection = 260 Ctx->getMachOSection("__LLVM_STACKMAPS", "__llvm_stackmaps", 0, 261 SectionKind::getMetadata()); 262 263 TLSExtraDataSection = TLSTLVSection; 264 } 265 266 void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { 267 switch (T.getArch()) { 268 case Triple::mips: 269 case Triple::mipsel: 270 FDECFIEncoding = dwarf::DW_EH_PE_sdata4; 271 break; 272 case Triple::mips64: 273 case Triple::mips64el: 274 FDECFIEncoding = dwarf::DW_EH_PE_sdata8; 275 break; 276 case Triple::x86_64: 277 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | 278 ((CMModel == CodeModel::Large) ? dwarf::DW_EH_PE_sdata8 279 : dwarf::DW_EH_PE_sdata4); 280 281 break; 282 default: 283 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 284 break; 285 } 286 287 switch (T.getArch()) { 288 case Triple::arm: 289 case Triple::armeb: 290 case Triple::thumb: 291 case Triple::thumbeb: 292 if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM) 293 break; 294 // Fallthrough if not using EHABI 295 case Triple::ppc: 296 case Triple::x86: 297 PersonalityEncoding = (RelocM == Reloc::PIC_) 298 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 299 : dwarf::DW_EH_PE_absptr; 300 LSDAEncoding = (RelocM == Reloc::PIC_) 301 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 302 : dwarf::DW_EH_PE_absptr; 303 TTypeEncoding = (RelocM == Reloc::PIC_) 304 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 305 : dwarf::DW_EH_PE_absptr; 306 break; 307 case Triple::x86_64: 308 if (RelocM == Reloc::PIC_) { 309 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 310 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 311 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 312 LSDAEncoding = dwarf::DW_EH_PE_pcrel | 313 (CMModel == CodeModel::Small 314 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 315 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 316 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 317 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 318 } else { 319 PersonalityEncoding = 320 (CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 321 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 322 LSDAEncoding = (CMModel == CodeModel::Small) 323 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 324 TTypeEncoding = (CMModel == CodeModel::Small) 325 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 326 } 327 break; 328 case Triple::aarch64: 329 case Triple::aarch64_be: 330 // The small model guarantees static code/data size < 4GB, but not where it 331 // will be in memory. Most of these could end up >2GB away so even a signed 332 // pc-relative 32-bit address is insufficient, theoretically. 333 if (RelocM == Reloc::PIC_) { 334 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 335 dwarf::DW_EH_PE_sdata8; 336 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8; 337 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 338 dwarf::DW_EH_PE_sdata8; 339 } else { 340 PersonalityEncoding = dwarf::DW_EH_PE_absptr; 341 LSDAEncoding = dwarf::DW_EH_PE_absptr; 342 TTypeEncoding = dwarf::DW_EH_PE_absptr; 343 } 344 break; 345 case Triple::mips: 346 case Triple::mipsel: 347 case Triple::mips64: 348 case Triple::mips64el: 349 // MIPS uses indirect pointer to refer personality functions, so that the 350 // eh_frame section can be read-only. DW.ref.personality will be generated 351 // for relocation. 352 PersonalityEncoding = dwarf::DW_EH_PE_indirect; 353 break; 354 case Triple::ppc64: 355 case Triple::ppc64le: 356 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 357 dwarf::DW_EH_PE_udata8; 358 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8; 359 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 360 dwarf::DW_EH_PE_udata8; 361 break; 362 case Triple::sparc: 363 if (RelocM == Reloc::PIC_) { 364 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 365 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 366 dwarf::DW_EH_PE_sdata4; 367 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 368 dwarf::DW_EH_PE_sdata4; 369 } else { 370 LSDAEncoding = dwarf::DW_EH_PE_absptr; 371 PersonalityEncoding = dwarf::DW_EH_PE_absptr; 372 TTypeEncoding = dwarf::DW_EH_PE_absptr; 373 } 374 break; 375 case Triple::sparcv9: 376 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 377 if (RelocM == Reloc::PIC_) { 378 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 379 dwarf::DW_EH_PE_sdata4; 380 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 381 dwarf::DW_EH_PE_sdata4; 382 } else { 383 PersonalityEncoding = dwarf::DW_EH_PE_absptr; 384 TTypeEncoding = dwarf::DW_EH_PE_absptr; 385 } 386 break; 387 case Triple::systemz: 388 // All currently-defined code models guarantee that 4-byte PC-relative 389 // values will be in range. 390 if (RelocM == Reloc::PIC_) { 391 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 392 dwarf::DW_EH_PE_sdata4; 393 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 394 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 395 dwarf::DW_EH_PE_sdata4; 396 } else { 397 PersonalityEncoding = dwarf::DW_EH_PE_absptr; 398 LSDAEncoding = dwarf::DW_EH_PE_absptr; 399 TTypeEncoding = dwarf::DW_EH_PE_absptr; 400 } 401 break; 402 default: 403 break; 404 } 405 406 // Solaris requires different flags for .eh_frame to seemingly every other 407 // platform. 408 EHSectionType = ELF::SHT_PROGBITS; 409 EHSectionFlags = ELF::SHF_ALLOC; 410 if (T.isOSSolaris()) { 411 if (T.getArch() == Triple::x86_64) 412 EHSectionType = ELF::SHT_X86_64_UNWIND; 413 else 414 EHSectionFlags |= ELF::SHF_WRITE; 415 } 416 417 418 // ELF 419 BSSSection = 420 Ctx->getELFSection(".bss", ELF::SHT_NOBITS, 421 ELF::SHF_WRITE | ELF::SHF_ALLOC, 422 SectionKind::getBSS()); 423 424 TextSection = 425 Ctx->getELFSection(".text", ELF::SHT_PROGBITS, 426 ELF::SHF_EXECINSTR | 427 ELF::SHF_ALLOC, 428 SectionKind::getText()); 429 430 DataSection = 431 Ctx->getELFSection(".data", ELF::SHT_PROGBITS, 432 ELF::SHF_WRITE |ELF::SHF_ALLOC, 433 SectionKind::getDataRel()); 434 435 ReadOnlySection = 436 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, 437 ELF::SHF_ALLOC, 438 SectionKind::getReadOnly()); 439 440 TLSDataSection = 441 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS, 442 ELF::SHF_ALLOC | ELF::SHF_TLS | 443 ELF::SHF_WRITE, 444 SectionKind::getThreadData()); 445 446 TLSBSSSection = 447 Ctx->getELFSection(".tbss", ELF::SHT_NOBITS, 448 ELF::SHF_ALLOC | ELF::SHF_TLS | 449 ELF::SHF_WRITE, 450 SectionKind::getThreadBSS()); 451 452 DataRelSection = 453 Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS, 454 ELF::SHF_ALLOC |ELF::SHF_WRITE, 455 SectionKind::getDataRel()); 456 457 DataRelLocalSection = 458 Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 459 ELF::SHF_ALLOC |ELF::SHF_WRITE, 460 SectionKind::getDataRelLocal()); 461 462 DataRelROSection = 463 Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 464 ELF::SHF_ALLOC |ELF::SHF_WRITE, 465 SectionKind::getReadOnlyWithRel()); 466 467 DataRelROLocalSection = 468 Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 469 ELF::SHF_ALLOC |ELF::SHF_WRITE, 470 SectionKind::getReadOnlyWithRelLocal()); 471 472 MergeableConst4Section = 473 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 474 ELF::SHF_ALLOC |ELF::SHF_MERGE, 475 SectionKind::getMergeableConst4()); 476 477 MergeableConst8Section = 478 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 479 ELF::SHF_ALLOC |ELF::SHF_MERGE, 480 SectionKind::getMergeableConst8()); 481 482 MergeableConst16Section = 483 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 484 ELF::SHF_ALLOC |ELF::SHF_MERGE, 485 SectionKind::getMergeableConst16()); 486 487 StaticCtorSection = 488 Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS, 489 ELF::SHF_ALLOC |ELF::SHF_WRITE, 490 SectionKind::getDataRel()); 491 492 StaticDtorSection = 493 Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS, 494 ELF::SHF_ALLOC |ELF::SHF_WRITE, 495 SectionKind::getDataRel()); 496 497 // Exception Handling Sections. 498 499 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 500 // it contains relocatable pointers. In PIC mode, this is probably a big 501 // runtime hit for C++ apps. Either the contents of the LSDA need to be 502 // adjusted or this should be a data section. 503 LSDASection = 504 Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 505 ELF::SHF_ALLOC, 506 SectionKind::getReadOnly()); 507 508 COFFDebugSymbolsSection = nullptr; 509 510 // Debug Info Sections. 511 DwarfAbbrevSection = 512 Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 513 SectionKind::getMetadata()); 514 DwarfInfoSection = 515 Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 516 SectionKind::getMetadata()); 517 DwarfLineSection = 518 Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 519 SectionKind::getMetadata()); 520 DwarfFrameSection = 521 Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 522 SectionKind::getMetadata()); 523 DwarfPubNamesSection = 524 Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0, 525 SectionKind::getMetadata()); 526 DwarfPubTypesSection = 527 Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 528 SectionKind::getMetadata()); 529 DwarfGnuPubNamesSection = 530 Ctx->getELFSection(".debug_gnu_pubnames", ELF::SHT_PROGBITS, 0, 531 SectionKind::getMetadata()); 532 DwarfGnuPubTypesSection = 533 Ctx->getELFSection(".debug_gnu_pubtypes", ELF::SHT_PROGBITS, 0, 534 SectionKind::getMetadata()); 535 DwarfStrSection = 536 Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 537 ELF::SHF_MERGE | ELF::SHF_STRINGS, 538 SectionKind::getMergeable1ByteCString()); 539 DwarfLocSection = 540 Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 541 SectionKind::getMetadata()); 542 DwarfARangesSection = 543 Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 544 SectionKind::getMetadata()); 545 DwarfRangesSection = 546 Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 547 SectionKind::getMetadata()); 548 DwarfMacroInfoSection = 549 Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 550 SectionKind::getMetadata()); 551 552 // DWARF5 Experimental Debug Info 553 554 // Accelerator Tables 555 DwarfAccelNamesSection = 556 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0, 557 SectionKind::getMetadata()); 558 DwarfAccelObjCSection = 559 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0, 560 SectionKind::getMetadata()); 561 DwarfAccelNamespaceSection = 562 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0, 563 SectionKind::getMetadata()); 564 DwarfAccelTypesSection = 565 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0, 566 SectionKind::getMetadata()); 567 568 // Fission Sections 569 DwarfInfoDWOSection = 570 Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0, 571 SectionKind::getMetadata()); 572 DwarfTypesDWOSection = 573 Ctx->getELFSection(".debug_types.dwo", ELF::SHT_PROGBITS, 0, 574 SectionKind::getMetadata()); 575 DwarfAbbrevDWOSection = 576 Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0, 577 SectionKind::getMetadata()); 578 DwarfStrDWOSection = 579 Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS, 580 ELF::SHF_MERGE | ELF::SHF_STRINGS, 581 SectionKind::getMergeable1ByteCString()); 582 DwarfLineDWOSection = 583 Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0, 584 SectionKind::getMetadata()); 585 DwarfLocDWOSection = 586 Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0, 587 SectionKind::getMetadata()); 588 DwarfStrOffDWOSection = 589 Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0, 590 SectionKind::getMetadata()); 591 DwarfAddrSection = 592 Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0, 593 SectionKind::getMetadata()); 594 595 StackMapSection = 596 Ctx->getELFSection(".llvm_stackmaps", ELF::SHT_PROGBITS, 597 ELF::SHF_ALLOC, 598 SectionKind::getMetadata()); 599 600 } 601 602 603 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) { 604 bool IsWoA = T.getArch() == Triple::arm || T.getArch() == Triple::thumb; 605 606 CommDirectiveSupportsAlignment = true; 607 608 // COFF 609 BSSSection = 610 Ctx->getCOFFSection(".bss", 611 COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA | 612 COFF::IMAGE_SCN_MEM_READ | 613 COFF::IMAGE_SCN_MEM_WRITE, 614 SectionKind::getBSS()); 615 TextSection = 616 Ctx->getCOFFSection(".text", 617 (IsWoA ? COFF::IMAGE_SCN_MEM_16BIT 618 : (COFF::SectionCharacteristics)0) | 619 COFF::IMAGE_SCN_CNT_CODE | 620 COFF::IMAGE_SCN_MEM_EXECUTE | 621 COFF::IMAGE_SCN_MEM_READ, 622 SectionKind::getText()); 623 DataSection = 624 Ctx->getCOFFSection(".data", 625 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 626 COFF::IMAGE_SCN_MEM_READ | 627 COFF::IMAGE_SCN_MEM_WRITE, 628 SectionKind::getDataRel()); 629 ReadOnlySection = 630 Ctx->getCOFFSection(".rdata", 631 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 632 COFF::IMAGE_SCN_MEM_READ, 633 SectionKind::getReadOnly()); 634 635 if (T.isKnownWindowsMSVCEnvironment() || T.isWindowsItaniumEnvironment()) { 636 StaticCtorSection = 637 Ctx->getCOFFSection(".CRT$XCU", 638 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 639 COFF::IMAGE_SCN_MEM_READ, 640 SectionKind::getReadOnly()); 641 StaticDtorSection = 642 Ctx->getCOFFSection(".CRT$XTX", 643 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 644 COFF::IMAGE_SCN_MEM_READ, 645 SectionKind::getReadOnly()); 646 } else { 647 StaticCtorSection = 648 Ctx->getCOFFSection(".ctors", 649 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 650 COFF::IMAGE_SCN_MEM_READ | 651 COFF::IMAGE_SCN_MEM_WRITE, 652 SectionKind::getDataRel()); 653 StaticDtorSection = 654 Ctx->getCOFFSection(".dtors", 655 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 656 COFF::IMAGE_SCN_MEM_READ | 657 COFF::IMAGE_SCN_MEM_WRITE, 658 SectionKind::getDataRel()); 659 } 660 661 // FIXME: We're emitting LSDA info into a readonly section on COFF, even 662 // though it contains relocatable pointers. In PIC mode, this is probably a 663 // big runtime hit for C++ apps. Either the contents of the LSDA need to be 664 // adjusted or this should be a data section. 665 assert(T.isOSWindows() && "Windows is the only supported COFF target"); 666 if (T.getArch() == Triple::x86_64) { 667 // On Windows 64 with SEH, the LSDA is emitted into the .xdata section 668 LSDASection = 0; 669 } else { 670 LSDASection = Ctx->getCOFFSection(".gcc_except_table", 671 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 672 COFF::IMAGE_SCN_MEM_READ, 673 SectionKind::getReadOnly()); 674 } 675 676 // Debug info. 677 COFFDebugSymbolsSection = 678 Ctx->getCOFFSection(".debug$S", 679 COFF::IMAGE_SCN_MEM_DISCARDABLE | 680 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 681 COFF::IMAGE_SCN_MEM_READ, 682 SectionKind::getMetadata()); 683 684 DwarfAbbrevSection = 685 Ctx->getCOFFSection(".debug_abbrev", 686 COFF::IMAGE_SCN_MEM_DISCARDABLE | 687 COFF::IMAGE_SCN_MEM_READ, 688 SectionKind::getMetadata()); 689 DwarfInfoSection = 690 Ctx->getCOFFSection(".debug_info", 691 COFF::IMAGE_SCN_MEM_DISCARDABLE | 692 COFF::IMAGE_SCN_MEM_READ, 693 SectionKind::getMetadata()); 694 DwarfLineSection = 695 Ctx->getCOFFSection(".debug_line", 696 COFF::IMAGE_SCN_MEM_DISCARDABLE | 697 COFF::IMAGE_SCN_MEM_READ, 698 SectionKind::getMetadata()); 699 DwarfFrameSection = 700 Ctx->getCOFFSection(".debug_frame", 701 COFF::IMAGE_SCN_MEM_DISCARDABLE | 702 COFF::IMAGE_SCN_MEM_READ, 703 SectionKind::getMetadata()); 704 DwarfPubNamesSection = 705 Ctx->getCOFFSection(".debug_pubnames", 706 COFF::IMAGE_SCN_MEM_DISCARDABLE | 707 COFF::IMAGE_SCN_MEM_READ, 708 SectionKind::getMetadata()); 709 DwarfPubTypesSection = 710 Ctx->getCOFFSection(".debug_pubtypes", 711 COFF::IMAGE_SCN_MEM_DISCARDABLE | 712 COFF::IMAGE_SCN_MEM_READ, 713 SectionKind::getMetadata()); 714 DwarfGnuPubNamesSection = 715 Ctx->getCOFFSection(".debug_gnu_pubnames", 716 COFF::IMAGE_SCN_MEM_DISCARDABLE | 717 COFF::IMAGE_SCN_MEM_READ, 718 SectionKind::getMetadata()); 719 DwarfGnuPubTypesSection = 720 Ctx->getCOFFSection(".debug_gnu_pubtypes", 721 COFF::IMAGE_SCN_MEM_DISCARDABLE | 722 COFF::IMAGE_SCN_MEM_READ, 723 SectionKind::getMetadata()); 724 DwarfStrSection = 725 Ctx->getCOFFSection(".debug_str", 726 COFF::IMAGE_SCN_MEM_DISCARDABLE | 727 COFF::IMAGE_SCN_MEM_READ, 728 SectionKind::getMetadata()); 729 DwarfLocSection = 730 Ctx->getCOFFSection(".debug_loc", 731 COFF::IMAGE_SCN_MEM_DISCARDABLE | 732 COFF::IMAGE_SCN_MEM_READ, 733 SectionKind::getMetadata()); 734 DwarfARangesSection = 735 Ctx->getCOFFSection(".debug_aranges", 736 COFF::IMAGE_SCN_MEM_DISCARDABLE | 737 COFF::IMAGE_SCN_MEM_READ, 738 SectionKind::getMetadata()); 739 DwarfRangesSection = 740 Ctx->getCOFFSection(".debug_ranges", 741 COFF::IMAGE_SCN_MEM_DISCARDABLE | 742 COFF::IMAGE_SCN_MEM_READ, 743 SectionKind::getMetadata()); 744 DwarfMacroInfoSection = 745 Ctx->getCOFFSection(".debug_macinfo", 746 COFF::IMAGE_SCN_MEM_DISCARDABLE | 747 COFF::IMAGE_SCN_MEM_READ, 748 SectionKind::getMetadata()); 749 DwarfInfoDWOSection = 750 Ctx->getCOFFSection(".debug_info.dwo", 751 COFF::IMAGE_SCN_MEM_DISCARDABLE | 752 COFF::IMAGE_SCN_MEM_READ, 753 SectionKind::getMetadata()); 754 DwarfTypesDWOSection = 755 Ctx->getCOFFSection(".debug_types.dwo", COFF::IMAGE_SCN_MEM_DISCARDABLE | 756 COFF::IMAGE_SCN_MEM_READ, 757 SectionKind::getMetadata()); 758 DwarfAbbrevDWOSection = 759 Ctx->getCOFFSection(".debug_abbrev.dwo", 760 COFF::IMAGE_SCN_MEM_DISCARDABLE | 761 COFF::IMAGE_SCN_MEM_READ, 762 SectionKind::getMetadata()); 763 DwarfStrDWOSection = 764 Ctx->getCOFFSection(".debug_str.dwo", 765 COFF::IMAGE_SCN_MEM_DISCARDABLE | 766 COFF::IMAGE_SCN_MEM_READ, 767 SectionKind::getMetadata()); 768 DwarfLineDWOSection = 769 Ctx->getCOFFSection(".debug_line.dwo", 770 COFF::IMAGE_SCN_MEM_DISCARDABLE | 771 COFF::IMAGE_SCN_MEM_READ, 772 SectionKind::getMetadata()); 773 DwarfLocDWOSection = 774 Ctx->getCOFFSection(".debug_loc.dwo", 775 COFF::IMAGE_SCN_MEM_DISCARDABLE | 776 COFF::IMAGE_SCN_MEM_READ, 777 SectionKind::getMetadata()); 778 DwarfStrOffDWOSection = 779 Ctx->getCOFFSection(".debug_str_offsets.dwo", 780 COFF::IMAGE_SCN_MEM_DISCARDABLE | 781 COFF::IMAGE_SCN_MEM_READ, 782 SectionKind::getMetadata()); 783 784 DwarfAddrSection = 785 Ctx->getCOFFSection(".debug_addr", 786 COFF::IMAGE_SCN_MEM_DISCARDABLE | 787 COFF::IMAGE_SCN_MEM_READ, 788 SectionKind::getMetadata()); 789 790 DwarfAccelNamesSection = 791 Ctx->getCOFFSection(".apple_names", 792 COFF::IMAGE_SCN_MEM_DISCARDABLE | 793 COFF::IMAGE_SCN_MEM_READ, 794 SectionKind::getMetadata()); 795 DwarfAccelNamespaceSection = 796 Ctx->getCOFFSection(".apple_namespaces", 797 COFF::IMAGE_SCN_MEM_DISCARDABLE | 798 COFF::IMAGE_SCN_MEM_READ, 799 SectionKind::getMetadata()); 800 DwarfAccelTypesSection = 801 Ctx->getCOFFSection(".apple_types", 802 COFF::IMAGE_SCN_MEM_DISCARDABLE | 803 COFF::IMAGE_SCN_MEM_READ, 804 SectionKind::getMetadata()); 805 DwarfAccelObjCSection = 806 Ctx->getCOFFSection(".apple_objc", 807 COFF::IMAGE_SCN_MEM_DISCARDABLE | 808 COFF::IMAGE_SCN_MEM_READ, 809 SectionKind::getMetadata()); 810 811 DrectveSection = 812 Ctx->getCOFFSection(".drectve", 813 COFF::IMAGE_SCN_LNK_INFO | 814 COFF::IMAGE_SCN_LNK_REMOVE, 815 SectionKind::getMetadata()); 816 817 PDataSection = 818 Ctx->getCOFFSection(".pdata", 819 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 820 COFF::IMAGE_SCN_MEM_READ, 821 SectionKind::getDataRel()); 822 823 XDataSection = 824 Ctx->getCOFFSection(".xdata", 825 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 826 COFF::IMAGE_SCN_MEM_READ, 827 SectionKind::getDataRel()); 828 829 TLSDataSection = 830 Ctx->getCOFFSection(".tls$", 831 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 832 COFF::IMAGE_SCN_MEM_READ | 833 COFF::IMAGE_SCN_MEM_WRITE, 834 SectionKind::getDataRel()); 835 } 836 837 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef T, Reloc::Model relocm, 838 CodeModel::Model cm, 839 MCContext &ctx) { 840 RelocM = relocm; 841 CMModel = cm; 842 Ctx = &ctx; 843 844 // Common. 845 CommDirectiveSupportsAlignment = true; 846 SupportsWeakOmittedEHFrame = true; 847 SupportsCompactUnwindWithoutEHFrame = false; 848 849 PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding = 850 dwarf::DW_EH_PE_absptr; 851 852 CompactUnwindDwarfEHFrameOnly = 0; 853 854 EHFrameSection = nullptr; // Created on demand. 855 CompactUnwindSection = nullptr; // Used only by selected targets. 856 DwarfAccelNamesSection = nullptr; // Used only by selected targets. 857 DwarfAccelObjCSection = nullptr; // Used only by selected targets. 858 DwarfAccelNamespaceSection = nullptr; // Used only by selected targets. 859 DwarfAccelTypesSection = nullptr; // Used only by selected targets. 860 861 TT = Triple(T); 862 863 Triple::ArchType Arch = TT.getArch(); 864 // FIXME: Checking for Arch here to filter out bogus triples such as 865 // cellspu-apple-darwin. Perhaps we should fix in Triple? 866 if ((Arch == Triple::x86 || Arch == Triple::x86_64 || 867 Arch == Triple::arm || Arch == Triple::thumb || 868 Arch == Triple::aarch64 || 869 Arch == Triple::ppc || Arch == Triple::ppc64 || 870 Arch == Triple::UnknownArch) && 871 (TT.isOSDarwin() || TT.isOSBinFormatMachO())) { 872 Env = IsMachO; 873 InitMachOMCObjectFileInfo(TT); 874 } else if ((Arch == Triple::x86 || Arch == Triple::x86_64 || 875 Arch == Triple::arm || Arch == Triple::thumb) && 876 (TT.isOSWindows() && TT.getObjectFormat() == Triple::COFF)) { 877 Env = IsCOFF; 878 InitCOFFMCObjectFileInfo(TT); 879 } else { 880 Env = IsELF; 881 InitELFMCObjectFileInfo(TT); 882 } 883 } 884 885 const MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const { 886 return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP, 887 SectionKind::getMetadata(), 0, utostr(Hash)); 888 } 889 890 void MCObjectFileInfo::InitEHFrameSection() { 891 if (Env == IsMachO) 892 EHFrameSection = 893 Ctx->getMachOSection("__TEXT", "__eh_frame", 894 MachO::S_COALESCED | 895 MachO::S_ATTR_NO_TOC | 896 MachO::S_ATTR_STRIP_STATIC_SYMS | 897 MachO::S_ATTR_LIVE_SUPPORT, 898 SectionKind::getReadOnly()); 899 else if (Env == IsELF) 900 EHFrameSection = 901 Ctx->getELFSection(".eh_frame", EHSectionType, 902 EHSectionFlags, 903 SectionKind::getDataRel()); 904 else 905 EHFrameSection = 906 Ctx->getCOFFSection(".eh_frame", 907 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 908 COFF::IMAGE_SCN_MEM_READ | 909 COFF::IMAGE_SCN_MEM_WRITE, 910 SectionKind::getDataRel()); 911 } 912