OLD | NEW |
1 //===-- llvm/Target/ARMTargetObjectFile.cpp - ARM Object Info Impl --------===// | 1 //===-- llvm/Target/ARMTargetObjectFile.cpp - ARM Object Info Impl --------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 | 9 |
10 #include "ARMTargetObjectFile.h" | 10 #include "ARMTargetObjectFile.h" |
11 #include "ARMSubtarget.h" | 11 #include "ARMSubtarget.h" |
12 #include "llvm/ADT/StringExtras.h" | 12 #include "llvm/ADT/StringExtras.h" |
| 13 #include "llvm/ADT/Triple.h" // @LOCALMOD |
| 14 #include "llvm/CodeGen/MachineModuleInfo.h" // @LOCALMOD |
13 #include "llvm/IR/Mangler.h" | 15 #include "llvm/IR/Mangler.h" |
14 #include "llvm/MC/MCAsmInfo.h" | 16 #include "llvm/MC/MCAsmInfo.h" |
15 #include "llvm/MC/MCContext.h" | 17 #include "llvm/MC/MCContext.h" |
16 #include "llvm/MC/MCExpr.h" | 18 #include "llvm/MC/MCExpr.h" |
17 #include "llvm/MC/MCSectionELF.h" | 19 #include "llvm/MC/MCSectionELF.h" |
18 #include "llvm/Support/Dwarf.h" | 20 #include "llvm/Support/Dwarf.h" |
19 #include "llvm/Support/ELF.h" | 21 #include "llvm/Support/ELF.h" |
20 #include "llvm/Target/TargetLowering.h" | 22 #include "llvm/Target/TargetLowering.h" |
21 using namespace llvm; | 23 using namespace llvm; |
22 using namespace dwarf; | 24 using namespace dwarf; |
23 | 25 |
24 //===----------------------------------------------------------------------===// | 26 //===----------------------------------------------------------------------===// |
25 // ELF Target | 27 // ELF Target |
26 //===----------------------------------------------------------------------===// | 28 //===----------------------------------------------------------------------===// |
27 | 29 |
28 void ARMElfTargetObjectFile::Initialize(MCContext &Ctx, | 30 void ARMElfTargetObjectFile::Initialize(MCContext &Ctx, |
29 const TargetMachine &TM) { | 31 const TargetMachine &TM) { |
30 bool isAAPCS_ABI = TM.getSubtarget<ARMSubtarget>().isAAPCS_ABI(); | 32 bool isAAPCS_ABI = TM.getSubtarget<ARMSubtarget>().isAAPCS_ABI(); |
31 TargetLoweringObjectFileELF::Initialize(Ctx, TM); | 33 TargetLoweringObjectFileELF::Initialize(Ctx, TM); |
32 InitializeELF(isAAPCS_ABI); | 34 InitializeELF(isAAPCS_ABI); |
33 | 35 |
34 if (isAAPCS_ABI) { | 36 // @LOCALMOD-BEGIN |
| 37 if (isAAPCS_ABI && !TM.getSubtarget<ARMSubtarget>().isTargetNaCl()) { |
| 38 // @LOCALMOD-END |
35 LSDASection = nullptr; | 39 LSDASection = nullptr; |
36 } | 40 } |
37 | 41 |
38 AttributesSection = | 42 AttributesSection = |
39 getContext().getELFSection(".ARM.attributes", | 43 getContext().getELFSection(".ARM.attributes", |
40 ELF::SHT_ARM_ATTRIBUTES, | 44 ELF::SHT_ARM_ATTRIBUTES, |
41 0, | 45 0, |
42 SectionKind::getMetadata()); | 46 SectionKind::getMetadata()); |
43 } | 47 } |
44 | 48 |
45 const MCExpr *ARMElfTargetObjectFile::getTTypeGlobalReference( | 49 const MCExpr *ARMElfTargetObjectFile::getTTypeGlobalReference( |
46 const GlobalValue *GV, unsigned Encoding, Mangler &Mang, | 50 const GlobalValue *GV, unsigned Encoding, Mangler &Mang, |
47 const TargetMachine &TM, MachineModuleInfo *MMI, | 51 const TargetMachine &TM, MachineModuleInfo *MMI, |
48 MCStreamer &Streamer) const { | 52 MCStreamer &Streamer) const { |
49 if (TM.getMCAsmInfo()->getExceptionHandlingType() != ExceptionHandling::ARM) | 53 if (TM.getMCAsmInfo()->getExceptionHandlingType() != ExceptionHandling::ARM) |
50 return TargetLoweringObjectFileELF::getTTypeGlobalReference( | 54 return TargetLoweringObjectFileELF::getTTypeGlobalReference( |
51 GV, Encoding, Mang, TM, MMI, Streamer); | 55 GV, Encoding, Mang, TM, MMI, Streamer); |
52 | 56 |
53 assert(Encoding == DW_EH_PE_absptr && "Can handle absptr encoding only"); | 57 assert(Encoding == DW_EH_PE_absptr && "Can handle absptr encoding only"); |
| 58 // @LOCALMOD-BEGIN |
| 59 // FIXME: There has got to be a better way to get this info. |
| 60 Triple T(MMI->getModule()->getTargetTriple()); |
| 61 if (T.isOSNaCl()) |
| 62 return TargetLoweringObjectFileELF::getTTypeGlobalReference( |
| 63 GV, Encoding, Mang, TM, MMI, Streamer); |
| 64 // @LOCALMOD-END |
54 | 65 |
55 return MCSymbolRefExpr::Create(TM.getSymbol(GV, Mang), | 66 return MCSymbolRefExpr::Create(TM.getSymbol(GV, Mang), |
56 MCSymbolRefExpr::VK_ARM_TARGET2, getContext()); | 67 MCSymbolRefExpr::VK_ARM_TARGET2, getContext()); |
57 } | 68 } |
58 | 69 |
59 const MCExpr *ARMElfTargetObjectFile:: | 70 const MCExpr *ARMElfTargetObjectFile:: |
60 getDebugThreadLocalSymbol(const MCSymbol *Sym) const { | 71 getDebugThreadLocalSymbol(const MCSymbol *Sym) const { |
61 return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_ARM_TLSLDO, | 72 return MCSymbolRefExpr::Create(Sym, MCSymbolRefExpr::VK_ARM_TLSLDO, |
62 getContext()); | 73 getContext()); |
63 } | 74 } |
OLD | NEW |