Skip to content

Commit 94cbe63

Browse files
dcodeIOkripken
authored andcommitted
Provide AddImport/AddExport for each element in the C-API (#1292)
* Provide AddImport/AddExport for each element in the C-API
1 parent 13ec76d commit 94cbe63

18 files changed

+1411
-1232
lines changed

bin/binaryen.js

Lines changed: 693 additions & 688 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bin/wasm.js

Lines changed: 493 additions & 493 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build-js.sh

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,10 @@ export_function "_BinaryenAtomicCmpxchgId"
176176
export_function "_BinaryenAtomicRMWId"
177177
export_function "_BinaryenAtomicWaitId"
178178
export_function "_BinaryenAtomicWakeId"
179+
export_function "_BinaryenExternalFunction"
180+
export_function "_BinaryenExternalTable"
181+
export_function "_BinaryenExternalMemory"
182+
export_function "_BinaryenExternalGlobal"
179183
export_function "_BinaryenModuleCreate"
180184
export_function "_BinaryenModuleDispose"
181185
export_function "_BinaryenAddFunctionType"
@@ -361,9 +365,15 @@ export_function "_BinaryenAddFunction"
361365
export_function "_BinaryenGetFunction"
362366
export_function "_BinaryenRemoveFunction"
363367
export_function "_BinaryenAddGlobal"
364-
export_function "_BinaryenAddImport"
368+
export_function "_BinaryenAddFunctionImport"
369+
export_function "_BinaryenAddTableImport"
370+
export_function "_BinaryenAddMemoryImport"
371+
export_function "_BinaryenAddGlobalImport"
365372
export_function "_BinaryenRemoveImport"
366-
export_function "_BinaryenAddExport"
373+
export_function "_BinaryenAddFunctionExport"
374+
export_function "_BinaryenAddTableExport"
375+
export_function "_BinaryenAddMemoryExport"
376+
export_function "_BinaryenAddGlobalExport"
367377
export_function "_BinaryenRemoveExport"
368378
export_function "_BinaryenSetFunctionTable"
369379
export_function "_BinaryenSetMemory"

src/binaryen-c.cpp

Lines changed: 115 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ BinaryenExpressionId BinaryenAtomicRMWId(void) { return Expression::Id::AtomicRM
137137
BinaryenExpressionId BinaryenAtomicWaitId(void) { return Expression::Id::AtomicWaitId; }
138138
BinaryenExpressionId BinaryenAtomicWakeId(void) { return Expression::Id::AtomicWakeId; }
139139

140+
// External kinds
141+
142+
BinaryenExternalKind BinaryenExternalFunction(void) { return static_cast<BinaryenExternalKind>(ExternalKind::Function); }
143+
BinaryenExternalKind BinaryenExternalTable(void) { return static_cast<BinaryenExternalKind>(ExternalKind::Table); }
144+
BinaryenExternalKind BinaryenExternalMemory(void) { return static_cast<BinaryenExternalKind>(ExternalKind::Memory); }
145+
BinaryenExternalKind BinaryenExternalGlobal(void) { return static_cast<BinaryenExternalKind>(ExternalKind::Global); }
146+
140147
// Modules
141148

142149
BinaryenModuleRef BinaryenModuleCreate(void) {
@@ -946,46 +953,149 @@ BinaryenGlobalRef BinaryenAddGlobal(BinaryenModuleRef module, const char* name,
946953

947954
// Imports
948955

949-
BinaryenImportRef BinaryenAddImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef type) {
956+
WASM_DEPRECATED BinaryenImportRef BinaryenAddImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef type) {
957+
return BinaryenAddFunctionImport(module, internalName, externalModuleName, externalBaseName, type);
958+
}
959+
BinaryenImportRef BinaryenAddFunctionImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef functionType) {
950960
if (tracing) {
951-
std::cout << " BinaryenAddImport(the_module, \"" << internalName << "\", \"" << externalModuleName << "\", \"" << externalBaseName << "\", functionTypes[" << functionTypes[type] << "]);\n";
961+
std::cout << " BinaryenAddFunctionImport(the_module, \"" << internalName << "\", \"" << externalModuleName << "\", \"" << externalBaseName << "\", functionTypes[" << functionTypes[functionType] << "]);\n";
952962
}
953963

954964
auto* wasm = (Module*)module;
955965
auto* ret = new Import();
956966
ret->name = internalName;
957967
ret->module = externalModuleName;
958968
ret->base = externalBaseName;
959-
ret->functionType = ((FunctionType*)type)->name;
969+
ret->functionType = ((FunctionType*)functionType)->name;
960970
ret->kind = ExternalKind::Function;
961971
wasm->addImport(ret);
962972
return ret;
963973
}
974+
BinaryenImportRef BinaryenAddTableImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char* externalBaseName) {
975+
if (tracing) {
976+
std::cout << " BinaryenAddTableImport(the_module, \"" << internalName << "\", \"" << externalModuleName << "\", \"" << externalBaseName << "\");\n";
977+
}
978+
979+
auto* wasm = (Module*)module;
980+
auto* ret = new Import();
981+
ret->name = internalName;
982+
ret->module = externalModuleName;
983+
ret->base = externalBaseName;
984+
ret->kind = ExternalKind::Table;
985+
if (wasm->table.name == ret->name) {
986+
wasm->table.imported = true;
987+
}
988+
wasm->addImport(ret);
989+
return ret;
990+
}
991+
BinaryenImportRef BinaryenAddMemoryImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char* externalBaseName) {
992+
if (tracing) {
993+
std::cout << " BinaryenAddMemoryImport(the_module, \"" << internalName << "\", \"" << externalModuleName << "\", \"" << externalBaseName << "\");\n";
994+
}
995+
996+
auto* wasm = (Module*)module;
997+
auto* ret = new Import();
998+
ret->name = internalName;
999+
ret->module = externalModuleName;
1000+
ret->base = externalBaseName;
1001+
ret->kind = ExternalKind::Memory;
1002+
if (wasm->memory.name == ret->name) {
1003+
wasm->memory.imported = true;
1004+
}
1005+
wasm->addImport(ret);
1006+
return ret;
1007+
}
1008+
BinaryenImportRef BinaryenAddGlobalImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char* externalBaseName, BinaryenType globalType) {
1009+
if (tracing) {
1010+
std::cout << " BinaryenAddGlobalImport(the_module, \"" << internalName << "\", \"" << externalModuleName << "\", \"" << externalBaseName << "\", " << globalType << ");\n";
1011+
}
9641012

1013+
auto* wasm = (Module*)module;
1014+
auto* ret = new Import();
1015+
ret->name = internalName;
1016+
ret->module = externalModuleName;
1017+
ret->base = externalBaseName;
1018+
ret->globalType = WasmType(globalType);
1019+
ret->kind = ExternalKind::Global;
1020+
wasm->addImport(ret);
1021+
return ret;
1022+
}
9651023
void BinaryenRemoveImport(BinaryenModuleRef module, const char* internalName) {
9661024
if (tracing) {
9671025
std::cout << " BinaryenRemoveImport(the_module, \"" << internalName << "\");\n";
9681026
}
9691027

9701028
auto* wasm = (Module*)module;
1029+
auto* import = wasm->getImport(internalName);
1030+
if (import->kind == ExternalKind::Table) {
1031+
if (import->name == wasm->table.name) {
1032+
wasm->table.imported = false;
1033+
}
1034+
} else if (import->kind == ExternalKind::Memory) {
1035+
if (import->name == wasm->memory.name) {
1036+
wasm->memory.imported = false;
1037+
}
1038+
}
9711039
wasm->removeImport(internalName);
9721040
}
9731041

