[PATCH] TargetInfo: Use DataLayout to compute pointer width in getPointerWidth()
Reid Kleckner
rnk at google.com
Wed Jun 25 13:45:38 PDT 2014
Feel free to commit with some comments on the test.
On Wed, Jun 25, 2014 at 1:31 PM, Tom Stellard <thomas.stellard at amd.com>
wrote:
> ---
> include/clang/Basic/TargetInfo.h | 4 +---
> lib/Basic/TargetInfo.cpp | 9 +++++++++
> test/CodeGen/record-lowering-non-zero-as.cl | 14 ++++++++++++++
> 3 files changed, 24 insertions(+), 3 deletions(-)
> create mode 100644 test/CodeGen/record-lowering-non-zero-as.cl
>
> diff --git a/include/clang/Basic/TargetInfo.h
> b/include/clang/Basic/TargetInfo.h
> index e1d0116..65dc101 100644
> --- a/include/clang/Basic/TargetInfo.h
> +++ b/include/clang/Basic/TargetInfo.h
> @@ -790,9 +790,7 @@ public:
> }
>
> protected:
> - virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
> - return PointerWidth;
> - }
> + virtual uint64_t getPointerWidthV(unsigned AddrSpace) const;
> virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
> return PointerAlign;
> }
> diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp
> index 71e39dd..d0f6306 100644
> --- a/lib/Basic/TargetInfo.cpp
> +++ b/lib/Basic/TargetInfo.cpp
> @@ -17,6 +17,7 @@
> #include "clang/Basic/LangOptions.h"
> #include "llvm/ADT/APFloat.h"
> #include "llvm/ADT/STLExtras.h"
> +#include "llvm/IR/DataLayout.h"
> #include "llvm/Support/ErrorHandling.h"
> #include <cstdlib>
> using namespace clang;
> @@ -242,6 +243,14 @@ bool TargetInfo::isTypeSigned(IntType T) {
> };
> }
>
> +uint64_t TargetInfo::getPointerWidthV(unsigned AddrSpace) const {
> + if (!DescriptionString)
> + return PointerWidth;
> +
> + llvm::DataLayout DL(DescriptionString);
> + return DL.getPointerSizeInBits(AddrSpace);
> +}
>
Seems reasonable.
> +
> /// setForcedLangOptions - Set forced language options.
> /// Apply changes to the target information with respect to certain
> /// language options which change the target configuration.
> diff --git a/test/CodeGen/record-lowering-non-zero-as.cl b/test/CodeGen/
> record-lowering-non-zero-as.cl
> new file mode 100644
> index 0000000..a96756f
> --- /dev/null
> +++ b/test/CodeGen/record-lowering-non-zero-as.cl
> @@ -0,0 +1,14 @@
> +// REQUIRES: r600-registered-target
> +// RUN: %clang -target r600 -mcpu=verde -S -emit-llvm -o - %s
>
IMO this should be a Sema test. CodeGen was working as intended, it's the
output of sizeof() that was wrong. Can you make this a Sema test like:
struct test_as0 { int *ptr; };
int as0[sizeof(struct test_as0) == 4 ? 1 : -1];
struct test_as1 { global int *ptr; };
int as1[sizeof(struct test_as1) == 8 ? 1 : -1];
// ... and so on, for other interesting address spaces.
If you also want a CodeGen test, please FileCheck for the correct LLVM IR
struct type.
+
> +// Record lowering was crashing on SI and newer targets, because it
> +// was using the wrong size for test::ptr. Since global memory
> +// has 64-bit pointers, sizeof(test::ptr) should be 8.
> +
> +struct test {
> + global int *ptr;
> +};
> +
> +void func(struct test t, global int *ptr) {
> + *ptr = 0;
> +}
> --
> 1.8.1.5
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140625/cfdeff51/attachment.html>
More information about the cfe-commits
mailing list