1dfe076af9879eb68a7b8331f9c02eecf563d85beTim Northover//===-- AArch64TargetObjectFile.cpp - AArch64 Object Info -----------------===//
272062f5744557e270a38192554c3126ea5f97434Tim Northover//
372062f5744557e270a38192554c3126ea5f97434Tim Northover//                     The LLVM Compiler Infrastructure
472062f5744557e270a38192554c3126ea5f97434Tim Northover//
572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source
672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details.
772062f5744557e270a38192554c3126ea5f97434Tim Northover//
872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===//
972062f5744557e270a38192554c3126ea5f97434Tim Northover
1072062f5744557e270a38192554c3126ea5f97434Tim Northover#include "AArch64TargetObjectFile.h"
11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64TargetMachine.h"
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/IR/Mangler.h"
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCContext.h"
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCExpr.h"
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCStreamer.h"
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/Dwarf.h"
1772062f5744557e270a38192554c3126ea5f97434Tim Northoverusing namespace llvm;
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace dwarf;
1972062f5744557e270a38192554c3126ea5f97434Tim Northover
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid AArch64_ELFTargetObjectFile::Initialize(MCContext &Ctx,
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                             const TargetMachine &TM) {
2272062f5744557e270a38192554c3126ea5f97434Tim Northover  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
2372062f5744557e270a38192554c3126ea5f97434Tim Northover  InitializeELF(TM.Options.UseInitArray);
2472062f5744557e270a38192554c3126ea5f97434Tim Northover}
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesconst MCExpr *AArch64_MachoTargetObjectFile::getTTypeGlobalReference(
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const TargetMachine &TM, MachineModuleInfo *MMI,
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCStreamer &Streamer) const {
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // On Darwin, we can reference dwarf symbols with foo@GOT-., which
31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // is an indirect pc-relative reference. The default implementation
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // won't reference using the GOT, so we need this target-specific
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // version.
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (Encoding & (DW_EH_PE_indirect | DW_EH_PE_pcrel)) {
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const MCSymbol *Sym = TM.getSymbol(GV, Mang);
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const MCExpr *Res =
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_GOT, getContext());
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MCSymbol *PCSym = getContext().CreateTempSymbol();
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    Streamer.EmitLabel(PCSym);
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const MCExpr *PC = MCSymbolRefExpr::Create(PCSym, getContext());
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return MCBinaryExpr::CreateSub(Res, PC, getContext());
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  }
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return TargetLoweringObjectFileMachO::getTTypeGlobalReference(
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      GV, Encoding, Mang, TM, MMI, Streamer);
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSymbol *AArch64_MachoTargetObjectFile::getCFIPersonalitySymbol(
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    MachineModuleInfo *MMI) const {
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return TM.getSymbol(GV, Mang);
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
53