9741042
// Exports
9751043

976-
BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
1044+
WASM_DEPRECATED BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
1045+
return BinaryenAddFunctionExport(module, internalName, externalName);
1046+
}
1047+
BinaryenExportRef BinaryenAddFunctionExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
1048+
if (tracing) {
1049+
std::cout << " BinaryenAddFunctionExport(the_module, \"" << internalName << "\", \"" << externalName << "\");\n";
1050+
}
1051+
1052+
auto* wasm = (Module*)module;
1053+
auto* ret = new Export();
1054+
ret->value = internalName;
1055+
ret->name = externalName;
1056+
ret->kind = ExternalKind::Function;
1057+
wasm->addExport(ret);
1058+
return ret;
1059+
}
1060+
BinaryenExportRef BinaryenAddTableExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
9771061
if (tracing) {
978-
std::cout << " BinaryenAddExport(the_module, \"" << internalName << "\", \"" << externalName << "\");\n";
1062+
std::cout << " BinaryenAddTableExport(the_module, \"" << internalName << "\", \"" << externalName << "\");\n";
9791063
}
9801064

9811065
auto* wasm = (Module*)module;
9821066
auto* ret = new Export();
9831067
ret->value = internalName;
9841068
ret->name = externalName;
1069+
ret->kind = ExternalKind::Table;
9851070
wasm->addExport(ret);
9861071
return ret;
9871072
}
1073+
BinaryenExportRef BinaryenAddMemoryExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
1074+
if (tracing) {
1075+
std::cout << " BinaryenAddMemoryExport(the_module, \"" << internalName << "\", \"" << externalName << "\");\n";
1076+
}
9881077

