131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===// 28c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// 38c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// The LLVM Compiler Infrastructure 48c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// 58c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// This file is distributed under the University of Illinois Open Source 68c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// License. See LICENSE.TXT for details. 78c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner// 88c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner//===----------------------------------------------------------------------===// 98c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 109184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "X86TargetObjectFile.h" 11228252f98157132488a8e2616d9c95a28c167c5cChris Lattner#include "llvm/MC/MCContext.h" 124e815f8a8cae6c846cdca52420046cab902865deDaniel Dunbar#include "llvm/MC/MCExpr.h" 13d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola#include "llvm/MC/MCSectionELF.h" 149184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov#include "llvm/Support/Dwarf.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/Mangler.h" 16805141e5043b7bd2fade62102c79b2beb2e3aec4Jakub Staszak 178c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattnerusing namespace llvm; 189184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikovusing namespace dwarf; 198c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner 20a44489d5b5687e98c39947b7b64187a3ad5faf0eBill Wendlingconst MCExpr *X86_64MachoTargetObjectFile:: 2125efd6d556718295a63d37f5294985746af354f6Anton KorobeynikovgetTTypeGlobalReference(const GlobalValue *GV, Mangler *Mang, 2225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MachineModuleInfo *MMI, unsigned Encoding, 2325efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov MCStreamer &Streamer) const { 249184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 258c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which 268c6ed05157e9c97ff8f3ccb211dd797e53228da1Chris Lattner // is an indirect pc-relative reference. 2746885ded4e4c620efd59f8d18e1657135ea39d00Anton Korobeynikov if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) { 28034721eb6a1787b3d5ebf760de067cb622555baeChris Lattner const MCSymbol *Sym = Mang->getSymbol(GV); 2946885ded4e4c620efd59f8d18e1657135ea39d00Anton Korobeynikov const MCExpr *Res = 304e815f8a8cae6c846cdca52420046cab902865deDaniel Dunbar MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext()); 3146885ded4e4c620efd59f8d18e1657135ea39d00Anton Korobeynikov const MCExpr *Four = MCConstantExpr::Create(4, getContext()); 3246885ded4e4c620efd59f8d18e1657135ea39d00Anton Korobeynikov return MCBinaryExpr::CreateAdd(Res, Four, getContext()); 339184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov } 349184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 359184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov return TargetLoweringObjectFileMachO:: 3625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov getTTypeGlobalReference(GV, Mang, MMI, Encoding, Streamer); 379184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov} 389184b25fa543a900463215c11635c2c014ddb623Anton Korobeynikov 39a44489d5b5687e98c39947b7b64187a3ad5faf0eBill WendlingMCSymbol *X86_64MachoTargetObjectFile:: 4060246a96224c8b790177253bf25433b93b335d2bRafael EspindolagetCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang, 417afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola MachineModuleInfo *MMI) const { 427afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola return Mang->getSymbol(GV); 437afec9cc0ff1654619d30b6f30e2a4d13369c8bfRafael Espindola} 44d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola 45d6b43a317e71246380db55a50b799b062b53cdceRafael Espindolavoid 46d6b43a317e71246380db55a50b799b062b53cdceRafael EspindolaX86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) { 47d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola TargetLoweringObjectFileELF::Initialize(Ctx, TM); 48d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola InitializeELF(TM.Options.UseInitArray); 49d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola} 50a35ae962918258207f9092ccbdf4fffa1f2c70f1David Blaikie 51716a94f0c96d6bef575cd286bafb2cc507adc6b0Ulrich Weigandconst MCExpr * 52a35ae962918258207f9092ccbdf4fffa1f2c70f1David BlaikieX86LinuxTargetObjectFile::getDebugThreadLocalSymbol( 53a35ae962918258207f9092ccbdf4fffa1f2c70f1David Blaikie const MCSymbol *Sym) const { 54a35ae962918258207f9092ccbdf4fffa1f2c70f1David Blaikie return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext()); 55a35ae962918258207f9092ccbdf4fffa1f2c70f1David Blaikie} 56