Index: lib/Support/Triple.cpp =================================================================== --- lib/Support/Triple.cpp +++ lib/Support/Triple.cpp @@ -1556,7 +1556,7 @@ if (NewEnv != T.getEnvironment()) T.setEnvironment(NewEnv); - return std::make_pair(T, ""); + return std::make_pair(T, ABI); } } } Index: lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp =================================================================== --- lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp +++ lib/Target/Mips/MCTargetDesc/MipsABIInfo.cpp @@ -49,9 +49,25 @@ MipsABIInfo MipsABIInfo::computeTargetABI(const Triple &TT, StringRef CPU, const MCTargetOptions &Options) { - if (!Options.getABIName().empty()) - llvm_unreachable( - "ABI name should be in triple. See Triple::getABIVariant()"); + if (Options.getABIName().startswith("o32")) { + assert((TT.getEnvironment() == Triple::ABI32 || + TT.getEnvironment() == Triple::AndroidABI32 || + TT.getEnvironment() == Triple::GNUABI32) && + "Selected ABI disagrees with triple"); + return MipsABIInfo::O32(); + } else if (Options.getABIName().startswith("n32")) { + assert((TT.getEnvironment() == Triple::ABIN32 || + TT.getEnvironment() == Triple::GNUABIN32) && + "Selected ABI disagrees with triple"); + return MipsABIInfo::N32(); + } else if (Options.getABIName().startswith("n64")) { + assert((TT.getEnvironment() == Triple::ABI64 || + TT.getEnvironment() == Triple::AndroidABI64 || + TT.getEnvironment() == Triple::GNUABI64) && + "Selected ABI disagrees with triple"); + return MipsABIInfo::N64(); + } else if (!Options.getABIName().empty()) + llvm_unreachable("Unknown ABI option for MIPS"); else if (TT.getEnvironment() == Triple::ABI32 || TT.getEnvironment() == Triple::AndroidABI32 || TT.getEnvironment() == Triple::GNUABI32) Index: unittests/ADT/TripleTest.cpp =================================================================== --- unittests/ADT/TripleTest.cpp +++ unittests/ADT/TripleTest.cpp @@ -868,10 +868,13 @@ EXPECT_EQ(Triple::GNUABIN32, N32.first.getEnvironment()); EXPECT_EQ(Triple::GNUABI64, N64.first.getEnvironment()); - EXPECT_EQ("", Default.second); - EXPECT_EQ("", O32.second); - EXPECT_EQ("", N32.second); - EXPECT_EQ("", N64.second); + EXPECT_EQ((T.getArch() == Triple::mips64 || T.getArch() == Triple::mips64el) + ? "n64" + : "o32", + Default.second); + EXPECT_EQ("o32", O32.second); + EXPECT_EQ("n32", N32.second); + EXPECT_EQ("n64", N64.second); // Try an unsupported ABI name. This should change the arch component of the // triple to UnknownArch. Other values are undefined. @@ -906,9 +909,12 @@ EXPECT_EQ(Triple::AndroidABI32, O32.first.getEnvironment()); EXPECT_EQ(Triple::AndroidABI64, N64.first.getEnvironment()); - EXPECT_EQ("", Default.second); - EXPECT_EQ("", O32.second); - EXPECT_EQ("", N64.second); + EXPECT_EQ((T.getArch() == Triple::mips64 || T.getArch() == Triple::mips64el) + ? "n64" + : "o32", + Default.second); + EXPECT_EQ("o32", O32.second); + EXPECT_EQ("n64", N64.second); // Try an unsupported ABI name. This should change the arch component of the // triple to UnknownArch. Other values are undefined. @@ -954,10 +960,13 @@ EXPECT_EQ(Triple::ABIN32, N32.first.getEnvironment()); EXPECT_EQ(Triple::ABI64, N64.first.getEnvironment()); - EXPECT_EQ("", Default.second); - EXPECT_EQ("", O32.second); - EXPECT_EQ("", N32.second); - EXPECT_EQ("", N64.second); + EXPECT_EQ((T.getArch() == Triple::mips64 || T.getArch() == Triple::mips64el) + ? "n64" + : "o32", + Default.second); + EXPECT_EQ("o32", O32.second); + EXPECT_EQ("n32", N32.second); + EXPECT_EQ("n64", N64.second); EXPECT_EQ("foo", Foo.second); } }