From eb4fc2d4fefe2638f986aeb0fa2368ff88c584d5 Mon Sep 17 00:00:00 2001 From: maik Date: Tue, 7 Jan 2020 15:33:33 +0100 Subject: [PATCH 1/6] Export scalar statics in wasm --- src/librustc_codegen_ssa/back/symbol_export.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs index edd0fa5042707..9cf0f0a801e1a 100644 --- a/src/librustc_codegen_ssa/back/symbol_export.rs +++ b/src/librustc_codegen_ssa/back/symbol_export.rs @@ -349,7 +349,12 @@ fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel if let Some(Node::Item(&hir::Item { kind: hir::ItemKind::Static(..), .. })) = tcx.hir().get_if_local(sym_def_id) { - return SymbolExportLevel::Rust; + let export_level = if tcx.type_of(sym_def_id).is_scalar() { + SymbolExportLevel::C + } else { + SymbolExportLevel::Rust + }; + return export_level; } } From 093fb856a32c93941db9297cc452444d9c628ce4 Mon Sep 17 00:00:00 2001 From: maik Date: Tue, 7 Jan 2020 16:20:58 +0100 Subject: [PATCH 2/6] Always export static variables as SymbolExportLevel::C in wasm --- src/librustc_codegen_ssa/back/symbol_export.rs | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/librustc_codegen_ssa/back/symbol_export.rs b/src/librustc_codegen_ssa/back/symbol_export.rs index 9cf0f0a801e1a..a406b5f103b9d 100644 --- a/src/librustc_codegen_ssa/back/symbol_export.rs +++ b/src/librustc_codegen_ssa/back/symbol_export.rs @@ -345,16 +345,11 @@ fn symbol_export_level(tcx: TyCtxt<'_>, sym_def_id: DefId) -> SymbolExportLevel if is_extern && !std_internal { let target = &tcx.sess.target.target.llvm_target; // WebAssembly cannot export data symbols, so reduce their export level - if target.contains("wasm32") || target.contains("emscripten") { + if target.contains("emscripten") { if let Some(Node::Item(&hir::Item { kind: hir::ItemKind::Static(..), .. })) = tcx.hir().get_if_local(sym_def_id) { - let export_level = if tcx.type_of(sym_def_id).is_scalar() { - SymbolExportLevel::C - } else { - SymbolExportLevel::Rust - }; - return export_level; + return SymbolExportLevel::Rust; } } From a526c8d7fd3740723b35b708eaa3c1bc7be3f928 Mon Sep 17 00:00:00 2001 From: Maik Klein Date: Tue, 7 Jan 2020 19:37:24 +0100 Subject: [PATCH 3/6] Add tests for static variables --- .../run-make/wasm-export-all-symbols/bar.rs | 3 +++ .../wasm-export-all-symbols/verify.js | 24 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/test/run-make/wasm-export-all-symbols/bar.rs b/src/test/run-make/wasm-export-all-symbols/bar.rs index c5de87e8e7230..ac9c20a57e5a4 100644 --- a/src/test/run-make/wasm-export-all-symbols/bar.rs +++ b/src/test/run-make/wasm-export-all-symbols/bar.rs @@ -2,3 +2,6 @@ #[no_mangle] pub extern fn foo() {} + +#[no_mangle] +pub static FOO: u64 = 42; diff --git a/src/test/run-make/wasm-export-all-symbols/verify.js b/src/test/run-make/wasm-export-all-symbols/verify.js index 7b6fc7a45682b..589796206132d 100644 --- a/src/test/run-make/wasm-export-all-symbols/verify.js +++ b/src/test/run-make/wasm-export-all-symbols/verify.js @@ -8,21 +8,31 @@ let list = WebAssembly.Module.exports(m); console.log('exports', list); const my_exports = {}; -let nexports = 0; +let nexports_fn = 0; +let nexports_global = 0; for (const entry of list) { - if (entry.kind !== 'function') - continue; - my_exports[entry.name] = true; - nexports += 1; + if (entry.kind == 'function'){ + nexports_fn += 1; + } + if (entry.kind == 'global'){ + nexports_global += 1; + } + my_exports[entry.name] = true; } if (my_exports.foo === undefined) throw new Error("`foo` wasn't defined"); +if (my_exports.FOO === undefined) + throw new Error("`FOO` wasn't defined"); + if (my_exports.main === undefined) { - if (nexports != 1) + if (nexports_fn != 1) throw new Error("should only have one function export"); } else { - if (nexports != 2) + if (nexports_fn != 2) throw new Error("should only have two function exports"); } + +if (nexports_global != 1) + throw new Error("should only have one static export"); From eddb3f0668398a6a9cdd90fa111f5ea569b395de Mon Sep 17 00:00:00 2001 From: Maik Klein Date: Tue, 7 Jan 2020 19:41:59 +0100 Subject: [PATCH 4/6] Fix indentation --- src/test/run-make/wasm-export-all-symbols/verify.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/run-make/wasm-export-all-symbols/verify.js b/src/test/run-make/wasm-export-all-symbols/verify.js index 589796206132d..cfb7817c5404a 100644 --- a/src/test/run-make/wasm-export-all-symbols/verify.js +++ b/src/test/run-make/wasm-export-all-symbols/verify.js @@ -17,7 +17,7 @@ for (const entry of list) { if (entry.kind == 'global'){ nexports_global += 1; } - my_exports[entry.name] = true; + my_exports[entry.name] = true; } if (my_exports.foo === undefined) From b81ab44a8fee7ad838f5abba881547078df7d9ce Mon Sep 17 00:00:00 2001 From: maik Date: Wed, 8 Jan 2020 09:53:33 +0100 Subject: [PATCH 5/6] Remove unnecessary global counting --- .../run-make/wasm-export-all-symbols/verify.js | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/test/run-make/wasm-export-all-symbols/verify.js b/src/test/run-make/wasm-export-all-symbols/verify.js index cfb7817c5404a..a42aec45535a9 100644 --- a/src/test/run-make/wasm-export-all-symbols/verify.js +++ b/src/test/run-make/wasm-export-all-symbols/verify.js @@ -8,14 +8,11 @@ let list = WebAssembly.Module.exports(m); console.log('exports', list); const my_exports = {}; -let nexports_fn = 0; -let nexports_global = 0; +let nexports = 0; + for (const entry of list) { if (entry.kind == 'function'){ - nexports_fn += 1; - } - if (entry.kind == 'global'){ - nexports_global += 1; + nexports += 1; } my_exports[entry.name] = true; } @@ -27,12 +24,9 @@ if (my_exports.FOO === undefined) throw new Error("`FOO` wasn't defined"); if (my_exports.main === undefined) { - if (nexports_fn != 1) + if (nexports != 1) throw new Error("should only have one function export"); } else { - if (nexports_fn != 2) + if (nexports != 2) throw new Error("should only have two function exports"); } - -if (nexports_global != 1) - throw new Error("should only have one static export"); From f1fb384cd62dc13d0b4647c9f988f6f46cbf4b6f Mon Sep 17 00:00:00 2001 From: maik Date: Wed, 8 Jan 2020 10:05:44 +0100 Subject: [PATCH 6/6] Check for the entry kind --- src/test/run-make/wasm-export-all-symbols/verify.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/run-make/wasm-export-all-symbols/verify.js b/src/test/run-make/wasm-export-all-symbols/verify.js index a42aec45535a9..72db3356f5635 100644 --- a/src/test/run-make/wasm-export-all-symbols/verify.js +++ b/src/test/run-make/wasm-export-all-symbols/verify.js @@ -14,13 +14,13 @@ for (const entry of list) { if (entry.kind == 'function'){ nexports += 1; } - my_exports[entry.name] = true; + my_exports[entry.name] = entry.kind; } -if (my_exports.foo === undefined) +if (my_exports.foo != "function") throw new Error("`foo` wasn't defined"); -if (my_exports.FOO === undefined) +if (my_exports.FOO != "global") throw new Error("`FOO` wasn't defined"); if (my_exports.main === undefined) {