|
From: <sv...@va...> - 2014-10-26 19:16:22
|
Author: florian
Date: Sun Oct 26 19:16:14 2014
New Revision: 14666
Log:
Merge r14289 from the BUF_REMOVAL branch to trunk.
Change CLG_(get_debug_info) to not build up an absolute pathname in its
'file' parameter. Instead give it an additional parameter to hold the
directory name. Callers can then build up the absolute pathname if needed.
This change will come in handy soonish when VG_(get_filename_lineno) will be
changed and those buffers will disappear.
The change has a bit of ripple to get_fn_node_inseg and CLG_(get_file_node).
Modified:
trunk/ (props changed)
trunk/callgrind/debug.c
trunk/callgrind/dump.c
trunk/callgrind/fn.c
trunk/callgrind/global.h
Modified: trunk/callgrind/debug.c
==============================================================================
--- trunk/callgrind/debug.c (original)
+++ trunk/callgrind/debug.c Sun Oct 26 19:16:14 2014
@@ -374,6 +374,7 @@
void CLG_(print_addr)(Addr addr)
{
HChar fl_buf[FILENAME_LEN];
+ HChar dir_buf[FILENAME_LEN];
const HChar *fn_buf;
const HChar* obj_name;
DebugInfo* di;
@@ -384,7 +385,7 @@
return;
}
- CLG_(get_debug_info)(addr, fl_buf, &fn_buf, &ln, &di);
+ CLG_(get_debug_info)(addr, dir_buf, fl_buf, &fn_buf, &ln, &di);
if (VG_(strcmp)(fn_buf,"???")==0)
VG_(printf)("%#lx", addr);
@@ -403,8 +404,12 @@
}
}
- if (ln>0)
- VG_(printf)(" (%s:%u)", fl_buf,ln);
+ if (ln>0) {
+ if (dir_buf[0])
+ VG_(printf)(" (%s/%s:%u)", dir_buf, fl_buf, ln);
+ else
+ VG_(printf)(" (%s:%u)", fl_buf, ln);
+ }
}
void CLG_(print_addr_ln)(Addr addr)
Modified: trunk/callgrind/dump.c
==============================================================================
--- trunk/callgrind/dump.c (original)
+++ trunk/callgrind/dump.c Sun Oct 26 19:16:14 2014
@@ -448,14 +448,7 @@
VG_(strcpy)(file, "???");
p->line = 0;
}
- if (found_dirname) {
- // +1 for the '/'.
- CLG_ASSERT(VG_(strlen)(dir) + VG_(strlen)(file) + 1 < FILENAME_LEN);
- VG_(strcat)(dir, "/"); // Append '/'
- VG_(strcat)(dir, file); // Append file to dir
- VG_(strcpy)(file, dir); // Move dir+file to file
- }
- p->file = CLG_(get_file_node)(bbcc->bb->obj, file);
+ p->file = CLG_(get_file_node)(bbcc->bb->obj, dir, file);
debug_cache_info[cachepos] = found_file_line;
debug_cache_addr[cachepos] = addr;
Modified: trunk/callgrind/fn.c
==============================================================================
--- trunk/callgrind/fn.c (original)
+++ trunk/callgrind/fn.c Sun Oct 26 19:16:14 2014
@@ -286,7 +286,7 @@
static __inline__
-file_node* new_file_node(HChar filename[FILENAME_LEN],
+file_node* new_file_node(const HChar *filename,
obj_node* obj, file_node* next)
{
Int i;
@@ -305,11 +305,19 @@
file_node* CLG_(get_file_node)(obj_node* curr_obj_node,
- HChar filename[FILENAME_LEN])
+ const HChar *dir, const HChar *file)
{
file_node* curr_file_node;
UInt filename_hash;
+ /* Build up an absolute pathname, if there is a directory available */
+ HChar filename[VG_(strlen)(dir) + 1 + VG_(strlen)(file) + 1];
+ VG_(strcpy)(filename, dir);
+ if (filename[0] != '\0') {
+ VG_(strcat)(filename, "/");
+ }
+ VG_(strcat)(filename, file);
+
/* lookup in file hash */
filename_hash = str_hash(filename, N_FILE_ENTRIES);
curr_file_node = curr_obj_node->files[filename_hash];
@@ -403,11 +411,12 @@
*/
static __inline__
fn_node* get_fn_node_inseg(DebugInfo* di,
- HChar filename[FILENAME_LEN],
+ const HChar *dirname,
+ const HChar *filename,
const HChar *fnname)
{
obj_node *obj = CLG_(get_obj_node)(di);
- file_node *file = CLG_(get_file_node)(obj, filename);
+ file_node *file = CLG_(get_file_node)(obj, dirname, filename);
fn_node *fn = get_fn_node_infile(file, fnname);
return fn;
@@ -415,12 +424,12 @@
Bool CLG_(get_debug_info)(Addr instr_addr,
- HChar file[FILENAME_LEN],
- const HChar **fn_name, UInt* line_num,
- DebugInfo** pDebugInfo)
+ HChar dir[FILENAME_LEN],
+ HChar file[FILENAME_LEN],
+ const HChar **fn_name, UInt* line_num,
+ DebugInfo** pDebugInfo)
{
Bool found_file_line, found_fn, found_dirname, result = True;
- HChar dir[FILENAME_LEN];
UInt line;
CLG_DEBUG(6, " + get_debug_info(%#lx)\n", instr_addr);
@@ -438,14 +447,6 @@
&line);
found_fn = VG_(get_fnname)(instr_addr, fn_name);
- if (found_dirname) {
- // +1 for the '/'.
- CLG_ASSERT(VG_(strlen)(dir) + VG_(strlen)(file) + 1 < FILENAME_LEN);
- VG_(strcat)(dir, "/"); // Append '/'
- VG_(strcat)(dir, file); // Append file to dir
- VG_(strcpy)(file, dir); // Move dir+file to file
- }
-
if (!found_file_line && !found_fn) {
CLG_(stat).no_debug_BBs++;
VG_(strcpy)(file, "???");
@@ -488,6 +489,7 @@
fn_node* CLG_(get_fn_node)(BB* bb)
{
HChar filename[FILENAME_LEN];
+ HChar dirname[FILENAME_LEN];
const HChar *fnname;
DebugInfo* di;
UInt line_num;
@@ -502,7 +504,7 @@
* the BB according to debug information
*/
CLG_(get_debug_info)(bb_addr(bb),
- filename, &fnname, &line_num, &di);
+ dirname, filename, &fnname, &line_num, &di);
if (0 == VG_(strcmp)(fnname, "???")) {
int p;
@@ -533,7 +535,7 @@
if (0 == VG_(strcmp)(fnname, "vgPlain___libc_freeres_wrapper")
&& exit_bb) {
CLG_(get_debug_info)(bb_addr(exit_bb),
- filename, &fnname, &line_num, &di);
+ dirname, filename, &fnname, &line_num, &di);
CLG_DEBUG(1, "__libc_freeres_wrapper renamed to _exit\n");
}
@@ -548,7 +550,7 @@
}
/* get fn_node struct for this function */
- fn = get_fn_node_inseg( di, filename, fnname);
+ fn = get_fn_node_inseg( di, dirname, filename, fnname);
/* if this is the 1st time the function is seen,
* some attributes are set */
@@ -589,8 +591,12 @@
bb->fn = fn;
bb->line = line_num;
- CLG_DEBUG(3,"- get_fn_node(BB %#lx): %s (in %s:%u)\n",
- bb_addr(bb), fnname, filename, line_num);
+ if (dirname[0]) {
+ CLG_DEBUG(3,"- get_fn_node(BB %#lx): %s (in %s:%u)\n",
+ bb_addr(bb), fnname, filename, line_num);
+ } else
+ CLG_DEBUG(3,"- get_fn_node(BB %#lx): %s (in %s/%s:%u)\n",
+ bb_addr(bb), fnname, dirname, filename, line_num);
return fn;
}
Modified: trunk/callgrind/global.h
==============================================================================
--- trunk/callgrind/global.h (original)
+++ trunk/callgrind/global.h Sun Oct 26 19:16:14 2014
@@ -690,8 +690,9 @@
void CLG_(init_eventsets)(void);
/* from main.c */
-Bool CLG_(get_debug_info)(Addr, HChar filename[FILENAME_LEN],
- const HChar **fn_name, UInt*, DebugInfo**);
+Bool CLG_(get_debug_info)(Addr, HChar dirname[FILENAME_LEN],
+ HChar filename[FILENAME_LEN],
+ const HChar **fn_name, UInt*, DebugInfo**);
void CLG_(collectBlockInfo)(IRSB* bbIn, UInt*, UInt*, Bool*);
void CLG_(set_instrument_state)(const HChar*,Bool);
void CLG_(dump_profile)(const HChar* trigger,Bool only_current_thread);
@@ -720,7 +721,8 @@
void CLG_(init_obj_table)(void);
obj_node* CLG_(get_obj_node)(DebugInfo* si);
-file_node* CLG_(get_file_node)(obj_node*, HChar* filename);
+file_node* CLG_(get_file_node)(obj_node*, const HChar *dirname,
+ const HChar* filename);
fn_node* CLG_(get_fn_node)(BB* bb);
/* from bbcc.c */
|