Skip to content

Commit c1e1390

Browse files
committed
[AMDPGU] Auto-upgrade ELF mangling in the data layout
Summary: The changes in llvm#163011 caused all ELF platforms to default to ELF mangling. We want to auto upgrade this for linking in new programs to old ones. contains
1 parent 914fbe3 commit c1e1390

File tree

2 files changed

+59
-51
lines changed

2 files changed

+59
-51
lines changed

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6041,8 +6041,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
60416041
Triple T(TT);
60426042
// The only data layout upgrades needed for pre-GCN, SPIR or SPIRV are setting
60436043
// the address space of globals to 1. This does not apply to SPIRV Logical.
6044-
if (((T.isAMDGPU() && !T.isAMDGCN()) ||
6045-
(T.isSPIR() || (T.isSPIRV() && !T.isSPIRVLogical()))) &&
6044+
if ((T.isSPIR() || (T.isSPIRV() && !T.isSPIRVLogical())) &&
60466045
!DL.contains("-G") && !DL.starts_with("G")) {
60476046
return DL.empty() ? std::string("G1") : (DL + "-G1").str();
60486047
}
@@ -6055,35 +6054,43 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
60556054
return DL.str();
60566055
}
60576056

6057+
// AMDGPU data layout upgrades.
60586058
std::string Res = DL.str();
6059-
// AMDGCN data layout upgrades.
6060-
if (T.isAMDGCN()) {
6059+
if (T.isAMDGPU()) {
60616060
// Define address spaces for constants.
60626061
if (!DL.contains("-G") && !DL.starts_with("G"))
60636062
Res.append(Res.empty() ? "G1" : "-G1");
60646063

6065-
// Add missing non-integral declarations.
6066-
// This goes before adding new address spaces to prevent incoherent string
6067-
// values.
6068-
if (!DL.contains("-ni") && !DL.starts_with("ni"))
6069-
Res.append("-ni:7:8:9");
6070-
// Update ni:7 to ni:7:8:9.
6071-
if (DL.ends_with("ni:7"))
6072-
Res.append(":8:9");
6073-
if (DL.ends_with("ni:7:8"))
6074-
Res.append(":9");
6075-
6076-
// Add sizing for address spaces 7 and 8 (fat raw buffers and buffer
6077-
// resources) An empty data layout has already been upgraded to G1 by now.
6078-
if (!DL.contains("-p7") && !DL.starts_with("p7"))
6079-
Res.append("-p7:160:256:256:32");
6080-
if (!DL.contains("-p8") && !DL.starts_with("p8"))
6081-
Res.append("-p8:128:128:128:48");
6082-
constexpr StringRef OldP8("-p8:128:128-");
6083-
if (DL.contains(OldP8))
6084-
Res.replace(Res.find(OldP8), OldP8.size(), "-p8:128:128:128:48-");
6085-
if (!DL.contains("-p9") && !DL.starts_with("p9"))
6086-
Res.append("-p9:192:256:256:32");
6064+
// AMDGCN data layout upgrades.
6065+
if (T.isAMDGCN()) {
6066+
6067+
// Add missing non-integral declarations.
6068+
// This goes before adding new address spaces to prevent incoherent string
6069+
// values.
6070+
if (!DL.contains("-ni") && !DL.starts_with("ni"))
6071+
Res.append("-ni:7:8:9");
6072+
// Update ni:7 to ni:7:8:9.
6073+
if (DL.ends_with("ni:7"))
6074+
Res.append(":8:9");
6075+
if (DL.ends_with("ni:7:8"))
6076+
Res.append(":9");
6077+
6078+
// Add sizing for address spaces 7 and 8 (fat raw buffers and buffer
6079+
// resources) An empty data layout has already been upgraded to G1 by now.
6080+
if (!DL.contains("-p7") && !DL.starts_with("p7"))
6081+
Res.append("-p7:160:256:256:32");
6082+
if (!DL.contains("-p8") && !DL.starts_with("p8"))
6083+
Res.append("-p8:128:128:128:48");
6084+
constexpr StringRef OldP8("-p8:128:128-");
6085+
if (DL.contains(OldP8))
6086+
Res.replace(Res.find(OldP8), OldP8.size(), "-p8:128:128:128:48-");
6087+
if (!DL.contains("-p9") && !DL.starts_with("p9"))
6088+
Res.append("-p9:192:256:256:32");
6089+
}
6090+
6091+
// Upgrade the ELF mangling mode.
6092+
if (!DL.contains("m:e"))
6093+
Res = Res.empty() ? "m:e" : "m:e-" + Res;
60876094

60886095
return Res;
60896096
}

llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,20 +39,21 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
3939
"64-i128:128-n32:64-S128-Fn32");
4040

