r268483 - [Sparc] Implement __builtin_setjmp, __builtin_longjmp back-end.

2016-05-04 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Wed May  4 04:33:30 2016
New Revision: 268483

URL: http://llvm.org/viewvc/llvm-project?rev=268483&view=rev
Log:
[Sparc] Implement __builtin_setjmp, __builtin_longjmp back-end.

This code implements builtin_setjmp and builtin_longjmp exception handling 
intrinsics for 32-bit Sparc back-ends.

The code started as a mash-up of the PowerPC and X86 versions, although there 
are sufficient differences to both that had to be made for Sparc handling.

Note: I have manual tests running. I'll work on a unit test and add that to the 
rest of this diff in the next day.

Also, this implementation is only for 32-bit Sparc. I haven't focussed on a 
64-bit version, although I have left the code in a prepared state for 
implementing this, including detecting pointer size and comments indicating 
where I suspect there may be differences.

Differential Revision: http://reviews.llvm.org/D19798

Modified:
cfe/trunk/lib/Basic/Targets.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=268483&r1=268482&r2=268483&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Wed May  4 04:33:30 2016
@@ -6447,6 +6447,10 @@ public:
   }
 }
   }
+
+  bool hasSjLjLowering() const override {
+return true;
+  }
 };
 
 // SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r272148 - [Sparc] Complex return value ABI compliance.

2016-06-08 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Wed Jun  8 09:46:05 2016
New Revision: 272148

URL: http://llvm.org/viewvc/llvm-project?rev=272148&view=rev
Log:
[Sparc] Complex return value ABI compliance.

According to the Sparc V8 ABI, complex numbers should be passed and returned as 
pairs of registers:

https://docs.oracle.com/cd/E26502_01/html/E28387/gentextid-2734.html

This fix ensures this is the case. Without this, complex numbers are returned 
as a struct of two floats, which breaks the ABI rules.

Differential Review: http://reviews.llvm.org/D20955

Added:
cfe/trunk/test/CodeGen/sparcv8-abi.c   (with props)

Added: cfe/trunk/test/CodeGen/sparcv8-abi.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/sparcv8-abi.c?rev=272148&view=auto
==
--- cfe/trunk/test/CodeGen/sparcv8-abi.c (added)
+++ cfe/trunk/test/CodeGen/sparcv8-abi.c Wed Jun  8 09:46:05 2016
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 -triple sparc-unknown-unknown -emit-llvm %s -o - | 
FileCheck %s
+
+// CHECK-LABEL: define { float, float } @p({ float, float }* byval align 4 %a, 
{ float, float }* byval align 4 %b) #0 {
+float __complex__
+p (float __complex__  a, float __complex__  b)
+{
+}
+
+// CHECK-LABEL: define { double, double } @q({ double, double }* byval align 8 
%a, { double, double }* byval align 8 %b) #0 {
+double __complex__
+q (double __complex__  a, double __complex__  b)
+{
+}
+
+// CHECK-LABEL: define { i64, i64 } @r({ i64, i64 }* byval align 8 %a, { i64, 
i64 }* byval align 8 %b) #0 {
+long long __complex__
+r (long long __complex__  a, long long __complex__  b)
+{
+}

Propchange: cfe/trunk/test/CodeGen/sparcv8-abi.c
--
svn:eol-style = native


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r272149 - [Sparc] Complex return value ABI compliance.

2016-06-08 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Wed Jun  8 09:47:25 2016
New Revision: 272149

URL: http://llvm.org/viewvc/llvm-project?rev=272149&view=rev
Log:
[Sparc] Complex return value ABI compliance.

According to the Sparc V8 ABI, complex numbers should be passed and returned as 
pairs of registers:

https://docs.oracle.com/cd/E26502_01/html/E28387/gentextid-2734.html

This fix ensures this is the case. Without this, complex numbers are returned 
as a struct of two floats, which breaks the ABI rules.

Differential Review: http://reviews.llvm.org/D20955

Modified:
cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=272149&r1=272148&r2=272149&view=diff
==
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Jun  8 09:47:25 2016
@@ -6843,6 +6843,49 @@ void AMDGPUTargetCodeGenInfo::setTargetA
 
 
 
