aboutsummaryrefslogtreecommitdiff
path: root/libraries/libprof/profiler.S
blob: 1aa5c9796314e0ba0e680922523c45ec9518fb5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
 * profiler.S
 *  Implements the gprof profiler arc counting function.
 *  Created on: 06.08.2015
 *      Author: Erich Styger
 */

    .syntax unified
    .arch armv7-m

.globl __gnu_mcount_nc
.type __gnu_mcount_nc, %function

__gnu_mcount_nc:
#if 0 /* dummy version, doing nothing */
  mov    ip, lr
  pop    { lr }
  bx     ip
#else
  push {r0, r1, r2, r3, lr}     /* save registers */
  bic r1, lr, #1                /* R1 contains callee address, with thumb bit cleared */
  ldr r0, [sp, #20]             /* R0 contains caller address */
  bic r0, r0, #1                /* clear thumb bit */
  bl _mcount_internal           /* jump to internal _mcount() implementation */
  pop {r0, r1, r2, r3, ip, lr}  /* restore saved registers */
  bx ip                         /* return to caller */
#endif