Skip to content

Commit c45088c

Browse files
committed
[WebAssembly] Add -i128:128 to the datalayout string.
Clang [defaults to aligning `__int128_t` to 16 bytes], while LLVM `datalayout` strings [default to aligning `i128` to 8 bytes]. Wasm is currently using the defaults for both, so it's inconsistent. Fix this by adding `-i128:128` to Wasm's `datalayout` string so that it aligns `i128` to 16 bytes too. This is similar to dbad963 for SPARC. This fixes rust-lang/rust#133991; see that issue for further discussion. [defaults to aligning `__int128_t` to 16 bytes]: https://github.com/llvm/llvm-project/blob/f8b4182f076f8fe55f9d5f617b5a25008a77b22f/clang/lib/Basic/TargetInfo.cpp#L77 [default to aligning `i128` to 8 bytes]: https://llvm.org/docs/LangRef.html#langref-datalayout
1 parent 4e59721 commit c45088c

File tree

6 files changed

+55
-15
lines changed

6 files changed

+55
-15
lines changed

clang/lib/Basic/Targets/WebAssembly.h

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,11 +183,12 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly32TargetInfo
183183
const TargetOptions &Opts)
184184
: WebAssemblyTargetInfo(T, Opts) {
185185
if (T.isOSEmscripten())
186-
resetDataLayout("e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-f128:64-n32:64-"
187-
"S128-ni:1:10:20");
188-
else
189186
resetDataLayout(
190-
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20");
187+
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-"
188+
"S128-ni:1:10:20");
189+
else
190+
resetDataLayout("e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-"
191+
"S128-ni:1:10:20");
191192
}
192193

193194
protected:
@@ -207,11 +208,12 @@ class LLVM_LIBRARY_VISIBILITY WebAssembly64TargetInfo
207208
PtrDiffType = SignedLong;
208209
IntPtrType = SignedLong;
209210
if (T.isOSEmscripten())
210-
resetDataLayout("e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-f128:64-n32:64-"
211-
"S128-ni:1:10:20");
212-
else
213211
resetDataLayout(
214-
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20");
212+
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-f128:64-n32:64-"
213+
"S128-ni:1:10:20");
214+
else
215+
resetDataLayout("e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-"
216+
"S128-ni:1:10:20");
215217
}
216218

217219
protected:

clang/test/CodeGen/target-data.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,11 +108,11 @@
108108

109109
// RUN: %clang_cc1 -triple wasm32-unknown-unknown -o - -emit-llvm %s | \
110110
// RUN: FileCheck %s -check-prefix=WEBASSEMBLY32
111-
// WEBASSEMBLY32: target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
111+
// WEBASSEMBLY32: target datalayout = "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20"
112112

113113
// RUN: %clang_cc1 -triple wasm64-unknown-unknown -o - -emit-llvm %s | \
114114
// RUN: FileCheck %s -check-prefix=WEBASSEMBLY64
115-
// WEBASSEMBLY64: target datalayout = "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20"
115+
// WEBASSEMBLY64: target datalayout = "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20"
116116

117117
// RUN: %clang_cc1 -triple lanai-unknown-unknown -o - -emit-llvm %s | \
118118
// RUN: FileCheck %s -check-prefix=LANAI

llvm/lib/IR/AutoUpgrade.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5559,7 +5559,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
55595559
return Res;
55605560
}
55615561

5562-
if (T.isSPARC() || (T.isMIPS64() && !DL.contains("m:m"))) {
5562+
if (T.isSPARC() || (T.isMIPS64() && !DL.contains("m:m")) || T.isWasm()) {
55635563
// Mips64 with o32 ABI did not add "-i128:128".
55645564
// Add "-i128:128"
55655565
std::string I64 = "-i64:64";

llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,13 @@ WebAssemblyTargetMachine::WebAssemblyTargetMachine(
118118
T,
119119
TT.isArch64Bit()
120120
? (TT.isOSEmscripten() ? "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
121-
"f128:64-n32:64-S128-ni:1:10:20"
121+
"i128:128-f128:64-n32:64-S128-ni:1:10:20"
122122
: "e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-"
123-
"n32:64-S128-ni:1:10:20")
123+
"i128:128-n32:64-S128-ni:1:10:20")
124124
: (TT.isOSEmscripten() ? "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
125-
"f128:64-n32:64-S128-ni:1:10:20"
125+
"i128:128-f128:64-n32:64-S128-ni:1:10:20"
126126
: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-"
127-
"n32:64-S128-ni:1:10:20"),
127+
"i128:128-n32:64-S128-ni:1:10:20"),
128128
TT, CPU, FS, Options, getEffectiveRelocModel(RM, TT),
129129
getEffectiveCodeModel(CM, CodeModel::Large), OL),
130130
TLOF(new WebAssemblyTargetObjectFile()),
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
; RUN: llc < %s -march=wasm32 | FileCheck %s
2+
; RUN: llc < %s -march=wasm64 | FileCheck %s
3+
4+
; CHECK: .Li8:
5+
; CHECK-DAG: .size .Li8, 1
6+
@i8 = private constant i8 42
7+
8+
; CHECK: .p2align 1
9+
; CHECK-NEXT: .Li16:
10+
; CHECK-DAG: .size .Li16, 2
11+
@i16 = private constant i16 42
12+
13+
; CHECK: .p2align 2
14+
; CHECK-NEXT: .Li32:
15+
; CHECK-DAG: .size .Li32, 4
16+
@i32 = private constant i32 42
17+
18+
; CHECK: .p2align 3
19+
; CHECK-NEXT: .Li64:
20+
; CHECK-DAG: .size .Li64, 8
21+
@i64 = private constant i64 42
22+
23+
; CHECK: .p2align 4
24+
; CHECK-NEXT: .Li128:
25+
; CHECK-DAG: .size .Li128, 16
26+
@i128 = private constant i128 42

llvm/unittests/Bitcode/DataLayoutUpgradeTest.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,18 @@ TEST(DataLayoutUpgradeTest, ValidDataLayoutUpgrade) {
9292
"e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64", "mips64el"),
9393
"e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64");
9494

95+
// Check that WebAssembly targets add -i128:128.
96+
EXPECT_EQ(
97+
UpgradeDataLayoutString(
98+
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",
99+
"wasm32"),
100+
"e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");
101+
EXPECT_EQ(
102+
UpgradeDataLayoutString(
103+
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20",
104+
"wasm64"),
105+
"e-m:e-p:64:64-p10:8:8-p20:8:8-i64:64-i128:128-n32:64-S128-ni:1:10:20");
106+
95107
// Check that SPIR && SPIRV targets add -G1 if it's not present.
96108
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir"), "e-p:32:32-G1");
97109
EXPECT_EQ(UpgradeDataLayoutString("e-p:32:32", "spir64"), "e-p:32:32-G1");

0 commit comments

Comments
 (0)