diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index d6408c514f4..9e91642d975 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -434,6 +434,8 @@ std::string Triple::normalize(StringRef Str) { if (Components.size() > 3) Environment = parseEnvironment(Components[3]); ObjectFormatType ObjectFormat = UnknownObjectFormat; + if (Components.size() > 4) + ObjectFormat = parseFormat(Components[4]); // Note which components are already in their final position. These will not // be moved. @@ -544,8 +546,16 @@ std::string Triple::normalize(StringRef Str) { if (OS == Triple::Win32) { Components.resize(4); Components[2] = "windows"; - if (Environment == UnknownEnvironment && ObjectFormat == UnknownObjectFormat) - Components[3] = "msvc"; + if (Environment == UnknownEnvironment) { + if (ObjectFormat == UnknownObjectFormat) + Components[3] = "msvc"; + else + Components[3] = getObjectFormatTypeName(ObjectFormat); + } else if (ObjectFormat != UnknownObjectFormat && + ObjectFormat != Triple::COFF) { + Components.resize(5); + Components[4] = getObjectFormatTypeName(ObjectFormat); + } } else if (OS == Triple::MinGW32) { Components.resize(4); Components[2] = "windows"; diff --git a/unittests/ADT/TripleTest.cpp b/unittests/ADT/TripleTest.cpp index 52d7de9386b..2b806a3163d 100644 --- a/unittests/ADT/TripleTest.cpp +++ b/unittests/ADT/TripleTest.cpp @@ -513,6 +513,13 @@ TEST(TripleTest, FileFormat) { EXPECT_EQ(Triple::COFF, Triple("i686--win32").getObjectFormat()); + EXPECT_EQ(Triple::ELF, Triple("i686-pc-windows-msvc-elf").getObjectFormat()); + + { + Triple Normalized(Triple::normalize("i686-pc-windows-msvc-elf")); + EXPECT_EQ(Triple::ELF, Normalized.getObjectFormat()); + } + Triple T = Triple(""); T.setObjectFormat(Triple::ELF); EXPECT_EQ(Triple::ELF, T.getObjectFormat()); @@ -546,5 +553,7 @@ TEST(TripleTest, NormalizeWindows) { EXPECT_EQ("x86_64--windows-macho", Triple::normalize("x86_64-win32-macho")); EXPECT_EQ("i686-pc-windows-itanium", Triple::normalize("i686-pc-windows-itanium")); + + EXPECT_EQ("i686-pc-windows-msvc", Triple::normalize("i686-pc-windows-msvc")); } }