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.