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