1078+
auto* wasm = (Module*)module;
1079+
auto* ret = new Export();
1080+
ret->value = internalName;
1081+
ret->name = externalName;
1082+
ret->kind = ExternalKind::Memory;
1083+
wasm->addExport(ret);
1084+
return ret;
1085+
}
1086+
BinaryenExportRef BinaryenAddGlobalExport(BinaryenModuleRef module, const char* internalName, const char* externalName) {
1087+
if (tracing) {
1088+
std::cout << " BinaryenAddGlobalExport(the_module, \"" << internalName << "\", \"" << externalName << "\");\n";
1089+
}
1090+
1091+
auto* wasm = (Module*)module;
1092+
auto* ret = new Export();
1093+
ret->value = internalName;
1094+
ret->name = externalName;
1095+
ret->kind = ExternalKind::Global;
1096+
wasm->addExport(ret);
1097+
return ret;
1098+
}
9891099
void BinaryenRemoveExport(BinaryenModuleRef module, const char* externalName) {
9901100
if (tracing) {
9911101
std::cout << " BinaryenRemoveExport(the_module, \"" << externalName << "\");\n";

src/binaryen-c.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
#include <stddef.h>
4848
#include <stdint.h>
4949

50+
#include "compiler-support.h"
51+
5052
#ifdef __cplusplus
5153
extern "C" {
5254
#endif
@@ -109,6 +111,15 @@ BinaryenExpressionId BinaryenAtomicRMWId(void);
109111
BinaryenExpressionId BinaryenAtomicWaitId(void);
110112
BinaryenExpressionId BinaryenAtomicWakeId(void);
111113

114+
// External kinds (call to get the value of each; you can cache them)
115+
116+
typedef uint32_t BinaryenExternalKind;
117+
118+
BinaryenExternalKind BinaryenExternalFunction(void);
119+
BinaryenExternalKind BinaryenExternalTable(void);
120+
BinaryenExternalKind BinaryenExternalMemory(void);
121+
BinaryenExternalKind BinaryenExternalGlobal(void);
122+
112123
// Modules
113124
//
114125
// Modules contain lists of functions, imports, exports, function types. The
@@ -410,14 +421,22 @@ void BinaryenRemoveFunction(BinaryenModuleRef module, const char* name);
410421

411422
typedef void* BinaryenImportRef;
412423

413-
BinaryenImportRef BinaryenAddImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef type);
424+
WASM_DEPRECATED BinaryenImportRef BinaryenAddImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef type);
425+
BinaryenImportRef BinaryenAddFunctionImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenFunctionTypeRef functionType);
426+
BinaryenImportRef BinaryenAddTableImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName);
427+
BinaryenImportRef BinaryenAddMemoryImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName);
428+
BinaryenImportRef BinaryenAddGlobalImport(BinaryenModuleRef module, const char* internalName, const char* externalModuleName, const char *externalBaseName, BinaryenType globalType);
414429
void BinaryenRemoveImport(BinaryenModuleRef module, const char* internalName);
415430

416431
// Exports
417432

418433
typedef void* BinaryenExportRef;
419434

420-
BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
435+
WASM_DEPRECATED BinaryenExportRef BinaryenAddExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
436+
BinaryenExportRef BinaryenAddFunctionExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
437+
BinaryenExportRef BinaryenAddTableExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
438+
BinaryenExportRef BinaryenAddMemoryExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
439+
BinaryenExportRef BinaryenAddGlobalExport(BinaryenModuleRef module, const char* internalName, const char* externalName);
421440
void BinaryenRemoveExport(BinaryenModuleRef module, const char* externalName);
422441

423442
// Globals

src/compiler-support.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,13 @@
4141

4242
#ifdef __GNUC__
4343
#define WASM_NORETURN __attribute__((noreturn))
44+
#define WASM_DEPRECATED __attribute__((deprecated))
4445
#elif defined(_MSC_VER)
4546
#define WASM_NORETURN __declspec(noreturn)
47+
#define WASM_DEPRECATED __declspec(deprecated)
4648
#else
4749
#define WASM_NORETURN
50+
#define WASM_DEPRECATED
4851
#endif
4952

