Skip to content

Commit 569daa6

Browse files
committed
[LLVM][Triple] Drop unknown object types from normalized triples
According to the LangRef the longest canonical form for the triple is: `ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT` Seems like object format may also appear at the end of the triple separated by an additional `-` but it looks like object format is part of the `enviornment` as opposed to a seperate identifier. This appears to be the case because various pieces of code that parse the enviornment substring also handle the object format, and often the code only assumes four componenets where the enviornment string may also hold the version number and the object format. Also see: `getEnvironmentName()`. While creating a Triple, in case of an invalid or unknown object format we call the `getDefaultFormat()` function which sets the appropriate format. So, the object format is never really unknown. Since we always set a default format, having `unknown` as a placeholder can cause issues. This is supported by the fact that the string expectation for an `UnknownObjectFormat` is `""`, as seen in `getObjectFormatTypeName()` instead of `"unknown"`. So, to me it makes sense to drop "unknown" for the triple for object format. expectation of `getEnvironmentVersionString()` is that if the enviornment string contains a `"-"` then it has the object format at the end and object format name and type should match, which is not the case if "-unknown" is present in the triple. As a part of this patch I also removed `Triple::CanonicalForm::FIVE_IDENT`. Change-Id: I5c6ef8fef4ff029ab28f4c3afdab573251cf629c
1 parent a45b133 commit 569daa6

File tree

3 files changed

+48
-68
lines changed

3 files changed

+48
-68
lines changed

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,7 @@ class Triple {
370370
enum class CanonicalForm {
371371
ANY = 0,
372372
THREE_IDENT = 3, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM
373-
FOUR_IDENT = 4, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
374-
FIVE_IDENT = 5, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT-FORMAT
373+
FOUR_IDENT = 4, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT(-FORMAT)
375374
};
376375

377376
/// Turn an arbitrary machine specification into the canonical triple form (or

llvm/lib/TargetParser/Triple.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,11 +1162,12 @@ std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
11621162

11631163
// Note which components are already in their final position. These will not
11641164
// be moved.
1165-
bool Found[4];
1165+
bool Found[5];
11661166
Found[0] = Arch != UnknownArch;
11671167
Found[1] = Vendor != UnknownVendor;
11681168
Found[2] = OS != UnknownOS;
11691169
Found[3] = Environment != UnknownEnvironment;
1170+
Found[4] = ObjectFormat != UnknownObjectFormat;
11701171

11711172
// If they are not there already, permute the components into their canonical
11721173
// positions by seeing if they parse as a valid architecture, and if so moving
@@ -1202,10 +1203,10 @@ std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
12021203
case 3:
12031204
Environment = parseEnvironment(Comp);
12041205
Valid = Environment != UnknownEnvironment;
1205-
if (!Valid) {
1206-
ObjectFormat = parseFormat(Comp);
1207-
Valid = ObjectFormat != UnknownObjectFormat;
1208-
}
1206+
break;
1207+
case 4:
1208+
ObjectFormat = parseFormat(Comp);
1209+
Valid = ObjectFormat != UnknownObjectFormat;
12091210
break;
12101211
}
12111212
if (!Valid)
@@ -1265,6 +1266,14 @@ std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
12651266
}
12661267
}
12671268

1269+
// Environment "unknown-elf" is just "elf".
1270+
if (ObjectFormat != UnknownObjectFormat &&
1271+
(Components[3] == "unknown" || Components[3].empty())) {
1272+
Found[3] = true;
1273+
std::swap(Components[3], Components[4]);
1274+
Components.pop_back();
1275+
}
1276+
12681277
// If "none" is in the middle component in a three-component triple, treat it
12691278
// as the OS (Components[2]) instead of the vendor (Components[1]).
12701279
if (Found[0] && !Found[1] && !Found[2] && Found[3] &&
@@ -1335,16 +1344,23 @@ std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
13351344
}
13361345
}
13371346

