From: James Molloy Date: Wed, 16 Apr 2014 15:06:20 +0000 (+0000) Subject: [ARM64] Fix up predefines, including adding big endian support to Targets.cpp X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=039ed6c7d5fc46f9c0e1c796e4d0bb2630d32680;p=clang [ARM64] Fix up predefines, including adding big endian support to Targets.cpp git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206390 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 971567b157..745cc38979 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -4478,6 +4478,7 @@ public: namespace { class ARM64TargetInfo : public TargetInfo { + virtual void setDescriptionString() = 0; static const TargetInfo::GCCRegAlias GCCRegAliases[]; static const char *const GCCRegNames[]; @@ -4488,7 +4489,6 @@ class ARM64TargetInfo : public TargetInfo { public: ARM64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple), ABI("aapcs") { - BigEndian = false; LongWidth = LongAlign = PointerWidth = PointerAlign = 64; IntMaxType = SignedLong; UIntMaxType = UnsignedLong; @@ -4526,7 +4526,7 @@ public: virtual bool setCPU(const std::string &Name) { bool CPUKnown = llvm::StringSwitch(Name) - .Case("arm64-generic", true) + .Case("generic", true) .Case("cyclone", true) .Default(false); return CPUKnown; @@ -4535,23 +4535,11 @@ public: virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { // Target identification. - Builder.defineMacro("__arm64"); - Builder.defineMacro("__arm64__"); Builder.defineMacro("__aarch64__"); - Builder.defineMacro("__ARM64_ARCH_8__"); - Builder.defineMacro("__AARCH64_SIMD__"); - Builder.defineMacro("__ARM_NEON__"); // Target properties. Builder.defineMacro("_LP64"); Builder.defineMacro("__LP64__"); - Builder.defineMacro("__LITTLE_ENDIAN__"); - - // Subtarget options. - Builder.defineMacro("__REGISTER_PREFIX__", ""); - - Builder.defineMacro("__aarch64__"); - Builder.defineMacro("__AARCH64EL__"); // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); @@ -4587,9 +4575,6 @@ public: Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4"); - if (BigEndian) - Builder.defineMacro("__ARM_BIG_ENDIAN"); - // FIXME: the target should support NEON as an optional extension, like // the OSS AArch64. Builder.defineMacro("__ARM_NEON"); @@ -4610,10 +4595,18 @@ public: virtual bool hasFeature(StringRef Feature) const { return llvm::StringSwitch(Feature) .Case("arm64", true) + .Case("aarch64", true) .Case("neon", true) .Default(false); } + bool handleTargetFeatures(std::vector &Features, + DiagnosticsEngine &Diags) override { + setDescriptionString(); + + return true; + } + virtual bool isCLZForZeroUndef() const { return false; } virtual BuiltinVaListKind getBuiltinVaListKind() const { @@ -4741,13 +4734,65 @@ const Builtin::Info ARM64TargetInfo::BuiltinInfo[] = { { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES }, #include "clang/Basic/BuiltinsARM64.def" }; + +class ARM64leTargetInfo : public ARM64TargetInfo { + void setDescriptionString() override { + if (getTriple().isOSBinFormatMachO()) + DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128"; + else + DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128"; + } + +public: + ARM64leTargetInfo(const llvm::Triple &Triple) + : ARM64TargetInfo(Triple) { + BigEndian = false; + } + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override { + Builder.defineMacro("__AARCH64EL__"); + ARM64TargetInfo::getTargetDefines(Opts, Builder); + } +}; + +class ARM64beTargetInfo : public ARM64TargetInfo { + void setDescriptionString() override { + assert(!getTriple().isOSBinFormatMachO()); + DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128"; + } + +public: + ARM64beTargetInfo(const llvm::Triple &Triple) + : ARM64TargetInfo(Triple) { } + void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const override { + Builder.defineMacro("__AARCH64EB__"); + Builder.defineMacro("__AARCH_BIG_ENDIAN"); + Builder.defineMacro("__ARM_BIG_ENDIAN"); + ARM64TargetInfo::getTargetDefines(Opts, Builder); + } +}; } // end anonymous namespace. namespace { -class DarwinARM64TargetInfo : public DarwinTargetInfo { +class DarwinARM64TargetInfo : public DarwinTargetInfo { +protected: + void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, + MacroBuilder &Builder) const override { + Builder.defineMacro("__AARCH64_SIMD__"); + Builder.defineMacro("__ARM64_ARCH_8__"); + Builder.defineMacro("__ARM_NEON__"); + Builder.defineMacro("__LITTLE_ENDIAN__"); + Builder.defineMacro("__REGISTER_PREFIX__", ""); + Builder.defineMacro("__arm64", "1"); + Builder.defineMacro("__arm64__", "1"); + + getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion); + } + public: DarwinARM64TargetInfo(const llvm::Triple &Triple) - : DarwinTargetInfo(Triple) { + : DarwinTargetInfo(Triple) { Int64Type = SignedLongLong; WCharType = SignedInt; UseSignedCharForObjCBool = false; @@ -6089,9 +6134,21 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { switch (os) { case llvm::Triple::Linux: - return new LinuxTargetInfo(Triple); + return new LinuxTargetInfo(Triple); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo(Triple); + default: + return new ARM64leTargetInfo(Triple); + } + + case llvm::Triple::arm64_be: + switch (os) { + case llvm::Triple::Linux: + return new LinuxTargetInfo(Triple); + case llvm::Triple::NetBSD: + return new NetBSDTargetInfo(Triple); default: - return new ARM64TargetInfo(Triple); + return new ARM64beTargetInfo(Triple); } case llvm::Triple::xcore: diff --git a/test/Preprocessor/init.c b/test/Preprocessor/init.c index 8f57d298c3..4fc4bfa47d 100644 --- a/test/Preprocessor/init.c +++ b/test/Preprocessor/init.c @@ -213,6 +213,7 @@ // Other definitions vary from platform to platform // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64-none-none < /dev/null | FileCheck -check-prefix AARCH64 %s +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm64-none-none < /dev/null | FileCheck -check-prefix AARCH64 %s // // AARCH64:#define _LP64 1 // AARCH64-NOT:#define __AARCH64EB__ 1 @@ -315,6 +316,7 @@ // AARCH64:#define __aarch64__ 1 // // RUN: %clang_cc1 -E -dM -ffreestanding -triple=aarch64_be-none-none < /dev/null | FileCheck -check-prefix AARCH64-BE %s +// RUN: %clang_cc1 -E -dM -ffreestanding -triple=arm64_be-none-none < /dev/null | FileCheck -check-prefix AARCH64-BE %s // // AARCH64-BE:#define _LP64 1 // AARCH64-BE:#define __AARCH64EB__ 1