5053
// The code might contain TODOs or stubs that read some values but do nothing

src/js/binaryen.js-post.js

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,19 +1034,51 @@
10341034
return Module['_BinaryenAddGlobal'](module, strToStack(name), type, mutable, init);
10351035
});
10361036
}
1037-
this['addImport'] = function(internalName, externalModuleName, externalBaseName, type) {
1037+
this['addImport'] = // deprecated
1038+
this['addFunctionImport'] = function(internalName, externalModuleName, externalBaseName, functionType) {
10381039
return preserveStack(function() {
1039-
return Module['_BinaryenAddImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), type);
1040+
return Module['_BinaryenAddFunctionImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), functionType);
1041+
});
1042+
};
1043+
this['addTableImport'] = function(internalName, externalModuleName, externalBaseName) {
1044+
return preserveStack(function() {
1045+
return Module['_BinaryenAddTableImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName));
1046+
});
1047+
};
1048+
this['addMemoryImport'] = function(internalName, externalModuleName, externalBaseName) {
1049+
return preserveStack(function() {
1050+
return Module['_BinaryenAddMemoryImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName));
1051+
});
1052+
};
1053+
this['addGlobalImport'] = function(internalName, externalModuleName, externalBaseName, globalType) {
1054+
return preserveStack(function() {
1055+
return Module['_BinaryenAddGlobalImport'](module, strToStack(internalName), strToStack(externalModuleName), strToStack(externalBaseName), globalType);
10401056
});
10411057
};
10421058
this['removeImport'] = function(internalName) {
10431059
return preserveStack(function() {
10441060
return Module['_BinaryenRemoveImport'](module, strToStack(internalName));
10451061
});
10461062
};
1047-
this['addExport'] = function(internalName, externalName) {
1063+
this['addExport'] = // deprecated
1064+
this['addFunctionExport'] = function(internalName, externalName) {
1065+
return preserveStack(function() {
1066+
return Module['_BinaryenAddFunctionExport'](module, strToStack(internalName), strToStack(externalName));
1067+
});
1068+
};
1069+
this['addTableExport'] = function(internalName, externalName) {
1070+
return preserveStack(function() {
1071+
return Module['_BinaryenAddTableExport'](module, strToStack(internalName), strToStack(externalName));
1072+
});
1073+
};
1074+
this['addMemoryExport'] = function(internalName, externalName) {
1075+
return preserveStack(function() {
1076+
return Module['_BinaryenAddMemoryExport'](module, strToStack(internalName), strToStack(externalName));
1077+
});
1078+
};
1079+
this['addGlobalExport'] = function(internalName, externalName) {
10481080
return preserveStack(function() {
1049-
return Module['_BinaryenAddExport'](module, strToStack(internalName), strToStack(externalName));
1081+
return Module['_BinaryenAddGlobalExport'](module, strToStack(internalName), strToStack(externalName));
10501082
});
10511083
};
10521084
this['removeExport'] = function(externalName) {

test/binaryen.js/call_import_error.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
var module = new Binaryen.Module();
22

33
var signature = module.addFunctionType("v", Binaryen.none, []);
4-
module.addImport("fn", "env", "fn", signature);
4+
module.addFunctionImport("fn", "env", "fn", signature);
55

66
module.addFunction("main", signature, [], module.block("", [
77
module.call("fn", [], Binaryen.none) // should be callImport
88
]));
9-
module.addExport("main", "main");
9+
module.addFunctionExport("main", "main");
1010

1111
console.log(module.emitText());
1212

test/binaryen.js/emit_asmjs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var signature = module.addFunctionType("ii", Binaryen.i32, [ Binaryen.i32 ]);
44

55
module.addFunction("main", signature, [], module.getLocal(0, Binaryen.i32));
66

7-
module.addExport("main", "main");
7+
module.addFunctionExport("main", "main");
88

99
module.validate(); // should validate before calling emitAsmjs
1010

test/binaryen.js/hello-world.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ module.addFunction('adder', iii, [], ret);
2222

2323
// Export the function, so we can call it later (for simplicity we
2424
// export it as the same name as it has internally)
25-
module.addExport('adder', 'adder');
25+
module.addFunctionExport('adder', 'adder');
2626

2727
// Print out the text
2828
console.log(module.emitText());

0 commit comments

Comments
 (0)