Msg/ClobberedSP

From CPUlator Wiki

< Msg
Revision as of 01:08, 10 March 2019 by Henry (talk | contribs) (→‎Examples)

A function should always ensure that the stack pointer is the same at the entry and exit of the function. This message tells you that this didn't happen: the stack pointer was different at the function return than when the function was first called.

Examples

ARMv7

.global _start
_start:
    mov sp, #0x1000		// Initialize SP to something sane
    bl MyFunction
    nop
    nop
    # ...
    
MyFunction:
    push {r4}	// Change SP
    bx lr		// SP is different at return

Nios II

.global _start
_start:
    movi sp, 0x1000		# Initialize SP
    call Function
    nop
    nop
    
Function:
    subi sp, sp, 4		# Modify SP
    ret					# SP is different at return

Debugging

  • Fundamentally, this message is complaining that the stack pointer differs between the start of the function and at the function return. Use breakpoints and make a note of the value of the stack pointer at both the function entry and return. Are they the same?
  • The most common way to use the stack pointer is to modify it while pushing and popping values on the stack. When pushes and pops are mismatched, there is a net change in the stack pointer in the function.

Implementation

The simulator identifies idiomatic call and return instructions executed at runtime. It records the values of registers when executing call instructions, and verifies that they haven't changed when executing the matching function return. This warning is generated at the return instruction.

Disabling this message

This debugging check can be disabled in the Debugging Checks section of the Settings box: Function clobbered ra or sp.