1 //===-- llvm/Target/X86/X86TargetObjectFile.cpp - X86 Object Info ---------===// 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 "X86TargetObjectFile.h" 11 #include "X86TargetMachine.h" 12 #include "llvm/CodeGen/MachineModuleInfoImpls.h" 13 #include "llvm/MC/MCContext.h" 14 #include "llvm/MC/MCExpr.h" 15 #include "llvm/MC/MCSectionMachO.h" 16 #include "llvm/Target/Mangler.h" 17 #include "llvm/ADT/SmallString.h" 18 #include "llvm/Support/Dwarf.h" 19 using namespace llvm; 20 using namespace dwarf; 21 22 const MCExpr *X8664_MachoTargetObjectFile:: 23 getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang, 24 MachineModuleInfo *MMI, unsigned Encoding, 25 MCStreamer &Streamer) const { 26 27 // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which 28 // is an indirect pc-relative reference. 29 if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) { 30 const MCSymbol *Sym = Mang->getSymbol(GV); 31 const MCExpr *Res = 32 MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext()); 33 const MCExpr *Four = MCConstantExpr::Create(4, getContext()); 34 return MCBinaryExpr::CreateAdd(Res, Four, getContext()); 35 } 36 37 return TargetLoweringObjectFileMachO:: 38 getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer); 39 } 40 41 unsigned X8632_ELFTargetObjectFile::getPersonalityEncoding() const { 42 if (TM.getRelocationModel() == Reloc::PIC_) 43 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 44 else 45 return DW_EH_PE_absptr; 46 } 47 48 unsigned X8632_ELFTargetObjectFile::getLSDAEncoding() const { 49 if (TM.getRelocationModel() == Reloc::PIC_) 50 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 51 else 52 return DW_EH_PE_absptr; 53 } 54 55 unsigned X8632_ELFTargetObjectFile::getFDEEncoding() const { 56 if (TM.getRelocationModel() == Reloc::PIC_) 57 return DW_EH_PE_pcrel | DW_EH_PE_sdata4; 58 else 59 return DW_EH_PE_absptr; 60 } 61 62 unsigned X8632_ELFTargetObjectFile::getTTypeEncoding() const { 63 if (TM.getRelocationModel() == Reloc::PIC_) 64 return DW_EH_PE_indirect | DW_EH_PE_pcrel | DW_EH_PE_sdata4; 65 else 66 return DW_EH_PE_absptr; 67 } 68 69 unsigned X8664_ELFTargetObjectFile::getPersonalityEncoding() const { 70 CodeModel::Model Model = TM.getCodeModel(); 71 if (TM.getRelocationModel() == Reloc::PIC_) 72 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small || 73 Model == CodeModel::Medium ? 74 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 75 76 if (Model == CodeModel::Small || Model == CodeModel::Medium) 77 return DW_EH_PE_udata4; 78 79 return DW_EH_PE_absptr; 80 } 81 82 unsigned X8664_ELFTargetObjectFile::getLSDAEncoding() const { 83 CodeModel::Model Model = TM.getCodeModel(); 84 if (TM.getRelocationModel() == Reloc::PIC_) 85 return DW_EH_PE_pcrel | (Model == CodeModel::Small ? 86 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 87 88 if (Model == CodeModel::Small) 89 return DW_EH_PE_udata4; 90 91 return DW_EH_PE_absptr; 92 } 93 94 unsigned X8664_ELFTargetObjectFile::getFDEEncoding() const { 95 CodeModel::Model Model = TM.getCodeModel(); 96 if (TM.getRelocationModel() == Reloc::PIC_) 97 return DW_EH_PE_pcrel | (Model == CodeModel::Small || 98 Model == CodeModel::Medium ? 99 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 100 101 if (Model == CodeModel::Small || Model == CodeModel::Medium) 102 return DW_EH_PE_udata4; 103 104 return DW_EH_PE_absptr; 105 } 106 107 unsigned X8664_ELFTargetObjectFile::getTTypeEncoding() const { 108 CodeModel::Model Model = TM.getCodeModel(); 109 if (TM.getRelocationModel() == Reloc::PIC_) 110 return DW_EH_PE_indirect | DW_EH_PE_pcrel | (Model == CodeModel::Small || 111 Model == CodeModel::Medium ? 112 DW_EH_PE_sdata4 : DW_EH_PE_sdata8); 113 114 if (Model == CodeModel::Small) 115 return DW_EH_PE_udata4; 116 117 return DW_EH_PE_absptr; 118 } 119