From 05262fa55762433ccaf4f2291b891692e6a7f76a Mon Sep 17 00:00:00 2001 From: Molly Tian Date: Thu, 5 Oct 2023 14:16:16 -0700 Subject: [PATCH] Remap symbols from binaryen symbol map to their original java qualified binary names. PiperOrigin-RevId: 571127599 --- .../j2wasm_application.bzl | 25 +++++++++++++++++-- ...rowingStacktraceTest.stacktrace_j2wasm.txt | 17 ++++++------- ...ktraceTest.stacktrace_j2wasm_optimized.txt | 9 +++---- .../backend/wasm/WasmOutputsGenerator.java | 23 +++++++++++++++++ 4 files changed, 58 insertions(+), 16 deletions(-) diff --git a/build_defs/internal_do_not_use/j2wasm_application.bzl b/build_defs/internal_do_not_use/j2wasm_application.bzl index d783cd2f94..5ffedae37d 100644 --- a/build_defs/internal_do_not_use/j2wasm_application.bzl +++ b/build_defs/internal_do_not_use/j2wasm_application.bzl @@ -134,6 +134,7 @@ def _impl_j2wasm_application(ctx): input = ctx.outputs.wat input_source_map = None + binaryen_symbolmap = ctx.actions.declare_file(ctx.label.name + ".binaryen.symbolmap") stages = _extract_stages(ctx.attr.binaryen_args) current_stage = 0 for stage_args in stages: @@ -163,8 +164,8 @@ def _impl_j2wasm_application(ctx): args.add("--output-source-map-url", source_map_base_url + "/" + ctx.outputs.srcmap.basename) # SymbolMap flag must be after optimization passes to get the final symbol names. - args.add("--symbolmap=" + ctx.outputs.symbolmap.path) - outputs.append(ctx.outputs.symbolmap) + args.add("--symbolmap=" + binaryen_symbolmap.path) + outputs.append(binaryen_symbolmap) # Always keep the embedded debug information if explicitly asked by user. if ctx.attr.enable_debug_info or ctx.var.get("J2CL_APP_STYLE", "") == "PRETTY": @@ -203,6 +204,8 @@ def _impl_j2wasm_application(ctx): input = output input_source_map = output_source_map + _remap_symbol_map(ctx, transpile_out, binaryen_symbolmap) + runfiles.append(ctx.outputs.wasm) # Make the debugging data available in runfiles. @@ -285,6 +288,24 @@ def _extract_stages(args): def _trigger_javac_build(deps): return depset(transitive = [d[J2wasmInfo]._private_.java_info.transitive_runtime_jars for d in deps]) +def _remap_symbol_map(ctx, transpile_out, binaryen_symbolmap): + ctx.actions.run_shell( + inputs = [transpile_out, binaryen_symbolmap], + outputs = [ctx.outputs.symbolmap], + command = + """awk 'BEGIN { FS = ":" } { + from = $1; + to = substr($0, length(from) + length(FS) + 1); + if (from ~ /^[0-9]+$/) { + symbols[from] = to in mapping ? mapping[to] : to + } else { + mapping[from] = to + } + } END { + for (i in symbols) print i":"symbols[i] + }' %s/namemap %s > %s""" % (transpile_out.path, binaryen_symbolmap.path, ctx.outputs.symbolmap.path), + ) + _J2WASM_APP_ATTRS = { "deps": attr.label_list(providers = [J2wasmInfo]), "entry_points": attr.string_list(), diff --git a/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm.txt b/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm.txt index 28d2661925..5a0ef1fc14 100644 --- a/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm.txt +++ b/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm.txt @@ -1,13 +1,12 @@ java.lang.RuntimeException: __the_message__! And second line! at create(jre/java/super-wasm/exception_utils.js:26:13) - at m_createJsError__java_lang_Throwable__javaemul_internal_Exceptions_JsErrorWrapper@javaemul.internal.Exceptions(Exceptions.java:55) - at $create__java_lang_String@java.lang.RuntimeException(RuntimeException.java:28) - at m_method3__void@com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest(SimpleThrowingStacktraceTest.java:40) - at m_method2__void@com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest(SimpleThrowingStacktraceTest.java:35) - at m_method1__void@com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest(SimpleThrowingStacktraceTest.java:31) - at m_test__void@com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest(SimpleThrowingStacktraceTest.java:27) - at m_testInSimpleThrowingStacktraceTest__void@javatests.com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest_Adapter(SimpleThrowingStacktraceTest_Adapter.java:43) - at m_testInSimpleThrowingStacktraceTest__$export__void@javatests.com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest_Adapter(SimpleThrowingStacktraceTest_Adapter.java:41) - at Object.test(junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest-j2wasm_generated_suite.js.zip!/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.js:37:59) + at javaemul.internal.Exceptions.createJsError(Exceptions.java:55) + at java.lang.RuntimeException.(RuntimeException.java:28) + at com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest.method3(SimpleThrowingStacktraceTest.java:40) + at com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest.method2(SimpleThrowingStacktraceTest.java:35) + at com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest.method1(SimpleThrowingStacktraceTest.java:31) + at com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest.test(SimpleThrowingStacktraceTest.java:27) + __OPTIONAL__ # Testing infra on J2CL + __OPTIONAL__ # Testing infra on J2CL __OPTIONAL__ # Testing infra on J2CL \ No newline at end of file diff --git a/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm_optimized.txt b/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm_optimized.txt index 9e22c5cc3a..14b59364e4 100644 --- a/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm_optimized.txt +++ b/junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.stacktrace_j2wasm_optimized.txt @@ -1,7 +1,6 @@ java.lang.RuntimeException: __the_message__! - And second line! +And second line! at create(jre/java/super-wasm/exception_utils.js:26:13) - at m_createJsError__java_lang_Throwable__javaemul_internal_Exceptions_JsErrorWrapper@javaemul.internal.Exceptions(Exceptions.java:55) - at m_testInSimpleThrowingStacktraceTest__$export__void@javatests.com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest_Adapter(RuntimeException.java:28) - at Object.test(junit/generator/javatests/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest-j2wasm_optimized_generated_suite.js.zip!/com/google/j2cl/junit/integration/stacktrace/data/SimpleThrowingStacktraceTest.js:37:59) - __OPTIONAL__ # Testing infra on J2CL \ No newline at end of file + at javaemul.internal.Exceptions.createJsError(Exceptions.java:55) + at javatests.com.google.j2cl.junit.integration.stacktrace.data.SimpleThrowingStacktraceTest_Adapter.testInSimpleThrowingStacktraceTest__$export(RuntimeException.java:28) + __OPTIONAL__ # Testing infra on J2CL \ No newline at end of file diff --git a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmOutputsGenerator.java b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmOutputsGenerator.java index eba903fb68..4eba3257d3 100644 --- a/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmOutputsGenerator.java +++ b/transpiler/java/com/google/j2cl/transpiler/backend/wasm/WasmOutputsGenerator.java @@ -15,6 +15,7 @@ */ package com.google.j2cl.transpiler.backend.wasm; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Predicates.not; import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.String.format; @@ -171,6 +172,7 @@ private void generateWasmModule(Library library) { builder.newLine(); builder.append(")"); output.write("module.wat", builder.build()); + output.write("namemap", emitNameMapping(library)); } private void emitDataSegments(Library library) { @@ -922,4 +924,25 @@ private void emitEndCodeComment(String commentId) { private void generateJsImportsFile() { JsImportsGenerator.generateOutputs(output, environment.getJsImports()); } + + private String emitNameMapping(Library library) { + SourceBuilder builder = new SourceBuilder(); + library.accept( + new AbstractVisitor() { + @Override + public void exitMethod(Method method) { + MethodDescriptor methodDescriptor = method.getDescriptor(); + String methodImplementationName = + environment.getMethodImplementationName(methodDescriptor); + checkState(methodImplementationName.startsWith("$")); + builder.append( + String.format( + "%s:%s", + methodImplementationName.substring(1), + methodDescriptor.getQualifiedBinaryName())); + builder.newLine(); + } + }); + return builder.build(); + } }