aboutsummaryrefslogtreecommitdiff
path: root/lib/Basic/Targets.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-04-08 02:07:04 +0000
committerMike Stump <mrs@apple.com>2009-04-08 02:07:04 +0000
commit437bb4b6ecf23bd016203dee80983402cdcb761e (patch)
tree6e17656ea532003b078f5c2e967e4b21cd5c6106 /lib/Basic/Targets.cpp
parent82d00688525c876bf47bce414dedae9c343e67f5 (diff)
Add basic support for arm static analysis checking. Radar 6699395
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68582 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Basic/Targets.cpp')
-rw-r--r--lib/Basic/Targets.cpp36
1 files changed, 33 insertions, 3 deletions
diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp
index 2197b42eb7..55c683a36b 100644
--- a/lib/Basic/Targets.cpp
+++ b/lib/Basic/Targets.cpp
@@ -859,11 +859,25 @@ public:
namespace {
class ARMTargetInfo : public TargetInfo {
+ enum {
+ Armv4t,
+ Armv5,
+ Armv6,
+ XScale
+ } ArmArch;
public:
ARMTargetInfo(const std::string& triple) : TargetInfo(triple) {
// FIXME: Are the defaults correct for ARM?
DescriptionString = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
"i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:64";
+ if (triple.find("arm-") || triple.find("armv6-"))
+ ArmArch = Armv6;
+ else if (triple.find("armv5-"))
+ ArmArch = Armv5;
+ else if (triple.find("armv4t-"))
+ ArmArch = Armv4t;
+ else if (triple.find("xscale-"))
+ ArmArch = XScale;
}
virtual void getTargetDefines(const LangOptions &Opts,
std::vector<char> &Defs) const {
@@ -874,8 +888,22 @@ public:
// Target properties.
Define(Defs, "__LITTLE_ENDIAN__");
- // Subtarget options. [hard coded to v6 for now]
- Define(Defs, "__ARM_ARCH_6K__");
+ // Subtarget options.
+ if (ArmArch == Armv6) {
+ Define(Defs, "__ARM_ARCH_6K__");
+ Define(Defs, "__THUMB_INTERWORK__");
+ } else if (ArmArch == Armv5) {
+ Define(Defs, "__ARM_ARCH_5TEJ__");
+ Define(Defs, "__THUMB_INTERWORK__");
+ Define(Defs, "__SOFTFP__");
+ } else if (ArmArch == Armv4t) {
+ Define(Defs, "__ARM_ARCH_4T__");
+ Define(Defs, "__SOFTFP__");
+ } else if (ArmArch == XScale) {
+ Define(Defs, "__ARM_ARCH_5TE__");
+ Define(Defs, "__XSCALE__");
+ Define(Defs, "__SOFTFP__");
+ }
Define(Defs, "__ARMEL__");
Define(Defs, "__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__", "20000");
}
@@ -1141,7 +1169,9 @@ TargetInfo* TargetInfo::CreateTargetInfo(const std::string &T) {
return new PPC64TargetInfo(T);
}
- if (T.find("armv6-") == 0 || T.find("arm-") == 0) {
+ if (T.find("armv6-") == 0 || T.find("arm-") == 0
+ || T.find("armv4t") == 0 || T.find("armv5-") == 0
+ || T.find("xscale") == 0) {
if (isDarwin)
return new DarwinARMTargetInfo(T);
if (isFreeBSD)