//===--===//
+// SPARC v8 ABI Implementation.
+// Based on the SPARC Compliance Definition version 2.4.1.
+//
+// Ensures that complex values are passed in registers.
+//
+namespace {
+class SparcV8ABIInfo : public DefaultABIInfo {
+public:
+  SparcV8ABIInfo(CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
+
+private:
+  ABIArgInfo classifyReturnType(QualType RetTy) const;
+  void computeInfo(CGFunctionInfo &FI) const override;
+};
+} // end anonymous namespace
+
+
+ABIArgInfo
+SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
+  if (Ty->isAnyComplexType()) {
+return ABIArgInfo::getDirect();
+  }
+  else {
+return DefaultABIInfo::classifyReturnType(Ty);
+  }
+}
+
+void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
+
+  FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
+  for (auto &Arg : FI.arguments())
+Arg.info = classifyArgumentType(Arg.type);
+}
+
+namespace {
+class SparcV8TargetCodeGenInfo : public TargetCodeGenInfo {
+public:
+  SparcV8TargetCodeGenInfo(CodeGenTypes &CGT)
+: TargetCodeGenInfo(new SparcV8ABIInfo(CGT)) {}
+};
+} // end anonymous namespace
+
+//===--===//
 // SPARC v9 ABI Implementation.
 // Based on the SPARC Compliance Definition version 2.4.1.
 //
@@ -7965,6 +8008,8 @@ const TargetCodeGenInfo &CodeGenModule::
 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
   case llvm::Triple::amdgcn:
 return SetCGInfo(new AMDGPUTargetCodeGenInfo(Types));
+  case llvm::Triple::sparc:
+return SetCGInfo(new SparcV8TargetCodeGenInfo(Types));
   case llvm::Triple::sparcv9:
 return SetCGInfo(new SparcV9TargetCodeGenInfo(Types));
   case llvm::Triple::xcore:


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r272782 - [Sparc] Change to let clang know that setjmp and longjmp intrinsics are implemented in the back-end.

2016-06-15 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Wed Jun 15 07:44:47 2016
New Revision: 272782

URL: http://llvm.org/viewvc/llvm-project?rev=272782&view=rev
Log:
[Sparc] Change to let clang know that setjmp and longjmp intrinsics are 
implemented in the back-end.

Differential Revision: http://reviews.llvm.org/D19798

Modified:
cfe/trunk/lib/Basic/Targets.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=272782&r1=272781&r2=272782&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Wed Jun 15 07:44:47 2016
@@ -6395,6 +6395,10 @@ public:
  .Default(false);
   }
 