1347+
// Leave out unknown object format from the string representation.
1348+
if (ObjectFormat == UnknownObjectFormat && Components.size() == 5)
1349+
Components.pop_back();
1350+
13381351
// Canonicalize the components if necessary.
13391352
switch (Form) {
13401353
case CanonicalForm::ANY:
13411354
break;
1342-
case CanonicalForm::THREE_IDENT:
1343-
case CanonicalForm::FOUR_IDENT:
1344-
case CanonicalForm::FIVE_IDENT: {
1355+
case CanonicalForm::THREE_IDENT: {
13451356
Components.resize(static_cast<unsigned>(Form), "unknown");
13461357
break;
13471358
}
1359+
case CanonicalForm::FOUR_IDENT: {
1360+
if (Components.size() < 4)
1361+
Components.resize(static_cast<unsigned>(Form), "unknown");
1362+
break;
1363+
}
13481364
}
13491365

13501366
// Stick the corrected components back together to form the normalized string.

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 23 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,8 +1384,7 @@ TEST(TripleTest, Normalization) {
13841384
EXPECT_EQ("unknown-unknown", Triple::normalize("-"));
13851385
EXPECT_EQ("unknown-unknown-unknown", Triple::normalize("--"));
13861386
EXPECT_EQ("unknown-unknown-unknown-unknown", Triple::normalize("---"));
1387-
EXPECT_EQ("unknown-unknown-unknown-unknown-unknown",
1388-
Triple::normalize("----"));
1387+
EXPECT_EQ("unknown-unknown-unknown-unknown", Triple::normalize("----"));
13891388

13901389
EXPECT_EQ("a", Triple::normalize("a"));
13911390
EXPECT_EQ("a-b", Triple::normalize("a-b"));
@@ -1403,7 +1402,7 @@ TEST(TripleTest, Normalization) {
14031402
EXPECT_EQ("a-pc-b-c", Triple::normalize("a-b-c-pc"));
14041403

14051404
EXPECT_EQ("a-b-linux", Triple::normalize("a-b-linux"));
1406-
EXPECT_EQ("unknown-unknown-linux-b-c", Triple::normalize("linux-b-c"));
1405+
EXPECT_EQ("unknown-unknown-linux-b-elf", Triple::normalize("linux-b-elf"));
14071406
EXPECT_EQ("a-unknown-linux-c", Triple::normalize("a-linux-c"));
14081407

14091408
EXPECT_EQ("i386-pc-a", Triple::normalize("a-pc-i386"));
@@ -1438,27 +1437,15 @@ TEST(TripleTest, Normalization) {
14381437
Triple::normalize("a-b-c-d", Triple::CanonicalForm::FOUR_IDENT));
14391438
EXPECT_EQ("a-b-c-d",
14401439
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::FOUR_IDENT));
1441-
1442-
EXPECT_EQ("a-unknown-unknown-unknown-unknown",
1443-
Triple::normalize("a", Triple::CanonicalForm::FIVE_IDENT));
1444-
EXPECT_EQ("a-b-unknown-unknown-unknown",
1445-
Triple::normalize("a-b", Triple::CanonicalForm::FIVE_IDENT));
1446-
EXPECT_EQ("a-b-c-unknown-unknown",
1447-
Triple::normalize("a-b-c", Triple::CanonicalForm::FIVE_IDENT));
1448-
EXPECT_EQ("a-b-c-d-unknown",
1449-
Triple::normalize("a-b-c-d", Triple::CanonicalForm::FIVE_IDENT));
1450-
EXPECT_EQ("a-b-c-d-e",
1451-
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::FIVE_IDENT));
1440+
EXPECT_EQ(
1441+
"a-b-c-d-elf",
1442+
Triple::normalize("a-b-c-d-elf", Triple::CanonicalForm::FOUR_IDENT));
14521443

14531444
EXPECT_EQ("i386-b-c-unknown",
14541445
Triple::normalize("i386-b-c", Triple::CanonicalForm::FOUR_IDENT));
1455-
EXPECT_EQ("i386-b-c-unknown-unknown",
1456-
Triple::normalize("i386-b-c", Triple::CanonicalForm::FIVE_IDENT));
14571446

14581447
EXPECT_EQ("i386-a-c-unknown",
14591448
Triple::normalize("a-i386-c", Triple::CanonicalForm::FOUR_IDENT));
1460-
EXPECT_EQ("i386-a-c-unknown-unknown",
1461-
Triple::normalize("a-i386-c", Triple::CanonicalForm::FIVE_IDENT));
14621449

14631450
EXPECT_EQ("i386-a-b-unknown",
14641451
Triple::normalize("a-b-i386", Triple::CanonicalForm::FOUR_IDENT));
@@ -1502,46 +1489,24 @@ TEST(TripleTest, Normalization) {
15021489
"x86_64-unknown-linux-gnu",
15031490
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FOUR_IDENT));
15041491

