r268483 - [Sparc] Implement __builtin_setjmp, __builtin_longjmp back-end.
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.
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.
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.
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.
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 -
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.
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