Skip to content

Commit ebef440

Browse files
authored
[LLVM][Triple] Add an argument to specify canonical form to Triple::normalize (llvm#122935)
Currently, the output of `Triple::normalize` can vary depending on how the `Triple` object is constructed, producing a 3-field, 4-field, or even 5-field string. However, there is no way to control the format of the output, as all forms are considered canonical according to the LangRef. This lack of control can be inconvenient when a specific format is required. To address this, this PR introduces an argument to specify the desired format (3, 4, or 5 identifiers), with the default set to none to maintain the current behavior. If the requested format requires more components than are available in the actual `Data`, `"unknown"` is appended as needed.
1 parent b665ddd commit ebef440

File tree

3 files changed

+155
-4
lines changed

3 files changed

+155
-4
lines changed

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,14 +366,26 @@ class Triple {
366366
/// @name Normalization
367367
/// @{
368368

369+
/// Canonical form
370+
enum class CanonicalForm {
371+
ANY = 0,
372+
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
375+
};
376+
369377
/// Turn an arbitrary machine specification into the canonical triple form (or
370378
/// something sensible that the Triple class understands if nothing better can
371379
/// reasonably be done). In particular, it handles the common case in which
372-
/// otherwise valid components are in the wrong order.
373-
static std::string normalize(StringRef Str);
380+
/// otherwise valid components are in the wrong order. \p Form is used to
381+
/// specify the output canonical form.
382+
static std::string normalize(StringRef Str,
383+
CanonicalForm Form = CanonicalForm::ANY);
374384

375385
/// Return the normalized form of this triple's string.
376-
std::string normalize() const { return normalize(Data); }
386+
std::string normalize(CanonicalForm Form = CanonicalForm::ANY) const {
387+
return normalize(Data, Form);
388+
}
377389

378390
/// @}
379391
/// @name Typed Component Access

llvm/lib/TargetParser/Triple.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1128,7 +1128,7 @@ static StringRef getDXILArchNameFromShaderModel(StringRef ShaderModelStr) {
11281128
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0);
11291129
}
11301130

1131-
std::string Triple::normalize(StringRef Str) {
1131+
std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
11321132
bool IsMinGW32 = false;
11331133
bool IsCygwin = false;
11341134

@@ -1334,6 +1334,19 @@ std::string Triple::normalize(StringRef Str) {
13341334
Components[0] = getDXILArchNameFromShaderModel(Components[2]);
13351335
}
13361336
}
1337+
1338+
// Canonicalize the components if necessary.
1339+
switch (Form) {
1340+
case CanonicalForm::ANY:
1341+
break;
1342+
case CanonicalForm::THREE_IDENT:
1343+
case CanonicalForm::FOUR_IDENT:
1344+
case CanonicalForm::FIVE_IDENT: {
1345+
Components.resize(static_cast<unsigned>(Form), "unknown");
1346+
break;
1347+
}
1348+
}
1349+
13371350
// Stick the corrected components back together to form the normalized string.
13381351
return join(Components, "-");
13391352
}

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,6 +1417,132 @@ TEST(TripleTest, Normalization) {
14171417

14181418
EXPECT_EQ("x86_64-unknown-linux-gnu", Triple::normalize("x86_64-gnu-linux"));
14191419

1420+
EXPECT_EQ("a-unknown-unknown",
1421+
Triple::normalize("a", Triple::CanonicalForm::THREE_IDENT));
1422+
EXPECT_EQ("a-b-unknown",
1423+
Triple::normalize("a-b", Triple::CanonicalForm::THREE_IDENT));
1424+
EXPECT_EQ("a-b-c",
1425+
Triple::normalize("a-b-c", Triple::CanonicalForm::THREE_IDENT));
1426+
EXPECT_EQ("a-b-c",
1427+
Triple::normalize("a-b-c-d", Triple::CanonicalForm::THREE_IDENT));
1428+
EXPECT_EQ("a-b-c",
1429+
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::THREE_IDENT));
1430+
1431+
EXPECT_EQ("a-unknown-unknown-unknown",
1432+
Triple::normalize("a", Triple::CanonicalForm::FOUR_IDENT));
1433+
EXPECT_EQ("a-b-unknown-unknown",
1434+
Triple::normalize("a-b", Triple::CanonicalForm::FOUR_IDENT));
1435+
EXPECT_EQ("a-b-c-unknown",
1436+
Triple::normalize("a-b-c", Triple::CanonicalForm::FOUR_IDENT));
1437+
EXPECT_EQ("a-b-c-d",
1438+
Triple::normalize("a-b-c-d", Triple::CanonicalForm::FOUR_IDENT));
1439+
EXPECT_EQ("a-b-c-d",
1440+
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));
1452+
1453+
EXPECT_EQ("i386-b-c-unknown",
1454+
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));
1457+
1458+
EXPECT_EQ("i386-a-c-unknown",
1459+
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));
1462+
1463+
EXPECT_EQ("i386-a-b-unknown",
1464+
Triple::normalize("a-b-i386", Triple::CanonicalForm::FOUR_IDENT));
1465+
EXPECT_EQ("i386-a-b-c",
1466+
Triple::normalize("a-b-c-i386", Triple::CanonicalForm::FOUR_IDENT));
1467+
1468+
EXPECT_EQ("a-pc-c-unknown",
1469+
Triple::normalize("a-pc-c", Triple::CanonicalForm::FOUR_IDENT));
1470+
EXPECT_EQ("unknown-pc-b-c",
1471+
Triple::normalize("pc-b-c", Triple::CanonicalForm::FOUR_IDENT));
1472+
EXPECT_EQ("a-pc-b-unknown",
1473+
Triple::normalize("a-b-pc", Triple::CanonicalForm::FOUR_IDENT));
1474+
EXPECT_EQ("a-pc-b-c",
1475+
Triple::normalize("a-b-c-pc", Triple::CanonicalForm::FOUR_IDENT));
1476+
1477+
EXPECT_EQ("a-b-linux-unknown",
1478+
Triple::normalize("a-b-linux", Triple::CanonicalForm::FOUR_IDENT));
1479+
// We lose `-c` here as expected.
1480+
EXPECT_EQ("unknown-unknown-linux-b",
1481+
Triple::normalize("linux-b-c", Triple::CanonicalForm::FOUR_IDENT));
1482+
EXPECT_EQ("a-unknown-linux-c",
1483+
Triple::normalize("a-linux-c", Triple::CanonicalForm::FOUR_IDENT));
1484+
1485+
EXPECT_EQ("i386-pc-a-unknown",
1486+
Triple::normalize("a-pc-i386", Triple::CanonicalForm::FOUR_IDENT));
1487+
EXPECT_EQ("i386-pc-unknown-unknown",
1488+
Triple::normalize("-pc-i386", Triple::CanonicalForm::FOUR_IDENT));
1489+
EXPECT_EQ("unknown-pc-linux-c",
1490+
Triple::normalize("linux-pc-c", Triple::CanonicalForm::FOUR_IDENT));
1491+
EXPECT_EQ("unknown-pc-linux-unknown",
1492+
Triple::normalize("linux-pc-", Triple::CanonicalForm::FOUR_IDENT));
1493+
1494+
EXPECT_EQ("i386-unknown-unknown-unknown",
1495+
Triple::normalize("i386", Triple::CanonicalForm::FOUR_IDENT));
1496+
EXPECT_EQ("unknown-pc-unknown-unknown",
1497+
Triple::normalize("pc", Triple::CanonicalForm::FOUR_IDENT));
1498+
EXPECT_EQ("unknown-unknown-linux-unknown",
1499+
Triple::normalize("linux", Triple::CanonicalForm::FOUR_IDENT));
1500+
1501+
EXPECT_EQ(
1502+
"x86_64-unknown-linux-gnu",
1503+
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FOUR_IDENT));
1504+
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));
1545+
14201546
// Check that normalizing a permutated set of valid components returns a
14211547
// triple with the unpermuted components.
14221548
//

0 commit comments

Comments
 (0)