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/Triple.h" 12 #include "llvm/MC/MCContext.h" 13 #include "llvm/MC/MCSection.h" 14 #include "llvm/MC/MCSectionCOFF.h" 15 #include "llvm/MC/MCSectionELF.h" 16 #include "llvm/MC/MCSectionMachO.h" 17 using namespace llvm; 18 19 void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) { 20 // MachO 21 IsFunctionEHFrameSymbolPrivate = false; 22 SupportsWeakOmittedEHFrame = false; 23 24 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel 25 | dwarf::DW_EH_PE_sdata4; 26 LSDAEncoding = FDEEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel; 27 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 28 dwarf::DW_EH_PE_sdata4; 29 30 // .comm doesn't support alignment before Leopard. 31 if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5)) 32 CommDirectiveSupportsAlignment = false; 33 34 TextSection // .text 35 = Ctx->getMachOSection("__TEXT", "__text", 36 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 37 SectionKind::getText()); 38 DataSection // .data 39 = Ctx->getMachOSection("__DATA", "__data", 0, 40 SectionKind::getDataRel()); 41 42 TLSDataSection // .tdata 43 = Ctx->getMachOSection("__DATA", "__thread_data", 44 MCSectionMachO::S_THREAD_LOCAL_REGULAR, 45 SectionKind::getDataRel()); 46 TLSBSSSection // .tbss 47 = Ctx->getMachOSection("__DATA", "__thread_bss", 48 MCSectionMachO::S_THREAD_LOCAL_ZEROFILL, 49 SectionKind::getThreadBSS()); 50 51 // TODO: Verify datarel below. 52 TLSTLVSection // .tlv 53 = Ctx->getMachOSection("__DATA", "__thread_vars", 54 MCSectionMachO::S_THREAD_LOCAL_VARIABLES, 55 SectionKind::getDataRel()); 56 57 TLSThreadInitSection 58 = Ctx->getMachOSection("__DATA", "__thread_init", 59 MCSectionMachO::S_THREAD_LOCAL_INIT_FUNCTION_POINTERS, 60 SectionKind::getDataRel()); 61 62 CStringSection // .cstring 63 = Ctx->getMachOSection("__TEXT", "__cstring", 64 MCSectionMachO::S_CSTRING_LITERALS, 65 SectionKind::getMergeable1ByteCString()); 66 UStringSection 67 = Ctx->getMachOSection("__TEXT","__ustring", 0, 68 SectionKind::getMergeable2ByteCString()); 69 FourByteConstantSection // .literal4 70 = Ctx->getMachOSection("__TEXT", "__literal4", 71 MCSectionMachO::S_4BYTE_LITERALS, 72 SectionKind::getMergeableConst4()); 73 EightByteConstantSection // .literal8 74 = Ctx->getMachOSection("__TEXT", "__literal8", 75 MCSectionMachO::S_8BYTE_LITERALS, 76 SectionKind::getMergeableConst8()); 77 78 // ld_classic doesn't support .literal16 in 32-bit mode, and ld64 falls back 79 // to using it in -static mode. 80 SixteenByteConstantSection = 0; 81 if (RelocM != Reloc::Static && 82 T.getArch() != Triple::x86_64 && T.getArch() != Triple::ppc64) 83 SixteenByteConstantSection = // .literal16 84 Ctx->getMachOSection("__TEXT", "__literal16", 85 MCSectionMachO::S_16BYTE_LITERALS, 86 SectionKind::getMergeableConst16()); 87 88 ReadOnlySection // .const 89 = Ctx->getMachOSection("__TEXT", "__const", 0, 90 SectionKind::getReadOnly()); 91 92 TextCoalSection 93 = Ctx->getMachOSection("__TEXT", "__textcoal_nt", 94 MCSectionMachO::S_COALESCED | 95 MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS, 96 SectionKind::getText()); 97 ConstTextCoalSection 98 = Ctx->getMachOSection("__TEXT", "__const_coal", 99 MCSectionMachO::S_COALESCED, 100 SectionKind::getReadOnly()); 101 ConstDataSection // .const_data 102 = Ctx->getMachOSection("__DATA", "__const", 0, 103 SectionKind::getReadOnlyWithRel()); 104 DataCoalSection 105 = Ctx->getMachOSection("__DATA","__datacoal_nt", 106 MCSectionMachO::S_COALESCED, 107 SectionKind::getDataRel()); 108 DataCommonSection 109 = Ctx->getMachOSection("__DATA","__common", 110 MCSectionMachO::S_ZEROFILL, 111 SectionKind::getBSS()); 112 DataBSSSection 113 = Ctx->getMachOSection("__DATA","__bss", MCSectionMachO::S_ZEROFILL, 114 SectionKind::getBSS()); 115 116 117 LazySymbolPointerSection 118 = Ctx->getMachOSection("__DATA", "__la_symbol_ptr", 119 MCSectionMachO::S_LAZY_SYMBOL_POINTERS, 120 SectionKind::getMetadata()); 121 NonLazySymbolPointerSection 122 = Ctx->getMachOSection("__DATA", "__nl_symbol_ptr", 123 MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS, 124 SectionKind::getMetadata()); 125 126 if (RelocM == Reloc::Static) { 127 StaticCtorSection 128 = Ctx->getMachOSection("__TEXT", "__constructor", 0, 129 SectionKind::getDataRel()); 130 StaticDtorSection 131 = Ctx->getMachOSection("__TEXT", "__destructor", 0, 132 SectionKind::getDataRel()); 133 } else { 134 StaticCtorSection 135 = Ctx->getMachOSection("__DATA", "__mod_init_func", 136 MCSectionMachO::S_MOD_INIT_FUNC_POINTERS, 137 SectionKind::getDataRel()); 138 StaticDtorSection 139 = Ctx->getMachOSection("__DATA", "__mod_term_func", 140 MCSectionMachO::S_MOD_TERM_FUNC_POINTERS, 141 SectionKind::getDataRel()); 142 } 143 144 // Exception Handling. 145 LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0, 146 SectionKind::getReadOnlyWithRel()); 147 148 if (T.isMacOSX() && !T.isMacOSXVersionLT(10, 6)) 149 CompactUnwindSection = 150 Ctx->getMachOSection("__LD", "__compact_unwind", 151 MCSectionMachO::S_ATTR_DEBUG, 152 SectionKind::getReadOnly()); 153 154 // Debug Information. 155 DwarfAccelNamesSection = 156 Ctx->getMachOSection("__DWARF", "__apple_names", 157 MCSectionMachO::S_ATTR_DEBUG, 158 SectionKind::getMetadata()); 159 DwarfAccelObjCSection = 160 Ctx->getMachOSection("__DWARF", "__apple_objc", 161 MCSectionMachO::S_ATTR_DEBUG, 162 SectionKind::getMetadata()); 163 // 16 character section limit... 164 DwarfAccelNamespaceSection = 165 Ctx->getMachOSection("__DWARF", "__apple_namespac", 166 MCSectionMachO::S_ATTR_DEBUG, 167 SectionKind::getMetadata()); 168 DwarfAccelTypesSection = 169 Ctx->getMachOSection("__DWARF", "__apple_types", 170 MCSectionMachO::S_ATTR_DEBUG, 171 SectionKind::getMetadata()); 172 173 DwarfAbbrevSection = 174 Ctx->getMachOSection("__DWARF", "__debug_abbrev", 175 MCSectionMachO::S_ATTR_DEBUG, 176 SectionKind::getMetadata()); 177 DwarfInfoSection = 178 Ctx->getMachOSection("__DWARF", "__debug_info", 179 MCSectionMachO::S_ATTR_DEBUG, 180 SectionKind::getMetadata()); 181 DwarfLineSection = 182 Ctx->getMachOSection("__DWARF", "__debug_line", 183 MCSectionMachO::S_ATTR_DEBUG, 184 SectionKind::getMetadata()); 185 DwarfFrameSection = 186 Ctx->getMachOSection("__DWARF", "__debug_frame", 187 MCSectionMachO::S_ATTR_DEBUG, 188 SectionKind::getMetadata()); 189 DwarfPubNamesSection = 190 Ctx->getMachOSection("__DWARF", "__debug_pubnames", 191 MCSectionMachO::S_ATTR_DEBUG, 192 SectionKind::getMetadata()); 193 DwarfPubTypesSection = 194 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", 195 MCSectionMachO::S_ATTR_DEBUG, 196 SectionKind::getMetadata()); 197 DwarfStrSection = 198 Ctx->getMachOSection("__DWARF", "__debug_str", 199 MCSectionMachO::S_ATTR_DEBUG, 200 SectionKind::getMetadata()); 201 DwarfLocSection = 202 Ctx->getMachOSection("__DWARF", "__debug_loc", 203 MCSectionMachO::S_ATTR_DEBUG, 204 SectionKind::getMetadata()); 205 DwarfARangesSection = 206 Ctx->getMachOSection("__DWARF", "__debug_aranges", 207 MCSectionMachO::S_ATTR_DEBUG, 208 SectionKind::getMetadata()); 209 DwarfRangesSection = 210 Ctx->getMachOSection("__DWARF", "__debug_ranges", 211 MCSectionMachO::S_ATTR_DEBUG, 212 SectionKind::getMetadata()); 213 DwarfMacroInfoSection = 214 Ctx->getMachOSection("__DWARF", "__debug_macinfo", 215 MCSectionMachO::S_ATTR_DEBUG, 216 SectionKind::getMetadata()); 217 DwarfDebugInlineSection = 218 Ctx->getMachOSection("__DWARF", "__debug_inlined", 219 MCSectionMachO::S_ATTR_DEBUG, 220 SectionKind::getMetadata()); 221 222 TLSExtraDataSection = TLSTLVSection; 223 } 224 225 void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { 226 // FIXME: Check this. Mips64el is using the base values, which is most likely 227 // incorrect. 228 if (T.getArch() != Triple::mips64el) 229 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 230 231 if (T.getArch() == Triple::x86) { 232 PersonalityEncoding = (RelocM == Reloc::PIC_) 233 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 234 : dwarf::DW_EH_PE_absptr; 235 LSDAEncoding = (RelocM == Reloc::PIC_) 236 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 237 : dwarf::DW_EH_PE_absptr; 238 FDEEncoding = (RelocM == Reloc::PIC_) 239 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 240 : dwarf::DW_EH_PE_absptr; 241 TTypeEncoding = (RelocM == Reloc::PIC_) 242 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 243 : dwarf::DW_EH_PE_absptr; 244 } else if (T.getArch() == Triple::x86_64) { 245 if (RelocM == Reloc::PIC_) { 246 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 247 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 248 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 249 LSDAEncoding = dwarf::DW_EH_PE_pcrel | 250 (CMModel == CodeModel::Small 251 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 252 FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 253 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 254 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 255 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 256 } else { 257 PersonalityEncoding = 258 (CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 259 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 260 LSDAEncoding = (CMModel == CodeModel::Small) 261 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 262 FDEEncoding = dwarf::DW_EH_PE_udata4; 263 TTypeEncoding = (CMModel == CodeModel::Small) 264 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 265 } 266 } else if (T.getArch() == Triple::aarch64) { 267 // The small model guarantees static code/data size < 4GB, but not where it 268 // will be in memory. Most of these could end up >2GB away so even a signed 269 // pc-relative 32-bit address is insufficient, theoretically. 270 if (RelocM == Reloc::PIC_) { 271 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 272 dwarf::DW_EH_PE_sdata8; 273 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8; 274 FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 275 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 276 dwarf::DW_EH_PE_sdata8; 277 } else { 278 PersonalityEncoding = dwarf::DW_EH_PE_absptr; 279 LSDAEncoding = dwarf::DW_EH_PE_absptr; 280 FDEEncoding = dwarf::DW_EH_PE_udata4; 281 TTypeEncoding = dwarf::DW_EH_PE_absptr; 282 } 283 } else if (T.getArch() == Triple::ppc64) { 284 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 285 dwarf::DW_EH_PE_udata8; 286 LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8; 287 FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8; 288 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 289 dwarf::DW_EH_PE_udata8; 290 } 291 292 // Solaris requires different flags for .eh_frame to seemingly every other 293 // platform. 294 EHSectionType = ELF::SHT_PROGBITS; 295 EHSectionFlags = ELF::SHF_ALLOC; 296 if (T.getOS() == Triple::Solaris) { 297 if (T.getArch() == Triple::x86_64) 298 EHSectionType = ELF::SHT_X86_64_UNWIND; 299 else 300 EHSectionFlags |= ELF::SHF_WRITE; 301 } 302 303 304 // ELF 305 BSSSection = 306 Ctx->getELFSection(".bss", ELF::SHT_NOBITS, 307 ELF::SHF_WRITE | ELF::SHF_ALLOC, 308 SectionKind::getBSS()); 309 310 TextSection = 311 Ctx->getELFSection(".text", ELF::SHT_PROGBITS, 312 ELF::SHF_EXECINSTR | 313 ELF::SHF_ALLOC, 314 SectionKind::getText()); 315 316 DataSection = 317 Ctx->getELFSection(".data", ELF::SHT_PROGBITS, 318 ELF::SHF_WRITE |ELF::SHF_ALLOC, 319 SectionKind::getDataRel()); 320 321 ReadOnlySection = 322 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, 323 ELF::SHF_ALLOC, 324 SectionKind::getReadOnly()); 325 326 TLSDataSection = 327 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS, 328 ELF::SHF_ALLOC | ELF::SHF_TLS | 329 ELF::SHF_WRITE, 330 SectionKind::getThreadData()); 331 332 TLSBSSSection = 333 Ctx->getELFSection(".tbss", ELF::SHT_NOBITS, 334 ELF::SHF_ALLOC | ELF::SHF_TLS | 335 ELF::SHF_WRITE, 336 SectionKind::getThreadBSS()); 337 338 DataRelSection = 339 Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS, 340 ELF::SHF_ALLOC |ELF::SHF_WRITE, 341 SectionKind::getDataRel()); 342 343 DataRelLocalSection = 344 Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 345 ELF::SHF_ALLOC |ELF::SHF_WRITE, 346 SectionKind::getDataRelLocal()); 347 348 DataRelROSection = 349 Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 350 ELF::SHF_ALLOC |ELF::SHF_WRITE, 351 SectionKind::getReadOnlyWithRel()); 352 353 DataRelROLocalSection = 354 Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 355 ELF::SHF_ALLOC |ELF::SHF_WRITE, 356 SectionKind::getReadOnlyWithRelLocal()); 357 358 MergeableConst4Section = 359 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 360 ELF::SHF_ALLOC |ELF::SHF_MERGE, 361 SectionKind::getMergeableConst4()); 362 363 MergeableConst8Section = 364 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 365 ELF::SHF_ALLOC |ELF::SHF_MERGE, 366 SectionKind::getMergeableConst8()); 367 368 MergeableConst16Section = 369 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 370 ELF::SHF_ALLOC |ELF::SHF_MERGE, 371 SectionKind::getMergeableConst16()); 372 373 StaticCtorSection = 374 Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS, 375 ELF::SHF_ALLOC |ELF::SHF_WRITE, 376 SectionKind::getDataRel()); 377 378 StaticDtorSection = 379 Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS, 380 ELF::SHF_ALLOC |ELF::SHF_WRITE, 381 SectionKind::getDataRel()); 382 383 // Exception Handling Sections. 384 385 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 386 // it contains relocatable pointers. In PIC mode, this is probably a big 387 // runtime hit for C++ apps. Either the contents of the LSDA need to be 388 // adjusted or this should be a data section. 389 LSDASection = 390 Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 391 ELF::SHF_ALLOC, 392 SectionKind::getReadOnly()); 393 394 // Debug Info Sections. 395 DwarfAbbrevSection = 396 Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 397 SectionKind::getMetadata()); 398 DwarfInfoSection = 399 Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 400 SectionKind::getMetadata()); 401 DwarfLineSection = 402 Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 403 SectionKind::getMetadata()); 404 DwarfFrameSection = 405 Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 406 SectionKind::getMetadata()); 407 DwarfPubNamesSection = 408 Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0, 409 SectionKind::getMetadata()); 410 DwarfPubTypesSection = 411 Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 412 SectionKind::getMetadata()); 413 DwarfStrSection = 414 Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 415 ELF::SHF_MERGE | ELF::SHF_STRINGS, 416 SectionKind::getMergeable1ByteCString()); 417 DwarfLocSection = 418 Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 419 SectionKind::getMetadata()); 420 DwarfARangesSection = 421 Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 422 SectionKind::getMetadata()); 423 DwarfRangesSection = 424 Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 425 SectionKind::getMetadata()); 426 DwarfMacroInfoSection = 427 Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 428 SectionKind::getMetadata()); 429 430 // DWARF5 Experimental Debug Info 431 432 // Accelerator Tables 433 DwarfAccelNamesSection = 434 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0, 435 SectionKind::getMetadata()); 436 DwarfAccelObjCSection = 437 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0, 438 SectionKind::getMetadata()); 439 DwarfAccelNamespaceSection = 440 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0, 441 SectionKind::getMetadata()); 442 DwarfAccelTypesSection = 443 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0, 444 SectionKind::getMetadata()); 445 446 // Fission Sections 447 DwarfInfoDWOSection = 448 Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0, 449 SectionKind::getMetadata()); 450 DwarfAbbrevDWOSection = 451 Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0, 452 SectionKind::getMetadata()); 453 DwarfStrDWOSection = 454 Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS, 455 ELF::SHF_MERGE | ELF::SHF_STRINGS, 456 SectionKind::getMergeable1ByteCString()); 457 DwarfLineDWOSection = 458 Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0, 459 SectionKind::getMetadata()); 460 DwarfLocDWOSection = 461 Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0, 462 SectionKind::getMetadata()); 463 DwarfStrOffDWOSection = 464 Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0, 465 SectionKind::getMetadata()); 466 DwarfAddrSection = 467 Ctx->getELFSection(".debug_addr", ELF::SHT_PROGBITS, 0, 468 SectionKind::getMetadata()); 469 } 470 471 472 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) { 473 // COFF 474 TextSection = 475 Ctx->getCOFFSection(".text", 476 COFF::IMAGE_SCN_CNT_CODE | 477 COFF::IMAGE_SCN_MEM_EXECUTE | 478 COFF::IMAGE_SCN_MEM_READ, 479 SectionKind::getText()); 480 DataSection = 481 Ctx->getCOFFSection(".data", 482 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 483 COFF::IMAGE_SCN_MEM_READ | 484 COFF::IMAGE_SCN_MEM_WRITE, 485 SectionKind::getDataRel()); 486 ReadOnlySection = 487 Ctx->getCOFFSection(".rdata", 488 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 489 COFF::IMAGE_SCN_MEM_READ, 490 SectionKind::getReadOnly()); 491 if (T.getOS() == Triple::Win32) { 492 StaticCtorSection = 493 Ctx->getCOFFSection(".CRT$XCU", 494 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 495 COFF::IMAGE_SCN_MEM_READ, 496 SectionKind::getReadOnly()); 497 } else { 498 StaticCtorSection = 499 Ctx->getCOFFSection(".ctors", 500 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 501 COFF::IMAGE_SCN_MEM_READ | 502 COFF::IMAGE_SCN_MEM_WRITE, 503 SectionKind::getDataRel()); 504 } 505 506 507 if (T.getOS() == Triple::Win32) { 508 StaticDtorSection = 509 Ctx->getCOFFSection(".CRT$XTX", 510 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 511 COFF::IMAGE_SCN_MEM_READ, 512 SectionKind::getReadOnly()); 513 } else { 514 StaticDtorSection = 515 Ctx->getCOFFSection(".dtors", 516 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 517 COFF::IMAGE_SCN_MEM_READ | 518 COFF::IMAGE_SCN_MEM_WRITE, 519 SectionKind::getDataRel()); 520 } 521 522 // FIXME: We're emitting LSDA info into a readonly section on COFF, even 523 // though it contains relocatable pointers. In PIC mode, this is probably a 524 // big runtime hit for C++ apps. Either the contents of the LSDA need to be 525 // adjusted or this should be a data section. 526 LSDASection = 527 Ctx->getCOFFSection(".gcc_except_table", 528 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 529 COFF::IMAGE_SCN_MEM_READ, 530 SectionKind::getReadOnly()); 531 532 // Debug info. 533 DwarfAbbrevSection = 534 Ctx->getCOFFSection(".debug_abbrev", 535 COFF::IMAGE_SCN_MEM_DISCARDABLE | 536 COFF::IMAGE_SCN_MEM_READ, 537 SectionKind::getMetadata()); 538 DwarfInfoSection = 539 Ctx->getCOFFSection(".debug_info", 540 COFF::IMAGE_SCN_MEM_DISCARDABLE | 541 COFF::IMAGE_SCN_MEM_READ, 542 SectionKind::getMetadata()); 543 DwarfLineSection = 544 Ctx->getCOFFSection(".debug_line", 545 COFF::IMAGE_SCN_MEM_DISCARDABLE | 546 COFF::IMAGE_SCN_MEM_READ, 547 SectionKind::getMetadata()); 548 DwarfFrameSection = 549 Ctx->getCOFFSection(".debug_frame", 550 COFF::IMAGE_SCN_MEM_DISCARDABLE | 551 COFF::IMAGE_SCN_MEM_READ, 552 SectionKind::getMetadata()); 553 DwarfPubNamesSection = 554 Ctx->getCOFFSection(".debug_pubnames", 555 COFF::IMAGE_SCN_MEM_DISCARDABLE | 556 COFF::IMAGE_SCN_MEM_READ, 557 SectionKind::getMetadata()); 558 DwarfPubTypesSection = 559 Ctx->getCOFFSection(".debug_pubtypes", 560 COFF::IMAGE_SCN_MEM_DISCARDABLE | 561 COFF::IMAGE_SCN_MEM_READ, 562 SectionKind::getMetadata()); 563 DwarfStrSection = 564 Ctx->getCOFFSection(".debug_str", 565 COFF::IMAGE_SCN_MEM_DISCARDABLE | 566 COFF::IMAGE_SCN_MEM_READ, 567 SectionKind::getMetadata()); 568 DwarfLocSection = 569 Ctx->getCOFFSection(".debug_loc", 570 COFF::IMAGE_SCN_MEM_DISCARDABLE | 571 COFF::IMAGE_SCN_MEM_READ, 572 SectionKind::getMetadata()); 573 DwarfARangesSection = 574 Ctx->getCOFFSection(".debug_aranges", 575 COFF::IMAGE_SCN_MEM_DISCARDABLE | 576 COFF::IMAGE_SCN_MEM_READ, 577 SectionKind::getMetadata()); 578 DwarfRangesSection = 579 Ctx->getCOFFSection(".debug_ranges", 580 COFF::IMAGE_SCN_MEM_DISCARDABLE | 581 COFF::IMAGE_SCN_MEM_READ, 582 SectionKind::getMetadata()); 583 DwarfMacroInfoSection = 584 Ctx->getCOFFSection(".debug_macinfo", 585 COFF::IMAGE_SCN_MEM_DISCARDABLE | 586 COFF::IMAGE_SCN_MEM_READ, 587 SectionKind::getMetadata()); 588 589 DrectveSection = 590 Ctx->getCOFFSection(".drectve", 591 COFF::IMAGE_SCN_LNK_INFO, 592 SectionKind::getMetadata()); 593 594 PDataSection = 595 Ctx->getCOFFSection(".pdata", 596 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 597 COFF::IMAGE_SCN_MEM_READ, 598 SectionKind::getDataRel()); 599 600 XDataSection = 601 Ctx->getCOFFSection(".xdata", 602 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 603 COFF::IMAGE_SCN_MEM_READ, 604 SectionKind::getDataRel()); 605 TLSDataSection = 606 Ctx->getCOFFSection(".tls$", 607 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 608 COFF::IMAGE_SCN_MEM_READ | 609 COFF::IMAGE_SCN_MEM_WRITE, 610 SectionKind::getDataRel()); 611 } 612 613 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm, 614 CodeModel::Model cm, 615 MCContext &ctx) { 616 RelocM = relocm; 617 CMModel = cm; 618 Ctx = &ctx; 619 620 // Common. 621 CommDirectiveSupportsAlignment = true; 622 SupportsWeakOmittedEHFrame = true; 623 IsFunctionEHFrameSymbolPrivate = true; 624 625 PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding = 626 TTypeEncoding = dwarf::DW_EH_PE_absptr; 627 628 EHFrameSection = 0; // Created on demand. 629 CompactUnwindSection = 0; // Used only by selected targets. 630 DwarfAccelNamesSection = 0; // Used only by selected targets. 631 DwarfAccelObjCSection = 0; // Used only by selected targets. 632 DwarfAccelNamespaceSection = 0; // Used only by selected targets. 633 DwarfAccelTypesSection = 0; // Used only by selected targets. 634 635 Triple T(TT); 636 Triple::ArchType Arch = T.getArch(); 637 // FIXME: Checking for Arch here to filter out bogus triples such as 638 // cellspu-apple-darwin. Perhaps we should fix in Triple? 639 if ((Arch == Triple::x86 || Arch == Triple::x86_64 || 640 Arch == Triple::arm || Arch == Triple::thumb || 641 Arch == Triple::ppc || Arch == Triple::ppc64 || 642 Arch == Triple::UnknownArch) && 643 (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) { 644 Env = IsMachO; 645 InitMachOMCObjectFileInfo(T); 646 } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) && 647 (T.getEnvironment() != Triple::ELF) && 648 (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin || 649 T.getOS() == Triple::Win32)) { 650 Env = IsCOFF; 651 InitCOFFMCObjectFileInfo(T); 652 } else { 653 Env = IsELF; 654 InitELFMCObjectFileInfo(T); 655 } 656 } 657 658 void MCObjectFileInfo::InitEHFrameSection() { 659 if (Env == IsMachO) 660 EHFrameSection = 661 Ctx->getMachOSection("__TEXT", "__eh_frame", 662 MCSectionMachO::S_COALESCED | 663 MCSectionMachO::S_ATTR_NO_TOC | 664 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 665 MCSectionMachO::S_ATTR_LIVE_SUPPORT, 666 SectionKind::getReadOnly()); 667 else if (Env == IsELF) 668 EHFrameSection = 669 Ctx->getELFSection(".eh_frame", EHSectionType, 670 EHSectionFlags, 671 SectionKind::getDataRel()); 672 else 673 EHFrameSection = 674 Ctx->getCOFFSection(".eh_frame", 675 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 676 COFF::IMAGE_SCN_MEM_READ | 677 COFF::IMAGE_SCN_MEM_WRITE, 678 SectionKind::getDataRel()); 679 } 680