1//===-- 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/ADT/StringExtras.h"
13#include "llvm/CodeGen/MachineModuleInfoImpls.h"
14#include "llvm/MC/MCContext.h"
15#include "llvm/MC/MCExpr.h"
16#include "llvm/MC/MCSectionELF.h"
17#include "llvm/MC/MCSectionMachO.h"
18#include "llvm/Target/Mangler.h"
19#include "llvm/Support/Dwarf.h"
20#include "llvm/Support/ELF.h"
21using namespace llvm;
22using namespace dwarf;
23
24const MCExpr *X86_64MachoTargetObjectFile::
25getExprForDwarfGlobalReference(const GlobalValue *GV, Mangler *Mang,
26                               MachineModuleInfo *MMI, unsigned Encoding,
27                               MCStreamer &Streamer) const {
28
29  // On Darwin/X86-64, we can reference dwarf symbols with foo@GOTPCREL+4, which
30  // is an indirect pc-relative reference.
31  if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
32    const MCSymbol *Sym = Mang->getSymbol(GV);
33    const MCExpr *Res =
34      MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOTPCREL, getContext());
35    const MCExpr *Four = MCConstantExpr::Create(4, getContext());
36    return MCBinaryExpr::CreateAdd(Res, Four, getContext());
37  }
38
39  return TargetLoweringObjectFileMachO::
40    getExprForDwarfGlobalReference(GV, Mang, MMI, Encoding, Streamer);
41}
42
43MCSymbol *X86_64MachoTargetObjectFile::
44getCFIPersonalitySymbol(const GlobalValue *GV, Mangler *Mang,
45                        MachineModuleInfo *MMI) const {
46  return Mang->getSymbol(GV);
47}
48
49void
50X86LinuxTargetObjectFile::Initialize(MCContext &Ctx, const TargetMachine &TM) {
51  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
52  InitializeELF(TM.Options.UseInitArray);
53}
54