From c2d143c8ea3536a7c116ff8b6482ff2ff6e9c4a6 Mon Sep 17 00:00:00 2001 From: Josef Weidendorfer Date: Tue, 12 Sep 2006 19:10:08 +0000 Subject: [PATCH] Callgrind: fix segfault when dumping after toggling instrumentation mode This bug shows up when callgrind dumps data of a BB with 0 instructions (the segfault only appears on x86_64; for x86 we were "lucky"). "BB with 0 instructions" happens when you switch on instrumentation (and callgrinds call graph tracing starts with an emtpy shadow call stack) in the middle of a run: Whenever the shadow callstack is empty, but callgrind sees a return instruction (ie. a shadow callstack underrun), it creates an artifical BB which is faked to have called the function we are returning from. This way, the call arc is noted and will appear in the dump. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6053 --- callgrind/global.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/callgrind/global.h b/callgrind/global.h index f6190a206..0079b4d3a 100644 --- a/callgrind/global.h +++ b/callgrind/global.h @@ -688,7 +688,8 @@ void CLG_(delete_bb)(Addr addr); static __inline__ Addr bb_addr(BB* bb) { return bb->offset + bb->obj->offset; } static __inline__ Addr bb_jmpaddr(BB* bb) - { return bb->instr[bb->instr_count-1].instr_offset + bb->offset + bb->obj->offset; } + { UInt off = (bb->instr_count > 0) ? bb->instr[bb->instr_count-1].instr_offset : 0; + return off + bb->offset + bb->obj->offset; } /* from fn.c */ void CLG_(init_fn_array)(fn_array*);