summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/shell-interface.h2
-rw-r--r--src/tools/execution-results.h2
-rw-r--r--src/tools/wasm-ctor-eval.cpp11
-rw-r--r--src/wasm-interpreter.h8
-rw-r--r--test/lit/ctor-eval/exported-import.wast14
-rw-r--r--test/lit/exec/exported-import.wast14
6 files changed, 47 insertions, 4 deletions
diff --git a/src/shell-interface.h b/src/shell-interface.h
index e27f5c690..1efa31f79 100644
--- a/src/shell-interface.h
+++ b/src/shell-interface.h
@@ -133,7 +133,7 @@ struct ShellExternalInterface : ModuleRunner::ExternalInterface {
});
}
- Literals callImport(Function* import, Literals& arguments) override {
+ Literals callImport(Function* import, const Literals& arguments) override {
if (import->module == SPECTEST && import->base.startsWith(PRINT)) {
for (auto argument : arguments) {
std::cout << argument << " : " << argument.type << '\n';
diff --git a/src/tools/execution-results.h b/src/tools/execution-results.h
index 4ef087cec..0cd40959e 100644
--- a/src/tools/execution-results.h
+++ b/src/tools/execution-results.h
@@ -39,7 +39,7 @@ struct LoggingExternalInterface : public ShellExternalInterface {
LoggingExternalInterface(Loggings& loggings) : loggings(loggings) {}
- Literals callImport(Function* import, Literals& arguments) override {
+ Literals callImport(Function* import, const Literals& arguments) override {
if (import->module == "fuzzing-support") {
std::cout << "[LoggingExternalInterface logging";
loggings.push_back(Literal()); // buffer with a None between calls
diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp
index 1b60a9222..eb2a4eb5d 100644
--- a/src/tools/wasm-ctor-eval.cpp
+++ b/src/tools/wasm-ctor-eval.cpp
@@ -227,7 +227,7 @@ struct CtorEvalExternalInterface : EvallingModuleRunner::ExternalInterface {
});
}
- Literals callImport(Function* import, Literals& arguments) override {
+ Literals callImport(Function* import, const Literals& arguments) override {
Name WASI("wasi_snapshot_preview1");
if (ignoreExternalInput) {
@@ -1022,6 +1022,15 @@ EvalCtorOutcome evalCtor(EvallingModuleRunner& instance,
Name exportName) {
auto& wasm = instance.wasm;
auto* func = wasm.getFunction(funcName);
+ if (func->imported()) {
+ // We cannot evaluate an import.
+ if (!quiet) {
+ std::cout << " ...stopping since could not eval: call import: "
+ << func->module.toString() << "." << func->base.toString()
+ << '\n';
+ }
+ return EvalCtorOutcome();
+ }
// We don't know the values of parameters, so give up if there are any, unless
// we are ignoring them.
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h
index 3b451a787..8eb52e634 100644
--- a/src/wasm-interpreter.h
+++ b/src/wasm-interpreter.h
@@ -2382,7 +2382,8 @@ public:
virtual ~ExternalInterface() = default;
virtual void init(Module& wasm, SubType& instance) {}
virtual void importGlobals(GlobalValueSet& globals, Module& wasm) = 0;
- virtual Literals callImport(Function* import, Literals& arguments) = 0;
+ virtual Literals callImport(Function* import,
+ const Literals& arguments) = 0;
virtual Literals callTable(Name tableName,
Index index,
HeapType sig,
@@ -3907,6 +3908,11 @@ public:
// Call a function, starting an invocation.
Literals callFunction(Name name, const Literals& arguments) {
+ auto* func = wasm.getFunction(name);
+ if (func->imported()) {
+ return externalInterface->callImport(func, arguments);
+ }
+
// if the last call ended in a jump up the stack, it might have left stuff
// for us to clean up here
callDepth = 0;
diff --git a/test/lit/ctor-eval/exported-import.wast b/test/lit/ctor-eval/exported-import.wast
new file mode 100644
index 000000000..3ec2780bc
--- /dev/null
+++ b/test/lit/ctor-eval/exported-import.wast
@@ -0,0 +1,14 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+;; RUN: wasm-ctor-eval %s --ctors=export --kept-exports=export --quiet -all -S -o - | filecheck %s
+
+;; We cannot eval an exported import, and should exit with a message about
+;; that rather than an error.
+
+(module
+ ;; CHECK: (type $0 (func))
+
+ ;; CHECK: (import "spectest" "print" (func $import (type $0)))
+ (import "spectest" "print" (func $import))
+ ;; CHECK: (export "export" (func $import))
+ (export "export" (func $import))
+)
diff --git a/test/lit/exec/exported-import.wast b/test/lit/exec/exported-import.wast
new file mode 100644
index 000000000..5264e9e00
--- /dev/null
+++ b/test/lit/exec/exported-import.wast
@@ -0,0 +1,14 @@
+;; RUN: wasm-opt %s --fuzz-exec-before -q -o /dev/null 2>&1 | filecheck %s
+
+;; Execute an import that is immediately exported. We should not error here, but
+;; no other output is expected (as the import does nothing and is ignored).
+
+(module
+ (import "spectest" "nothing" (func $import))
+ (export "__wasm_call_ctors" (func $import))
+)
+
+;; Note this file does not use automatic updating as that only works for
+;; defined functions at the moment, and this module has none of those.
+
+;; CHECK: [fuzz-exec] calling __wasm_call_ctors