forked from vmprof/vmprof-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvmprof_get_custom_offset.h
62 lines (54 loc) · 1.99 KB
/
vmprof_get_custom_offset.h
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#pragma once
#ifdef PYPY_JIT_CODEMAP
#include "vmprof.h"
#ifdef VMPROF_WINDOWS
#include "msiinttypes/stdint.h"
#else
#include <stdint.h>
#endif
void *pypy_find_codemap_at_addr(long addr, long *start_addr);
long pypy_yield_codemap_at_addr(void *codemap_raw, long addr,
long *current_pos_addr);
#define MAX_INLINE_DEPTH 384
long vmprof_write_header_for_jit_addr(intptr_t *result, long n,
intptr_t addr, int max_depth)
{
void *codemap;
long current_pos = 0;
intptr_t ident, local_stack[MAX_INLINE_DEPTH];
long m;
long start_addr = 0;
codemap = pypy_find_codemap_at_addr(addr, &start_addr);
if (codemap == NULL || n >= max_depth - 2)
// not a jit code at all or almost max depth
return n;
// modify the last entry to point to start address and not the random one
// in the middle
result[n++] = VMPROF_ASSEMBLER_TAG;
result[n++] = start_addr;
// build the list of code idents corresponding to the current
// position inside this particular piece of assembler. If (very
// unlikely) we get more than MAX_INLINE_DEPTH recursion levels
// all inlined inside this single piece of assembler, then stop:
// there will be some missing frames then. Otherwise, we need to
// first collect 'local_stack' and then write it to 'result' in the
// opposite order, stopping at 'max_depth'. Previous versions of
// the code would write the oldest calls and then stop---whereas
// what we really need it to write the newest calls and then stop.
m = 0;
while (m < MAX_INLINE_DEPTH) {
ident = pypy_yield_codemap_at_addr(codemap, addr, ¤t_pos);
if (ident == -1)
// finish
break;
if (ident == 0)
continue; // not main codemap
local_stack[m++] = ident;
}
while (m > 0 && n < max_depth) {
result[n++] = VMPROF_JITTED_TAG;
result[n++] = local_stack[--m];
}
return n;
}
#endif