diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parsing.h | 5 | ||||
-rw-r--r-- | src/passes/Inlining.cpp | 12 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/parsing.h b/src/parsing.h index 9c3e0cd19..a8ed8b13f 100644 --- a/src/parsing.h +++ b/src/parsing.h @@ -321,6 +321,11 @@ struct UniqueNameMapper { } Name sourceToUnique(Name sName) { + // DELEGATE_CALLER_TARGET is a fake target used to denote delegating to the + // caller. We do not need to modify it, as it has no definitions, only uses. + if (sName == DELEGATE_CALLER_TARGET) { + return DELEGATE_CALLER_TARGET; + } if (labelMappings.find(sName) == labelMappings.end()) { throw ParseException("bad label in sourceToUnique"); } diff --git a/src/passes/Inlining.cpp b/src/passes/Inlining.cpp index 44ebbd54d..d0a69ea96 100644 --- a/src/passes/Inlining.cpp +++ b/src/passes/Inlining.cpp @@ -48,6 +48,7 @@ struct FunctionInfo { Index size; bool hasCalls; bool hasLoops; + bool hasTryDelegate; bool usedGlobally; // in a table or export FunctionInfo() { @@ -55,11 +56,16 @@ struct FunctionInfo { size = 0; hasCalls = false; hasLoops = false; + hasTryDelegate = false; usedGlobally = false; } // See pass.h for how defaults for these options were chosen. bool worthInlining(PassOptions& options) { + // Until we have proper support for try-delegate, ignore such functions. + if (hasTryDelegate) { + return false; + } // If it's small enough that we always want to inline such things, do so. if (size <= options.inlining.alwaysInlineMaxSize) { return true; @@ -113,6 +119,12 @@ struct FunctionInfoScanner (*infos)[getFunction()->name].hasCalls = true; } + void visitTry(Try* curr) { + if (curr->isDelegate()) { + (*infos)[getFunction()->name].hasTryDelegate = true; + } + } + void visitRefFunc(RefFunc* curr) { assert(infos->count(curr->func) > 0); (*infos)[curr->func].refs++; |