diff options
| author | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2013-07-26 01:36:11 +0000 |
|---|---|---|
| committer | Bill Schmidt <wschmidt@linux.vnet.ibm.com> | 2013-07-26 01:36:11 +0000 |
| commit | 778d387684c4cbc22b1f74587b17a34c7cbae307 (patch) | |
| tree | b01f834812dac1b0d2d06db0abed0dfac4c552a9 /clang/lib/Basic/Targets.cpp | |
| parent | 0a9170d931629a1a8d5aced1ff9c0a46976c62dc (diff) | |
| download | bcm5719-llvm-778d387684c4cbc22b1f74587b17a34c7cbae307.tar.gz bcm5719-llvm-778d387684c4cbc22b1f74587b17a34c7cbae307.zip | |
[PowerPC] Support powerpc64le as a syntax-checking target.
This patch provides basic support for powerpc64le as an LLVM target.
However, use of this target will not actually generate little-endian
code. Instead, use of the target will cause the correct little-endian
built-in defines to be generated, so that code that tests for
__LITTLE_ENDIAN__, for example, will be correctly parsed for
syntax-only testing. Code generation will otherwise be the same as
powerpc64 (big-endian), for now.
The patch leaves open the possibility of creating a little-endian
PowerPC64 back end, but there is no immediate intent to create such a
thing.
The new test case variant ensures that correct built-in defines for
little-endian code are generated.
llvm-svn: 187180
Diffstat (limited to 'clang/lib/Basic/Targets.cpp')
| -rw-r--r-- | clang/lib/Basic/Targets.cpp | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp index 20e504c0be5..596eb8cb168 100644 --- a/clang/lib/Basic/Targets.cpp +++ b/clang/lib/Basic/Targets.cpp @@ -268,6 +268,7 @@ public: case llvm::Triple::mipsel: case llvm::Triple::ppc: case llvm::Triple::ppc64: + case llvm::Triple::ppc64le: this->MCountName = "_mcount"; break; case llvm::Triple::arm: @@ -631,6 +632,7 @@ class PPCTargetInfo : public TargetInfo { std::string CPU; public: PPCTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) { + BigEndian = (Triple.getArch() != llvm::Triple::ppc64le); LongDoubleWidth = LongDoubleAlign = 128; LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble; } @@ -702,6 +704,8 @@ public: .Case("ppc", true) .Case("powerpc64", true) .Case("ppc64", true) + .Case("powerpc64le", true) + .Case("ppc64le", true) .Default(false); if (CPUKnown) @@ -867,10 +871,15 @@ void PPCTargetInfo::getTargetDefines(const LangOptions &Opts, } // Target properties. - if (getTriple().getOS() != llvm::Triple::NetBSD && - getTriple().getOS() != llvm::Triple::OpenBSD) - Builder.defineMacro("_BIG_ENDIAN"); - Builder.defineMacro("__BIG_ENDIAN__"); + if (getTriple().getArch() == llvm::Triple::ppc64le) { + Builder.defineMacro("_LITTLE_ENDIAN"); + Builder.defineMacro("__LITTLE_ENDIAN__"); + } else { + if (getTriple().getOS() != llvm::Triple::NetBSD && + getTriple().getOS() != llvm::Triple::OpenBSD) + Builder.defineMacro("_BIG_ENDIAN"); + Builder.defineMacro("__BIG_ENDIAN__"); + } // Subtarget options. Builder.defineMacro("__NATURAL_ALIGNMENT__"); @@ -1006,6 +1015,7 @@ void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const { .Case("pwr6", true) .Case("pwr7", true) .Case("ppc64", true) + .Case("ppc64le", true) .Default(false); Features["qpx"] = (CPU == "a2q"); @@ -1167,6 +1177,8 @@ public: }; } // end anonymous namespace. +// Note: ABI differences may eventually require us to have a separate +// TargetInfo for little endian. namespace { class PPC64TargetInfo : public PPCTargetInfo { public: @@ -2967,6 +2979,7 @@ public: case llvm::Triple::mipsel: case llvm::Triple::ppc: case llvm::Triple::ppc64: + case llvm::Triple::ppc64le: // this->MCountName = "_mcount"; break; case llvm::Triple::arm: @@ -5236,6 +5249,14 @@ static TargetInfo *AllocateTarget(const llvm::Triple &Triple) { return new PPC64TargetInfo(Triple); } + case llvm::Triple::ppc64le: + switch (os) { + case llvm::Triple::Linux: + return new LinuxTargetInfo<PPC64TargetInfo>(Triple); + default: + return new PPC64TargetInfo(Triple); + } + case llvm::Triple::nvptx: return new NVPTX32TargetInfo(Triple); case llvm::Triple::nvptx64: |