4141
// Check that AMDGPU targets add -G1 if it's not present.
42-
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "r600"), "e-p:32:32-G1");
42+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "r600"), "m:e-e-p:32:32-G1");
4343
// and that ANDGCN adds p7 and p8 as well.
4444
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64", "amdgcn"),
45-
"e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:"
46-
"256:256:32");
45+
"m:e-e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"
46+
"192:256:256:32");
4747
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G1", "amdgcn"),
48-
"e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:"
49-
"256:256:32");
48+
"m:e-e-p:64:64-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"
49+
"192:256:256:32");
5050
// Check that the old AMDGCN p8:128:128 definition is upgraded
5151
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-p8:128:128-G1", "amdgcn"),
52-
"e-p:64:64-p8:128:128:128:48-G1-ni:7:8:9-p7:160:256:256:32-"
53-
"p9:192:256:256:32");
52+
"m:e-e-p:64:64-p8:128:128:128:48-G1-ni:7:8:9-p7:160:256:256:32-p9:"
53+
"192:256:256:32");
5454
// but that r600 does not.
55-
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G1", "r600"), "e-p:32:32-G1");
55+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G1", "r600"),
56+
"m:e-e-p:32:32-G1");
5657

5758
// Ensure that the non-integral direction for address space 8 doesn't get
5859
// added in to pointer declarations.
@@ -62,11 +63,10 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
6263
"64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-"
6364
"v1024:1024-v2048:2048-n32:64-S32-A5-G1-ni:7",
6465
"amdgcn"),
65-
"e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:64-"
66-
"v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:"
66+
"m:e-e-p:64:64-p1:64:64-p2:32:32-p3:32:32-p4:64:64-p5:32:32-p6:32:32-i64:"
67+
"64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:"
6768
"1024-v2048:2048-n32:64-S32-A5-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:"
68-
"128:48-"
69-
"p9:192:256:256:32");
69+
"128:48-p9:192:256:256:32");
7070

7171
// Check that RISCV64 upgrades -n64 to -n32:64.
7272
EXPECT_EQ(UpgradeDataLayoutString("e-m:e-p:64:64-i64:64-i128:128-n64-S128",
@@ -147,28 +147,29 @@ TEST(DataLayoutUpgradeTest, NoDataLayoutUpgrade) {
147147
"64-S128-Fn32");
148148

149149
// Check that AMDGPU targets don't add -G1 if there is already a -G flag.
150-
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "r600"), "e-p:32:32-G2");
151-
EXPECT_EQ(UpgradeDataLayoutString("G2", "r600"), "G2");
150+
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32-G2", "r600"),
151+
"m:e-e-p:32:32-G2");
152+
EXPECT_EQ(UpgradeDataLayoutString("G2", "r600"), "m:e-G2");
152153
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G2", "amdgcn"),
153-
"e-p:64:64-G2-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:"
154-
"256:256:32");
154+
"m:e-e-p:64:64-G2-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"
155+
"192:256:256:32");
155156
EXPECT_EQ(UpgradeDataLayoutString("G2-e-p:64:64", "amdgcn"),
156-
"G2-e-p:64:64-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:"
157-
"256:256:32");
157+
"m:e-G2-e-p:64:64-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"
158+
"192:256:256:32");
158159
EXPECT_EQ(UpgradeDataLayoutString("e-p:64:64-G0", "amdgcn"),
159-
"e-p:64:64-G0-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:"
160-
"256:256:32");
160+
"m:e-e-p:64:64-G0-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:"
161+
"192:256:256:32");
161162

162163
// Check that AMDGCN targets don't add already declared address space 7.
163164
EXPECT_EQ(
164165
UpgradeDataLayoutString("e-p:64:64-p7:64:64", "amdgcn"),
165-
"e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
166+
"m:e-e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
166167
EXPECT_EQ(
167168
UpgradeDataLayoutString("p7:64:64-G2-e-p:64:64", "amdgcn"),
168-
"p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
169+
"m:e-p7:64:64-G2-e-p:64:64-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
169170
EXPECT_EQ(
170171
UpgradeDataLayoutString("e-p:64:64-p7:64:64-G1", "amdgcn"),
171-
"e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
172+
"m:e-e-p:64:64-p7:64:64-G1-ni:7:8:9-p8:128:128:128:48-p9:192:256:256:32");
172173

173174
// Check that SPIR & SPIRV targets don't add -G1 if there is already a -G
174175
// flag.
@@ -198,10 +199,10 @@ TEST(DataLayoutUpgradeTest, EmptyDataLayout) {
198199
EXPECT_EQ(DL2, "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128");
199200

200201
// Check that AMDGPU targets add G1 if it's not present.
201-
EXPECT_EQ(UpgradeDataLayoutString("", "r600"), "G1");
202+
EXPECT_EQ(UpgradeDataLayoutString("", "r600"), "m:e-G1");
202203
EXPECT_EQ(
203204
UpgradeDataLayoutString("", "amdgcn"),
204-
"G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32");
205+
"m:e-G1-ni:7:8:9-p7:160:256:256:32-p8:128:128:128:48-p9:192:256:256:32");
205206

206207
// Check that SPIR & SPIRV targets add G1 if it's not present.
207208
EXPECT_EQ(UpgradeDataLayoutString("", "spir"), "G1");

0 commit comments

Comments
 (0)