summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Wirtz <dcode@dcode.io>2020-02-13 22:48:12 +0100
committerGitHub <noreply@github.com>2020-02-13 13:48:12 -0800
commit32bb67f4660de4b5b03bdff5c9c59ab92f8a0049 (patch)
treebef65081c9ef8ae285addbcb76e44477d11eb2c0
parent41e9d4b244986149603ad83a4f526d950b3a441b (diff)
downloadbinaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.tar.gz
binaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.tar.bz2
binaryen-32bb67f4660de4b5b03bdff5c9c59ab92f8a0049.zip
Add C-/JS-APIs for inlining options (#2655)
Allows a user to modify the inlining limits using the C- and JS-APIs. * binaryen.**getAlwaysInlineMaxSize**(): `number` * binaryen.**setAlwaysInlineMaxSize**(size: `number`): `void` * binaryen.**getFlexibleInlineMaxSize**(): `number` * binaryen.**setFlexibleInlineMaxSize**(size: `number`): `void` * binaryen.**getOneCallerInlineMaxSize**(): `number` * binaryen.**setOneCallerInlineMaxSize**(size: `number`): `void`
-rw-r--r--src/binaryen-c.cpp48
-rw-r--r--src/binaryen-c.h24
-rw-r--r--src/js/binaryen.js-post.js30
-rw-r--r--test/binaryen.js/inlining-options.js15
-rw-r--r--test/binaryen.js/inlining-options.js.txt28
5 files changed, 145 insertions, 0 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp
index 17c95c96e..fc16eee42 100644
--- a/src/binaryen-c.cpp
+++ b/src/binaryen-c.cpp
@@ -3958,6 +3958,54 @@ void BinaryenClearPassArguments(void) {
globalPassOptions.arguments.clear();
}
+BinaryenIndex BinaryenGetAlwaysInlineMaxSize(void) {
+ if (tracing) {
+ std::cout << " BinaryenGetAlwaysInlineMaxSize();\n";
+ }
+
+ return globalPassOptions.inlining.alwaysInlineMaxSize;
+}
+
+void BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size) {
+ if (tracing) {
+ std::cout << " BinaryenSetAlwaysInlineMaxSize(" << size << ");\n";
+ }
+
+ globalPassOptions.inlining.alwaysInlineMaxSize = size;
+}
+
+BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void) {
+ if (tracing) {
+ std::cout << " BinaryenGetFlexibleInlineMaxSize();\n";
+ }
+
+ return globalPassOptions.inlining.flexibleInlineMaxSize;
+}
+
+void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size) {
+ if (tracing) {
+ std::cout << " BinaryenSetFlexibleInlineMaxSize(" << size << ");\n";
+ }
+
+ globalPassOptions.inlining.flexibleInlineMaxSize = size;
+}
+
+BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void) {
+ if (tracing) {
+ std::cout << " BinaryenGetOneCallerInlineMaxSize();\n";
+ }
+
+ return globalPassOptions.inlining.oneCallerInlineMaxSize;
+}
+
+void BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size) {
+ if (tracing) {
+ std::cout << " BinaryenSetOneCallerInlineMaxSize(" << size << ");\n";
+ }
+
+ globalPassOptions.inlining.oneCallerInlineMaxSize = size;
+}
+
void BinaryenModuleRunPasses(BinaryenModuleRef module,
const char** passes,
BinaryenIndex numPasses) {
diff --git a/src/binaryen-c.h b/src/binaryen-c.h
index 66a68e8d2..39e0aca33 100644
--- a/src/binaryen-c.h
+++ b/src/binaryen-c.h
@@ -1304,6 +1304,30 @@ BINARYEN_API void BinaryenSetPassArgument(const char* name, const char* value);
// Applies to all modules, globally.
BINARYEN_API void BinaryenClearPassArguments();
+// Gets the function size at which we always inline.
+// Applies to all modules, globally.
+BINARYEN_API BinaryenIndex BinaryenGetAlwaysInlineMaxSize(void);
+
+// Sets the function size at which we always inline.
+// Applies to all modules, globally.
+BINARYEN_API void BinaryenSetAlwaysInlineMaxSize(BinaryenIndex size);
+
+// Gets the function size which we inline when functions are lightweight.
+// Applies to all modules, globally.
+BINARYEN_API BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void);
+
+// Sets the function size which we inline when functions are lightweight.
+// Applies to all modules, globally.
+BINARYEN_API void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size);
+
+// Gets the function size which we inline when there is only one caller.
+// Applies to all modules, globally.
+BINARYEN_API BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void);
+
+// Sets the function size which we inline when there is only one caller.
+// Applies to all modules, globally.
+BINARYEN_API void BinaryenSetOneCallerInlineMaxSize(BinaryenIndex size);
+
// Runs the specified passes on the module. Uses the currently set global
// optimize and shrink level.
BINARYEN_API void BinaryenModuleRunPasses(BinaryenModuleRef module,
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
index d41e9575b..3ef19fd7d 100644
--- a/src/js/binaryen.js-post.js
+++ b/src/js/binaryen.js-post.js
@@ -2928,6 +2928,36 @@ Module['clearPassArguments'] = function() {
Module['_BinaryenClearPassArguments']();
};
+// Gets the function size at which we always inline.
+Module['getAlwaysInlineMaxSize'] = function() {
+ return Module['_BinaryenGetAlwaysInlineMaxSize']();
+};
+
+// Sets the function size at which we always inline.
+Module['setAlwaysInlineMaxSize'] = function(size) {
+ Module['_BinaryenSetAlwaysInlineMaxSize'](size);
+};
+
+// Gets the function size which we inline when functions are lightweight.
+Module['getFlexibleInlineMaxSize'] = function() {
+ return Module['_BinaryenGetFlexibleInlineMaxSize']();
+};
+
+// Sets the function size which we inline when functions are lightweight.
+Module['setFlexibleInlineMaxSize'] = function(size) {
+ Module['_BinaryenSetFlexibleInlineMaxSize'](size);
+};
+
+// Gets the function size which we inline when there is only one caller.
+Module['getOneCallerInlineMaxSize'] = function() {
+ return Module['_BinaryenGetOneCallerInlineMaxSize']();
+};
+
+// Sets the function size which we inline when there is only one caller.
+Module['setOneCallerInlineMaxSize'] = function(size) {
+ Module['_BinaryenSetOneCallerInlineMaxSize'](size);
+};
+
// Enables or disables C-API tracing
Module['setAPITracing'] = function(on) {
return Module['_BinaryenSetAPITracing'](on);
diff --git a/test/binaryen.js/inlining-options.js b/test/binaryen.js/inlining-options.js
new file mode 100644
index 000000000..7884f0ed4
--- /dev/null
+++ b/test/binaryen.js/inlining-options.js
@@ -0,0 +1,15 @@
+binaryen.setAPITracing(true);
+
+console.log("// alwaysInlineMaxSize=" + binaryen.getAlwaysInlineMaxSize());
+binaryen.setAlwaysInlineMaxSize(11);
+assert(binaryen.getAlwaysInlineMaxSize() == 11);
+
+console.log("// flexibleInlineMaxSize=" + binaryen.getFlexibleInlineMaxSize());
+binaryen.setFlexibleInlineMaxSize(22);
+assert(binaryen.getFlexibleInlineMaxSize() == 22);
+
+console.log("// oneCallerInlineMaxSize=" + binaryen.getOneCallerInlineMaxSize());
+binaryen.setOneCallerInlineMaxSize(33);
+assert(binaryen.getOneCallerInlineMaxSize() == 33);
+
+binaryen.setAPITracing(false);
diff --git a/test/binaryen.js/inlining-options.js.txt b/test/binaryen.js/inlining-options.js.txt
new file mode 100644
index 000000000..4993fd0d6
--- /dev/null
+++ b/test/binaryen.js/inlining-options.js.txt
@@ -0,0 +1,28 @@
+// beginning a Binaryen API trace
+#include <math.h>
+#include <map>
+#include "binaryen-c.h"
+int main() {
+ std::map<size_t, BinaryenExpressionRef> expressions;
+ std::map<size_t, BinaryenFunctionRef> functions;
+ std::map<size_t, BinaryenGlobalRef> globals;
+ std::map<size_t, BinaryenEventRef> events;
+ std::map<size_t, BinaryenExportRef> exports;
+ std::map<size_t, RelooperBlockRef> relooperBlocks;
+ BinaryenModuleRef the_module = NULL;
+ RelooperRef the_relooper = NULL;
+ BinaryenGetAlwaysInlineMaxSize();
+// alwaysInlineMaxSize=2
+ BinaryenSetAlwaysInlineMaxSize(11);
+ BinaryenGetAlwaysInlineMaxSize();
+ BinaryenGetFlexibleInlineMaxSize();
+// flexibleInlineMaxSize=20
+ BinaryenSetFlexibleInlineMaxSize(22);
+ BinaryenGetFlexibleInlineMaxSize();
+ BinaryenGetOneCallerInlineMaxSize();
+// oneCallerInlineMaxSize=15
+ BinaryenSetOneCallerInlineMaxSize(33);
+ BinaryenGetOneCallerInlineMaxSize();
+ return 0;
+}
+// ending a Binaryen API trace