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/MC/MCContext.h" 12 #include "llvm/MC/MCSection.h" 13 #include "llvm/MC/MCSectionCOFF.h" 14 #include "llvm/MC/MCSectionELF.h" 15 #include "llvm/MC/MCSectionMachO.h" 16 #include "llvm/ADT/Triple.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 DwarfAbbrevSection = 156 Ctx->getMachOSection("__DWARF", "__debug_abbrev", 157 MCSectionMachO::S_ATTR_DEBUG, 158 SectionKind::getMetadata()); 159 DwarfInfoSection = 160 Ctx->getMachOSection("__DWARF", "__debug_info", 161 MCSectionMachO::S_ATTR_DEBUG, 162 SectionKind::getMetadata()); 163 DwarfLineSection = 164 Ctx->getMachOSection("__DWARF", "__debug_line", 165 MCSectionMachO::S_ATTR_DEBUG, 166 SectionKind::getMetadata()); 167 DwarfFrameSection = 168 Ctx->getMachOSection("__DWARF", "__debug_frame", 169 MCSectionMachO::S_ATTR_DEBUG, 170 SectionKind::getMetadata()); 171 DwarfPubNamesSection = 172 Ctx->getMachOSection("__DWARF", "__debug_pubnames", 173 MCSectionMachO::S_ATTR_DEBUG, 174 SectionKind::getMetadata()); 175 DwarfPubTypesSection = 176 Ctx->getMachOSection("__DWARF", "__debug_pubtypes", 177 MCSectionMachO::S_ATTR_DEBUG, 178 SectionKind::getMetadata()); 179 DwarfStrSection = 180 Ctx->getMachOSection("__DWARF", "__debug_str", 181 MCSectionMachO::S_ATTR_DEBUG, 182 SectionKind::getMetadata()); 183 DwarfLocSection = 184 Ctx->getMachOSection("__DWARF", "__debug_loc", 185 MCSectionMachO::S_ATTR_DEBUG, 186 SectionKind::getMetadata()); 187 DwarfARangesSection = 188 Ctx->getMachOSection("__DWARF", "__debug_aranges", 189 MCSectionMachO::S_ATTR_DEBUG, 190 SectionKind::getMetadata()); 191 DwarfRangesSection = 192 Ctx->getMachOSection("__DWARF", "__debug_ranges", 193 MCSectionMachO::S_ATTR_DEBUG, 194 SectionKind::getMetadata()); 195 DwarfMacroInfoSection = 196 Ctx->getMachOSection("__DWARF", "__debug_macinfo", 197 MCSectionMachO::S_ATTR_DEBUG, 198 SectionKind::getMetadata()); 199 DwarfDebugInlineSection = 200 Ctx->getMachOSection("__DWARF", "__debug_inlined", 201 MCSectionMachO::S_ATTR_DEBUG, 202 SectionKind::getMetadata()); 203 204 TLSExtraDataSection = TLSTLVSection; 205 } 206 207 void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) { 208 if (T.getArch() == Triple::x86) { 209 PersonalityEncoding = (RelocM == Reloc::PIC_) 210 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 211 : dwarf::DW_EH_PE_absptr; 212 LSDAEncoding = (RelocM == Reloc::PIC_) 213 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 214 : dwarf::DW_EH_PE_absptr; 215 FDEEncoding = FDECFIEncoding = (RelocM == Reloc::PIC_) 216 ? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 217 : dwarf::DW_EH_PE_absptr; 218 TTypeEncoding = (RelocM == Reloc::PIC_) 219 ? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4 220 : dwarf::DW_EH_PE_absptr; 221 } else if (T.getArch() == Triple::x86_64) { 222 FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 223 224 if (RelocM == Reloc::PIC_) { 225 PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 226 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 227 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 228 LSDAEncoding = dwarf::DW_EH_PE_pcrel | 229 (CMModel == CodeModel::Small 230 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 231 FDEEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4; 232 TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel | 233 ((CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 234 ? dwarf::DW_EH_PE_sdata4 : dwarf::DW_EH_PE_sdata8); 235 } else { 236 PersonalityEncoding = 237 (CMModel == CodeModel::Small || CMModel == CodeModel::Medium) 238 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 239 LSDAEncoding = (CMModel == CodeModel::Small) 240 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 241 FDEEncoding = dwarf::DW_EH_PE_udata4; 242 TTypeEncoding = (CMModel == CodeModel::Small) 243 ? dwarf::DW_EH_PE_udata4 : dwarf::DW_EH_PE_absptr; 244 } 245 } 246 247 // ELF 248 BSSSection = 249 Ctx->getELFSection(".bss", ELF::SHT_NOBITS, 250 ELF::SHF_WRITE |ELF::SHF_ALLOC, 251 SectionKind::getBSS()); 252 253 TextSection = 254 Ctx->getELFSection(".text", ELF::SHT_PROGBITS, 255 ELF::SHF_EXECINSTR | 256 ELF::SHF_ALLOC, 257 SectionKind::getText()); 258 259 DataSection = 260 Ctx->getELFSection(".data", ELF::SHT_PROGBITS, 261 ELF::SHF_WRITE |ELF::SHF_ALLOC, 262 SectionKind::getDataRel()); 263 264 ReadOnlySection = 265 Ctx->getELFSection(".rodata", ELF::SHT_PROGBITS, 266 ELF::SHF_ALLOC, 267 SectionKind::getReadOnly()); 268 269 TLSDataSection = 270 Ctx->getELFSection(".tdata", ELF::SHT_PROGBITS, 271 ELF::SHF_ALLOC | ELF::SHF_TLS | 272 ELF::SHF_WRITE, 273 SectionKind::getThreadData()); 274 275 TLSBSSSection = 276 Ctx->getELFSection(".tbss", ELF::SHT_NOBITS, 277 ELF::SHF_ALLOC | ELF::SHF_TLS | 278 ELF::SHF_WRITE, 279 SectionKind::getThreadBSS()); 280 281 DataRelSection = 282 Ctx->getELFSection(".data.rel", ELF::SHT_PROGBITS, 283 ELF::SHF_ALLOC |ELF::SHF_WRITE, 284 SectionKind::getDataRel()); 285 286 DataRelLocalSection = 287 Ctx->getELFSection(".data.rel.local", ELF::SHT_PROGBITS, 288 ELF::SHF_ALLOC |ELF::SHF_WRITE, 289 SectionKind::getDataRelLocal()); 290 291 DataRelROSection = 292 Ctx->getELFSection(".data.rel.ro", ELF::SHT_PROGBITS, 293 ELF::SHF_ALLOC |ELF::SHF_WRITE, 294 SectionKind::getReadOnlyWithRel()); 295 296 DataRelROLocalSection = 297 Ctx->getELFSection(".data.rel.ro.local", ELF::SHT_PROGBITS, 298 ELF::SHF_ALLOC |ELF::SHF_WRITE, 299 SectionKind::getReadOnlyWithRelLocal()); 300 301 MergeableConst4Section = 302 Ctx->getELFSection(".rodata.cst4", ELF::SHT_PROGBITS, 303 ELF::SHF_ALLOC |ELF::SHF_MERGE, 304 SectionKind::getMergeableConst4()); 305 306 MergeableConst8Section = 307 Ctx->getELFSection(".rodata.cst8", ELF::SHT_PROGBITS, 308 ELF::SHF_ALLOC |ELF::SHF_MERGE, 309 SectionKind::getMergeableConst8()); 310 311 MergeableConst16Section = 312 Ctx->getELFSection(".rodata.cst16", ELF::SHT_PROGBITS, 313 ELF::SHF_ALLOC |ELF::SHF_MERGE, 314 SectionKind::getMergeableConst16()); 315 316 StaticCtorSection = 317 Ctx->getELFSection(".ctors", ELF::SHT_PROGBITS, 318 ELF::SHF_ALLOC |ELF::SHF_WRITE, 319 SectionKind::getDataRel()); 320 321 StaticDtorSection = 322 Ctx->getELFSection(".dtors", ELF::SHT_PROGBITS, 323 ELF::SHF_ALLOC |ELF::SHF_WRITE, 324 SectionKind::getDataRel()); 325 326 // Exception Handling Sections. 327 328 // FIXME: We're emitting LSDA info into a readonly section on ELF, even though 329 // it contains relocatable pointers. In PIC mode, this is probably a big 330 // runtime hit for C++ apps. Either the contents of the LSDA need to be 331 // adjusted or this should be a data section. 332 LSDASection = 333 Ctx->getELFSection(".gcc_except_table", ELF::SHT_PROGBITS, 334 ELF::SHF_ALLOC, 335 SectionKind::getReadOnly()); 336 337 // Debug Info Sections. 338 DwarfAbbrevSection = 339 Ctx->getELFSection(".debug_abbrev", ELF::SHT_PROGBITS, 0, 340 SectionKind::getMetadata()); 341 DwarfInfoSection = 342 Ctx->getELFSection(".debug_info", ELF::SHT_PROGBITS, 0, 343 SectionKind::getMetadata()); 344 DwarfLineSection = 345 Ctx->getELFSection(".debug_line", ELF::SHT_PROGBITS, 0, 346 SectionKind::getMetadata()); 347 DwarfFrameSection = 348 Ctx->getELFSection(".debug_frame", ELF::SHT_PROGBITS, 0, 349 SectionKind::getMetadata()); 350 DwarfPubNamesSection = 351 Ctx->getELFSection(".debug_pubnames", ELF::SHT_PROGBITS, 0, 352 SectionKind::getMetadata()); 353 DwarfPubTypesSection = 354 Ctx->getELFSection(".debug_pubtypes", ELF::SHT_PROGBITS, 0, 355 SectionKind::getMetadata()); 356 DwarfStrSection = 357 Ctx->getELFSection(".debug_str", ELF::SHT_PROGBITS, 0, 358 SectionKind::getMetadata()); 359 DwarfLocSection = 360 Ctx->getELFSection(".debug_loc", ELF::SHT_PROGBITS, 0, 361 SectionKind::getMetadata()); 362 DwarfARangesSection = 363 Ctx->getELFSection(".debug_aranges", ELF::SHT_PROGBITS, 0, 364 SectionKind::getMetadata()); 365 DwarfRangesSection = 366 Ctx->getELFSection(".debug_ranges", ELF::SHT_PROGBITS, 0, 367 SectionKind::getMetadata()); 368 DwarfMacroInfoSection = 369 Ctx->getELFSection(".debug_macinfo", ELF::SHT_PROGBITS, 0, 370 SectionKind::getMetadata()); 371 } 372 373 374 void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) { 375 // COFF 376 TextSection = 377 Ctx->getCOFFSection(".text", 378 COFF::IMAGE_SCN_CNT_CODE | 379 COFF::IMAGE_SCN_MEM_EXECUTE | 380 COFF::IMAGE_SCN_MEM_READ, 381 SectionKind::getText()); 382 DataSection = 383 Ctx->getCOFFSection(".data", 384 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 385 COFF::IMAGE_SCN_MEM_READ | 386 COFF::IMAGE_SCN_MEM_WRITE, 387 SectionKind::getDataRel()); 388 ReadOnlySection = 389 Ctx->getCOFFSection(".rdata", 390 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 391 COFF::IMAGE_SCN_MEM_READ, 392 SectionKind::getReadOnly()); 393 StaticCtorSection = 394 Ctx->getCOFFSection(".ctors", 395 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 396 COFF::IMAGE_SCN_MEM_READ | 397 COFF::IMAGE_SCN_MEM_WRITE, 398 SectionKind::getDataRel()); 399 StaticDtorSection = 400 Ctx->getCOFFSection(".dtors", 401 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 402 COFF::IMAGE_SCN_MEM_READ | 403 COFF::IMAGE_SCN_MEM_WRITE, 404 SectionKind::getDataRel()); 405 406 // FIXME: We're emitting LSDA info into a readonly section on COFF, even 407 // though it contains relocatable pointers. In PIC mode, this is probably a 408 // big runtime hit for C++ apps. Either the contents of the LSDA need to be 409 // adjusted or this should be a data section. 410 LSDASection = 411 Ctx->getCOFFSection(".gcc_except_table", 412 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 413 COFF::IMAGE_SCN_MEM_READ, 414 SectionKind::getReadOnly()); 415 416 // Debug info. 417 DwarfAbbrevSection = 418 Ctx->getCOFFSection(".debug_abbrev", 419 COFF::IMAGE_SCN_MEM_DISCARDABLE | 420 COFF::IMAGE_SCN_MEM_READ, 421 SectionKind::getMetadata()); 422 DwarfInfoSection = 423 Ctx->getCOFFSection(".debug_info", 424 COFF::IMAGE_SCN_MEM_DISCARDABLE | 425 COFF::IMAGE_SCN_MEM_READ, 426 SectionKind::getMetadata()); 427 DwarfLineSection = 428 Ctx->getCOFFSection(".debug_line", 429 COFF::IMAGE_SCN_MEM_DISCARDABLE | 430 COFF::IMAGE_SCN_MEM_READ, 431 SectionKind::getMetadata()); 432 DwarfFrameSection = 433 Ctx->getCOFFSection(".debug_frame", 434 COFF::IMAGE_SCN_MEM_DISCARDABLE | 435 COFF::IMAGE_SCN_MEM_READ, 436 SectionKind::getMetadata()); 437 DwarfPubNamesSection = 438 Ctx->getCOFFSection(".debug_pubnames", 439 COFF::IMAGE_SCN_MEM_DISCARDABLE | 440 COFF::IMAGE_SCN_MEM_READ, 441 SectionKind::getMetadata()); 442 DwarfPubTypesSection = 443 Ctx->getCOFFSection(".debug_pubtypes", 444 COFF::IMAGE_SCN_MEM_DISCARDABLE | 445 COFF::IMAGE_SCN_MEM_READ, 446 SectionKind::getMetadata()); 447 DwarfStrSection = 448 Ctx->getCOFFSection(".debug_str", 449 COFF::IMAGE_SCN_MEM_DISCARDABLE | 450 COFF::IMAGE_SCN_MEM_READ, 451 SectionKind::getMetadata()); 452 DwarfLocSection = 453 Ctx->getCOFFSection(".debug_loc", 454 COFF::IMAGE_SCN_MEM_DISCARDABLE | 455 COFF::IMAGE_SCN_MEM_READ, 456 SectionKind::getMetadata()); 457 DwarfARangesSection = 458 Ctx->getCOFFSection(".debug_aranges", 459 COFF::IMAGE_SCN_MEM_DISCARDABLE | 460 COFF::IMAGE_SCN_MEM_READ, 461 SectionKind::getMetadata()); 462 DwarfRangesSection = 463 Ctx->getCOFFSection(".debug_ranges", 464 COFF::IMAGE_SCN_MEM_DISCARDABLE | 465 COFF::IMAGE_SCN_MEM_READ, 466 SectionKind::getMetadata()); 467 DwarfMacroInfoSection = 468 Ctx->getCOFFSection(".debug_macinfo", 469 COFF::IMAGE_SCN_MEM_DISCARDABLE | 470 COFF::IMAGE_SCN_MEM_READ, 471 SectionKind::getMetadata()); 472 473 DrectveSection = 474 Ctx->getCOFFSection(".drectve", 475 COFF::IMAGE_SCN_LNK_INFO, 476 SectionKind::getMetadata()); 477 478 PDataSection = 479 Ctx->getCOFFSection(".pdata", 480 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 481 COFF::IMAGE_SCN_MEM_READ | 482 COFF::IMAGE_SCN_MEM_WRITE, 483 SectionKind::getDataRel()); 484 485 XDataSection = 486 Ctx->getCOFFSection(".xdata", 487 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 488 COFF::IMAGE_SCN_MEM_READ | 489 COFF::IMAGE_SCN_MEM_WRITE, 490 SectionKind::getDataRel()); 491 } 492 493 void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm, 494 CodeModel::Model cm, 495 MCContext &ctx) { 496 RelocM = relocm; 497 CMModel = cm; 498 Ctx = &ctx; 499 500 // Common. 501 CommDirectiveSupportsAlignment = true; 502 SupportsWeakOmittedEHFrame = true; 503 IsFunctionEHFrameSymbolPrivate = true; 504 505 PersonalityEncoding = LSDAEncoding = FDEEncoding = FDECFIEncoding = 506 TTypeEncoding = dwarf::DW_EH_PE_absptr; 507 508 EHFrameSection = 0; // Created on demand. 509 CompactUnwindSection = 0; // Used only by selected targets. 510 511 Triple T(TT); 512 Triple::ArchType Arch = T.getArch(); 513 // FIXME: Checking for Arch here to filter out bogus triples such as 514 // cellspu-apple-darwin. Perhaps we should fix in Triple? 515 if ((Arch == Triple::x86 || Arch == Triple::x86_64 || 516 Arch == Triple::arm || Arch == Triple::thumb || 517 Arch == Triple::ppc || Arch == Triple::ppc64 || 518 Arch == Triple::UnknownArch) && 519 (T.isOSDarwin() || T.getEnvironment() == Triple::MachO)) { 520 Env = IsMachO; 521 InitMachOMCObjectFileInfo(T); 522 } else if ((Arch == Triple::x86 || Arch == Triple::x86_64) && 523 (T.getOS() == Triple::MinGW32 || T.getOS() == Triple::Cygwin || 524 T.getOS() == Triple::Win32)) { 525 Env = IsCOFF; 526 InitCOFFMCObjectFileInfo(T); 527 } else { 528 Env = IsELF; 529 InitELFMCObjectFileInfo(T); 530 } 531 } 532 533 void MCObjectFileInfo::InitEHFrameSection() { 534 if (Env == IsMachO) 535 EHFrameSection = 536 Ctx->getMachOSection("__TEXT", "__eh_frame", 537 MCSectionMachO::S_COALESCED | 538 MCSectionMachO::S_ATTR_NO_TOC | 539 MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS | 540 MCSectionMachO::S_ATTR_LIVE_SUPPORT, 541 SectionKind::getReadOnly()); 542 else if (Env == IsELF) 543 EHFrameSection = 544 Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS, 545 ELF::SHF_ALLOC, 546 SectionKind::getDataRel()); 547 else 548 EHFrameSection = 549 Ctx->getCOFFSection(".eh_frame", 550 COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | 551 COFF::IMAGE_SCN_MEM_READ | 552 COFF::IMAGE_SCN_MEM_WRITE, 553 SectionKind::getDataRel()); 554 } 555