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.

Reply via email to