From 5f15f4daf0e225ea8463fe2ef522c009c95ffc9c Mon Sep 17 00:00:00 2001 From: Robert Lytton Date: Tue, 13 Aug 2013 09:43:10 +0000 Subject: [PATCH] Add XCore target git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188258 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/BuiltinsXCore.def | 22 ++++++ include/clang/Basic/TargetBuiltins.h | 10 +++ lib/Basic/Targets.cpp | 61 +++++++++++++++ lib/CodeGen/TargetInfo.cpp | 19 +++++ lib/Driver/Tools.cpp | 19 ++++- test/CodeGen/xcore-abi.c | 35 +++++++++ test/Driver/xcore-opts.c | 15 ++++ test/Preprocessor/init.c | 3 + test/Preprocessor/stdint.c | 108 ++++++++++++++++++++++++++ 9 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 include/clang/Basic/BuiltinsXCore.def create mode 100644 test/CodeGen/xcore-abi.c create mode 100644 test/Driver/xcore-opts.c diff --git a/include/clang/Basic/BuiltinsXCore.def b/include/clang/Basic/BuiltinsXCore.def new file mode 100644 index 0000000000..672d20578a --- /dev/null +++ b/include/clang/Basic/BuiltinsXCore.def @@ -0,0 +1,22 @@ +//===--- BuiltinsXCore.def - XCore Builtin function database ----*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the XCore-specific builtin function database. Users of +// this file must define the BUILTIN macro to make use of this information. +// +//===----------------------------------------------------------------------===// + +// The format of this database matches clang/Basic/Builtins.def. + +BUILTIN(__builtin_bitrev, "UiUi", "nc") +BUILTIN(__builtin_getid, "Si", "nc") +BUILTIN(__builtin_getps, "UiUi", "n") +BUILTIN(__builtin_setps, "vUiUi", "n") + +#undef BUILTIN diff --git a/include/clang/Basic/TargetBuiltins.h b/include/clang/Basic/TargetBuiltins.h index 4202a4a502..d07f8f7cd3 100644 --- a/include/clang/Basic/TargetBuiltins.h +++ b/include/clang/Basic/TargetBuiltins.h @@ -131,6 +131,16 @@ namespace clang { LastTSBuiltin }; } + + /// \brief XCore builtins + namespace XCore { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin-1, +#define BUILTIN(ID, TYPE, ATTRS) BI##ID, +#include "clang/Basic/BuiltinsXCore.def" + LastTSBuiltin + }; + } } // end namespace clang. #endif diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 4537717da0..f3822edcd5 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -5138,6 +5138,64 @@ namespace { }; } +namespace { +class XCoreTargetInfo : public TargetInfo { + static const Builtin::Info BuiltinInfo[]; +public: + XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { + BigEndian = false; + NoAsmVariants = true; + LongLongAlign = 32; + SuitableAlign = 32; + DoubleAlign = LongDoubleAlign = 32; + UseZeroLengthBitfieldAlignment = true; + DescriptionString = "e-p:32:32:32-a0:0:32-n32" + "-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32" + "-f16:16:32-f32:32:32-f64:32:32"; + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__XS1B__"); + } + virtual void getTargetBuiltins(const Builtin::Info *&Records, + unsigned &NumRecords) const { + Records = BuiltinInfo; + NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin; + } + virtual BuiltinVaListKind getBuiltinVaListKind() const { + return TargetInfo::VoidPtrBuiltinVaList; + } + virtual const char *getClobbers() const { + return ""; + } + virtual void getGCCRegNames(const char * const *&Names, + unsigned &NumNames) const { + static const char * const GCCRegNames[] = { + "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", + "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr" + }; + Names = GCCRegNames; + NumNames = llvm::array_lengthof(GCCRegNames); + } + virtual void getGCCRegAliases(const GCCRegAlias *&Aliases, + unsigned &NumAliases) const { + Aliases = NULL; + NumAliases = 0; + } + virtual bool validateAsmConstraint(const char *&Name, + TargetInfo::ConstraintInfo &Info) const { + return false; + } +}; + +const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, +#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\ + ALL_LANGUAGES }, +#include "clang/Basic/BuiltinsXCore.def" +}; +} // end anonymous namespace. + //===----------------------------------------------------------------------===// // Driver code @@ -5150,6 +5208,9 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { default: return NULL; + case llvm::Triple::xcore: + return new XCoreTargetInfo(Triple); + case llvm::Triple::hexagon: return new HexagonTargetInfo(Triple); diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 3e7f7fedba..bab77e6a45 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -5366,6 +5366,22 @@ public: } // end anonymous namespace +//===----------------------------------------------------------------------===// +// Xcore ABI Implementation +//===----------------------------------------------------------------------===// +namespace { +class XcoreTargetCodeGenInfo : public TargetCodeGenInfo { +public: + XcoreTargetCodeGenInfo(CodeGenTypes &CGT) + :TargetCodeGenInfo(new DefaultABIInfo(CGT)) {} +}; +} // end anonymous namespace + + +//===----------------------------------------------------------------------===// +// Driver code +//===----------------------------------------------------------------------===// + const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { if (TheTargetCodeGenInfo) return *TheTargetCodeGenInfo; @@ -5474,5 +5490,8 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { return *(TheTargetCodeGenInfo = new HexagonTargetCodeGenInfo(Types)); case llvm::Triple::sparcv9: return *(TheTargetCodeGenInfo = new SparcV9TargetCodeGenInfo(Types)); + case llvm::Triple::xcore: + return *(TheTargetCodeGenInfo = new XcoreTargetCodeGenInfo(Types)); + } } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index ee75635f45..13d36b0312 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -552,10 +552,21 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) { case llvm::Triple::ppc64le: case llvm::Triple::systemz: + case llvm::Triple::xcore: return false; } } +static bool isNoCommonDefault(const llvm::Triple &Triple) { + switch (Triple.getArch()) { + default: + return false; + + case llvm::Triple::xcore: + return true; + } +} + // Handle -mfpu=. // // FIXME: Centralize feature selection, defaulting shouldn't be also in the @@ -1761,6 +1772,9 @@ static bool shouldUseFramePointer(const ArgList &Args, return false; } + if (Triple.getArch() == llvm::Triple::xcore) + return false; + return true; } @@ -1780,6 +1794,9 @@ static bool shouldUseLeafFramePointer(const ArgList &Args, return false; } + if (Triple.getArch() == llvm::Triple::xcore) + return false; + return true; } @@ -3200,7 +3217,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fpack-struct=1"); } - if (KernelOrKext) { + if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) { if (!Args.hasArg(options::OPT_fcommon)) CmdArgs.push_back("-fno-common"); Args.ClaimAllArgs(options::OPT_fno_common); diff --git a/test/CodeGen/xcore-abi.c b/test/CodeGen/xcore-abi.c new file mode 100644 index 0000000000..fcdefebe23 --- /dev/null +++ b/test/CodeGen/xcore-abi.c @@ -0,0 +1,35 @@ +// RUN: %clang -target xcore -O1 -o - -emit-llvm -S %s | FileCheck %s + +// CHECK: target datalayout = "e-p:32:32:32-a0:0:32-n32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f16:16:32-f32:32:32-f64:32:32" +// CHECK: target triple = "xcore" + +#include +struct x { int a; }; +void testva (int n, ...) { + va_list ap; + // CHECK: %ap = alloca i8*, align 4 + + char* v1 = va_arg (ap, char*); + // CHECK: %0 = va_arg i8** %ap, i8* + + int v2 = va_arg (ap, int); + // CHECK: %1 = va_arg i8** %ap, i32 + + long long int v3 = va_arg (ap, long long int); + // CHECK: %2 = va_arg i8** %ap, i64 + + //struct x t = va_arg (ap, struct x); + //cannot compile aggregate va_arg expressions yet +} + +void testbuiltin (void) { +// CHECK: %0 = tail call i32 @llvm.xcore.getid() +// CHECK: %1 = tail call i32 @llvm.xcore.getps(i32 %0) +// CHECK: %2 = tail call i32 @llvm.xcore.bitrev(i32 %1) +// CHECK: tail call void @llvm.xcore.setps(i32 %0, i32 %2) + int i = __builtin_getid(); + unsigned int ui = __builtin_getps(i); + ui = __builtin_bitrev(ui); + __builtin_setps(i,ui); + +} diff --git a/test/Driver/xcore-opts.c b/test/Driver/xcore-opts.c new file mode 100644 index 0000000000..137e28f3a6 --- /dev/null +++ b/test/Driver/xcore-opts.c @@ -0,0 +1,15 @@ +// RUN: %clang -target xcore -O1 -o - -emit-llvm -S %s | FileCheck %s + +// CHECK: @g1 = global +int g1; +// CHECK: @g2 = common global i32 0, align 4 +int g2 __attribute__((common)); + +// CHECK: define zeroext i8 @testchar() +// CHECK: ret i8 -1 +char testchar (void) { + return (char)-1; +} + +// CHECK: "no-frame-pointer-elim"="false" +// CHECK: "no-frame-pointer-elim-non-leaf"="false" diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index f25f3cdd92..d1f256a1ac 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -2946,3 +2946,6 @@ // ANDROID: __ANDROID__ 1 // RUN: %clang_cc1 -E -dM -ffreestanding -triple=powerpc64-unknown-freebsd < /dev/null | FileCheck -check-prefix PPC64-FREEBSD %s // PPC64-FREEBSD-NOT: #define __LONG_DOUBLE_128__ 1 +// +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=xcore-none-none < /dev/null | FileCheck -check-prefix XCORE %s +// XCORE:#define __XS1B__ 1 diff --git a/test/Preprocessor/stdint.c b/test/Preprocessor/stdint.c index cf6f341b35..971aea45ec 100644 --- a/test/Preprocessor/stdint.c +++ b/test/Preprocessor/stdint.c @@ -963,6 +963,114 @@ // I386_MINGW32:WCHAR_MIN_ 0U // // +// RUN: %clang_cc1 -E -ffreestanding -triple=xcore-none-none %s | FileCheck -check-prefix XCORE %s +// +// XCORE:typedef signed long long int int64_t; +// XCORE:typedef unsigned long long int uint64_t; +// XCORE:typedef int64_t int_least64_t; +// XCORE:typedef uint64_t uint_least64_t; +// XCORE:typedef int64_t int_fast64_t; +// XCORE:typedef uint64_t uint_fast64_t; +// +// XCORE:typedef signed int int32_t; +// XCORE:typedef unsigned int uint32_t; +// XCORE:typedef int32_t int_least32_t; +// XCORE:typedef uint32_t uint_least32_t; +// XCORE:typedef int32_t int_fast32_t; +// XCORE:typedef uint32_t uint_fast32_t; +// +// XCORE:typedef signed short int16_t; +// XCORE:typedef unsigned short uint16_t; +// XCORE:typedef int16_t int_least16_t; +// XCORE:typedef uint16_t uint_least16_t; +// XCORE:typedef int16_t int_fast16_t; +// XCORE:typedef uint16_t uint_fast16_t; +// +// XCORE:typedef signed char int8_t; +// XCORE:typedef unsigned char uint8_t; +// XCORE:typedef int8_t int_least8_t; +// XCORE:typedef uint8_t uint_least8_t; +// XCORE:typedef int8_t int_fast8_t; +// XCORE:typedef uint8_t uint_fast8_t; +// +// XCORE:typedef int32_t intptr_t; +// XCORE:typedef uint32_t uintptr_t; +// +// XCORE:typedef long long int intmax_t; +// XCORE:typedef long long unsigned int uintmax_t; +// +// XCORE:INT8_MAX_ 127 +// XCORE:INT8_MIN_ (-127 -1) +// XCORE:UINT8_MAX_ 255 +// XCORE:INT_LEAST8_MIN_ (-127 -1) +// XCORE:INT_LEAST8_MAX_ 127 +// XCORE:UINT_LEAST8_MAX_ 255 +// XCORE:INT_FAST8_MIN_ (-127 -1) +// XCORE:INT_FAST8_MAX_ 127 +// XCORE:UINT_FAST8_MAX_ 255 +// +// XCORE:INT16_MAX_ 32767 +// XCORE:INT16_MIN_ (-32767 -1) +// XCORE:UINT16_MAX_ 65535 +// XCORE:INT_LEAST16_MIN_ (-32767 -1) +// XCORE:INT_LEAST16_MAX_ 32767 +// XCORE:UINT_LEAST16_MAX_ 65535 +// XCORE:INT_FAST16_MIN_ (-32767 -1) +// XCORE:INT_FAST16_MAX_ 32767 +// XCORE:UINT_FAST16_MAX_ 65535 +// +// XCORE:INT32_MAX_ 2147483647 +// XCORE:INT32_MIN_ (-2147483647 -1) +// XCORE:UINT32_MAX_ 4294967295U +// XCORE:INT_LEAST32_MIN_ (-2147483647 -1) +// XCORE:INT_LEAST32_MAX_ 2147483647 +// XCORE:UINT_LEAST32_MAX_ 4294967295U +// XCORE:INT_FAST32_MIN_ (-2147483647 -1) +// XCORE:INT_FAST32_MAX_ 2147483647 +// XCORE:UINT_FAST32_MAX_ 4294967295U +// +// XCORE:INT64_MAX_ 9223372036854775807LL +// XCORE:INT64_MIN_ (-9223372036854775807LL -1) +// XCORE:UINT64_MAX_ 18446744073709551615ULL +// XCORE:INT_LEAST64_MIN_ (-9223372036854775807LL -1) +// XCORE:INT_LEAST64_MAX_ 9223372036854775807LL +// XCORE:UINT_LEAST64_MAX_ 18446744073709551615ULL +// XCORE:INT_FAST64_MIN_ (-9223372036854775807LL -1) +// XCORE:INT_FAST64_MAX_ 9223372036854775807LL +// XCORE:UINT_FAST64_MAX_ 18446744073709551615ULL +// +// XCORE:INTPTR_MIN_ (-2147483647 -1) +// XCORE:INTPTR_MAX_ 2147483647 +// XCORE:UINTPTR_MAX_ 4294967295U +// XCORE:PTRDIFF_MIN_ (-2147483647 -1) +// XCORE:PTRDIFF_MAX_ 2147483647 +// XCORE:SIZE_MAX_ 4294967295U +// +// XCORE:INTMAX_MIN_ (-9223372036854775807LL -1) +// XCORE:INTMAX_MAX_ 9223372036854775807LL +// XCORE:UINTMAX_MAX_ 18446744073709551615ULL +// +// XCORE:SIG_ATOMIC_MIN_ (-2147483647 -1) +// XCORE:SIG_ATOMIC_MAX_ 2147483647 +// XCORE:WINT_MIN_ (-2147483647 -1) +// XCORE:WINT_MAX_ 2147483647 +// +// XCORE:WCHAR_MAX_ 2147483647 +// XCORE:WCHAR_MIN_ (-2147483647 -1) +// +// XCORE:INT8_C_(0) 0 +// XCORE:UINT8_C_(0) 0U +// XCORE:INT16_C_(0) 0 +// XCORE:UINT16_C_(0) 0U +// XCORE:INT32_C_(0) 0 +// XCORE:UINT32_C_(0) 0U +// XCORE:INT64_C_(0) 0LL +// XCORE:UINT64_C_(0) 0ULL +// +// XCORE:INTMAX_C_(0) 0LL +// XCORE:UINTMAX_C_(0) 0ULL +// +// // stdint.h forms several macro definitions by pasting together identifiers // to form names (eg. int32_t is formed from int ## 32 ## _t). The following // case tests that these joining operations are performed correctly even if -- 2.40.0