From: Davide Italiano Date: Wed, 29 Jun 2016 20:01:39 +0000 (+0000) Subject: [Triple] Reimplement isLittleEndian(). Now it works for arm too. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=23b149871d220b1f84fb593ad42e2d0130924643;p=llvm [Triple] Reimplement isLittleEndian(). Now it works for arm too. Differential Revision: http://reviews.llvm.org/D21846 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274154 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index 71533df75d9..ba0d4dbc711 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -1288,6 +1288,9 @@ Triple Triple::get64BitArchVariant() const { Triple Triple::getBigEndianArchVariant() const { Triple T(*this); + // Already big endian. + if (!isLittleEndian()) + return T; switch (getArch()) { case Triple::UnknownArch: case Triple::amdgcn: @@ -1320,34 +1323,23 @@ Triple Triple::getBigEndianArchVariant() const { T.setArch(UnknownArch); break; - case Triple::aarch64_be: - case Triple::armeb: - case Triple::bpfeb: - case Triple::lanai: - case Triple::mips64: - case Triple::mips: - case Triple::ppc64: - case Triple::ppc: - case Triple::sparc: - case Triple::sparcv9: - case Triple::systemz: - case Triple::tce: - case Triple::thumbeb: - // Already big endian. - break; - case Triple::aarch64: T.setArch(Triple::aarch64_be); break; case Triple::bpfel: T.setArch(Triple::bpfeb); break; case Triple::mips64el:T.setArch(Triple::mips64); break; case Triple::mipsel: T.setArch(Triple::mips); break; case Triple::ppc64le: T.setArch(Triple::ppc64); break; case Triple::sparcel: T.setArch(Triple::sparc); break; + default: + llvm_unreachable("getBigEndianArchVariant: unknown triple."); } return T; } Triple Triple::getLittleEndianArchVariant() const { Triple T(*this); + if (isLittleEndian()) + return T; + switch (getArch()) { case Triple::UnknownArch: case Triple::lanai: @@ -1363,6 +1355,20 @@ Triple Triple::getLittleEndianArchVariant() const { T.setArch(UnknownArch); break; + case Triple::aarch64_be: T.setArch(Triple::aarch64); break; + case Triple::bpfeb: T.setArch(Triple::bpfel); break; + case Triple::mips64: T.setArch(Triple::mips64el); break; + case Triple::mips: T.setArch(Triple::mipsel); break; + case Triple::ppc64: T.setArch(Triple::ppc64le); break; + case Triple::sparc: T.setArch(Triple::sparcel); break; + default: + llvm_unreachable("getLittleEndianArchVariant: unknown triple."); + } + return T; +} + +bool Triple::isLittleEndian() const { + switch (getArch()) { case Triple::aarch64: case Triple::amdgcn: case Triple::amdil64: @@ -1393,21 +1399,10 @@ Triple Triple::getLittleEndianArchVariant() const { case Triple::x86: case Triple::x86_64: case Triple::xcore: - // Already little endian. - break; - - case Triple::aarch64_be: T.setArch(Triple::aarch64); break; - case Triple::bpfeb: T.setArch(Triple::bpfel); break; - case Triple::mips64: T.setArch(Triple::mips64el); break; - case Triple::mips: T.setArch(Triple::mipsel); break; - case Triple::ppc64: T.setArch(Triple::ppc64le); break; - case Triple::sparc: T.setArch(Triple::sparcel); break; + return true; + default: + return false; } - return T; -} - -bool Triple::isLittleEndian() const { - return *this == getLittleEndianArchVariant(); } StringRef Triple::getARMCPUForArch(StringRef MArch) const { diff --git a/unittests/ADT/TripleTest.cpp b/unittests/ADT/TripleTest.cpp index 294fcf5b942..984f4a2a595 100644 --- a/unittests/ADT/TripleTest.cpp +++ b/unittests/ADT/TripleTest.cpp @@ -643,6 +643,14 @@ TEST(TripleTest, EndianArchVariants) { T.setArch(Triple::arm); EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch()); EXPECT_EQ(Triple::arm, T.getLittleEndianArchVariant().getArch()); + T = Triple("arm"); + EXPECT_TRUE(T.isLittleEndian()); + T = Triple("thumb"); + EXPECT_TRUE(T.isLittleEndian()); + T = Triple("armeb"); + EXPECT_FALSE(T.isLittleEndian()); + T = Triple("thumbeb"); + EXPECT_FALSE(T.isLittleEndian()); T.setArch(Triple::bpfeb); EXPECT_EQ(Triple::bpfeb, T.getBigEndianArchVariant().getArch());