V9016

Code

V9016

Message

Container declares a call depth that exceeds the VM frame-stack buffer

The container’s declared worst-case call depth (FileHeader.max_call_depth) is larger than the call-frame buffer the embedder provided to the VM. VmReady::start rejects the container before any init code runs, so no PLC instructions execute.

Codegen computes max_call_depth from the program’s static call graph (longest path through CALL and user-FB_CALL edges, counting the entry frame). The VM compares that number against VmBuffers.frames.len().

To resolve:

  • Grow the embedder’s frame buffer if the program legitimately needs the declared depth, then reload.

  • Recompile with a shallower call chain.

The trap message reports both numbers (required and capacity). A declared depth of 0 is invalid and is rejected separately at load with V9017 before this comparison runs.

Think IronPLC is wrong about this?

If you believe this diagnostic is incorrect, open an issue on GitHub with a small sample that demonstrates the problem.