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