1 //===-- ARMSubtarget.cpp - ARM Subtarget Information ------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the ARM specific subclass of TargetSubtarget.
12 //===----------------------------------------------------------------------===//
14 #include "ARMSubtarget.h"
15 #include "ARMGenSubtarget.inc"
16 #include "llvm/GlobalValue.h"
17 #include "llvm/Target/TargetOptions.h"
18 #include "llvm/Support/CommandLine.h"
22 ReserveR9("arm-reserve-r9", cl::Hidden
,
23 cl::desc("Reserve R9, making it unavailable as GPR"));
25 ARMSubtarget::ARMSubtarget(const std::string
&TT
, const std::string
&FS
,
29 , UseNEONForSinglePrecisionFP(false)
32 , IsR9Reserved(ReserveR9
)
34 , CPUString("generic")
35 , TargetType(isELF
) // Default to ELF unless otherwise specified.
36 , TargetABI(ARM_ABI_APCS
) {
37 // default to soft float ABI
38 if (FloatABIType
== FloatABI::Default
)
39 FloatABIType
= FloatABI::Soft
;
41 // Determine default and user specified characteristics
43 // Parse features string.
44 CPUString
= ParseSubtargetFeatures(FS
, CPUString
);
46 // Set the boolean corresponding to the current target triple, or the default
47 // if one cannot be determined, to true.
48 unsigned Len
= TT
.length();
51 if (Len
>= 5 && TT
.substr(0, 4) == "armv")
53 else if (Len
>= 6 && TT
.substr(0, 5) == "thumb") {
55 if (Len
>= 7 && TT
[5] == 'v')
59 unsigned SubVer
= TT
[Idx
];
60 if (SubVer
> '4' && SubVer
<= '9') {
63 } else if (SubVer
== '6') {
65 if (Len
>= Idx
+3 && TT
[Idx
+1] == 't' && TT
[Idx
+2] == '2')
66 ARMArchVersion
= V6T2
;
67 } else if (SubVer
== '5') {
69 if (Len
>= Idx
+3 && TT
[Idx
+1] == 't' && TT
[Idx
+2] == 'e')
70 ARMArchVersion
= V5TE
;
72 if (ARMArchVersion
>= V6T2
)
77 // Thumb2 implies at least V6T2.
78 if (ARMArchVersion
< V6T2
&& ThumbMode
>= Thumb2
)
79 ARMArchVersion
= V6T2
;
82 if (TT
.find("-darwin") != std::string::npos
)
84 TargetType
= isDarwin
;
87 if (TT
.find("eabi") != std::string::npos
)
88 TargetABI
= ARM_ABI_AAPCS
;
94 IsR9Reserved
= ReserveR9
| (ARMArchVersion
< V6
);
97 /// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
99 ARMSubtarget::GVIsIndirectSymbol(GlobalValue
*GV
, Reloc::Model RelocM
) const {
100 if (RelocM
== Reloc::Static
)
103 // GV with ghost linkage (in JIT lazy compilation mode) do not require an
104 // extra load from stub.
105 bool isDecl
= GV
->isDeclaration() && !GV
->hasNotBeenReadFromBitcode();
107 if (!isTargetDarwin()) {
108 // Extra load is needed for all externally visible.
109 if (GV
->hasLocalLinkage() || GV
->hasHiddenVisibility())
113 if (RelocM
== Reloc::PIC_
) {
114 // If this is a strong reference to a definition, it is definitely not
116 if (!isDecl
&& !GV
->isWeakForLinker())
119 // Unless we have a symbol with hidden visibility, we have to go through a
120 // normal $non_lazy_ptr stub because this symbol might be resolved late.
121 if (!GV
->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.
124 // If symbol visibility is hidden, we have a stub for common symbol
125 // references and external declarations.
126 if (isDecl
|| GV
->hasCommonLinkage())
127 // Hidden $non_lazy_ptr reference.
132 // If this is a strong reference to a definition, it is definitely not
134 if (!isDecl
&& !GV
->isWeakForLinker())
137 // Unless we have a symbol with hidden visibility, we have to go through a
138 // normal $non_lazy_ptr stub because this symbol might be resolved late.
139 if (!GV
->hasHiddenVisibility()) // Non-hidden $non_lazy_ptr reference.