The compiler doesn't 'reserve' stack - just uses it!
The amount of memory allocated to the stack will be defined by a combination of the linker script, defined memory areas and the system startup code.
If you have a single memory area it is likely (I don't use the defaults [1]) that it will be filled with code/rodata, data, bss, heap, stack in that order.
So if things go awry the stack crashes down into the heap (can be very difficult to diagnose, since minor code changes break unrelated things).
The information in the memory map output file from the linker probably contains useful info.
[1] The only stack references I have are where the function prologue (of a function that doesn't ever return) saves registers on entry! The relatively small code (fits in 8k of tightly coupled instruction memory) is compiled as a single unit with all functions inlined and no on-stack locals (or other register spills).