Index: llvm/include/llvm/ADT/Triple.h =================================================================== --- llvm/include/llvm/ADT/Triple.h +++ llvm/include/llvm/ADT/Triple.h @@ -384,6 +384,9 @@ /// triple. StringRef getArchName() const; + /// getArchName - Get the architecture name based on Kind and SubArch. + StringRef getArchName(ArchType Kind, SubArchType SubArch = NoSubArch) const; + /// getVendorName - Get the vendor (second) component of the triple. StringRef getVendorName() const; @@ -838,7 +841,7 @@ /// setArch - Set the architecture (first) component of the triple /// to a known type. - void setArch(ArchType Kind); + void setArch(ArchType Kind, SubArchType SubArch = NoSubArch); /// setVendor - Set the vendor (second) component of the triple to a /// known type. Index: llvm/lib/Support/Triple.cpp =================================================================== --- llvm/lib/Support/Triple.cpp +++ llvm/lib/Support/Triple.cpp @@ -1030,6 +1030,30 @@ return StringRef(Data).split('-').first; // Isolate first component } +StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) const { + switch (Kind) { + case Triple::mips: + if (SubArch == MipsSubArch_r6) + return "mipsisa32r6"; + break; + case Triple::mipsel: + if (SubArch == MipsSubArch_r6) + return "mipsisa32r6el"; + break; + case Triple::mips64: + if (SubArch == MipsSubArch_r6) + return "mipsisa64r6"; + break; + case Triple::mips64el: + if (SubArch == MipsSubArch_r6) + return "mipsisa64r6el"; + break; + default: + break; + } + return getArchTypeName(Kind); +} + StringRef Triple::getVendorName() const { StringRef Tmp = StringRef(Data).split('-').second; // Strip first component return Tmp.split('-').first; // Isolate second component @@ -1211,8 +1235,8 @@ *this = Triple(Str); } -void Triple::setArch(ArchType Kind) { - setArchName(getArchTypeName(Kind)); +void Triple::setArch(ArchType Kind, SubArchType SubArch) { + setArchName(getArchName(Kind, SubArch)); } void Triple::setVendor(VendorType Kind) { @@ -1404,8 +1428,12 @@ case Triple::amdil64: T.setArch(Triple::amdil); break; case Triple::hsail64: T.setArch(Triple::hsail); break; case Triple::le64: T.setArch(Triple::le32); break; - case Triple::mips64: T.setArch(Triple::mips); break; - case Triple::mips64el: T.setArch(Triple::mipsel); break; + case Triple::mips64: + T.setArch(Triple::mips, getSubArch()); + break; + case Triple::mips64el: + T.setArch(Triple::mipsel, getSubArch()); + break; case Triple::nvptx64: T.setArch(Triple::nvptx); break; case Triple::ppc64: T.setArch(Triple::ppc); break; case Triple::ppc64le: T.setArch(Triple::ppcle); break; @@ -1470,8 +1498,12 @@ case Triple::armeb: T.setArch(Triple::aarch64_be); break; case Triple::hsail: T.setArch(Triple::hsail64); break; case Triple::le32: T.setArch(Triple::le64); break; - case Triple::mips: T.setArch(Triple::mips64); break; - case Triple::mipsel: T.setArch(Triple::mips64el); break; + case Triple::mips: + T.setArch(Triple::mips64, getSubArch()); + break; + case Triple::mipsel: + T.setArch(Triple::mips64el, getSubArch()); + break; case Triple::nvptx: T.setArch(Triple::nvptx64); break; case Triple::ppc: T.setArch(Triple::ppc64); break; case Triple::ppcle: T.setArch(Triple::ppc64le); break; @@ -1532,8 +1564,12 @@ 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::mips64el: + T.setArch(Triple::mips64, getSubArch()); + break; + case Triple::mipsel: + T.setArch(Triple::mips, getSubArch()); + break; case Triple::ppcle: T.setArch(Triple::ppc); break; case Triple::ppc64le: T.setArch(Triple::ppc64); break; case Triple::sparcel: T.setArch(Triple::sparc); break; @@ -1565,8 +1601,12 @@ 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::mips64: + T.setArch(Triple::mips64el, getSubArch()); + break; + case Triple::mips: + T.setArch(Triple::mipsel, getSubArch()); + break; case Triple::ppc: T.setArch(Triple::ppcle); break; case Triple::ppc64: T.setArch(Triple::ppc64le); break; case Triple::sparc: T.setArch(Triple::sparcel); break; Index: llvm/unittests/ADT/TripleTest.cpp =================================================================== --- llvm/unittests/ADT/TripleTest.cpp +++ llvm/unittests/ADT/TripleTest.cpp @@ -930,11 +930,27 @@ T.setArch(Triple::mips); EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch()); + + T.setArch(Triple::mips, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch()); T.setArch(Triple::mipsel); EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch()); + + T.setArch(Triple::mipsel, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch()); T.setArch(Triple::ppc); EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch()); @@ -954,11 +970,27 @@ T.setArch(Triple::mips64); EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch()); + + T.setArch(Triple::mips64, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch()); T.setArch(Triple::mips64el); EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get32BitArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.get64BitArchVariant().getSubArch()); + + T.setArch(Triple::mips64el, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mipsel, T.get32BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get32BitArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64el, T.get64BitArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.get64BitArchVariant().getSubArch()); T.setArch(Triple::ppc64); EXPECT_EQ(Triple::ppc, T.get32BitArchVariant().getArch()); @@ -1104,19 +1136,55 @@ T.setArch(Triple::mips64); EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch()); + + T.setArch(Triple::mips64, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, + T.getLittleEndianArchVariant().getSubArch()); T.setArch(Triple::mips64el); EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch()); + EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch()); + + T.setArch(Triple::mips64el, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips64, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch()); EXPECT_EQ(Triple::mips64el, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, + T.getLittleEndianArchVariant().getSubArch()); T.setArch(Triple::mips); EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch()); EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch()); + + T.setArch(Triple::mips, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch()); + EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, + T.getLittleEndianArchVariant().getSubArch()); T.setArch(Triple::mipsel); EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getBigEndianArchVariant().getSubArch()); + EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::NoSubArch, T.getLittleEndianArchVariant().getSubArch()); + + T.setArch(Triple::mipsel, Triple::MipsSubArch_r6); + EXPECT_EQ(Triple::mips, T.getBigEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, T.getBigEndianArchVariant().getSubArch()); EXPECT_EQ(Triple::mipsel, T.getLittleEndianArchVariant().getArch()); + EXPECT_EQ(Triple::MipsSubArch_r6, + T.getLittleEndianArchVariant().getSubArch()); T.setArch(Triple::ppc); EXPECT_EQ(Triple::ppc, T.getBigEndianArchVariant().getArch());