From 5694dbccc3c8c778024fdfe3ff688cd838b45349 Mon Sep 17 00:00:00 2001 From: Wouter van Oortmerssen Date: Thu, 21 Oct 2021 13:44:54 -0700 Subject: [PATCH] [WebAssembly] support Memory64 in target_features section Differential Revision: https://reviews.llvm.org/D112266 --- .../Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 9 +++++++++ llvm/test/CodeGen/WebAssembly/memory64-feature.ll | 15 +++++++++++++++ llvm/test/MC/WebAssembly/debug-info64.ll | 6 ++++++ 3 files changed, 30 insertions(+) create mode 100644 llvm/test/CodeGen/WebAssembly/memory64-feature.ll diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index 66acd3519623..3851300f615e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -503,6 +503,15 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) { // This pseudo-feature tells the linker whether shared memory would be safe EmitFeature("shared-mem"); + // This is an "architecture", not a "feature", but we emit it as such for + // the benefit of tools like Binaryen and consistency with other producers. + // FIXME: Subtarget is null here, so can't Subtarget->hasAddr64() ? + if (M.getDataLayout().getMaxPointerSize() == 8) { + // Can't use EmitFeature since "wasm-feature-memory64" is not a module + // flag. + EmittedFeatures.push_back({wasm::WASM_FEATURE_PREFIX_USED, "memory64"}); + } + if (EmittedFeatures.size() == 0) return; diff --git a/llvm/test/CodeGen/WebAssembly/memory64-feature.ll b/llvm/test/CodeGen/WebAssembly/memory64-feature.ll new file mode 100644 index 000000000000..53fccfe08888 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/memory64-feature.ll @@ -0,0 +1,15 @@ +; RUN: llc < %s | FileCheck %s + +; Test that wasm64 is properly emitted into the target features section + +target triple = "wasm64-unknown-unknown" + +define void @foo() { + ret void +} + +; CHECK-LABEL: .custom_section.target_features +; CHECK-NEXT: .int8 1 +; CHECK-NEXT: .int8 43 +; CHECK-NEXT: .int8 8 +; CHECK-NEXT: .ascii "memory64" diff --git a/llvm/test/MC/WebAssembly/debug-info64.ll b/llvm/test/MC/WebAssembly/debug-info64.ll index a8d9a24a1f2b..60fa0cbfe987 100644 --- a/llvm/test/MC/WebAssembly/debug-info64.ll +++ b/llvm/test/MC/WebAssembly/debug-info64.ll @@ -129,6 +129,12 @@ ; CHECK-NEXT: Offset: 1073 ; CHECK-NEXT: Name: producers ; CHECK-NEXT: } +; CHECK-NEXT: Section { +; CHECK-NEXT: Type: CUSTOM (0x0) +; CHECK-NEXT: Size: 11 +; CHECK-NEXT: Offset: 1166 +; CHECK-NEXT: Name: target_features +; CHECK-NEXT: } ; CHECK-NEXT: ] ; CHECK-NEXT: Relocations [ ; CHECK-NEXT: Section (7) DATA {