From: Christian Pirker Date: Tue, 25 Feb 2014 13:51:00 +0000 (+0000) Subject: Add AArch64 big endian Target (aarch64_be) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ee2e36b5159ac2a2dfb7dd0adb69537eaabfc2ae;p=clang Add AArch64 big endian Target (aarch64_be) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202151 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index baa3e4940d..074b950ce9 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -2271,8 +2271,10 @@ void CXXNameMangler::mangleAArch64NeonVectorType(const VectorType *T) { void CXXNameMangler::mangleType(const VectorType *T) { if ((T->getVectorKind() == VectorType::NeonVector || T->getVectorKind() == VectorType::NeonPolyVector)) { - if (getASTContext().getTargetInfo().getTriple().getArch() == - llvm::Triple::aarch64) + llvm::Triple::ArchType Arch = + getASTContext().getTargetInfo().getTriple().getArch(); + if ((Arch == llvm::Triple::aarch64) || + (Arch == llvm::Triple::aarch64_be)) mangleAArch64NeonVectorType(T); else mangleNeonVectorType(T); diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 15982cf36f..8d2b54180b 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -3353,6 +3353,7 @@ public: namespace { class AArch64TargetInfo : public TargetInfo { + virtual void setDescriptionString() = 0; static const char * const GCCRegNames[]; static const TargetInfo::GCCRegAlias GCCRegAliases[]; @@ -3370,12 +3371,10 @@ public: IntMaxType = SignedLong; UIntMaxType = UnsignedLong; Int64Type = SignedLong; - BigEndian = false; LongWidth = LongAlign = 64; LongDoubleWidth = LongDoubleAlign = 128; PointerWidth = PointerAlign = 64; SuitableAlign = 128; - DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128"; WCharType = UnsignedInt; if (getTriple().getOS() == llvm::Triple::NetBSD) @@ -3394,7 +3393,6 @@ public: MacroBuilder &Builder) const { // GCC defines theses currently Builder.defineMacro("__aarch64__"); - Builder.defineMacro("__AARCH64EL__"); // ACLE predefines. Many can only have one possible value on v8 AArch64. Builder.defineMacro("__ARM_ACLE", "200"); @@ -3477,6 +3475,9 @@ public: if (Features[i] == "+crypto") Crypto = 1; } + + setDescriptionString(); + return true; } @@ -3599,6 +3600,38 @@ const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = { #include "clang/Basic/BuiltinsAArch64.def" }; +class AArch64leTargetInfo : public AArch64TargetInfo { + virtual void setDescriptionString() { + DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128"; + } + +public: + AArch64leTargetInfo(const llvm::Triple &Triple) + : AArch64TargetInfo(Triple) { + BigEndian = false; + } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__AARCH64EL__"); + AArch64TargetInfo::getTargetDefines(Opts, Builder); + } +}; + +class AArch64beTargetInfo : public AArch64TargetInfo { + virtual void setDescriptionString() { + DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128"; + } + +public: + AArch64beTargetInfo(const llvm::Triple &Triple) + : AArch64TargetInfo(Triple) { } + virtual void getTargetDefines(const LangOptions &Opts, + MacroBuilder &Builder) const { + Builder.defineMacro("__AARCH64EB__"); + AArch64TargetInfo::getTargetDefines(Opts, Builder); + } +}; + } // end anonymous namespace namespace { @@ -5594,11 +5627,21 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { case llvm::Triple::aarch64: 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 AArch64leTargetInfo(Triple); + } + + case llvm::Triple::aarch64_be: + switch (os) { + case llvm::Triple::Linux: + return new LinuxTargetInfo(Triple); case llvm::Triple::NetBSD: - return new NetBSDTargetInfo(Triple); + return new NetBSDTargetInfo(Triple); default: - return new AArch64TargetInfo(Triple); + return new AArch64beTargetInfo(Triple); } case llvm::Triple::arm: diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp index 5dcb15a4a5..c781c922b8 100644 --- a/lib/CodeGen/CGBuiltin.cpp +++ b/lib/CodeGen/CGBuiltin.cpp @@ -1627,6 +1627,7 @@ Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { switch (getTarget().getTriple().getArch()) { case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: return EmitAArch64BuiltinExpr(BuiltinID, E); case llvm::Triple::arm: case llvm::Triple::thumb: diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index e1c586a7d2..b59b046ebe 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -5798,6 +5798,7 @@ const TargetCodeGenInfo &CodeGenModule::getTargetCodeGenInfo() { return *(TheTargetCodeGenInfo = new MIPSTargetCodeGenInfo(Types, false)); case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: return *(TheTargetCodeGenInfo = new AArch64TargetCodeGenInfo(Types)); case llvm::Triple::arm: diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 5f62601e9d..a5c725d313 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1366,6 +1366,7 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { switch (TargetTriple.getArch()) { case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: LibDirs.append(AArch64LibDirs, AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs)); TripleAliases.append(AArch64Triples, @@ -2032,6 +2033,7 @@ bool Generic_GCC::IsIntegratedAssemblerDefault() const { return getTriple().getArch() == llvm::Triple::x86 || getTriple().getArch() == llvm::Triple::x86_64 || getTriple().getArch() == llvm::Triple::aarch64 || + getTriple().getArch() == llvm::Triple::aarch64_be || getTriple().getArch() == llvm::Triple::arm || getTriple().getArch() == llvm::Triple::thumb; } @@ -2041,6 +2043,7 @@ void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs, const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion(); bool UseInitArrayDefault = getTriple().getArch() == llvm::Triple::aarch64 || + getTriple().getArch() == llvm::Triple::aarch64_be || (getTriple().getOS() == llvm::Triple::Linux && ( !V.isOlderThan(4, 7, 0) || getTriple().getEnvironment() == llvm::Triple::Android)); @@ -2770,6 +2773,7 @@ static std::string getMultiarchTriple(const llvm::Triple TargetTriple, return "x86_64-linux-gnu"; return TargetTriple.str(); case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu")) return "aarch64-linux-gnu"; return TargetTriple.str(); @@ -3141,7 +3145,8 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, MultiarchIncludeDirs = X86_64MultiarchIncludeDirs; } else if (getTriple().getArch() == llvm::Triple::x86) { MultiarchIncludeDirs = X86MultiarchIncludeDirs; - } else if (getTriple().getArch() == llvm::Triple::aarch64) { + } else if ((getTriple().getArch() == llvm::Triple::aarch64) || + (getTriple().getArch() == llvm::Triple::aarch64_be)) { MultiarchIncludeDirs = AArch64MultiarchIncludeDirs; } else if (getTriple().getArch() == llvm::Triple::arm) { if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF) diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 7934105bfc..f2f82a1cf7 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -467,6 +467,7 @@ static bool isSignedCharDefault(const llvm::Triple &Triple) { return true; case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: case llvm::Triple::arm: case llvm::Triple::ppc: case llvm::Triple::ppc64: @@ -1262,6 +1263,7 @@ static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) { return ""; case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: return getAArch64TargetCPU(Args, T); case llvm::Triple::arm: @@ -1486,6 +1488,7 @@ static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple, getSparcTargetFeatures(Args, Features); break; case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: getAArch64TargetFeatures(D, Args, Features); break; case llvm::Triple::x86: diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp index 19e0832311..c978a1e5b1 100644 --- a/lib/Sema/SemaChecking.cpp +++ b/lib/Sema/SemaChecking.cpp @@ -307,6 +307,7 @@ Sema::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return ExprError(); break; case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: if (CheckAArch64BuiltinFunctionCall(BuiltinID, TheCall)) return ExprError(); break; diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index e3e5225f02..99493aeb16 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -4790,7 +4790,8 @@ static void HandleNeonVectorTypeAttr(QualType& CurType, llvm::Triple::ArchType Arch = S.Context.getTargetInfo().getTriple().getArch(); if (!isPermittedNeonBaseType(CurType, VecKind, - Arch == llvm::Triple::aarch64)) { + (Arch == llvm::Triple::aarch64) || + (Arch == llvm::Triple::aarch64_be))) { S.Diag(Attr.getLoc(), diag::err_attribute_invalid_vector_type) << CurType; Attr.setInvalid(); return;