Index: include/llvm/ADT/Triple.h =================================================================== --- include/llvm/ADT/Triple.h +++ include/llvm/ADT/Triple.h @@ -744,6 +744,11 @@ /// string then the triple's arch name is used. StringRef getARMCPUForArch(StringRef Arch = StringRef()) const; + /// Form a triple variant with provided ABI. + /// + /// \param ABIName the name of ABI (e.g., "o32", "n32" etc). + llvm::Triple getABIVariant(StringRef ABIName) const; + /// Tests whether the target triple is little endian. /// /// \returns true if the triple is little endian, false otherwise. Index: lib/Support/Triple.cpp =================================================================== --- lib/Support/Triple.cpp +++ lib/Support/Triple.cpp @@ -1601,6 +1601,37 @@ llvm_unreachable("invalid arch name"); } +llvm::Triple Triple::getABIVariant(StringRef ABIName) const { + if (ABIName.empty()) + return *this; + + switch (getArch()) { + default: + return *this; + case mips: + case mipsel: + case mips64: + case mips64el: { + Triple T; + StringRef EnvironmentTypeName = getEnvironmentTypeName(getEnvironment()); + if (ABIName == "o32") { + T = get32BitArchVariant(); + T.setEnvironmentName(EnvironmentTypeName); + } else if (ABIName == "n32") { + T = get64BitArchVariant(); + T.setEnvironmentName((EnvironmentTypeName + "abin32").str()); + } else if (ABIName == "n64") { + T = get64BitArchVariant(); + T.setEnvironmentName((EnvironmentTypeName + "abi64").str()); + } else { + T = *this; + T.setEnvironment(UnknownEnvironment); + } + return T; + } + } +} + Triple::MipsABI Triple::getMipsABI() const { if (getEnvironmentName().endswith("abin32")) return N32; Index: test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll =================================================================== --- test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll +++ test/CodeGen/Mips/compactbranches/no-beqzc-bnezc.ll @@ -103,7 +103,7 @@ define i32 @f6(i32 %a) { ; CHECK-LABEL: f6: -; CHECK: beqzc ${{[0-9]+}}, $BB +; CHECK: beqzc ${{[0-9]+}}, {{\$|\.L}}BB %cmp = icmp eq i32 %a, 0 br i1 %cmp, label %if.then, label %if.end @@ -117,7 +117,7 @@ define i32 @f7(i32 %a) { ; CHECK-LABEL: f7: -; CHECK: bnezc ${{[0-9]+}}, $BB +; CHECK: bnezc ${{[0-9]+}}, {{\$|\.L}}BB %cmp = icmp eq i32 0, %a br i1 %cmp, label %if.then, label %if.end Index: test/MC/Mips/expansion-jal-sym-pic.s =================================================================== --- test/MC/Mips/expansion-jal-sym-pic.s +++ test/MC/Mips/expansion-jal-sym-pic.s @@ -200,8 +200,8 @@ # ELF-O32-NEXT: 27 39 00 58 addiu $25, $25, 88 # ELF-O32-NEXT: R_MIPS_LO16 .text -# N32: lw $25, %got_disp($tmp0)($gp) # encoding: [0x8f,0x99,A,A] -# N32: # fixup A - offset: 0, value: %got_disp($tmp0), kind: fixup_Mips_GOT_DISP +# N32: lw $25, %got_disp(.Ltmp0)($gp) # encoding: [0x8f,0x99,A,A] +# N32: # fixup A - offset: 0, value: %got_disp(.Ltmp0), kind: fixup_Mips_GOT_DISP # ELF-N32: 8f 99 00 00 lw $25, 0($gp) # ELF-N32-NEXT: R_MIPS_GOT_DISP .Ltmp0 Index: test/MC/Mips/macro-li.d.s =================================================================== --- test/MC/Mips/macro-li.d.s +++ test/MC/Mips/macro-li.d.s @@ -18,7 +18,7 @@ li.d $4, 1.12345 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1072822694 # ALL: .4byte 3037400872 # ALL: .text @@ -58,7 +58,7 @@ li.d $4, 12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790602240 # ALL: .text @@ -90,7 +90,7 @@ li.d $4, 12345678910.0 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790602240 # ALL: .text @@ -122,7 +122,7 @@ li.d $4, 0.4 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1071225241 # ALL: .4byte 2576980378 # ALL: .text @@ -158,7 +158,7 @@ li.d $4, 12345678910.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790666967 # ALL: .text @@ -191,7 +191,7 @@ li.d $4, 12345678910123456789.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1139108501 # ALL: .4byte 836738583 # ALL: .text @@ -243,7 +243,7 @@ li.d $f4, 1.12345 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1072822694 # ALL: .4byte 3037400872 # ALL: .text @@ -286,7 +286,7 @@ li.d $f4, 12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790602240 # ALL: .text @@ -309,7 +309,7 @@ li.d $f4, 12345678910.0 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790602240 # ALL: .text @@ -332,7 +332,7 @@ li.d $f4, 0.4 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1071225241 # ALL: .4byte 2576980378 # ALL: .text @@ -375,7 +375,7 @@ li.d $f4, 2.515625 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1074012160 # ALL: .4byte 0 # ALL: .text @@ -398,7 +398,7 @@ li.d $f4, 12345678910.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1107754720 # ALL: .4byte 3790666967 # ALL: .text @@ -421,7 +421,7 @@ li.d $f4, 12345678910123456789.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1139108501 # ALL: .4byte 836738583 # ALL: .text Index: test/MC/Mips/macro-li.s.s =================================================================== --- test/MC/Mips/macro-li.s.s +++ test/MC/Mips/macro-li.s.s @@ -54,7 +54,7 @@ li.s $f4, 1.12345 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1066388790 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] @@ -84,7 +84,7 @@ li.s $f4, 12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1345844999 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] @@ -106,7 +106,7 @@ li.s $f4, 12345678910.0 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1345844999 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] @@ -129,7 +129,7 @@ li.s $f4, 0.4 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1053609165 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] @@ -155,7 +155,7 @@ li.s $f4, 12345678910.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1345844999 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] @@ -177,7 +177,7 @@ li.s $f4, 12345678910123456789.12345678910 # ALL: .section .rodata,"a",@progbits -# ALL: [[LABEL:\$tmp[0-9]+]]: +# ALL: [[LABEL:(\$|\.L)tmp[0-9]+]]: # ALL: .4byte 1596675242 # ALL: .text # O32-N32-PIC: lw $1, %got([[LABEL]])($gp) # encoding: [A,A,0x81,0x8f] Index: tools/llc/llc.cpp =================================================================== --- tools/llc/llc.cpp +++ tools/llc/llc.cpp @@ -429,6 +429,8 @@ return 1; } + TheTriple = TheTriple.getABIVariant(ABIName); + std::string CPUStr = getCPUStr(), FeaturesStr = getFeaturesStr(); CodeGenOpt::Level OLvl = CodeGenOpt::Default; Index: tools/llvm-mc/llvm-mc.cpp =================================================================== --- tools/llvm-mc/llvm-mc.cpp +++ tools/llvm-mc/llvm-mc.cpp @@ -192,6 +192,8 @@ return nullptr; } + TheTriple = TheTriple.getABIVariant(ABIName); + // Update the triple name and return the found target. TripleName = TheTriple.getTriple(); return TheTarget; Index: unittests/ADT/TripleTest.cpp =================================================================== --- unittests/ADT/TripleTest.cpp +++ unittests/ADT/TripleTest.cpp @@ -1220,4 +1220,55 @@ EXPECT_EQ(Triple::GNU, T.getEnvironment()); EXPECT_EQ(Triple::N64, T.getMipsABI()); } + +TEST(TripleTest, ABIVariant) { + Triple T = Triple("mips-img-linux").getABIVariant("");; + EXPECT_EQ(Triple::mips, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + EXPECT_EQ(Triple::O32, T.getMipsABI()); + + T = Triple("mips-img-linux").getABIVariant("o32"); + EXPECT_EQ(Triple::mips, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + EXPECT_EQ(Triple::O32, T.getMipsABI()); + + T = Triple("mips-img-linux").getABIVariant("n32"); + EXPECT_EQ(Triple::mips64, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + EXPECT_EQ(Triple::N32, T.getMipsABI()); + + T = Triple("mips-img-linux").getABIVariant("n64"); + EXPECT_EQ(Triple::mips64, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + EXPECT_EQ(Triple::N64, T.getMipsABI()); + + T = Triple("mips64-img-linux").getABIVariant("o32"); + EXPECT_EQ(Triple::mips, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment()); + EXPECT_EQ(Triple::O32, T.getMipsABI()); + + T = Triple("mips64-img-linux-gnuabin32").getABIVariant("o32"); + EXPECT_EQ(Triple::mips, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::GNU, T.getEnvironment()); + EXPECT_EQ(Triple::O32, T.getMipsABI()); + + T = Triple("mips64-img-linux-gnuabin32").getABIVariant("n64"); + EXPECT_EQ(Triple::mips64, T.getArch()); + EXPECT_EQ(Triple::ImaginationTechnologies, T.getVendor()); + EXPECT_EQ(Triple::Linux, T.getOS()); + EXPECT_EQ(Triple::GNU, T.getEnvironment()); + EXPECT_EQ(Triple::N64, T.getMipsABI()); +} } // end anonymous namespace