1dff0c46cSDimitry Andric //===-- X86TargetObjectFile.cpp - X86 Object Info -------------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky
10f22ef01cSRoman Divacky #include "X86TargetObjectFile.h"
1191bc56edSDimitry Andric #include "llvm/ADT/StringExtras.h"
12db17bf38SDimitry Andric #include "llvm/BinaryFormat/COFF.h"
13db17bf38SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h"
142cab237bSDimitry Andric #include "llvm/CodeGen/TargetLowering.h"
1591bc56edSDimitry Andric #include "llvm/IR/Mangler.h"
1691bc56edSDimitry Andric #include "llvm/IR/Operator.h"
17f22ef01cSRoman Divacky #include "llvm/MC/MCContext.h"
18f22ef01cSRoman Divacky #include "llvm/MC/MCExpr.h"
1991bc56edSDimitry Andric #include "llvm/MC/MCSectionCOFF.h"
207ae0e2c9SDimitry Andric #include "llvm/MC/MCSectionELF.h"
21ff0cc061SDimitry Andric #include "llvm/MC/MCValue.h"
22139f7f9bSDimitry Andric
23f22ef01cSRoman Divacky using namespace llvm;
24f22ef01cSRoman Divacky using namespace dwarf;
25f22ef01cSRoman Divacky
getTTypeGlobalReference(const GlobalValue * GV,unsigned Encoding,const TargetMachine & TM,MachineModuleInfo * MMI,MCStreamer & Streamer) const2691bc56edSDimitry Andric const MCExpr *X86_64MachoTargetObjectFile::getTTypeGlobalReference(
27d88c1a5aSDimitry Andric const GlobalValue *GV, unsigned Encoding, const TargetMachine &TM,
28d88c1a5aSDimitry Andric MachineModuleInfo *MMI, MCStreamer &Streamer) const {
29f22ef01cSRoman Divacky
30f22ef01cSRoman Divacky // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
31f22ef01cSRoman Divacky // is an indirect pc-relative reference.
3291bc56edSDimitry Andric if ((Encoding & DW_EH_PE_indirect) && (Encoding & DW_EH_PE_pcrel)) {
33d88c1a5aSDimitry Andric const MCSymbol *Sym = TM.getSymbol(GV);
34f22ef01cSRoman Divacky const MCExpr *Res =
3597bc6c73SDimitry Andric MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
3697bc6c73SDimitry Andric const MCExpr *Four = MCConstantExpr::create(4, getContext());
3797bc6c73SDimitry Andric return MCBinaryExpr::createAdd(Res, Four, getContext());
38f22ef01cSRoman Divacky }
39f22ef01cSRoman Divacky
4091bc56edSDimitry Andric return TargetLoweringObjectFileMachO::getTTypeGlobalReference(
41d88c1a5aSDimitry Andric GV, Encoding, TM, MMI, Streamer);
42f22ef01cSRoman Divacky }
43f22ef01cSRoman Divacky
getCFIPersonalitySymbol(const GlobalValue * GV,const TargetMachine & TM,MachineModuleInfo * MMI) const4491bc56edSDimitry Andric MCSymbol *X86_64MachoTargetObjectFile::getCFIPersonalitySymbol(
45d88c1a5aSDimitry Andric const GlobalValue *GV, const TargetMachine &TM,
463b0f4066SDimitry Andric MachineModuleInfo *MMI) const {
47d88c1a5aSDimitry Andric return TM.getSymbol(GV);
483b0f4066SDimitry Andric }
497ae0e2c9SDimitry Andric
getIndirectSymViaGOTPCRel(const MCSymbol * Sym,const MCValue & MV,int64_t Offset,MachineModuleInfo * MMI,MCStreamer & Streamer) const50ff0cc061SDimitry Andric const MCExpr *X86_64MachoTargetObjectFile::getIndirectSymViaGOTPCRel(
51ff0cc061SDimitry Andric const MCSymbol *Sym, const MCValue &MV, int64_t Offset,
52ff0cc061SDimitry Andric MachineModuleInfo *MMI, MCStreamer &Streamer) const {
53ff0cc061SDimitry Andric // On Darwin/X86-64, we need to use foo@GOTPCREL+4 to access the got entry
54ff0cc061SDimitry Andric // from a data section. In case there's an additional offset, then use
55ff0cc061SDimitry Andric // foo@GOTPCREL+4+<offset>.
56ff0cc061SDimitry Andric unsigned FinalOff = Offset+MV.getConstant()+4;
57ff0cc061SDimitry Andric const MCExpr *Res =
5897bc6c73SDimitry Andric MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
5997bc6c73SDimitry Andric const MCExpr *Off = MCConstantExpr::create(FinalOff, getContext());
6097bc6c73SDimitry Andric return MCBinaryExpr::createAdd(Res, Off, getContext());
617ae0e2c9SDimitry Andric }
62f785676fSDimitry Andric
getDebugThreadLocalSymbol(const MCSymbol * Sym) const63ff0cc061SDimitry Andric const MCExpr *X86ELFTargetObjectFile::getDebugThreadLocalSymbol(
64f785676fSDimitry Andric const MCSymbol *Sym) const {
6597bc6c73SDimitry Andric return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_DTPOFF, getContext());
66f785676fSDimitry Andric }
6791bc56edSDimitry Andric
68ff0cc061SDimitry Andric void
Initialize(MCContext & Ctx,const TargetMachine & TM)69d88c1a5aSDimitry Andric X86FreeBSDTargetObjectFile::Initialize(MCContext &Ctx,
70d88c1a5aSDimitry Andric const TargetMachine &TM) {
71d88c1a5aSDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
72d88c1a5aSDimitry Andric InitializeELF(TM.Options.UseInitArray);
73d88c1a5aSDimitry Andric }
74d88c1a5aSDimitry Andric
75d88c1a5aSDimitry Andric void
Initialize(MCContext & Ctx,const TargetMachine & TM)76d88c1a5aSDimitry Andric X86FuchsiaTargetObjectFile::Initialize(MCContext &Ctx,
77d88c1a5aSDimitry Andric const TargetMachine &TM) {
78d88c1a5aSDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
79d88c1a5aSDimitry Andric InitializeELF(TM.Options.UseInitArray);
80d88c1a5aSDimitry Andric }
81d88c1a5aSDimitry Andric
82d88c1a5aSDimitry Andric void
Initialize(MCContext & Ctx,const TargetMachine & TM)83ff0cc061SDimitry Andric X86LinuxNaClTargetObjectFile::Initialize(MCContext &Ctx,
84ff0cc061SDimitry Andric const TargetMachine &TM) {
85ff0cc061SDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
86ff0cc061SDimitry Andric InitializeELF(TM.Options.UseInitArray);
87ff0cc061SDimitry Andric }
88ff0cc061SDimitry Andric
Initialize(MCContext & Ctx,const TargetMachine & TM)89edd7eaddSDimitry Andric void X86SolarisTargetObjectFile::Initialize(MCContext &Ctx,
90edd7eaddSDimitry Andric const TargetMachine &TM) {
91edd7eaddSDimitry Andric TargetLoweringObjectFileELF::Initialize(Ctx, TM);
92edd7eaddSDimitry Andric InitializeELF(TM.Options.UseInitArray);
93edd7eaddSDimitry Andric }
94