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;
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];
*/
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;
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);
&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, "???");
fn_node* CLG_(get_fn_node)(BB* bb)
{
HChar filename[FILENAME_LEN];
+ HChar dirname[FILENAME_LEN];
const HChar *fnname;
DebugInfo* di;
UInt line_num;
* 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;
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");
}
}
/* 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 */
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;
}
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);
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 */