From ced6e32e735a2d728f8d23c9b6c3a6f73277c53f Mon Sep 17 00:00:00 2001 From: Douglas Katzman Date: Mon, 11 May 2015 15:21:44 +0000 Subject: [PATCH] [Sparc] Add support for 'sparcel' to clang. Differential Revision: http://reviews.llvm.org/D8784 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237001 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Basic/Targets.cpp | 24 ++++++++++++++++ lib/Driver/ToolChains.cpp | 1 + lib/Driver/Tools.cpp | 12 +++++++- test/Driver/linux-as.c | 8 ++++++ test/Driver/linux-ld.c | 11 ++++++-- test/Preprocessor/predefined-arch-macros.c | 33 ++++++++++++++++++++++ 6 files changed, 86 insertions(+), 3 deletions(-) diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 44584c4501..9c09942ba1 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -5477,6 +5477,15 @@ public: } }; +// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel. +class SparcV8elTargetInfo : public SparcV8TargetInfo { + public: + SparcV8elTargetInfo(const llvm::Triple &Triple) : SparcV8TargetInfo(Triple) { + DescriptionString = "e-m:e-p:32:32-i64:64-f128:64-n32-S64"; + BigEndian = false; + } +}; + // SPARC v9 is the 64-bit mode selected by Triple::sparcv9. class SparcV9TargetInfo : public SparcTargetInfo { public: @@ -6998,6 +7007,21 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { return new SparcV8TargetInfo(Triple); } + // The 'sparcel' architecture copies all the above cases except for Solaris. + case llvm::Triple::sparcel: + switch (os) { + case llvm::Triple::Linux: + return new LinuxTargetInfo(Triple); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo(Triple); + case llvm::Triple::OpenBSD: + return new OpenBSDTargetInfo(Triple); + case llvm::Triple::RTEMS: + return new RTEMSTargetInfo(Triple); + default: + return new SparcV8elTargetInfo(Triple); + } + case llvm::Triple::sparcv9: switch (os) { case llvm::Triple::Linux: diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index ab129a139f..0d9e212039 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2078,6 +2078,7 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const { getTriple().getArch() == llvm::Triple::ppc64 || getTriple().getArch() == llvm::Triple::ppc64le || getTriple().getArch() == llvm::Triple::sparc || + getTriple().getArch() == llvm::Triple::sparcel || getTriple().getArch() == llvm::Triple::sparcv9 || getTriple().getArch() == llvm::Triple::systemz; } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 0be1fa1e17..e215b6eed5 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1568,6 +1568,7 @@ static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) { } case llvm::Triple::sparc: + case llvm::Triple::sparcel: case llvm::Triple::sparcv9: if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) return A->getValue(); @@ -1946,6 +1947,7 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, getPPCTargetFeatures(Args, Features); break; case llvm::Triple::sparc: + case llvm::Triple::sparcel: case llvm::Triple::sparcv9: getSparcTargetFeatures(Args, Features); break; @@ -2833,6 +2835,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, case llvm::Triple::mips64: case llvm::Triple::mips64el: case llvm::Triple::sparc: + case llvm::Triple::sparcel: case llvm::Triple::x86: case llvm::Triple::x86_64: IsPICLevelTwo = false; // "-fpie" @@ -3269,6 +3272,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, break; case llvm::Triple::sparc: + case llvm::Triple::sparcel: case llvm::Triple::sparcv9: AddSparcTargetArgs(Args, CmdArgs); break; @@ -6580,6 +6584,7 @@ void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, break; case llvm::Triple::sparc: + case llvm::Triple::sparcel: CmdArgs.push_back("-32"); NeedsKPIC = true; break; @@ -6958,6 +6963,7 @@ void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-matpcs"); } } else if (getToolChain().getArch() == llvm::Triple::sparc || + getToolChain().getArch() == llvm::Triple::sparcel || getToolChain().getArch() == llvm::Triple::sparcv9) { if (getToolChain().getArch() == llvm::Triple::sparc) CmdArgs.push_back("-Av8plusa"); @@ -7212,6 +7218,7 @@ void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA, } case llvm::Triple::sparc: + case llvm::Triple::sparcel: CmdArgs.push_back("-32"); addAssemblerKPIC(Args, CmdArgs); break; @@ -7489,6 +7496,7 @@ void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-mlittle-endian"); break; case llvm::Triple::sparc: + case llvm::Triple::sparcel: CmdArgs.push_back("-32"); CmdArgs.push_back("-Av8plusa"); NeedsKPIC = true; @@ -7696,7 +7704,8 @@ static std::string getLinuxDynamicLinker(const ArgList &Args, else return "/system/bin/linker"; } else if (ToolChain.getArch() == llvm::Triple::x86 || - ToolChain.getArch() == llvm::Triple::sparc) + ToolChain.getArch() == llvm::Triple::sparc || + ToolChain.getArch() == llvm::Triple::sparcel) return "/lib/ld-linux.so.2"; else if (ToolChain.getArch() == llvm::Triple::aarch64) return "/lib/ld-linux-aarch64.so.1"; @@ -7798,6 +7807,7 @@ static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) { case llvm::Triple::ppc64le: return "elf64lppc"; case llvm::Triple::sparc: + case llvm::Triple::sparcel: return "elf32_sparc"; case llvm::Triple::sparcv9: return "elf64_sparc"; diff --git a/test/Driver/linux-as.c b/test/Driver/linux-as.c index db76027d0c..8aa323ab5b 100644 --- a/test/Driver/linux-as.c +++ b/test/Driver/linux-as.c @@ -131,6 +131,14 @@ // CHECK-SPARCV8: -Av8plusa // CHECK-SPARCV8: -o // +// RUN: %clang -target sparcel-linux -mcpu=invalid-cpu -### \ +// RUN: -no-integrated-as -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=CHECK-SPARCV8EL %s +// CHECK-SPARCV8EL: as +// CHECK-SPARCV8EL: -32 +// CHECK-SPARCV8EL: -Av8plusa +// CHECK-SPARCV8EL: -o +// // RUN: %clang -target s390x-linux -### -no-integrated-as -c %s 2>&1 \ // RUN: | FileCheck -check-prefix=CHECK-Z-DEFAULT-ARCH %s // CHECK-Z-DEFAULT-ARCH: as{{.*}} "-march=z10" diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 84cec7b95c..38edb7fe4a 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -756,14 +756,21 @@ // CHECK-MIPS64EL-N32-NAN2008-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 \ -// RUN: --target=sparc-linux-gnu \ +// RUN: --target=sparc-unknown-linux-gnu \ // RUN: | FileCheck --check-prefix=CHECK-SPARCV8 %s // CHECK-SPARCV8: "{{.*}}ld{{(.exe)?}}" // CHECK-SPARCV8: "-m" "elf32_sparc" // CHECK-SPARCV8: "-dynamic-linker" "/lib/ld-linux.so.2" // // RUN: %clang %s -### -o %t.o 2>&1 \ -// RUN: --target=sparcv9-linux-gnu \ +// RUN: --target=sparcel-unknown-linux-gnu \ +// RUN: | FileCheck --check-prefix=CHECK-SPARCV8EL %s +// CHECK-SPARCV8EL: "{{.*}}ld{{(.exe)?}}" +// CHECK-SPARCV8EL: "-m" "elf32_sparc" +// CHECK-SPARCV8EL: "-dynamic-linker" "/lib/ld-linux.so.2" +// +// RUN: %clang %s -### -o %t.o 2>&1 \ +// RUN: --target=sparcv9-unknown-linux-gnu \ // RUN: | FileCheck --check-prefix=CHECK-SPARCV9 %s // CHECK-SPARCV9: "{{.*}}ld{{(.exe)?}}" // CHECK-SPARCV9: "-m" "elf64_sparc" diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 9fee3b6294..5116a56489 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -1676,6 +1676,39 @@ // CHECK_PPC_CRYPTO_M64: #define __CRYPTO__ // +// Begin Sparc/GCC/Linux tests ---------------- +// +// RUN: %clang -E -dM %s -o - 2>&1 \ +// RUN: -target sparc-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SPARC +// +// CHECK_SPARC: #define __BIG_ENDIAN__ 1 +// CHECK_SPARC: #define __sparc 1 +// CHECK_SPARC: #define __sparc__ 1 +// CHECK_SPARC: #define __sparcv8 1 + +// +// RUN: %clang -E -dM %s -o - 2>&1 \ +// RUN: -target sparcel-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SPARCEL +// +// CHECK_SPARCEL: #define __LITTLE_ENDIAN__ 1 +// CHECK_SPARCEL: #define __sparc 1 +// CHECK_SPARCEL: #define __sparc__ 1 +// CHECK_SPARCEL: #define __sparcv8 1 +// +// RUN: %clang -E -dM %s -o - 2>&1 \ +// RUN: -target sparcv9-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_SPARCV9 +// +// CHECK_SPARCV9: #define __BIG_ENDIAN__ 1 +// CHECK_SPARCV9: #define __sparc 1 +// CHECK_SPARCV9: #define __sparc64__ 1 +// CHECK_SPARCV9: #define __sparc__ 1 +// CHECK_SPARCV9: #define __sparc_v9__ 1 +// CHECK_SPARCV9: #define __sparcv9 1 +// CHECK_SPARCV9: #define __sparcv9__ 1 + // Begin SystemZ/GCC/Linux tests ---------------- // // RUN: %clang -march=z10 -E -dM %s -o - 2>&1 \ -- 2.40.0