1bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//===-- llvm/Target/ARMTargetObjectFile.cpp - ARM Object Info Impl --------===//
2bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//
3bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//                     The LLVM Compiler Infrastructure
4bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//
5bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling// This file is distributed under the University of Illinois Open Source
6bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling// License. See LICENSE.TXT for details.
7bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//
8bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//===----------------------------------------------------------------------===//
9bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling
10bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling#include "ARMTargetObjectFile.h"
11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "ARMTargetMachine.h"
12d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h"
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h"
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/MC/MCAsmInfo.h"
15287df1bc0309962770b6c176f2d143795dd3cc2fChris Lattner#include "llvm/MC/MCContext.h"
1625efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov#include "llvm/MC/MCExpr.h"
17bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling#include "llvm/MC/MCSectionELF.h"
18bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling#include "llvm/Support/Dwarf.h"
19c85dca66e68c9fa6ffa8471c64113b12d8d94fb1Rafael Espindola#include "llvm/Support/ELF.h"
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Target/TargetLowering.h"
21bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendlingusing namespace llvm;
22bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendlingusing namespace dwarf;
23bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling
24bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//===----------------------------------------------------------------------===//
25bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//                               ELF Target
26bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling//===----------------------------------------------------------------------===//
27bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling
28bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendlingvoid ARMElfTargetObjectFile::Initialize(MCContext &Ctx,
29bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling                                        const TargetMachine &TM) {
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  bool isAAPCS_ABI = static_cast<const ARMTargetMachine &>(TM).TargetABI ==
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                     ARMTargetMachine::ARMABI::ARM_ABI_AAPCS;
32bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling  TargetLoweringObjectFileELF::Initialize(Ctx, TM);
33d6b43a317e71246380db55a50b799b062b53cdceRafael Espindola  InitializeELF(isAAPCS_ABI);
34bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling
354a99f59aef358fb93eac180e49f6dcef03822046Anton Korobeynikov  if (isAAPCS_ABI) {
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    LSDASection = nullptr;
37bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling  }
38b5e16af9ea04cc1f94ca631104e5e6be96546aa1Anton Korobeynikov
3917b443df4368acfad853d09858c033c45c468d5cJason W Kim  AttributesSection =
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      getContext().getELFSection(".ARM.attributes", ELF::SHT_ARM_ATTRIBUTES, 0);
41bdc38e5aa27bf57b4315b961a172e250bcb1bd69Bill Wendling}
4225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCExpr *ARMElfTargetObjectFile::getTTypeGlobalReference(
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const GlobalValue *GV, unsigned Encoding, Mangler &Mang,
4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    const TargetMachine &TM, MachineModuleInfo *MMI,
4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    MCStreamer &Streamer) const {
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (TM.getMCAsmInfo()->getExceptionHandlingType() != ExceptionHandling::ARM)
48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return TargetLoweringObjectFileELF::getTTypeGlobalReference(
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        GV, Encoding, Mang, TM, MMI, Streamer);
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
5125efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov  assert(Encoding == DW_EH_PE_absptr && "Can handle absptr encoding only");
5225efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov
536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return MCSymbolRefExpr::create(TM.getSymbol(GV, Mang),
5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                 MCSymbolRefExpr::VK_ARM_TARGET2, getContext());
5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst MCExpr *ARMElfTargetObjectFile::
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesgetDebugThreadLocalSymbol(const MCSymbol *Sym) const {
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_ARM_TLSLDO,
6025efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov                                 getContext());
6125efd6d556718295a63d37f5294985746af354f6Anton Korobeynikov}
62