diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 9ed6ad31455..4bd0b6b0e4d 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -2685,6 +2685,22 @@ void BinaryenFunctionSetDebugLocation(BinaryenFunctionRef func, BinaryenExpressi fn->debugLocations[ex] = loc; } +int BinaryenFunctionGetUserFlags(BinaryenFunctionRef func) { + if (tracing) { + std::cout << " BinaryenFunctionGetUserFlags(functions[" << functions[func] << "]);\n"; + } + + auto* fn = (Function*)func; + return static_cast(fn->userFlags); +} +void BinaryenFunctionSetUserFlags(BinaryenFunctionRef func, int flags) { + if (tracing) { + std::cout << " BinaryenFunctionSetUserFlags(functions[" << functions[func] << "], " << flags << ");\n"; + } + + auto* fn = (Function*)func; + fn->userFlags = (Function::UserFlags)flags; +} // // =========== Import operations =========== diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 2a3254f7b08..2b6176e87cf 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -869,6 +869,11 @@ void BinaryenFunctionRunPasses(BinaryenFunctionRef func, BinaryenModuleRef modul // Sets the debug location of the specified `Expression` within the specified `Function`. void BinaryenFunctionSetDebugLocation(BinaryenFunctionRef func, BinaryenExpressionRef expr, BinaryenIndex fileIndex, BinaryenIndex lineNumber, BinaryenIndex columnNumber); +// Gets the user defined flags for this function +int BinaryenFunctionGetUserFlags(BinaryenFunctionRef func); +// Sets the user defined flags for this function +void BinaryenFunctionSetUserFlags(BinaryenFunctionRef func, int flags); + // // ========== Import Operations ========== // diff --git a/src/passes/Inlining.cpp b/src/passes/Inlining.cpp index f801662e0eb..f7b32a453ab 100644 --- a/src/passes/Inlining.cpp +++ b/src/passes/Inlining.cpp @@ -284,7 +284,7 @@ struct Inlining : public Pass { // decide which to inline InliningState state; ModuleUtils::iterDefinedFunctions(*module, [&](Function* func) { - if (infos[func->name].worthInlining(runner->options)) { + if (func->hasUserFlags(Function::UserFlags::Inline) || infos[func->name].worthInlining(runner->options)) { state.worthInlining.insert(func->name); } }); diff --git a/src/wasm.h b/src/wasm.h index dc24b0f1c83..b4d7ae5dae6 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -781,6 +781,17 @@ class Function : public Importable { void clearNames(); void clearDebugInfo(); + + // Special flags that can be set by a an API user + enum class UserFlags : unsigned int { + None = 0, + Inline = 1 << 0 + }; + UserFlags userFlags = UserFlags::None; + + bool hasUserFlags(UserFlags flags) { + return static_cast((static_cast(userFlags) & static_cast(flags))) == flags; + } }; // The kind of an import or export.