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 DwarfPubTypesSection = 190 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", 191 MCSectionMachO::S_ATTR_DEBUG, 192 SectionKind::getMetadata()); 193 DwarfStrSection = 194 Ctx->getMachOSection("__DWARF", "__debug_str", 195 MCSectionMachO::S_ATTR_DEBUG, 196 SectionKind::getMetadata()); 197 DwarfLocSection = 198 Ctx->getMachOSection("__DWARF", "__debug_loc", 199 MCSectionMachO::S_ATTR_DEBUG, 200 SectionKind::getMetadata()); 201 DwarfARangesSection = 202 Ctx->getMachOSection("__DWARF", "__debug_aranges", 203 MCSectionMachO::S_ATTR_DEBUG, 204 SectionKind::getMetadata()); 205 DwarfRangesSection = 206 Ctx->getMachOSection("__DWARF", "__debug_ranges", 207 MCSectionMachO::S_ATTR_DEBUG, 208 SectionKind::getMetadata()); 209 DwarfMacroInfoSection = 210 Ctx->getMachOSection("__DWARF", "__debug_macinfo", 211 MCSectionMachO::S_ATTR_DEBUG, 212 SectionKind::getMetadata()); 213 DwarfDebugInlineSection = 214 Ctx->getMachOSection("__DWARF", "__debug_inlined", 215 MCSectionMachO::S_ATTR_DEBUG, 216 SectionKind::getMetadata()); 217 218 TLSExtraDataSection = TLSTLVSection; 219 } 220 221 void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { 222 if (T.getArch() == Triple::x86) { 223 PersonalityEncoding = (RelocM == Reloc::PIC_) 224 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 225 : dwarf::DW_EH_PE_absptr; 226 LSDAEncoding = (RelocM == Reloc::PIC_) 227 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 228 : dwarf::DW_EH_PE_absptr; 229 FDEEncoding = FDECFIEncoding = (RelocM == Reloc::PIC_) 230 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 231 : dwarf::DW_EH_PE_absptr; 232 TTypeEncoding = (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 } else if (T.getArch() == Triple::x86_64) { 236 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 237 238 if (RelocM == Reloc::PIC_) { 239 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 240 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 241 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 242 LSDAEncoding = dwarf::DW_EH_PE_pcrel | 243 (CMModel == CodeModel::Small 244 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 245 FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 246 TTypeEncoding = 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 } else { 250 PersonalityEncoding = 251 (CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 252 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 253 LSDAEncoding = (CMModel == CodeModel::Small) 254 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 255 FDEEncoding = dwarf::DW_EH_PE_udata4; 256 TTypeEncoding = (CMModel == CodeModel::Small) 257 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 258 } 259 } else if (T.getArch() == Triple::ppc64) { 260 PersonalityEncoding = dwarf::DW_EH_PE_udata8; 261 PersonalityEncoding |= (RelocM == Reloc::PIC_) 262 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel 263 : dwarf::DW_EH_PE_absptr; 264 unsigned PICFlag = (RelocM == Reloc::PIC_) ? dwarf::DW_EH_PE_pcrel 265 : dwarf::DW_EH_PE_absptr; 266 FDECFIEncoding = PICFlag | dwarf::DW_EH_PE_sdata4; 267 LSDAEncoding = PICFlag | dwarf::DW_EH_PE_udata8; 268 FDEEncoding = PICFlag | dwarf::DW_EH_PE_sdata4; 269 TTypeEncoding = PICFlag | dwarf::DW_EH_PE_sdata4; 270 } 271 272 // Solaris requires different flags for .eh_frame to seemingly every other 273 // platform. 274 EHSectionType = ELF::SHT_PROGBITS; 275 EHSectionFlags = ELF::SHF_ALLOC; 276 if (T.getOS() == Triple::Solaris) { 277 if (T.getArch() == Triple::x86_64) 278 EHSectionType = ELF::SHT_X86_64_UNWIND; 279 else 280 EHSectionFlags |= ELF::SHF_WRITE; 281 } 282 283 284 // ELF 285 BSSSection = 286 Ctx->getELFSection(".bss", ELF::SHT_NOBITS, 287 ELF::SHF_WRITE | ELF::SHF_ALLOC, 288 SectionKind::getBSS()); 289 290 TextSection = 291 Ctx->getELFSection(".text", ELF::SHT_PROGBITS, 292 ELF::SHF_EXECINSTR | 293 ELF::SHF_ALLOC, 294 SectionKind::getText()); 295 296 DataSection = 297 Ctx->getELFSection(".data", ELF::SHT_PROGBITS, 298 ELF::SHF_WRITE |ELF::SHF_ALLOC, 299 SectionKind::getDataRel()); 300 301 ReadOnlySection = 302 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, 303 ELF::SHF_ALLOC, 304 SectionKind::getReadOnly()); 305 306 TLSDataSection = 307 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS, 308 ELF::SHF_ALLOC | ELF::SHF_TLS | 309 ELF::SHF_WRITE, 310 SectionKind::getThreadData()); 311 312 TLSBSSSection = 313 Ctx->getELFSection(".tbss", ELF::SHT_NOBITS, 314 ELF::SHF_ALLOC | ELF::SHF_TLS | 315 ELF::SHF_WRITE, 316 SectionKind::getThreadBSS()); 317 318 DataRelSection = 319 Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS, 320 ELF::SHF_ALLOC |ELF::SHF_WRITE, 321 SectionKind::getDataRel()); 322 323 DataRelLocalSection = 324 Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 325 ELF::SHF_ALLOC |ELF::SHF_WRITE, 326 SectionKind::getDataRelLocal()); 327 328 DataRelROSection = 329 Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 330 ELF::SHF_ALLOC |ELF::SHF_WRITE, 331 SectionKind::getReadOnlyWithRel()); 332 333 DataRelROLocalSection = 334 Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 335 ELF::SHF_ALLOC |ELF::SHF_WRITE, 336 SectionKind::getReadOnlyWithRelLocal()); 337 338 MergeableConst4Section = 339 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 340 ELF::SHF_ALLOC |ELF::SHF_MERGE, 341 SectionKind::getMergeableConst4()); 342 343 MergeableConst8Section = 344 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 345 ELF::SHF_ALLOC |ELF::SHF_MERGE, 346 SectionKind::getMergeableConst8()); 347 348 MergeableConst16Section = 349 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 350 ELF::SHF_ALLOC |ELF::SHF_MERGE, 351 SectionKind::getMergeableConst16()); 352 353 StaticCtorSection = 354 Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS, 355 ELF::SHF_ALLOC |ELF::SHF_WRITE, 356 SectionKind::getDataRel()); 357 358 StaticDtorSection = 359 Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS, 360 ELF::SHF_ALLOC |ELF::SHF_WRITE, 361 SectionKind::getDataRel()); 362 363 // Exception Handling Sections. 364 365 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 366 // it contains relocatable pointers. In PIC mode, this is probably a big 367 // runtime hit for C++ apps. Either the contents of the LSDA need to be 368 // adjusted or this should be a data section. 369 LSDASection = 370 Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 371 ELF::SHF_ALLOC, 372 SectionKind::getReadOnly()); 373 374 // Debug Info Sections. 375 DwarfAbbrevSection = 376 Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 377 SectionKind::getMetadata()); 378 DwarfInfoSection = 379 Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 380 SectionKind::getMetadata()); 381 DwarfLineSection = 382 Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 383 SectionKind::getMetadata()); 384 DwarfFrameSection = 385 Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 386 SectionKind::getMetadata()); 387 DwarfPubTypesSection = 388 Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 389 SectionKind::getMetadata()); 390 DwarfStrSection = 391 Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 392 ELF::SHF_MERGE | ELF::SHF_STRINGS, 393 SectionKind::getMergeable1ByteCString()); 394 DwarfLocSection = 395 Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 396 SectionKind::getMetadata()); 397 DwarfARangesSection = 398 Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 399 SectionKind::getMetadata()); 400 DwarfRangesSection = 401 Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 402 SectionKind::getMetadata()); 403 DwarfMacroInfoSection = 404 Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 405 SectionKind::getMetadata()); 406 407 // DWARF5 Experimental Debug Info 408 409 // Accelerator Tables 410 DwarfAccelNamesSection = 411 Ctx->getELFSection(".apple_names", ELF::SHT_PROGBITS, 0, 412 SectionKind::getMetadata()); 413 DwarfAccelObjCSection = 414 Ctx->getELFSection(".apple_objc", ELF::SHT_PROGBITS, 0, 415 SectionKind::getMetadata()); 416 DwarfAccelNamespaceSection = 417 Ctx->getELFSection(".apple_namespaces", ELF::SHT_PROGBITS, 0, 418 SectionKind::getMetadata()); 419 DwarfAccelTypesSection = 420 Ctx->getELFSection(".apple_types", ELF::SHT_PROGBITS, 0, 421 SectionKind::getMetadata()); 422 423 // Fission Sections 424 DwarfInfoDWOSection = 425 Ctx->getELFSection(".debug_info.dwo", ELF::SHT_PROGBITS, 0, 426 SectionKind::getMetadata()); 427 DwarfAbbrevDWOSection = 428 Ctx->getELFSection(".debug_abbrev.dwo", ELF::SHT_PROGBITS, 0, 429 SectionKind::getMetadata()); 430 DwarfStrDWOSection = 431 Ctx->getELFSection(".debug_str.dwo", ELF::SHT_PROGBITS, 432 ELF::SHF_MERGE | ELF::SHF_STRINGS, 433 SectionKind::getMergeable1ByteCString()); 434 DwarfLineDWOSection = 435 Ctx->getELFSection(".debug_line.dwo", ELF::SHT_PROGBITS, 0, 436 SectionKind::getMetadata()); 437 DwarfLocDWOSection = 438 Ctx->getELFSection(".debug_loc.dwo", ELF::SHT_PROGBITS, 0, 439 SectionKind::getMetadata()); 440 DwarfStrOffDWOSection = 441 Ctx->getELFSection(".debug_str_offsets.dwo", ELF::SHT_PROGBITS, 0, 442 SectionKind::getMetadata()); 443 } 444 445 446 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) { 447 // COFF 448 TextSection = 449 Ctx->getCOFFSection(".text", 450 COFF::IMAGE_SCN_CNT_CODE | 451 COFF::IMAGE_SCN_MEM_EXECUTE | 452 COFF::IMAGE_SCN_MEM_READ, 453 SectionKind::getText()); 454 DataSection = 455 Ctx->getCOFFSection(".data", 456 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 457 COFF::IMAGE_SCN_MEM_READ | 458 COFF::IMAGE_SCN_MEM_WRITE, 459 SectionKind::getDataRel()); 460 ReadOnlySection = 461 Ctx->getCOFFSection(".rdata", 462 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 463 COFF::IMAGE_SCN_MEM_READ, 464 SectionKind::getReadOnly()); 465 if (T.getOS() == Triple::Win32) { 466 StaticCtorSection = 467 Ctx->getCOFFSection(".CRT$XCU", 468 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 469 COFF::IMAGE_SCN_MEM_READ, 470 SectionKind::getReadOnly()); 471 } else { 472 StaticCtorSection = 473 Ctx->getCOFFSection(".ctors", 474 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 475 COFF::IMAGE_SCN_MEM_READ | 476 COFF::IMAGE_SCN_MEM_WRITE, 477 SectionKind::getDataRel()); 478 } 479 480 481 if (T.getOS() == Triple::Win32) { 482 StaticDtorSection = 483 Ctx->getCOFFSection(".CRT$XTX", 484 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 485 COFF::IMAGE_SCN_MEM_READ, 486 SectionKind::getReadOnly()); 487 } else { 488 StaticDtorSection = 489 Ctx->getCOFFSection(".dtors", 490 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 491 COFF::IMAGE_SCN_MEM_READ | 492 COFF::IMAGE_SCN_MEM_WRITE, 493 SectionKind::getDataRel()); 494 } 495 496 // FIXME: We're emitting LSDA info into a readonly section on COFF, even 497 // though it contains relocatable pointers. In PIC mode, this is probably a 498 // big runtime hit for C++ apps. Either the contents of the LSDA need to be 499 // adjusted or this should be a data section. 500 LSDASection = 501 Ctx->getCOFFSection(".gcc_except_table", 502 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 503 COFF::IMAGE_SCN_MEM_READ, 504 SectionKind::getReadOnly()); 505 506 // Debug info. 507 DwarfAbbrevSection = 508 Ctx->getCOFFSection(".debug_abbrev", 509 COFF::IMAGE_SCN_MEM_DISCARDABLE | 510 COFF::IMAGE_SCN_MEM_READ, 511 SectionKind::getMetadata()); 512 DwarfInfoSection = 513 Ctx->getCOFFSection(".debug_info", 514 COFF::IMAGE_SCN_MEM_DISCARDABLE | 515 COFF::IMAGE_SCN_MEM_READ, 516 SectionKind::getMetadata()); 517 DwarfLineSection = 518 Ctx->getCOFFSection(".debug_line", 519 COFF::IMAGE_SCN_MEM_DISCARDABLE | 520 COFF::IMAGE_SCN_MEM_READ, 521 SectionKind::getMetadata()); 522 DwarfFrameSection = 523 Ctx->getCOFFSection(".debug_frame", 524 COFF::IMAGE_SCN_MEM_DISCARDABLE | 525 COFF::IMAGE_SCN_MEM_READ, 526 SectionKind::getMetadata()); 527 DwarfPubTypesSection = 528 Ctx->getCOFFSection(".debug_pubtypes", 529 COFF::IMAGE_SCN_MEM_DISCARDABLE | 530 COFF::IMAGE_SCN_MEM_READ, 531 SectionKind::getMetadata()); 532 DwarfStrSection = 533 Ctx->getCOFFSection(".debug_str", 534 COFF::IMAGE_SCN_MEM_DISCARDABLE | 535 COFF::IMAGE_SCN_MEM_READ, 536 SectionKind::getMetadata()); 537 DwarfLocSection = 538 Ctx->getCOFFSection(".debug_loc", 539 COFF::IMAGE_SCN_MEM_DISCARDABLE | 540 COFF::IMAGE_SCN_MEM_READ, 541 SectionKind::getMetadata()); 542 DwarfARangesSection = 543 Ctx->getCOFFSection(".debug_aranges", 544 COFF::IMAGE_SCN_MEM_DISCARDABLE | 545 COFF::IMAGE_SCN_MEM_READ, 546 SectionKind::getMetadata()); 547 DwarfRangesSection = 548 Ctx->getCOFFSection(".debug_ranges", 549 COFF::IMAGE_SCN_MEM_DISCARDABLE | 550 COFF::IMAGE_SCN_MEM_READ, 551 SectionKind::getMetadata()); 552 DwarfMacroInfoSection = 553 Ctx->getCOFFSection(".debug_macinfo", 554 COFF::IMAGE_SCN_MEM_DISCARDABLE | 555 COFF::IMAGE_SCN_MEM_READ, 556 SectionKind::getMetadata()); 557 558 DrectveSection = 559 Ctx->getCOFFSection(".drectve", 560 COFF::IMAGE_SCN_LNK_INFO, 561 SectionKind::getMetadata()); 562 563 PDataSection = 564 Ctx->getCOFFSection(".pdata", 565 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 566 COFF::IMAGE_SCN_MEM_READ, 567 SectionKind::getDataRel()); 568 569 XDataSection = 570 Ctx->getCOFFSection(".xdata", 571 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 572 COFF::IMAGE_SCN_MEM_READ, 573 SectionKind::getDataRel()); 574 TLSDataSection = 575 Ctx->getCOFFSection(".tls$", 576 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 577 COFF::IMAGE_SCN_MEM_READ | 578 COFF::IMAGE_SCN_MEM_WRITE, 579 SectionKind::getDataRel()); 580 } 581 582 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm, 583 CodeModel::Model cm, 584 MCContext &ctx) { 585 RelocM = relocm; 586 CMModel = cm; 587 Ctx = &ctx; 588 589 // Common. 590 CommDirectiveSupportsAlignment = true; 591 SupportsWeakOmittedEHFrame = true; 592 IsFunctionEHFrameSymbolPrivate = true; 593 594 PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding = 595 TTypeEncoding = dwarf::DW_EH_PE_absptr; 596 597 EHFrameSection = 0; // Created on demand. 598 CompactUnwindSection = 0; // Used only by selected targets. 599 DwarfAccelNamesSection = 0; // Used only by selected targets. 600 DwarfAccelObjCSection = 0; // Used only by selected targets. 601 DwarfAccelNamespaceSection = 0; // Used only by selected targets. 602 DwarfAccelTypesSection = 0; // Used only by selected targets. 603 604 Triple T(TT); 605 Triple::ArchType Arch = T.getArch(); 606 // FIXME: Checking for Arch here to filter out bogus triples such as 607 // cellspu-apple-darwin. Perhaps we should fix in Triple? 608 if ((Arch == Triple::x86 || Arch == Triple::x86_64 || 609 Arch == Triple::arm || Arch == Triple::thumb || 610 Arch == Triple::ppc || Arch == Triple::ppc64 || 611 Arch == Triple::UnknownArch) && 612 (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) { 613 Env = IsMachO; 614 InitMachOMCObjectFileInfo(T); 615 } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) && 616 (T.getEnvironment() != Triple::ELF) && 617 (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin || 618 T.getOS() == Triple::Win32)) { 619 Env = IsCOFF; 620 InitCOFFMCObjectFileInfo(T); 621 } else { 622 Env = IsELF; 623 InitELFMCObjectFileInfo(T); 624 } 625 } 626 627 void MCObjectFileInfo::InitEHFrameSection() { 628 if (Env == IsMachO) 629 EHFrameSection = 630 Ctx->getMachOSection("__TEXT", "__eh_frame", 631 MCSectionMachO::S_COALESCED | 632 MCSectionMachO::S_ATTR_NO_TOC | 633 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 634 MCSectionMachO::S_ATTR_LIVE_SUPPORT, 635 SectionKind::getReadOnly()); 636 else if (Env == IsELF) 637 EHFrameSection = 638 Ctx->getELFSection(".eh_frame", EHSectionType, 639 EHSectionFlags, 640 SectionKind::getDataRel()); 641 else 642 EHFrameSection = 643 Ctx->getCOFFSection(".eh_frame", 644 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 645 COFF::IMAGE_SCN_MEM_READ | 646 COFF::IMAGE_SCN_MEM_WRITE, 647 SectionKind::getDataRel()); 648 } 649