Apparatus comprising: processing circuitry to perform data processing operations, wherein the data processing operations comprise subroutines; call stack storage to store a call stack comprising subroutine information relating to subroutines which have been called during the data processing operations and have not yet returned; stack pointer storage to store a stack pointer, wherein a current value of the stack pointer is indicative of an extremity of the call stack associated with a most recently called subroutine which has been called during the data processing operations and has not yet returned, wherein the processing circuitry is responsive to a call stack sampling trigger to perform a call stack sampling procedure comprising accessing the call stack with reference to the stack pointer, and tide mark pointer storage to store a tide mark pointer, wherein a value of the tide mark pointer is indicative of a previous value which the stack pointer had when the processing circuitry last completed the call stack sampling procedure, wherein the processing circuitry is arranged to perform the call stack sampling procedure comprising retrieving subroutine information indicated between the value of the tide mark pointer and the current value of the stack pointer, wherein the tide mark pointer storage is responsive to performance of the call stack sampling procedure to modify the tide mark pointer to match the current value of the stack pointer, and wherein tide mark pointer storage is responsive to removal of subroutine information from the call stack to set the tide mark pointer to the minimum of the current value of the tide mark pointer and the updated value of the stack pointer resulting from the removal of subroutine information from the call stack. processing circuitry to perform data processing operations, wherein the data processing operations comprise subroutines; call stack storage to store a call stack comprising subroutine information relating to subroutines which have been called during the data processing operations and have not yet returned; stack pointer storage to store a stack pointer, wherein a current value of the stack pointer is indicative of an extremity of the call stack associated with a most recently called subroutine which has been called during the data processing operations and has not yet returned, wherein the processing circuitry is responsive to a call stack sampling trigger to perform a call stack sampling procedure comprising accessing the call stack with reference to the stack pointer, and tide mark pointer storage to store a tide mark pointer, wherein a value of the tide mark pointer is indicative of a previous value which the stack pointer had when the processing circuitry last completed the call stack sampling procedure, wherein the processing circuitry is arranged to perform the call stack sampling procedure comprising retrieving subroutine information indicated between the value of the tide mark pointer and the current value of the stack pointer, wherein the tide mark pointer storage is responsive to performance of the call stack sampling procedure to modify the tide mark pointer to match the current value of the stack pointer, and wherein tide mark pointer storage is responsive to removal of subroutine information from the call stack to set the tide mark pointer to the minimum of the current value of the tide mark pointer and the updated value of the stack pointer resulting from the removal of subroutine information from the call stack.