diff --git a/valgrind-3.8.1-static-variables.patch b/valgrind-3.8.1-static-variables.patch new file mode 100644 index 0000000..30d02c1 --- /dev/null +++ b/valgrind-3.8.1-static-variables.patch @@ -0,0 +1,743 @@ +commit 81d24c396c66dde7db2d9b567451f99081a2eab7 +Author: philippe +Date: Wed Dec 5 21:08:24 2012 +0000 + + fix 310424 --read-var-info does not properly describe static variables + + This patch changes the way static variables are + recorded by readdwarf3.c (when giving --read-var-info=yes), + improving the way such variables are described. + + Currently: + A static variable does not have the DW_AT_external tag. + So, readdwarf3.c does not consider it a global variable. + It is rather considered a "local" variable. + When it is recorded, it is associated to a range of program counters + (the functions in the file where it is visible). + However, even if the static variable is only visible + in the source file where it is declared, it can in reality + be used by any range of program counters, typically + by having the address of the local variable passed + to other functions. + + Such local variable can then only be described + when the program counter is in the range of program + counters for which it has been recorded. + However, this (local) description is obtained + by a kludge in debuginfo.c (around line 3285). + + This kludge then produces a strange description, + telling that the variable has been declared in + frame 0 of a thread (see second example below). + + The kludge is not always able to describe + the address (if the IP of the tid is in another file than + where the variable has been declared). + + I suspect the kludge can sometimes describe the var as being + declared in an unrelated thread + (e.g. if an error is triggered by tid 5, but tid1 is by + luck in an IP corresponding to the recorded range). + + + The patch changes the way a static variable is recorded: + if DW_AT_external tag is found, a variable is marked as global. + If a variable is not external, but is seen when level is 1, + then we record the variable as a global variable (i.e. + with a full IP range). + This improves the way such static variable are described: + * they are described even if being accessed by other files. + * their description is not in an artificial "thread frame". + + + + + First example: + ************** + a variable cannot be described because it is + accessed by a function in another file: + + with the trunk: + ==20410== ---------------------------------------------------------------- + ==20410== + ==20410== Possible data race during read of size 4 at 0x600F54 by thread #1 + ==20410== Locks held: none + ==20410== at 0x4007E4: a (abc.c:42) + ==20410== by 0x4006BC: main (mabc.c:24) + ==20410== + ==20410== This conflicts with a previous write of size 4 by thread #2 + ==20410== Locks held: none + ==20410== at 0x4007ED: a (abc.c:42) + ==20410== by 0x400651: brussels_fn (mabc.c:9) + ==20410== by 0x4C2B54E: mythread_wrapper (hg_intercepts.c:219) + ==20410== by 0x4E348C9: start_thread (pthread_create.c:300) + ==20410== + ==20410== ---------------------------------------------------------------- + + + with the patch: + ==4515== ---------------------------------------------------------------- + ==4515== + ==4515== Possible data race during read of size 4 at 0x600F54 by thread #1 + ==4515== Locks held: none + ==4515== at 0x4007E4: a (abc.c:42) + ==4515== by 0x4006BC: main (mabc.c:24) + ==4515== + ==4515== This conflicts with a previous write of size 4 by thread #2 + ==4515== Locks held: none + ==4515== at 0x4007ED: a (abc.c:42) + ==4515== by 0x400651: brussels_fn (mabc.c:9) + ==4515== by 0x4C2B54E: mythread_wrapper (hg_intercepts.c:219) + ==4515== by 0x4E348C9: start_thread (pthread_create.c:300) + ==4515== + ==4515== Location 0x600f54 is 0 bytes inside global var "static_global" + ==4515== declared at mabc.c:4 + ==4515== + ==4515== ---------------------------------------------------------------- + + + Second example: + *************** + When the kludge can describe the variable, it is strangely described + as being declared in a frame of a thread, while for sure the declaration + has nothing to do with a thread + With the trunk: + ==20410== Location 0x600f68 is 0 bytes inside local var "static_global_a" + ==20410== declared at abc.c:3, in frame #0 of thread 1 + + With the patch: + ==4515== Location 0x600f68 is 0 bytes inside global var "static_global_a" + ==4515== declared at abc.c:3 + + #include + + static int static_global_a = 0; //// <<<< this is abc.c:3 + + + + + git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13153 a5019735-40e9-0310-863c-91ae7b9d1cf9 + +diff --git a/coregrind/m_debuginfo/debuginfo.c b/coregrind/m_debuginfo/debuginfo.c +index 59f920d..d3b8ef4 100644 +--- a/coregrind/m_debuginfo/debuginfo.c ++++ b/coregrind/m_debuginfo/debuginfo.c +@@ -3282,28 +3282,6 @@ Bool VG_(get_data_description)( + 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, +- data_addr, +- VG_(get_IP)(tid), +- VG_(get_SP)(tid), +- VG_(get_FP)(tid), tid, 0 )) { +- zterm_XA( dname1 ); +- zterm_XA( dname2 ); +- return True; +- } +- } +- /* --- end KLUDGE --- */ +- + /* Perhaps it's on a thread's stack? */ + found = False; + VG_(thread_stack_reset_iter)(&tid); +@@ -3328,9 +3306,6 @@ Bool VG_(get_data_description)( + n_frames = VG_(get_StackTrace)( tid, ips, N_FRAMES, + sps, fps, 0/*first_ip_delta*/ ); + +- /* 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++) { + if (consider_vars_in_frame( dname1, dname2, +diff --git a/drd/tests/annotate_ignore_rw.stderr.exp b/drd/tests/annotate_ignore_rw.stderr.exp +index 24684da..416be80 100644 +--- a/drd/tests/annotate_ignore_rw.stderr.exp ++++ b/drd/tests/annotate_ignore_rw.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_rw.c:?) +-Location 0x........ is 0 bytes inside local var "s_c" +-declared at annotate_ignore_rw.c:12, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_c" ++declared at annotate_ignore_rw.c:12 + + Finished. + +diff --git a/drd/tests/annotate_ignore_rw2.stderr.exp b/drd/tests/annotate_ignore_rw2.stderr.exp +index ffdb76f..4e96bf3 100644 +--- a/drd/tests/annotate_ignore_rw2.stderr.exp ++++ b/drd/tests/annotate_ignore_rw2.stderr.exp +@@ -1,18 +1,18 @@ + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_rw.c:?) +-Location 0x........ is 0 bytes inside local var "s_b" +-declared at annotate_ignore_rw.c:11, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_b" ++declared at annotate_ignore_rw.c:11 + + Conflicting store by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_rw.c:?) +-Location 0x........ is 0 bytes inside local var "s_a" +-declared at annotate_ignore_rw.c:10, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_a" ++declared at annotate_ignore_rw.c:10 + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_rw.c:?) +-Location 0x........ is 0 bytes inside local var "s_c" +-declared at annotate_ignore_rw.c:12, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_c" ++declared at annotate_ignore_rw.c:12 + + Finished. + +diff --git a/drd/tests/annotate_ignore_write.stderr.exp b/drd/tests/annotate_ignore_write.stderr.exp +index f26242e..2204d5b 100644 +--- a/drd/tests/annotate_ignore_write.stderr.exp ++++ b/drd/tests/annotate_ignore_write.stderr.exp +@@ -1,18 +1,18 @@ + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_b" +-declared at annotate_ignore_write.c:11, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_b" ++declared at annotate_ignore_write.c:11 + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_c" +-declared at annotate_ignore_write.c:12, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_c" ++declared at annotate_ignore_write.c:12 + + Conflicting store by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_a" +-declared at annotate_ignore_write.c:10, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_a" ++declared at annotate_ignore_write.c:10 + + Finished. + +diff --git a/drd/tests/annotate_ignore_write2.stderr.exp b/drd/tests/annotate_ignore_write2.stderr.exp +index 03c7766..9b58325 100644 +--- a/drd/tests/annotate_ignore_write2.stderr.exp ++++ b/drd/tests/annotate_ignore_write2.stderr.exp +@@ -1,23 +1,23 @@ + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_b" +-declared at annotate_ignore_write.c:11, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_b" ++declared at annotate_ignore_write.c:11 + + Conflicting store by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_a" +-declared at annotate_ignore_write.c:10, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_a" ++declared at annotate_ignore_write.c:10 + + Conflicting load by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_c" +-declared at annotate_ignore_write.c:12, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_c" ++declared at annotate_ignore_write.c:12 + + Conflicting store by thread 1 at 0x........ size 1 + at 0x........: main (annotate_ignore_write.c:?) +-Location 0x........ is 0 bytes inside local var "s_a" +-declared at annotate_ignore_write.c:10, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_a" ++declared at annotate_ignore_write.c:10 + + Finished. + +diff --git a/drd/tests/atomic_var.stderr.exp b/drd/tests/atomic_var.stderr.exp +index 7fa1e0e..ad05687 100644 +--- a/drd/tests/atomic_var.stderr.exp ++++ b/drd/tests/atomic_var.stderr.exp +@@ -3,8 +3,8 @@ Start of test. + Conflicting load by thread x at 0x........ size 4 + at 0x........: thread_func_2 (atomic_var.c:?) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) +-Location 0x........ is 0 bytes inside local var "s_y" +-declared at atomic_var.c:35, in frame #? of thread x ++Location 0x........ is 0 bytes inside global var "s_y" ++declared at atomic_var.c:35 + + y = 1 + Test finished. +diff --git a/drd/tests/fp_race.stderr.exp b/drd/tests/fp_race.stderr.exp +index 23873d2..68bd254 100644 +--- a/drd/tests/fp_race.stderr.exp ++++ b/drd/tests/fp_race.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 8 + at 0x........: main (fp_race.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at fp_race.c:24, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at fp_race.c:24 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +@@ -10,8 +10,8 @@ Other segment end (thread 2) + + Conflicting store by thread 1 at 0x........ size 8 + at 0x........: main (fp_race.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at fp_race.c:24, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at fp_race.c:24 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/drd/tests/fp_race_xml.stderr.exp b/drd/tests/fp_race_xml.stderr.exp +index 73a530e..05ffe71 100644 +--- a/drd/tests/fp_race_xml.stderr.exp ++++ b/drd/tests/fp_race_xml.stderr.exp +@@ -48,8 +48,8 @@ + ... + + +- Location 0x........ is 0 bytes inside local var "s_d3" +- declared at fp_race.c:24, in frame #? of thread x fp_race.c ... ++ Location 0x........ is 0 bytes inside global var "s_d3" ++ declared at fp_race.c:24 fp_race.c ... + + + +@@ -71,8 +71,8 @@ + ... + + +- Location 0x........ is 0 bytes inside local var "s_d3" +- declared at fp_race.c:24, in frame #? of thread x fp_race.c ... ++ Location 0x........ is 0 bytes inside global var "s_d3" ++ declared at fp_race.c:24 fp_race.c ... + + + +diff --git a/drd/tests/hg03_inherit.stderr.exp b/drd/tests/hg03_inherit.stderr.exp +index 62a8d5d..72eb236 100644 +--- a/drd/tests/hg03_inherit.stderr.exp ++++ b/drd/tests/hg03_inherit.stderr.exp +@@ -4,13 +4,13 @@ Conflicting store by thread 3 at 0x........ size 4 + at 0x........: t2 (hg03_inherit.c:28) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) + Location 0x........ is 0 bytes inside shared[1], +-declared at hg03_inherit.c:11, in frame #? of thread 3 ++a global variable declared at hg03_inherit.c:11 + + Conflicting store by thread 3 at 0x........ size 4 + at 0x........: t2 (hg03_inherit.c:29) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) + Location 0x........ is 0 bytes inside shared[1], +-declared at hg03_inherit.c:11, in frame #? of thread 3 ++a global variable declared at hg03_inherit.c:11 + + + ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0) +diff --git a/drd/tests/hg04_race.stderr.exp b/drd/tests/hg04_race.stderr.exp +index 9ea3ccd..5b5969c 100644 +--- a/drd/tests/hg04_race.stderr.exp ++++ b/drd/tests/hg04_race.stderr.exp +@@ -3,8 +3,8 @@ Thread 3: + Conflicting load by thread 3 at 0x........ size 4 + at 0x........: th (hg04_race.c:10) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) +-Location 0x........ is 0 bytes inside local var "shared" +-declared at hg04_race.c:6, in frame #? of thread 2 ++Location 0x........ is 0 bytes inside global var "shared" ++declared at hg04_race.c:6 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +@@ -13,8 +13,8 @@ Other segment end (thread 2) + Conflicting store by thread 3 at 0x........ size 4 + at 0x........: th (hg04_race.c:10) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) +-Location 0x........ is 0 bytes inside local var "shared" +-declared at hg04_race.c:6, in frame #? of thread 2 ++Location 0x........ is 0 bytes inside global var "shared" ++declared at hg04_race.c:6 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/drd/tests/rwlock_race.stderr.exp b/drd/tests/rwlock_race.stderr.exp +index 8350b50..d3e0b37 100644 +--- a/drd/tests/rwlock_race.stderr.exp ++++ b/drd/tests/rwlock_race.stderr.exp +@@ -2,14 +2,14 @@ + Conflicting load by thread x at 0x........ size 4 + at 0x........: thread_func (rwlock_race.c:?) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) +-Location 0x........ is 0 bytes inside local var "s_racy" +-declared at rwlock_race.c:18, in frame #? of thread x ++Location 0x........ is 0 bytes inside global var "s_racy" ++declared at rwlock_race.c:18 + + Conflicting store by thread x at 0x........ size 4 + at 0x........: thread_func (rwlock_race.c:?) + by 0x........: vgDrd_thread_wrapper (drd_pthread_intercepts.c:?) +-Location 0x........ is 0 bytes inside local var "s_racy" +-declared at rwlock_race.c:18, in frame #? of thread x ++Location 0x........ is 0 bytes inside global var "s_racy" ++declared at rwlock_race.c:18 + + Result: 2 + +diff --git a/drd/tests/sem_as_mutex.stderr.exp b/drd/tests/sem_as_mutex.stderr.exp +index 1646a6c..1fbd91a 100644 +--- a/drd/tests/sem_as_mutex.stderr.exp ++++ b/drd/tests/sem_as_mutex.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 8 + at 0x........: main (sem_as_mutex.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_as_mutex.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_as_mutex.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +@@ -10,8 +10,8 @@ Other segment end (thread 2) + + Conflicting store by thread 1 at 0x........ size 8 + at 0x........: main (sem_as_mutex.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_as_mutex.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_as_mutex.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/drd/tests/sem_as_mutex3.stderr.exp b/drd/tests/sem_as_mutex3.stderr.exp +index 97b09a1..efd47ff 100644 +--- a/drd/tests/sem_as_mutex3.stderr.exp ++++ b/drd/tests/sem_as_mutex3.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 8 + at 0x........: main (sem_as_mutex.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_as_mutex.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_as_mutex.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/drd/tests/sem_open.stderr.exp b/drd/tests/sem_open.stderr.exp +index 4e769e5..e926d05 100644 +--- a/drd/tests/sem_open.stderr.exp ++++ b/drd/tests/sem_open.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 8 + at 0x........: main (sem_open.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_open.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_open.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +@@ -10,8 +10,8 @@ Other segment end (thread 2) + + Conflicting store by thread 1 at 0x........ size 8 + at 0x........: main (sem_open.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_open.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_open.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/drd/tests/sem_open3.stderr.exp b/drd/tests/sem_open3.stderr.exp +index 3c2d392..fb994f5 100644 +--- a/drd/tests/sem_open3.stderr.exp ++++ b/drd/tests/sem_open3.stderr.exp +@@ -1,8 +1,8 @@ + + Conflicting load by thread 1 at 0x........ size 8 + at 0x........: main (sem_open.c:?) +-Location 0x........ is 0 bytes inside local var "s_d3" +-declared at sem_open.c:25, in frame #? of thread 1 ++Location 0x........ is 0 bytes inside global var "s_d3" ++declared at sem_open.c:25 + Other segment start (thread 2) + (thread finished, call stack no longer available) + Other segment end (thread 2) +diff --git a/helgrind/tests/hg03_inherit.stderr.exp b/helgrind/tests/hg03_inherit.stderr.exp +index 1c4a91e..ee21cf0 100644 +--- a/helgrind/tests/hg03_inherit.stderr.exp ++++ b/helgrind/tests/hg03_inherit.stderr.exp +@@ -24,7 +24,7 @@ Locks held: none + at 0x........: main (hg03_inherit.c:60) + + Location 0x........ is 0 bytes inside shared[1], +-declared at hg03_inherit.c:11, in frame #x of thread x ++a global variable declared at hg03_inherit.c:11 + + + ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) +diff --git a/helgrind/tests/hg04_race.stderr.exp b/helgrind/tests/hg04_race.stderr.exp +index 982f940..bf2a185 100644 +--- a/helgrind/tests/hg04_race.stderr.exp ++++ b/helgrind/tests/hg04_race.stderr.exp +@@ -29,8 +29,8 @@ Locks held: none + by 0x........: mythread_wrapper (hg_intercepts.c:...) + ... + +-Location 0x........ is 0 bytes inside local var "shared" +-declared at hg04_race.c:6, in frame #x of thread x ++Location 0x........ is 0 bytes inside global var "shared" ++declared at hg04_race.c:6 + + ---------------------------------------------------------------- + +@@ -46,8 +46,8 @@ Locks held: none + by 0x........: mythread_wrapper (hg_intercepts.c:...) + ... + +-Location 0x........ is 0 bytes inside local var "shared" +-declared at hg04_race.c:6, in frame #x of thread x ++Location 0x........ is 0 bytes inside global var "shared" ++declared at hg04_race.c:6 + + + ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0) +diff --git a/helgrind/tests/rwlock_race.stderr.exp b/helgrind/tests/rwlock_race.stderr.exp +index 4a44713..47c3bd5 100644 +--- a/helgrind/tests/rwlock_race.stderr.exp ++++ b/helgrind/tests/rwlock_race.stderr.exp +@@ -29,8 +29,8 @@ Locks held: none + by 0x........: mythread_wrapper (hg_intercepts.c:...) + ... + +-Location 0x........ is 0 bytes inside local var "s_racy" +-declared at rwlock_race.c:18, in frame #x of thread x ++Location 0x........ is 0 bytes inside global var "s_racy" ++declared at rwlock_race.c:18 + + Result: 2 + +diff --git a/helgrind/tests/tc21_pthonce.stderr.exp b/helgrind/tests/tc21_pthonce.stderr.exp +index 3e7d241..700b492 100644 +--- a/helgrind/tests/tc21_pthonce.stderr.exp ++++ b/helgrind/tests/tc21_pthonce.stderr.exp +@@ -29,8 +29,8 @@ Locks held: none + by 0x........: mythread_wrapper (hg_intercepts.c:...) + ... + +-Location 0x........ is 0 bytes inside local var "unprotected2" +-declared at tc21_pthonce.c:51, in frame #x of thread x ++Location 0x........ is 0 bytes inside global var "unprotected2" ++declared at tc21_pthonce.c:51 + + ---------------------------------------------------------------- + +@@ -46,8 +46,8 @@ Locks held: none + by 0x........: mythread_wrapper (hg_intercepts.c:...) + ... + +-Location 0x........ is 0 bytes inside local var "unprotected2" +-declared at tc21_pthonce.c:51, in frame #x of thread x ++Location 0x........ is 0 bytes inside global var "unprotected2" ++declared at tc21_pthonce.c:51 + + + ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0) +diff --git a/memcheck/tests/varinfo3.stderr.exp b/memcheck/tests/varinfo3.stderr.exp +index d24ddb8..73130b7 100644 +--- a/memcheck/tests/varinfo3.stderr.exp ++++ b/memcheck/tests/varinfo3.stderr.exp +@@ -3,7 +3,7 @@ Uninitialised byte(s) found during client check request + by 0x........: foo (varinfo3.c:54) + by 0x........: main (varinfo3.c:66) + Location 0x........ is 0 bytes inside static_global_def[1], +- declared at varinfo3.c:35, in frame #0 of thread 1 ++ a global variable declared at varinfo3.c:35 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo3.c:28) +@@ -17,7 +17,7 @@ Uninitialised byte(s) found during client check request + by 0x........: foo (varinfo3.c:56) + by 0x........: main (varinfo3.c:66) + Location 0x........ is 0 bytes inside static_global_undef[3], +- declared at varinfo3.c:37, in frame #0 of thread 1 ++ a global variable declared at varinfo3.c:37 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo3.c:28) +diff --git a/memcheck/tests/varinfo3.stderr.exp-ppc64 b/memcheck/tests/varinfo3.stderr.exp-ppc64 +index e02a3c8..8dff370 100644 +--- a/memcheck/tests/varinfo3.stderr.exp-ppc64 ++++ b/memcheck/tests/varinfo3.stderr.exp-ppc64 +@@ -3,7 +3,7 @@ Uninitialised byte(s) found during client check request + by 0x........: foo (varinfo3.c:54) + by 0x........: main (varinfo3.c:66) + Location 0x........ is 0 bytes inside static_global_def[1], +- declared at varinfo3.c:35, in frame #0 of thread 1 ++ a global variable declared at varinfo3.c:35 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo3.c:29) +@@ -17,7 +17,7 @@ Uninitialised byte(s) found during client check request + by 0x........: foo (varinfo3.c:56) + by 0x........: main (varinfo3.c:66) + Location 0x........ is 0 bytes inside static_global_undef[3], +- declared at varinfo3.c:37, in frame #0 of thread 1 ++ a global variable declared at varinfo3.c:37 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo3.c:29) +diff --git a/memcheck/tests/varinfo5.stderr.exp b/memcheck/tests/varinfo5.stderr.exp +index 3be0984..5fa9d97 100644 +--- a/memcheck/tests/varinfo5.stderr.exp ++++ b/memcheck/tests/varinfo5.stderr.exp +@@ -83,7 +83,7 @@ Uninitialised byte(s) found during client check request + by 0x........: varinfo5_main (varinfo5so.c:156) + by 0x........: main (varinfo5.c:5) + Location 0x........ is 0 bytes inside static_global_def[1], +- declared at varinfo5so.c:87, in frame #0 of thread 1 ++ a global variable declared at varinfo5so.c:87 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo5so.c:29) +@@ -101,7 +101,7 @@ Uninitialised byte(s) found during client check request + by 0x........: varinfo5_main (varinfo5so.c:156) + by 0x........: main (varinfo5.c:5) + Location 0x........ is 0 bytes inside static_global_undef[3], +- declared at varinfo5so.c:89, in frame #0 of thread 1 ++ a global variable declared at varinfo5so.c:89 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo5so.c:29) +diff --git a/memcheck/tests/varinfo5.stderr.exp-ppc64 b/memcheck/tests/varinfo5.stderr.exp-ppc64 +index db0c4fd..f5ebf0b 100644 +--- a/memcheck/tests/varinfo5.stderr.exp-ppc64 ++++ b/memcheck/tests/varinfo5.stderr.exp-ppc64 +@@ -83,7 +83,7 @@ Uninitialised byte(s) found during client check request + by 0x........: varinfo5_main (varinfo5so.c:156) + by 0x........: main (varinfo5.c:5) + Location 0x........ is 0 bytes inside static_global_def[1], +- declared at varinfo5so.c:87, in frame #0 of thread 1 ++ a global variable declared at varinfo5so.c:87 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo5so.c:30) +@@ -101,7 +101,7 @@ Uninitialised byte(s) found during client check request + by 0x........: varinfo5_main (varinfo5so.c:156) + by 0x........: main (varinfo5.c:5) + Location 0x........ is 0 bytes inside static_global_undef[3], +- declared at varinfo5so.c:89, in frame #0 of thread 1 ++ a global variable declared at varinfo5so.c:89 + + Uninitialised byte(s) found during client check request + at 0x........: croak (varinfo5so.c:30) +--- valgrind-3.8.1/coregrind/m_debuginfo/readdwarf3.c.orig 2012-08-17 08:59:56.000000000 +0200 ++++ valgrind-3.8.1/coregrind/m_debuginfo/readdwarf3.c 2013-02-19 15:39:55.965382081 +0100 +@@ -1853,7 +1853,7 @@ + if (dtag == DW_TAG_variable || dtag == DW_TAG_formal_parameter) { + UChar* name = NULL; + UWord typeR = D3_INVALID_CUOFF; +- Bool external = False; ++ Bool global = False; + GExpr* gexpr = NULL; + Int n_attrs = 0; + UWord abs_ori = (UWord)D3_INVALID_CUOFF; +@@ -1880,7 +1880,7 @@ + typeR = cook_die_using_form( cc, (UWord)cts, form ); + } + if (attr == DW_AT_external && ctsSzB > 0 && cts > 0) { +- external = True; ++ global = True; + } + if (attr == DW_AT_abstract_origin && ctsSzB > 0) { + abs_ori = (UWord)cts; +@@ -1902,6 +1902,14 @@ + if (0) VG_(printf)("XXX filename = %s\n", fileName); + } + } ++ if (!global && dtag == DW_TAG_variable && level == 1) { ++ /* Case of a static variable. It is better to declare ++ it global as the variable is not really related to ++ a PC range, as its address can be used by program ++ counters outside of the ranges where it is visible . */ ++ global = True; ++ } ++ + /* We'll collect it under if one of the following three + conditions holds: + (1) has location and type -> completed +@@ -1927,7 +1935,7 @@ + this CU. */ + vg_assert(parser->sp >= 0); + +- /* If this is a local variable (non-external), try to find ++ /* If this is a local variable (non-global), try to find + the GExpr for the DW_AT_frame_base of the containing + function. It should have been pushed on the stack at the + time we encountered its DW_TAG_subprogram DIE, so the way +@@ -1939,7 +1947,7 @@ + if the containing DT_TAG_subprogram didn't supply a + DW_AT_frame_base -- that's OK, but there must actually be + a containing DW_TAG_subprogram. */ +- if (!external) { ++ if (!global) { + Bool found = False; + for (i = parser->sp; i >= 0; i--) { + if (parser->isFunc[i]) { +@@ -1951,7 +1959,7 @@ + if (!found) { + if (0 && VG_(clo_verbosity) >= 0) { + VG_(message)(Vg_DebugMsg, +- "warning: parse_var_DIE: non-external variable " ++ "warning: parse_var_DIE: non-global variable " + "outside DW_TAG_subprogram\n"); + } + /* goto bad_DIE; */ +@@ -1964,18 +1972,18 @@ + } + } + +- /* re "external ? 0 : parser->sp" (twice), if the var is +- marked 'external' then we must put it at the global scope, ++ /* re "global ? 0 : parser->sp" (twice), if the var is ++ marked 'global' then we must put it at the global scope, + as only the global scope (level 0) covers the entire PC + address space. It is asserted elsewhere that level 0 + always covers the entire address space. */ +- xa = parser->ranges[external ? 0 : parser->sp]; ++ xa = parser->ranges[global ? 0 : parser->sp]; + nRanges = VG_(sizeXA)(xa); + vg_assert(nRanges >= 0); + + tv = ML_(dinfo_zalloc)( "di.readdwarf3.pvD.1", sizeof(TempVar) ); + tv->name = name; +- tv->level = external ? 0 : parser->sp; ++ tv->level = global ? 0 : parser->sp; + tv->typeR = typeR; + tv->gexpr = gexpr; + tv->fbGX = fbGX;