-
Notifications
You must be signed in to change notification settings - Fork 180
/
igprof-5.9.3-fix-jemalloc.patch
91 lines (83 loc) · 3.49 KB
/
igprof-5.9.3-fix-jemalloc.patch
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
diff --git a/src/hook.cc b/src/hook.cc
index 2aedfa6..5afd8b2 100644
--- a/src/hook.cc
+++ b/src/hook.cc
@@ -398,6 +398,11 @@ parse(const char *func, void *address, unsigned *patches)
else if (insns[0] == 0xe9) /* jmpq (32-bit offset) */
*patches++ = 0x500 + n+1, n += 5, insns += 5;
+ else if (insns[0] == 0x80 && insns[1] == 0x3d) /*cmpb $0x*, 0x*(rip) */
+ *patches++ = 0x700 + n+2, n += 7, insns += 7;
+
+ else if(insns[0] == 0xbd) /*mov 0x*, %rbp */
+ n += 5, insns += 5;
else
{
igprof_debug("%s (%p) + 0x%x: unrecognised prologue (found 0x%x 0x%x 0x%x 0x%x)\n",
diff --git a/src/igprof b/src/igprof
index c0de090..c5e1002 100755
--- a/src/igprof
+++ b/src/igprof
@@ -20,12 +20,13 @@ usage() {
echo -e "-pk, --keep-on-fork \tdo not reset performance profile in fork child"
echo -e "-fd, --file-descriptor \tstart the file descriptor profile"
echo -e "-fn, --function-profile X \tprofile cpu cycles spent in function X"
+ echo -e "-j, --jemalloc \tuse libjemalloc.so.1 instead of libc.so.6"
echo -e "[--] cmd [args...] \tcommand arguments to execute"
}
append() { eval "if [ -z \"\$$1\" ]; then $1=\"\$2\"; else $1=\"\$$1 \$2\"; fi"; }
-SORT= MEM= FD= PERF= FUNC= ALL= OUT= OUTZ=false OPTS=
+SORT= MEM= FD= PERF= FUNC= ALL= OUT= OUTZ=false OPTS= IGPROF_MALLOC_LIB='libc.so.6'
while [ "$#" != 0 ]; do
case "$1" in
-h | --help )
@@ -80,6 +81,8 @@ while [ "$#" != 0 ]; do
-fp | --function-profile )
[ -z "$FUNC" ] && FUNC="func"; FUNC="$FUNC:name=$2"; shift; shift ;;
+ -j | --jemalloc )
+ IGPROF_MALLOC_LIB='libjemalloc.so.1'; shift ;;
-- )
shift; break ;;
@@ -93,6 +96,8 @@ while [ "$#" != 0 ]; do
esac
done
+export IGPROF_MALLOC_LIB
+
[ X"$MEM" = X -a X"$FD" = X -a X"$PERF" = X -a X"$FUNC" = X ] && PERF=perf
if $OUTZ; then
diff --git a/src/profile-mem.cc b/src/profile-mem.cc
index b3eafbc..f6e060b 100644
--- a/src/profile-mem.cc
+++ b/src/profile-mem.cc
@@ -12,26 +12,26 @@
// Traps for this profiler module
DUAL_HOOK(1, void *, domalloc, _main, _libc,
(size_t n), (n),
- "malloc", 0, "libc.so.6")
+ "malloc", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(2, void *, docalloc, _main, _libc,
(size_t n, size_t m), (n, m),
- "calloc", 0, "libc.so.6")
+ "calloc", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(2, void *, dorealloc, _main, _libc,
(void *ptr, size_t n), (ptr, n),
- "realloc", 0, "libc.so.6")
+ "realloc", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(3, int, dopmemalign, _main, _libc,
(void **ptr, size_t alignment, size_t size),
(ptr, alignment, size),
- "posix_memalign", 0, "libc.so.6")
+ "posix_memalign", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(2, void *, domemalign, _main, _libc,
(size_t alignment, size_t size), (alignment, size),
- "memalign", 0, "libc.so.6")
+ "memalign", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(1, void *, dovalloc, _main, _libc,
(size_t size), (size),
- "valloc", 0, "libc.so.6")
+ "valloc", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
DUAL_HOOK(1, void, dofree, _main, _libc,
(void *ptr), (ptr),
- "free", 0, "libc.so.6")
+ "free", 0, igprof_getenv("IGPROF_MALLOC_LIB"))
// Data for this profiler module
static const int OVERHEAD_NONE = 0; // Memory use without malloc overheads