diff options
author | Christian Pirker <cpirker@a-bix.com> | 2014-02-25 13:51:00 +0000 |
---|---|---|
committer | Christian Pirker <cpirker@a-bix.com> | 2014-02-25 13:51:00 +0000 |
commit | 9b019ae8992f6cf05a1af22f9e3b091c180df80d (patch) | |
tree | 1b955008e4753a314d2e4097f1b5c0dad211ae44 /clang/lib/Basic/Targets.cpp | |
parent | e65ceb9f16f87c97a4c0d30ff66e9ae0bb5335e7 (diff) | |
download | bcm5719-llvm-9b019ae8992f6cf05a1af22f9e3b091c180df80d.tar.gz bcm5719-llvm-9b019ae8992f6cf05a1af22f9e3b091c180df80d.zip |
Add AArch64 big endian Target (aarch64_be)
llvm-svn: 202151
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
-rw-r--r-- | clang/lib/Basic/Targets.cpp | 55 |
1 files changed, 49 insertions, 6 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 15982cf36f6..8d2b54180b8 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/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<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: |