1505-
EXPECT_EQ("i386-a-b-unknown-unknown",
1506-
Triple::normalize("a-b-i386", Triple::CanonicalForm::FIVE_IDENT));
1507-
EXPECT_EQ("i386-a-b-c-unknown",
1508-
Triple::normalize("a-b-c-i386", Triple::CanonicalForm::FIVE_IDENT));
1509-
1510-
EXPECT_EQ("a-pc-c-unknown-unknown",
1511-
Triple::normalize("a-pc-c", Triple::CanonicalForm::FIVE_IDENT));
1512-
EXPECT_EQ("unknown-pc-b-c-unknown",
1513-
Triple::normalize("pc-b-c", Triple::CanonicalForm::FIVE_IDENT));
1514-
EXPECT_EQ("a-pc-b-unknown-unknown",
1515-
Triple::normalize("a-b-pc", Triple::CanonicalForm::FIVE_IDENT));
1516-
EXPECT_EQ("a-pc-b-c-unknown",
1517-
Triple::normalize("a-b-c-pc", Triple::CanonicalForm::FIVE_IDENT));
1518-
1519-
EXPECT_EQ("a-b-linux-unknown-unknown",
1520-
Triple::normalize("a-b-linux", Triple::CanonicalForm::FIVE_IDENT));
1521-
EXPECT_EQ("unknown-unknown-linux-b-c",
1522-
Triple::normalize("linux-b-c", Triple::CanonicalForm::FIVE_IDENT));
1523-
EXPECT_EQ("a-unknown-linux-c-unknown",
1524-
Triple::normalize("a-linux-c", Triple::CanonicalForm::FIVE_IDENT));
1525-
1526-
EXPECT_EQ("i386-pc-a-unknown-unknown",
1527-
Triple::normalize("a-pc-i386", Triple::CanonicalForm::FIVE_IDENT));
1528-
EXPECT_EQ("i386-pc-unknown-unknown-unknown",
1529-
Triple::normalize("-pc-i386", Triple::CanonicalForm::FIVE_IDENT));
1530-
EXPECT_EQ("unknown-pc-linux-c-unknown",
1531-
Triple::normalize("linux-pc-c", Triple::CanonicalForm::FIVE_IDENT));
1532-
EXPECT_EQ("unknown-pc-linux-unknown-unknown",
1533-
Triple::normalize("linux-pc-", Triple::CanonicalForm::FIVE_IDENT));
1534-
1535-
EXPECT_EQ("i386-unknown-unknown-unknown-unknown",
1536-
Triple::normalize("i386", Triple::CanonicalForm::FIVE_IDENT));
1537-
EXPECT_EQ("unknown-pc-unknown-unknown-unknown",
1538-
Triple::normalize("pc", Triple::CanonicalForm::FIVE_IDENT));
1539-
EXPECT_EQ("unknown-unknown-linux-unknown-unknown",
1540-
Triple::normalize("linux", Triple::CanonicalForm::FIVE_IDENT));
1541-
1542-
EXPECT_EQ(
1543-
"x86_64-unknown-linux-gnu-unknown",
1544-
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FIVE_IDENT));
1492+
EXPECT_EQ("arm-unknown-linux-gnueabi",
1493+
Triple::normalize("arm-linux-gnueabi",
1494+
Triple::CanonicalForm::FOUR_IDENT));
1495+
EXPECT_EQ("arm-unknown-linux-gnueabi-elf",
1496+
Triple::normalize("arm-linux-gnueabi-elf",
1497+
Triple::CanonicalForm::FOUR_IDENT));
1498+
EXPECT_EQ("arm-unknown-linux-gnueabi",
1499+
Triple::normalize("arm-linux-gnueabi-xyz",
1500+
Triple::CanonicalForm::FOUR_IDENT));
1501+
EXPECT_EQ("arm-unknown-linux-gnueabi",
1502+
Triple::normalize("arm-linux-gnueabi-unknown",
1503+
Triple::CanonicalForm::FOUR_IDENT));
1504+
EXPECT_EQ("arm-unknown-linux-gnueabi",
1505+
Triple::normalize("arm-unknown-linux-gnueabi-unknown",
1506+
Triple::CanonicalForm::FOUR_IDENT));
1507+
EXPECT_EQ("arm-unknown-linux-gnueabi",
1508+
Triple::normalize("arm-unknown-linux-gnueabi-xyz",
1509+
Triple::CanonicalForm::ANY));
15451510

15461511
// Check that normalizing a permutated set of valid components returns a
15471512
// triple with the unpermuted components.

0 commit comments

Comments
 (0)