From 23d3e8fcdc027a573febb584b81512f33e10954f Mon Sep 17 00:00:00 2001 From: Pirama Arumuga Nainar Date: Sat, 2 Jul 2016 00:05:42 +0000 Subject: [PATCH] Add TargetInfo for 32-bit and 64-bit RenderScript Summary: The TargetInfo for 'renderscript32' and 'renderscript64' ArchTypes are subclasses of ARMleTargetInfo and AArch64leTargetInfo respectively. RenderScript32TargetInfo modifies the ARM ABI to set LongWidth and LongAlign to be 64-bits. Other than this modification, the underlying TargetInfo base classes is initialized as if they have "armv7" and "aarch64" architecture type respectively. Reviewers: rsmith, echristo Subscribers: aemerson, tberghammer, cfe-commits, danalbert, mehdi_amini, srhines Differential Revision: http://reviews.llvm.org/D21334 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@274409 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 41 +++++++++++++++++++++++++++++++++++++ test/CodeGen/renderscript.c | 25 ++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 test/CodeGen/renderscript.c diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 252f2be7af..80802fdf97 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -8071,6 +8071,42 @@ public: return true; } }; + +// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes +class RenderScript32TargetInfo : public ARMleTargetInfo { +public: + RenderScript32TargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) + : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(), + Triple.getOSName(), + Triple.getEnvironmentName()), + Opts) { + LongWidth = LongAlign = 64; + } + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override { + Builder.defineMacro("__RENDERSCRIPT__"); + ARMleTargetInfo::getTargetDefines(Opts, Builder); + } +}; + +// 64-bit RenderScript is aarch64 +class RenderScript64TargetInfo : public AArch64leTargetInfo { +public: + RenderScript64TargetInfo(const llvm::Triple &Triple, + const TargetOptions &Opts) + : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(), + Triple.getOSName(), + Triple.getEnvironmentName()), + Opts) {} + + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override { + Builder.defineMacro("__RENDERSCRIPT__"); + AArch64leTargetInfo::getTargetDefines(Opts, Builder); + } +}; + } // end anonymous namespace //===----------------------------------------------------------------------===// @@ -8499,6 +8535,11 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple, if (!(Triple == llvm::Triple("wasm64-unknown-unknown"))) return nullptr; return new WebAssemblyOSTargetInfo(Triple, Opts); + + case llvm::Triple::renderscript32: + return new LinuxTargetInfo(Triple, Opts); + case llvm::Triple::renderscript64: + return new LinuxTargetInfo(Triple, Opts); } } diff --git a/test/CodeGen/renderscript.c b/test/CodeGen/renderscript.c new file mode 100644 index 0000000000..d47750a773 --- /dev/null +++ b/test/CodeGen/renderscript.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -triple=renderscript32-none-linux-gnueabi -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-RS32 +// RUN: %clang_cc1 %s -triple=renderscript64-none-linux-android -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-RS64 +// RUN: %clang_cc1 %s -triple=armv7-none-linux-gnueabi -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-ARM + +// Ensure that the bitcode has the correct triple +// CHECK-RS32: target triple = "armv7-none-linux-gnueabi" +// CHECK-RS64: target triple = "aarch64-none-linux-android" +// CHECK-ARM: target triple = "armv7-none-linux-gnueabi" + +// Ensure that long data type has 8-byte size and alignment in RenderScript +#ifdef __RENDERSCRIPT__ +#define LONG_WIDTH_AND_ALIGN 8 +#else +#define LONG_WIDTH_AND_ALIGN 4 +#endif + +_Static_assert(sizeof(long) == LONG_WIDTH_AND_ALIGN, "sizeof long is wrong"); +_Static_assert(_Alignof(long) == LONG_WIDTH_AND_ALIGN, "sizeof long is wrong"); + +// CHECK-RS32: i64 @test_long(i64 %v) +// CHECK-RS64: i64 @test_long(i64 %v) +// CHECK-ARM: i32 @test_long(i32 %v) +long test_long(long v) { + return v + 1; +} -- 2.40.0