]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Updates to the rest of the debuginfo module to track directory names.
authorJulian Seward <jseward@acm.org>
Mon, 13 Jun 2005 17:39:06 +0000 (17:39 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 13 Jun 2005 17:39:06 +0000 (17:39 +0000)
The only interesting part is a change of signature of
VG_(get_filename_linenum) so that callers can optionally request
directory info too.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@3909

cachegrind/cg_main.c
coregrind/m_debuginfo/priv_symtab.h
coregrind/m_debuginfo/stabs.c
coregrind/m_debuginfo/symtab.c
coregrind/m_debuginfo/symtypes.c
helgrind/hg_main.c
include/pub_tool_debuginfo.h

index 807037fc9914dc5c7eaeb83b8db4193770329d5b..64c90c311758bfe7f9a552ac89b52e272527b975 100644 (file)
@@ -165,8 +165,12 @@ static Int  BB_retranslations   = 0;
 static void get_debug_info(Addr instr_addr, Char file[FILE_LEN],
                            Char fn[FN_LEN], Int* line)
 {
-   Bool found_file_line = VG_(get_filename_linenum)(instr_addr, file,
-                                                    FILE_LEN, line);
+   Bool found_file_line = VG_(get_filename_linenum)(
+                             instr_addr, 
+                             file, FILE_LEN,
+                             NULL, 0, NULL,
+                             line
+                          );
    Bool found_fn        = VG_(get_fnname)(instr_addr, fn, FN_LEN);
 
    if (!found_file_line) {
index de17b17ef0a85ec3054aaeb1c9db86f1bdb3b804..004517135f06fe926a4dc7c2b3718297fdf98ef6 100644 (file)
@@ -69,7 +69,9 @@ typedef
       UShort size:LOC_SIZE_BITS;    /* byte size; we catch overflows of this */
       UInt   lineno:LINENO_BITS;    /* source line number, or zero */
       /* Word 3 */
-      Char*  filename;                /* source filename */
+      Char*  filename;              /* source filename */
+      /* Word 4 */
+      Char*  dirname;               /* source directory name */
    }
    RiLoc;
 
@@ -231,7 +233,10 @@ struct _SegInfo {
 
 Char *VG_(addStr) ( SegInfo* si, Char* str, Int len );
 void VG_(addScopeInfo) ( SegInfo* si, Addr this, Addr next, Scope *scope);
-void VG_(addLineInfo) ( SegInfo* si, Char* filename, Addr this, Addr next, Int lineno, Int entry);
+void VG_(addLineInfo) ( SegInfo* si, 
+                        Char* filename, 
+                        Char* dirname,  /* NULL is allowable */
+                        Addr this, Addr next, Int lineno, Int entry);
 void VG_(addCfiSI) ( SegInfo* si, CfiSI* cfisi );
 
 /* Non-fatal -- use vg_panic if terminal. */
index f1989fcaedeefbc4798636a2457008e53ad896dd..14e0a3837ad66bb498756ecb781efe008f15810e 100644 (file)
@@ -1414,7 +1414,7 @@ void VG_(read_debuginfo_stabs) ( SegInfo* si,
 
            if (line.addr != 0) {
               /* finish off previous line */
-              VG_(addLineInfo)(si, file.name, line.addr,
+              VG_(addLineInfo)(si, file.name, NULL, line.addr,
                                addr, line.no + line.ovf * LINENO_OVERFLOW, i);
            }
 
@@ -1446,7 +1446,7 @@ void VG_(read_debuginfo_stabs) ( SegInfo* si,
 
            if (line.addr != 0) {
               /* there was a previous */
-              VG_(addLineInfo)(si, file.name, line.addr,
+              VG_(addLineInfo)(si, file.name, NULL, line.addr,
                                addr, line.no + line.ovf * LINENO_OVERFLOW, i);
            }
 
@@ -1555,7 +1555,7 @@ void VG_(read_debuginfo_stabs) ( SegInfo* si,
            }
 
            if (line.addr) {
-              VG_(addLineInfo)(si, file.name, line.addr,
+              VG_(addLineInfo)(si, file.name, NULL, line.addr,
                                addr, line.no + line.ovf * LINENO_OVERFLOW, i);
               line.addr = 0;
            }
index 5dff0f8191cbbc1c089898600da6d1976d5d6570..40453824b5168ee24bbf6d996540314ded7e5009 100644 (file)
@@ -248,11 +248,12 @@ void addLoc ( SegInfo* si, RiLoc* loc )
 
 void VG_(addLineInfo) ( SegInfo* si,
                        Char*    filename,
+                       Char*    dirname, /* NULL == directory is unknown */
                        Addr     this,
                        Addr     next,
                        Int      lineno,
                        Int      entry /* only needed for debug printing */
-                      )
+                     )
 {
    static const Bool debug = False;
    RiLoc loc;
@@ -262,7 +263,9 @@ void VG_(addLineInfo) ( SegInfo* si,
    if (this == next) return;
 
    if (debug)
-      VG_(printf)("  src %s line %d %p-%p\n", filename, lineno, this, next);
+      VG_(printf)( "  src %s %s line %d %p-%p\n",
+                   dirname ? dirname : (Char*)"(unknown)",
+                   filename, lineno, this, next );
 
    /* Maximum sanity checking.  Some versions of GNU as do a shabby
     * job with stabs entries; if anything looks suspicious, revert to
@@ -314,6 +317,7 @@ void VG_(addLineInfo) ( SegInfo* si,
    loc.size      = (UShort)size;
    loc.lineno    = lineno;
    loc.filename  = filename;
+   loc.dirname   = dirname;
 
    if (0) VG_(message)(Vg_DebugMsg, 
                       "addLoc: addr %p, size %d, line %d, file %s",
@@ -2242,21 +2246,43 @@ Bool VG_(get_linenum)( Addr a, UInt* lineno )
    return True;
 }
 
-/* Map a code address to a (filename, line number) pair.  
-   Returns True if successful.
+/* Map a code address to a filename/line number/dir name info.
+   See prototype for detailed description of behaviour.
 */
-Bool VG_(get_filename_linenum)( Addr a, 
-                                Char* filename, Int n_filename, 
-                                UInt* lineno )
+Bool VG_(get_filename_linenum) ( Addr a, 
+                                 /*OUT*/Char* filename, Int n_filename,
+                                 /*OUT*/Char* dirname,  Int n_dirname,
+                                 /*OUT*/Bool* dirname_available,
+                                 /*OUT*/UInt* lineno )
 {
    SegInfo* si;
    Int      locno;
+
+   vg_assert( (dirname == NULL && dirname_available == NULL)
+              ||
+              (dirname != NULL && dirname_available != NULL) );
+
    search_all_loctabs ( a, &si, &locno );
    if (si == NULL) 
       return False;
    VG_(strncpy_safely)(filename, si->loctab[locno].filename, n_filename);
    *lineno = si->loctab[locno].lineno;
 
+   if (dirname) {
+      /* caller wants directory info too .. */
+      vg_assert(n_dirname > 0);
+      if (si->loctab[locno].dirname) {
+         /* .. and we have some */
+         *dirname_available = True;
+         VG_(strncpy_safely)(dirname, si->loctab[locno].dirname,
+                                      n_dirname);
+      } else {
+         /* .. but we don't have any */
+         *dirname_available = False;
+         *dirname = 0;
+      }
+   }
+
    return True;
 }
 
@@ -2267,7 +2293,7 @@ Bool VG_(get_filename_linenum)( Addr a,
 static Addr regaddr_from_tst(Int regno, ThreadArchState *arch)
 {
 #if defined(VGA_x86)
-/* This is the Intel register encoding -- integer regs. */
+   /* This is the Intel register encoding -- integer regs. */
 #  define R_STACK_PTR   4
 #  define R_FRAME_PTR   5
    switch (regno) {
@@ -2282,7 +2308,7 @@ static Addr regaddr_from_tst(Int regno, ThreadArchState *arch)
    default:          return 0;
    }
 #elif defined(VGA_amd64)
-/* This is the Intel register encoding -- integer regs. */
+   /* This is the AMD64 register encoding -- integer regs. */
 #  define R_STACK_PTR   7
 #  define R_FRAME_PTR   6
    switch (regno) {
@@ -2358,7 +2384,8 @@ Variable *VG_(get_scope_variables)(ThreadId tid)
       Char file[100];
       Int line;
 
-      if (!VG_(get_filename_linenum)(sr->addr, file, sizeof(file), &line))
+      if (!VG_(get_filename_linenum)(sr->addr, file, sizeof(file), 
+                                                     NULL, 0, NULL, &line))
         file[0] = 0;
 
       VG_(printf)("found scope range %p: eip=%p (%s:%d) size=%d scope=%p\n",
@@ -2366,7 +2393,9 @@ Variable *VG_(get_scope_variables)(ThreadId tid)
    }
 
    distance = 0;
-   for(scope = si->scopetab[scopeidx].scope; scope != NULL; scope = scope->outer, distance++) {
+   for (scope = si->scopetab[scopeidx].scope; 
+        scope != NULL; 
+        scope = scope->outer, distance++) {
       UInt i;
 
       for(i = 0; i < scope->nsyms; i++) {
@@ -2435,6 +2464,10 @@ Variable *VG_(get_scope_variables)(ThreadId tid)
 
    return list;
 }
+
+#  undef R_STACK_PTR
+#  undef R_FRAME_PTR
+
 #endif /* TEST */
 
 /* Print into buf info on code address, function name and filename */
@@ -2477,11 +2510,16 @@ Char* VG_(describe_IP)(Addr eip, Char* buf, Int n_buf)
    static UChar buf_fn[BUF_LEN];
    static UChar buf_obj[BUF_LEN];
    static UChar buf_srcloc[BUF_LEN];
+   static UChar buf_dirname[BUF_LEN];
+   Bool  know_dirinfo = False;
    Bool  know_fnname  = VG_(get_fnname) (eip, buf_fn,  BUF_LEN);
    Bool  know_objname = VG_(get_objname)(eip, buf_obj, BUF_LEN);
-   Bool  know_srcloc  = VG_(get_filename_linenum)(eip, buf_srcloc,
-                                                  BUF_LEN, &lineno);
-
+   Bool  know_srcloc  = VG_(get_filename_linenum)(
+                           eip, 
+                           buf_srcloc,  BUF_LEN, 
+                           buf_dirname, BUF_LEN, &know_dirinfo,
+                           &lineno 
+                        );
    if (VG_(clo_xml)) {
 
       Bool   human_readable = True;
@@ -2506,6 +2544,12 @@ Char* VG_(describe_IP)(Addr eip, Char* buf, Int n_buf)
          APPEND("</fn>");
       }
       if (know_srcloc) {
+         if (know_dirinfo) {
+            APPEND(maybe_newline);
+            APPEND("<dir>");
+            APPEND(buf_dirname);
+            APPEND("</dir>");
+         }
          APPEND(maybe_newline);
          APPEND("<file>");
          APPEND_ESC(buf_srcloc);
@@ -2552,6 +2596,7 @@ Char* VG_(describe_IP)(Addr eip, Char* buf, Int n_buf)
 
 #  undef APPEND
 #  undef APPEND_ESC
+#  undef BUF_LEN
 }
 
 /* Returns True if OK.  If not OK, *{ip,sp,fp}P are not changed. */
index 049189d3c91b4cd41881c6e2e573f1e91b1861b2..0b74a4ec27b913a2068f449b06a8f0e4630f164d 100644 (file)
@@ -737,7 +737,8 @@ Char *VG_(describe_addr)(ThreadId tid, Addr addr)
    if (debug) {
       Char file[100];
       Int line;
-      if (!VG_(get_filename_linenum)(eip, file, sizeof(file), &line))
+      if (!VG_(get_filename_linenum)(eip, file, sizeof(file), 
+                                          NULL, 0, NULL, &line))
         file[0] = 0;
       VG_(printf)("describing address %p for tid=%d @ %s:%d\n", addr, tid, file, line);
    }
@@ -1047,7 +1048,8 @@ Char *VG_(describe_addr)(ThreadId tid, Addr addr)
         if (addr != found->valuep)
            bprintf(describe_addr_addbuf, 0, "+%d", addr - found->valuep);
 
-        if (VG_(get_filename_linenum)(eip, file, sizeof(file), &line))
+        if (VG_(get_filename_linenum)(eip, file, sizeof(file), 
+                                            NULL, 0, NULL, &line))
            bprintf(describe_addr_addbuf, 0, " at %s:%d", file, line, addr);
       }
    }
index 0b5056601ffa066a0998f7d660f027ae24e0c4c9..f54b7c1a8878cf7012746f701e91334b360553b4 100644 (file)
@@ -2730,7 +2730,8 @@ static void hg_pp_Error ( Error* err )
                      pp_state(extra->lasttouched.state),
                      unpackTLS(extra->lasttouched.tls)->tid);
         
-        if (VG_(get_filename_linenum)(ip, file, sizeof(file), &line)) {
+        if (VG_(get_filename_linenum)(ip, file, sizeof(file), 
+                                           NULL, 0, NULL, &line)) {
            VG_(message)(Vg_UserMsg, "   at %p: %y (%s:%u)",
                         ip, ip, file, line);
         } else if (VG_(get_objname)(ip, file, sizeof(file))) {
index 927a4c5ce951e38caae94c6538d2ddf0e79bb6ac..106ad72233b40bc41e97fe47dcb1f249e8f2c1a5 100644 (file)
@@ -47,11 +47,23 @@ extern Bool VG_(get_linenum)  ( Addr a, UInt* linenum );
 extern Bool VG_(get_fnname_w_offset)
                               ( Addr a, Char* fnname,   Int n_fnname   );
 
-/* This one is more efficient if getting both filename and line number,
-   because the two lookups are done together. */
+/* This one is the most general.  It gives filename, line number and
+   optionally directory name.  filename and linenum may not be NULL.
+   dirname may be NULL, meaning that the caller does not want
+   directory name info, in which case dirname_available must also be
+   NULL.  If dirname is non-null, directory info is written to it, if
+   it is available; if not available, '\0' is written to the first
+   byte.  In either case *dirname_available is set to indicate whether
+   or not directory information was available.
+
+   Returned value indicates whether any filename/line info could be
+   found. */
 extern Bool VG_(get_filename_linenum)
-                              ( Addr a, Char* filename, Int n_filename,
-                                        UInt* linenum );
+                              ( Addr a, 
+                                /*OUT*/Char* filename, Int n_filename,
+                                /*OUT*/Char* dirname,  Int n_dirname,
+                                /*OUT*/Bool* dirname_available,
+                                /*OUT*/UInt* linenum );
 
 /* Succeeds only if we find from debug info that 'a' is the address of the
    first instruction in a function -- as opposed to VG_(get_fnname) which