The numbers for the available stack size that you print out look very odd
to me. At recursion level 4, it is stating that it has 17300 bytes(?) of
stack space left. Assuming that you have not changed the default Emscripten
stack size during compilation, which is 5MB (see here:
https://github.com/kripken/emscripten/blob/master/src/settings.js#L54 ),
then having only 17300 bytes of that 5MB left sounds like the huge majority
of the stack is already gone. The decrease of the stack by ~3KB per level
of recursion looks very normal for a large function like that.
Therefore I suspect that the stack is swallowed by something already
earlier than the recursive function. Try backing up the callstack and
execution and print out the stack sizes to try to find a location where you
still have ~5MB'ish of that stack space left available, and see where the
majority of that is killed.
Most often that occurs if you have a function with a large local array,
something like:
void foo()
{
int localTempArray[1024*1024]; // Consumes 4MB of stack space.
// ...
}
Another way to consume the stack space can occur if one uses the JS-facing
Runtime.stackAlloc function to allocate a very large stack size for JS<->C
interop. However if you are not doing custom JS interop or calling that
function manually, then I don't think that is the case here.
2015-02-13 4:24 GMT-08:00 Clifford Wolf <[email protected]>:
> Hello,
>
> I'm getting a "RangeError: Maximum call stack size exceeded" exception in
> my recursive algorithm. The problem is not deep recursion: this happens at
> 11 recursion levels of my function plus another 10-20 levels of function
> calls above that from the main program. The problem is that my function has
> a huge stack frame, and I don't know why it has it. I am using the
> following debug code at the top of my function to monitor what is happening:
>
> EM_ASM_({
> var i = 0;
> function stackExplorer() { i++; stackExplorer(); }
> try { stackExplorer(); } catch (e) { console.log("--> revursion level: " +
> $0 + ", free stack: " + i); }
> }, recursion_counter);
>
> The output I get when running in node.js is this:
>
> --> revursion level: 8, free stack: 5876
> --> revursion level: 9, free stack: 4112
> --> revursion level: 10, free stack: 2347
> --> revursion level: 11, free stack: 583
>
> /home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:84
> throw ex;
> ^
> RangeError: Maximum call stack size exceeded
>
>
> So the stack frame of my function is about 1765 times larger than the
> stack frame of the stackExplorer() function. In firefox I have the same
> problem (The stack frame is even slightly larger with firefox). The stack
> trace printed by firefox (see end of this mail) also shows that there is
> not a large stack of intermediate function calls in the call stack using up
> the space on the call stack. It is really just my function calling itself
> (the two intermediate functions dynCall_* and invoke_* are added by
> emscripten).
>
> I am willing to rewrite my code to reduce the size of the stack frame. But
> I don't understand how the call stack size is affected by my C++ code. (I
> assume that local objects of my C/C++ functions end up on the javascript
> heap.) Can I somehow profile where that large stack frame size comes from?
>
> Here is the code of my AstNode::simplify() function:
>
> https://github.com/cliffordwolf/yosys/blob/emcc-debug/frontends/ast/simplify.cc
>
> (Beware: This function is not pretty, and it is over 2000 lines long. One
> day I have to refactor it but it would be nice to understand this issue
> before I do that.)
>
> jfyi: The branch https://github.com/cliffordwolf/yosys/tree/emcc-debug
> can be used as a test case. It already contains a Makefile.conf with the
> correct build settings and an alternative main() that will trigger the
> error. With "emcc" in your path (i.e. after ". emsdk_set_env.sh") one only
> needs to run "make" to produce "yosys.js", and "node yosys.js" produce the
> above error.
>
> Thanks in advance for your help and insight and of course many thanks for
> making emcc in the first place!
>
> regards,
> - clifford
>
>
> --- Output incl. stack trace from firefox ---
>
> "--> revursion level: 4, free stack: 17300" yosys.js line 301 > eval:1
> "--> revursion level: 5, free stack: 14260" yosys.js line 301 > eval:1
> "--> revursion level: 6, free stack: 11220" yosys.js line 301 > eval:1
> "--> revursion level: 7, free stack: 8178" yosys.js line 301 > eval:1
> "--> revursion level: 8, free stack: 5138" yosys.js line 301 > eval:1
> "--> revursion level: 9, free stack: 2096" yosys.js line 301 > eval:1
> "exception thrown: InternalError: too much recursion,__
> ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:220682:2
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223678:20
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223678:20
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:224281:19
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223678:20
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223555:17
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223678:20
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223294:15
> dynCall_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225101:12
> invoke_iiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7980:12
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:223158:19
> __ZN5Yosys3AST7AstNode8simplifyEbbbiibb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:221655:12
> __ZN5YosysL14process_moduleEPNS_3AST7AstNodeEb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:219163:13
> dynCall_iii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225045:12
> invoke_iii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7908:12
> __ZN5Yosys3AST7processEPNS_5RTLIL6DesignEPNS0_7AstNodeEbbbbbbbbbbbb
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:216459:16
> dynCall_viiiiiiiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225010:5
> invoke_viiiiiiiiiiiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7863:5
> __
> ZN5Yosys15VerilogFrontend7executeERPNSt3__113basic_istreamIcNS1_11char_traitsIcEEEENS1_12basic_stringIcS4_NS1_9allocatorIcEEEENS1_6vectorISB_NS9_ISB_EEEEPNS_5RTLIL6DesignE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:325020:15
> dynCall_viiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224919:5
> invoke_viiiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7746:5
> __
> ZN5Yosys8Frontend13frontend_callEPNS_5RTLIL6DesignEPNSt3__113basic_istreamIcNS4_11char_traitsIcEEEENS4_12basic_stringIcS7_NS4_9allocatorIcEEEENS4_6vectorISD_NSB_ISD_EEEE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:15220:6
> dynCall_viiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225115:5
> invoke_viiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7998:5
> __
> ZN5Yosys8Frontend13frontend_callEPNS_5RTLIL6DesignEPNSt3__113basic_istreamIcNS4_11char_traitsIcEEEENS4_12basic_stringIcS7_NS4_9allocatorIcEEEESD_
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:14961:6
> dynCall_viiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225115:5
> invoke_viiii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7998:5
> __
> ZN12_GLOBAL__N_111TechmapPass7executeENSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEEPN5Yosys5RTLIL6DesignE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:929036:16
> dynCall_viii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225087:5
> invoke_viii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7962:5
> __
> ZN5Yosys4Pass4callEPNS_5RTLIL6DesignENSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:13058:2
> dynCall_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224933:5
> invoke_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7764:5
> __
> ZN5Yosys4Pass4callEPNS_5RTLIL6DesignENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:12645:8
> dynCall_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224933:5
> invoke_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7764:5
> __
> ZN12_GLOBAL__N_112TestCellPass7executeENSt3__16vectorINS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS6_IS8_EEEEPN5Yosys5RTLIL6DesignE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1050408:86
> dynCall_viii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1225087:5
> invoke_viii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7962:5
> __
> ZN5Yosys4Pass4callEPNS_5RTLIL6DesignENSt3__16vectorINS4_12basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEENS9_ISB_EEEE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:13058:2
> dynCall_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224933:5
> invoke_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7764:5
> __
> ZN5Yosys4Pass4callEPNS_5RTLIL6DesignENSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:12880:6
> dynCall_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224933:5
> invoke_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7764:5
> __
> ZN5Yosys8run_passENSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEPNS_5RTLIL6DesignE
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:125815:2
> dynCall_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1224933:5
> invoke_vii
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:7764:5
> __Z5main_iPPc
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:9438:11
> _main
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:10514:3
> asm._main
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1228824:8
> callMain
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1231384:15
> doRun
> @file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1231442:42
>
> run/<@file:///home/clifford/Work/handicraft/2014/verilearn/yosys/yosys.js:1231453:7
> " yosys.html:1245
>
> --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.