summaryrefslogtreecommitdiffstats
path: root/clang/lib/Basic/Targets.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-02-01 18:58:24 +0000
committerReid Kleckner <rnk@google.com>2016-02-01 18:58:24 +0000
commitf27e752fe888f8a8fd38d7e65854f57040a13160 (patch)
tree46991c185e2f6dd0087d3f0640fefdcef43a08fc /clang/lib/Basic/Targets.cpp
parentc8620dfd270c504a8e0b5159c937e875179217f9 (diff)
downloadbcm5719-llvm-f27e752fe888f8a8fd38d7e65854f57040a13160.tar.gz
bcm5719-llvm-f27e752fe888f8a8fd38d7e65854f57040a13160.zip
Fix attribute((mode([word|unwind_word]))) for x32
Patch by H.J. Lu ``` typedef unsigned int gcc_word __attribute__((mode(word))); ``` and ``` typedef unsigned int gcc_unwind_word __attribute__((mode(unwind_word))); ``` define the largest unsigned integer types which can be stored in a general purpose register, which may not be the pointer type. For x32, they aren't pointer nor unsigned long. We should 1. Make getUnwindWordWidth and getRegisterWidth virtual, 2. Override them for x32, similar to hasInt128Type. 3. Use getRegisterWidth for __attribute__((mode(word))); This fixes PR 24706. Reviewers: rnk Differential Revision: http://reviews.llvm.org/D16779 llvm-svn: 259383
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r--clang/lib/Basic/Targets.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index d75aa3e0095..3f4c1aa12c9 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -4029,6 +4029,8 @@ public:
// for x32 we need it here explicitly
bool hasInt128Type() const override { return true; }
+ unsigned getUnwindWordWidth() const override { return 64; }
+ unsigned getRegisterWidth() const override { return 64; }
bool validateGlobalRegisterVariable(StringRef RegName,
unsigned RegSize,
OpenPOWER on IntegriCloud