Skip to content

Commit ba32690

Browse files
shiltianjharryma
authored andcommitted
[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. (cherry picked from commit ebef440)
1 parent d528a8e commit ba32690

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
@@ -358,14 +358,26 @@ class Triple {
358358
/// @name Normalization
359359
/// @{
360360

361+
/// Canonical form
362+
enum class CanonicalForm {
363+
ANY = 0,
364+
THREE_IDENT = 3, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM
365+
FOUR_IDENT = 4, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT
366+
FIVE_IDENT = 5, // ARCHITECTURE-VENDOR-OPERATING_SYSTEM-ENVIRONMENT-FORMAT
367+
};
368+
361369
/// Turn an arbitrary machine specification into the canonical triple form (or
362370
/// something sensible that the Triple class understands if nothing better can
363371
/// reasonably be done). In particular, it handles the common case in which
364-
/// otherwise valid components are in the wrong order.
365-
static std::string normalize(StringRef Str);
372+
/// otherwise valid components are in the wrong order. \p Form is used to
373+
/// specify the output canonical form.
374+
static std::string normalize(StringRef Str,
375+
CanonicalForm Form = CanonicalForm::ANY);
366376

367377
/// Return the normalized form of this triple's string.
368-
std::string normalize() const { return normalize(Data); }
378+
std::string normalize(CanonicalForm Form = CanonicalForm::ANY) const {
379+
return normalize(Data, Form);
380+
}
369381

370382
/// @}
371383
/// @name Typed Component Access

llvm/lib/TargetParser/Triple.cpp

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

1092-
std::string Triple::normalize(StringRef Str) {
1092+
std::string Triple::normalize(StringRef Str, CanonicalForm Form) {
10931093
bool IsMinGW32 = false;
10941094
bool IsCygwin = false;
10951095

@@ -1295,6 +1295,19 @@ std::string Triple::normalize(StringRef Str) {
12951295
Components[0] = getDXILArchNameFromShaderModel(Components[2]);
12961296
}
12971297
}
1298+
1299+
// Canonicalize the components if necessary.
1300+
switch (Form) {
1301+
case CanonicalForm::ANY:
1302+
break;
1303+
case CanonicalForm::THREE_IDENT:
1304+
case CanonicalForm::FOUR_IDENT:
1305+
case CanonicalForm::FIVE_IDENT: {
1306+
Components.resize(static_cast<unsigned>(Form), "unknown");
1307+
break;
1308+
}
1309+
}
1310+
12981311
// Stick the corrected components back together to form the normalized string.
12991312
return join(Components, "-");
13001313
}

llvm/unittests/TargetParser/TripleTest.cpp

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

12391239
EXPECT_EQ("x86_64-unknown-linux-gnu", Triple::normalize("x86_64-gnu-linux"));
12401240

1241+
EXPECT_EQ("a-unknown-unknown",
1242+
Triple::normalize("a", Triple::CanonicalForm::THREE_IDENT));
1243+
EXPECT_EQ("a-b-unknown",
1244+
Triple::normalize("a-b", Triple::CanonicalForm::THREE_IDENT));
1245+
EXPECT_EQ("a-b-c",
1246+
Triple::normalize("a-b-c", Triple::CanonicalForm::THREE_IDENT));
1247+
EXPECT_EQ("a-b-c",
1248+
Triple::normalize("a-b-c-d", Triple::CanonicalForm::THREE_IDENT));
1249+
EXPECT_EQ("a-b-c",
1250+
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::THREE_IDENT));
1251+
1252+
EXPECT_EQ("a-unknown-unknown-unknown",
1253+
Triple::normalize("a", Triple::CanonicalForm::FOUR_IDENT));
1254+
EXPECT_EQ("a-b-unknown-unknown",
1255+
Triple::normalize("a-b", Triple::CanonicalForm::FOUR_IDENT));
1256+
EXPECT_EQ("a-b-c-unknown",
1257+
Triple::normalize("a-b-c", Triple::CanonicalForm::FOUR_IDENT));
1258+
EXPECT_EQ("a-b-c-d",
1259+
Triple::normalize("a-b-c-d", Triple::CanonicalForm::FOUR_IDENT));
1260+
EXPECT_EQ("a-b-c-d",
1261+
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::FOUR_IDENT));
1262+
1263+
EXPECT_EQ("a-unknown-unknown-unknown-unknown",
1264+
Triple::normalize("a", Triple::CanonicalForm::FIVE_IDENT));
1265+
EXPECT_EQ("a-b-unknown-unknown-unknown",
1266+
Triple::normalize("a-b", Triple::CanonicalForm::FIVE_IDENT));
1267+
EXPECT_EQ("a-b-c-unknown-unknown",
1268+
Triple::normalize("a-b-c", Triple::CanonicalForm::FIVE_IDENT));
1269+
EXPECT_EQ("a-b-c-d-unknown",
1270+
Triple::normalize("a-b-c-d", Triple::CanonicalForm::FIVE_IDENT));
1271+
EXPECT_EQ("a-b-c-d-e",
1272+
Triple::normalize("a-b-c-d-e", Triple::CanonicalForm::FIVE_IDENT));
1273+
1274+
EXPECT_EQ("i386-b-c-unknown",
1275+
Triple::normalize("i386-b-c", Triple::CanonicalForm::FOUR_IDENT));
1276+
EXPECT_EQ("i386-b-c-unknown-unknown",
1277+
Triple::normalize("i386-b-c", Triple::CanonicalForm::FIVE_IDENT));
1278+
1279+
EXPECT_EQ("i386-a-c-unknown",
1280+
Triple::normalize("a-i386-c", Triple::CanonicalForm::FOUR_IDENT));
1281+
EXPECT_EQ("i386-a-c-unknown-unknown",
1282+
Triple::normalize("a-i386-c", Triple::CanonicalForm::FIVE_IDENT));
1283+
1284+
EXPECT_EQ("i386-a-b-unknown",
1285+
Triple::normalize("a-b-i386", Triple::CanonicalForm::FOUR_IDENT));
1286+
EXPECT_EQ("i386-a-b-c",
1287+
Triple::normalize("a-b-c-i386", Triple::CanonicalForm::FOUR_IDENT));
1288+
1289+
EXPECT_EQ("a-pc-c-unknown",
1290+
Triple::normalize("a-pc-c", Triple::CanonicalForm::FOUR_IDENT));
1291+
EXPECT_EQ("unknown-pc-b-c",
1292+
Triple::normalize("pc-b-c", Triple::CanonicalForm::FOUR_IDENT));
1293+
EXPECT_EQ("a-pc-b-unknown",
1294+
Triple::normalize("a-b-pc", Triple::CanonicalForm::FOUR_IDENT));
1295+
EXPECT_EQ("a-pc-b-c",
1296+
Triple::normalize("a-b-c-pc", Triple::CanonicalForm::FOUR_IDENT));
1297+
1298+
EXPECT_EQ("a-b-linux-unknown",
1299+
Triple::normalize("a-b-linux", Triple::CanonicalForm::FOUR_IDENT));
1300+
// We lose `-c` here as expected.
1301+
EXPECT_EQ("unknown-unknown-linux-b",
1302+
Triple::normalize("linux-b-c", Triple::CanonicalForm::FOUR_IDENT));
1303+
EXPECT_EQ("a-unknown-linux-c",
1304+
Triple::normalize("a-linux-c", Triple::CanonicalForm::FOUR_IDENT));
1305+
1306+
EXPECT_EQ("i386-pc-a-unknown",
1307+
Triple::normalize("a-pc-i386", Triple::CanonicalForm::FOUR_IDENT));
1308+
EXPECT_EQ("i386-pc-unknown-unknown",
1309+
Triple::normalize("-pc-i386", Triple::CanonicalForm::FOUR_IDENT));
1310+
EXPECT_EQ("unknown-pc-linux-c",
1311+
Triple::normalize("linux-pc-c", Triple::CanonicalForm::FOUR_IDENT));
1312+
EXPECT_EQ("unknown-pc-linux-unknown",
1313+
Triple::normalize("linux-pc-", Triple::CanonicalForm::FOUR_IDENT));
1314+
1315+
EXPECT_EQ("i386-unknown-unknown-unknown",
1316+
Triple::normalize("i386", Triple::CanonicalForm::FOUR_IDENT));
1317+
EXPECT_EQ("unknown-pc-unknown-unknown",
1318+
Triple::normalize("pc", Triple::CanonicalForm::FOUR_IDENT));
1319+
EXPECT_EQ("unknown-unknown-linux-unknown",
1320+
Triple::normalize("linux", Triple::CanonicalForm::FOUR_IDENT));
1321+
1322+
EXPECT_EQ(
1323+
"x86_64-unknown-linux-gnu",
1324+
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FOUR_IDENT));
1325+
1326+
EXPECT_EQ("i386-a-b-unknown-unknown",
1327+
Triple::normalize("a-b-i386", Triple::CanonicalForm::FIVE_IDENT));
1328+
EXPECT_EQ("i386-a-b-c-unknown",
1329+
Triple::normalize("a-b-c-i386", Triple::CanonicalForm::FIVE_IDENT));
1330+
1331+
EXPECT_EQ("a-pc-c-unknown-unknown",
1332+
Triple::normalize("a-pc-c", Triple::CanonicalForm::FIVE_IDENT));
1333+
EXPECT_EQ("unknown-pc-b-c-unknown",
1334+
Triple::normalize("pc-b-c", Triple::CanonicalForm::FIVE_IDENT));
1335+
EXPECT_EQ("a-pc-b-unknown-unknown",
1336+
Triple::normalize("a-b-pc", Triple::CanonicalForm::FIVE_IDENT));
1337+
EXPECT_EQ("a-pc-b-c-unknown",
1338+
Triple::normalize("a-b-c-pc", Triple::CanonicalForm::FIVE_IDENT));
1339+
1340+
EXPECT_EQ("a-b-linux-unknown-unknown",
1341+
Triple::normalize("a-b-linux", Triple::CanonicalForm::FIVE_IDENT));
1342+
EXPECT_EQ("unknown-unknown-linux-b-c",
1343+
Triple::normalize("linux-b-c", Triple::CanonicalForm::FIVE_IDENT));
1344+
EXPECT_EQ("a-unknown-linux-c-unknown",
1345+
Triple::normalize("a-linux-c", Triple::CanonicalForm::FIVE_IDENT));
1346+
1347+
EXPECT_EQ("i386-pc-a-unknown-unknown",
1348+
Triple::normalize("a-pc-i386", Triple::CanonicalForm::FIVE_IDENT));
1349+
EXPECT_EQ("i386-pc-unknown-unknown-unknown",
1350+
Triple::normalize("-pc-i386", Triple::CanonicalForm::FIVE_IDENT));
1351+
EXPECT_EQ("unknown-pc-linux-c-unknown",
1352+
Triple::normalize("linux-pc-c", Triple::CanonicalForm::FIVE_IDENT));
1353+
EXPECT_EQ("unknown-pc-linux-unknown-unknown",
1354+
Triple::normalize("linux-pc-", Triple::CanonicalForm::FIVE_IDENT));
1355+
1356+
EXPECT_EQ("i386-unknown-unknown-unknown-unknown",
1357+
Triple::normalize("i386", Triple::CanonicalForm::FIVE_IDENT));
1358+
EXPECT_EQ("unknown-pc-unknown-unknown-unknown",
1359+
Triple::normalize("pc", Triple::CanonicalForm::FIVE_IDENT));
1360+
EXPECT_EQ("unknown-unknown-linux-unknown-unknown",
1361+
Triple::normalize("linux", Triple::CanonicalForm::FIVE_IDENT));
1362+
1363+
EXPECT_EQ(
1364+
"x86_64-unknown-linux-gnu-unknown",
1365+
Triple::normalize("x86_64-gnu-linux", Triple::CanonicalForm::FIVE_IDENT));
1366+
12411367
// Check that normalizing a permutated set of valid components returns a
12421368
// triple with the unpermuted components.
12431369
//

0 commit comments

Comments
 (0)