]> granicus.if.org Git - clang/commitdiff
Add AArch64 big endian Target (aarch64_be)
authorChristian Pirker <cpirker@a-bix.com>
Tue, 25 Feb 2014 13:51:00 +0000 (13:51 +0000)
committerChristian Pirker <cpirker@a-bix.com>
Tue, 25 Feb 2014 13:51:00 +0000 (13:51 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202151 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ItaniumMangle.cpp
lib/Basic/Targets.cpp
lib/CodeGen/CGBuiltin.cpp
lib/CodeGen/TargetInfo.cpp
lib/Driver/ToolChains.cpp
lib/Driver/Tools.cpp
lib/Sema/SemaChecking.cpp
lib/Sema/SemaType.cpp

index baa3e4940d37579a447e3b726b0f4e1f29b14898..074b950ce9e82a862c2f947d51da4efde099e4bd 100644 (file)
@@ -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);
index 15982cf36f6c034e49ee0214f3ee649f1796ec65..8d2b54180b8daf9a67d7149557b73bd4726b44f1 100644 (file)
@@ -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<AArch64TargetInfo>(Triple);
+      return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
+    case llvm::Triple::NetBSD:
+      return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
+    default:
+      return new AArch64leTargetInfo(Triple);
+    }
+
+  case llvm::Triple::aarch64_be:
+    switch (os) {
+    case llvm::Triple::Linux:
+      return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
     case llvm::Triple::NetBSD:
-      return new NetBSDTargetInfo<AArch64TargetInfo>(Triple);
+      return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
     default:
-      return new AArch64TargetInfo(Triple);
+      return new AArch64beTargetInfo(Triple);
     }
 
   case llvm::Triple::arm:
index 5dcb15a4a55ff5fe1b2de7632b7461f7e8eb5d60..c781c922b82f2d11f701d8e8df95608fcc015f26 100644 (file)
@@ -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:
index e1c586a7d287be33d99d6623f11612a795c8bf1d..b59b046ebe8fa73e41b6b000ea72ddf088c96e94 100644 (file)
@@ -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:
index 5f62601e9dafa682765511b7c3e9f8b0deb62f1e..a5c725d313cf1d5870258dee26222542e8e5aec4 100644 (file)
@@ -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)
index 7934105bfc95b6c08f37be443c80f6046c63eece..f2f82a1cf7fc17443efc57240951dd98f9ae407b 100644 (file)
@@ -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:
index 19e083231158c85d7324fa6a3ac6afe87126826d..c978a1e5b11705953b9e70b662ccab2ee6a36d57 100644 (file)
@@ -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;
index e3e5225f022a1d26d29ff09dc4126390a9e79de2..99493aeb16700f38fb0200d89a16eeb4bf71f7ad 100644 (file)
@@ -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;