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