+  bool hasSjLjLowering() const override {
+return true;
+  }
+
   ArrayRef getTargetBuiltins() const override {
 // FIXME: Implement!
 return None;
@@ -6562,6 +6566,7 @@ public:
   SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
   : SparcTargetInfo(Triple, Opts) {
 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses 
int.
 switch (getTriple().getOS()) {
 default:


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r272798 - [Sparc] setjmp and longjmp intrinsic support update to add unit tests and remove accidentally checked-in code.

2016-06-15 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Wed Jun 15 11:08:13 2016
New Revision: 272798

URL: http://llvm.org/viewvc/llvm-project?rev=272798&view=rev
Log:
[Sparc] setjmp and longjmp intrinsic support update to add unit tests and 
remove accidentally checked-in code.

Related to revision r272782

Modified:
cfe/trunk/lib/Basic/Targets.cpp
cfe/trunk/test/Sema/builtin-longjmp.c

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=272798&r1=272797&r2=272798&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Wed Jun 15 11:08:13 2016
@@ -6566,7 +6566,6 @@ public:
   SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
   : SparcTargetInfo(Triple, Opts) {
 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
-MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses 
int.
 switch (getTriple().getOS()) {
 default:

Modified: cfe/trunk/test/Sema/builtin-longjmp.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/builtin-longjmp.c?rev=272798&r1=272797&r2=272798&view=diff
==
--- cfe/trunk/test/Sema/builtin-longjmp.c (original)
+++ cfe/trunk/test/Sema/builtin-longjmp.c Wed Jun 15 11:08:13 2016
@@ -3,6 +3,7 @@
 // RUN: %clang_cc1 -triple x86_64-windows -emit-llvm < %s| FileCheck %s
 // RUN: %clang_cc1 -triple powerpc-unknown-unknown -emit-llvm < %s| FileCheck 
%s
 // RUN: %clang_cc1 -triple powerpc64-unknown-unknown -emit-llvm < %s| 
FileCheck %s
+// RUN: %clang_cc1 -triple sparc-eabi-unknown -emit-llvm < %s | FileCheck %s
 
 // RUN: %clang_cc1 -triple aarch64-unknown-unknown -emit-llvm-only -verify %s
 // RUN: %clang_cc1 -triple mips-unknown-unknown -emit-llvm-only -verify %s


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r273950 -

2016-06-27 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Mon Jun 27 17:11:12 2016
New Revision: 273950

URL: http://llvm.org/viewvc/llvm-project?rev=273950&view=rev
Log: (empty)

Modified:
cfe/trunk/lib/Basic/Targets.cpp

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=273950&r1=273949&r2=273950&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Mon Jun 27 17:11:12 2016
@@ -6594,6 +6594,8 @@ public:
   PtrDiffType = SignedLong;
   break;
 }
+
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
   }
 
   void getTargetDefines(const LangOptions &Opts,


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r274012 - [SPARC] Allows inlining of atomics for Sparc32 with appropriate store barrier.

2016-06-28 Thread Chris Dewhurst via cfe-commits
Author: lerochris
Date: Tue Jun 28 07:55:55 2016
New Revision: 274012

URL: http://llvm.org/viewvc/llvm-project?rev=274012&view=rev
Log:
[SPARC] Allows inlining of atomics for Sparc32 with appropriate store barrier.

The final change is required to extend the back-end's AtomicExpandPass that was 
implemented for Sparc (64 bit) and later extended for Sparc (32 bit).

Modified:
cfe/trunk/lib/Basic/Targets.cpp
cfe/trunk/test/CodeGen/atomics-inlining.c

Modified: cfe/trunk/lib/Basic/Targets.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=274012&r1=274011&r2=274012&view=diff
==
--- cfe/trunk/lib/Basic/Targets.cpp (original)
+++ cfe/trunk/lib/Basic/Targets.cpp Tue Jun 28 07:55:55 2016
@@ -6601,6 +6601,7 @@ public:
   PtrDiffType = SignedLong;
   break;
 }
+MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
   }
 
   void getTargetDefines(const LangOptions &Opts,

Modified: cfe/trunk/test/CodeGen/atomics-inlining.c
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomics-inlining.c?rev=274012&r1=274011&r2=274012&view=diff
==
--- cfe/trunk/test/CodeGen/atomics-inlining.c (original)
+++ cfe/trunk/test/CodeGen/atomics-inlining.c Tue Jun 28 07:55:55 2016
@@ -3,6 +3,7 @@
 // RUN: %clang_cc1 -triple powerpc64-linux-gnu -emit-llvm %s -o - | FileCheck 
%s -check-prefix=PPC64
 // RUN: %clang_cc1 -triple mipsel-linux-gnu -emit-llvm %s -o - | FileCheck %s 
-check-prefix=MIPS32
 // RUN: %clang_cc1 -triple mips64el-linux-gnu -emit-llvm %s -o - | FileCheck 
%s -check-prefix=MIPS64
+// RUN: %clang_cc1 -triple sparc-unknown-eabi -emit-llvm %s -o - | FileCheck 
%s -check-prefix=SPARC
 
 unsigned char c1, c2;
 unsigned short s1, s2;
@@ -90,4 +91,16 @@ void test1(void) {
 // MIPS64: store atomic i64 {{.*}}, i64* @ll1 seq_cst
 // MIPS64: call void @__atomic_load(i64 zeroext 100, i8* getelementptr 
inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0)
 // MIPS64: call void @__atomic_store(i64 zeroext 100, i8* getelementptr 
inbounds ([100 x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr 
inbounds ([100 x i8], [100 x i8]* @a2, i32 0, i32 0)
+
+// SPARC-LABEL: define void @test1
+// SPARC: = load atomic i8, i8* @c1 seq_cst
+// SPARC: store atomic i8 {{.*}}, i8* @c1 seq_cst
+// SPARC: = load atomic i16, i16* @s1 seq_cst
+// SPARC: store atomic i16 {{.*}}, i16* @s1 seq_cst
+// SPARC: = load atomic i32, i32* @i1 seq_cst
+// SPARC: store atomic i32 {{.*}}, i32* @i1 seq_cst
+// SPARC: = load atomic i64, i64* @ll1 seq_cst
+// SPARC: store atomic i64 {{.*}}, i64* @ll1 seq_cst
+// SPARC: call void @__atomic_load(i32 100, i8* getelementptr inbounds ([100 x 
i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], 
[100 x i8]* @a2, i32 0, i32 0)
+// SPARC: call void @__atomic_store(i32 100, i8* getelementptr inbounds ([100 
x i8], [100 x i8]* @a1, i32 0, i32 0), i8* getelementptr inbounds ([100 x i8], 
[100 x i8]* @a2, i32 0, i32 0)
 }


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits