Author: sewardj
Date: 2008-02-25 13:46:58 +0000 (Mon, 25 Feb 2008)
New Revision: 7457

Log:
Partially fix handling of variables which have Compilation-Unit scope.
In C these correspond to top level 'static' variables.



Modified:
   branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
   branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c


Modified: branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-25 13:44:04 UTC 
(rev 7456)
+++ branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-25 13:46:58 UTC 
(rev 7457)
@@ -2014,6 +2014,27 @@
       in the stacks of all the threads.  First try to figure out which
       thread's stack data_addr is in. */
 
+   /* --- KLUDGE --- Try examining the top frame of all thread stacks.
+      This finds variables which are not stack allocated but are not
+      globally visible either; specifically it appears to pick up
+      variables which are visible only within a compilation unit.
+      These will have the address range of the compilation unit and
+      tend to live at Scope level 1. */
+   VG_(thread_stack_reset_iter)(&tid);
+   while ( VG_(thread_stack_next)(&tid, &stack_min, &stack_max) ) {
+      if (stack_min >= stack_max)
+         continue; /* ignore obviously stupid cases */
+      if (consider_vars_in_frame( dname1, dname2, n_dname,
+                                  data_addr,
+                                  VG_(get_IP)(tid),
+                                  VG_(get_SP)(tid), 
+                                  VG_(get_FP)(tid), tid, 0 )) {
+         dname1[n_dname-1] = dname2[n_dname-1] = 0;
+         return True;
+      }
+   }
+   /* --- end KLUDGE --- */
+
    /* Perhaps it's on a thread's stack? */
    found = False;
    VG_(thread_stack_reset_iter)(&tid);
@@ -2050,6 +2071,9 @@
       all non-innermost IPs.  Note that VG_(get_StackTrace_wrk) itself
       has to use the same trick in order to use CFI data to unwind the
       stack (as documented therein in comments). */
+   /* As a result of KLUDGE above, starting the loop at j = 0
+      duplicates examination of the top frame and so isn't necessary.
+      Oh well. */
    vg_assert(n_frames >= 0 && n_frames <= N_FRAMES);
    for (j = 0; j < n_frames; j++) {
       Word ip_delta = j == 0 ? 0 : 1;

Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c        2008-02-25 
13:44:04 UTC (rev 7456)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c        2008-02-25 
13:46:58 UTC (rev 7457)
@@ -1290,7 +1290,7 @@
    UWord saved_die_c_offset  = get_position_of_Cursor( c_die );
    UWord saved_abbv_c_offset = get_position_of_Cursor( c_abbv );
 
-   varstack_preen( parser, td3, level );
+   varstack_preen( parser, td3, level-1 );
 
    if (dtag == DW_TAG_compile_unit) {
       Bool have_lo    = False;


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to