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:
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?
(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.)
Thanks in advance for your help and insight and of course many thanks for making emcc in the first place!
--- 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