]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Apply text_debug_bias to inline IP extracted from dwarf3
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Tue, 8 Jul 2014 18:56:47 +0000 (18:56 +0000)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Tue, 8 Jul 2014 18:56:47 +0000 (18:56 +0000)
Without this biasing, inline info is not correct for shared objects.
Updated test varinfo5 to use --read-inline-info=yes and added
an inline test case.
Note: the varinfo reader does not understand the inlining info, and
so variables in inlined functions are not properly described.

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

coregrind/m_debuginfo/readdwarf3.c
memcheck/tests/suppvarinfo5.supp
memcheck/tests/varinfo5.stderr.exp
memcheck/tests/varinfo5.vgtest
memcheck/tests/varinfo5so.c

index e6aac53868f630f693fd4401cf45400ded8dcda8..a3c0a0f0732a993afb6120af041fbafbe2d5c988 100644 (file)
@@ -2593,6 +2593,9 @@ static Bool parse_inl_DIE (
       if (have_lo && have_hi1 && (!have_range)) {
          /* This inlined call is just a single address range. */
          if (ip_lo < ip_hi1) {
+            /* Apply text debug biasing */
+            ip_lo += cc->di->text_debug_bias;
+            ip_hi1 += cc->di->text_debug_bias;
             ML_(addInlInfo) (cc->di,
                              ip_lo, ip_hi1, 
                              get_inlFnName (inlinedfn_abstract_origin, cc, td3),
@@ -2606,6 +2609,8 @@ static Bool parse_inl_DIE (
          Word j;
          HChar *inlfnname = get_inlFnName (inlinedfn_abstract_origin, cc, td3);
 
+         /* Why is get_range_list biasing with cc->cu_svma and 
+            not with text_debug_bias ? */
          ranges = get_range_list( cc, td3,
                                   rangeoff, cc->cu_svma );
          for (j = 0; j < VG_(sizeXA)( ranges ); j++) {
index 3ccbd52ac0ce0c62ded33c17a4f667ee08125fca..c135bb01d4332ceadc710ad5c14529cb136fcdd7 100644 (file)
    obj:*varinfo5so.so
    obj:*varinfo5
 }
+
+{
+   funinl_not_shown
+   Memcheck:User
+   fun:croak
+   fun:varinfo5_main
+   fun:main
+
+}
index 5fa9d979c72c5555dbbf22b336dad2dfe1be912f..8edc97e18f509e7f7d6ecd1d8e18558a2d5c2238 100644 (file)
@@ -178,3 +178,14 @@ Uninitialised byte(s) found during client check request
  declared at varinfo5so.c:135, in frame #1 of thread 1
 
 answer is 0
+Uninitialised byte(s) found during client check request
+   at 0x........: croak (varinfo5so.c:29)
+   by 0x........: fun_c (varinfo5so.c:164)
+   by 0x........: fun_b (varinfo5so.c:168)
+   by 0x........: fun_a (varinfo5so.c:172)
+   by 0x........: inlinetest (varinfo5so.c:178)
+   by 0x........: varinfo5_main (varinfo5so.c:158)
+   by 0x........: main (varinfo5.c:5)
+ Address 0x........ is on thread 1's stack
+ in frame #1, created by varinfo5_main (varinfo5so.c:153)
+
index 1213243cb1afac5893a8b46d967a39ddc78dbec2..79c4a72a4a0ba71d8c746d872ea75d91bc72511f 100644 (file)
@@ -1,3 +1,3 @@
 prog: varinfo5
-vgopts: --read-var-info=yes -q
+vgopts: --read-var-info=yes --read-inline-info=yes -q
 stderr_filter: filter_varinfo3
index d90fbc4e914f62933b850de607f7aafee7011a2b..d2c53502362dcd5502c416ffbc4611984b7d05e8 100644 (file)
@@ -146,7 +146,7 @@ static int varinfo4_main ( void )
   fprintf(stderr, "answer is %d\n", blah4(3,7) );
   return 0;
 }
-
+static void inlinetest(void);
 /* ------------ varinfo5 ------------ */
 
 void varinfo5_main ( void )
@@ -155,4 +155,25 @@ void varinfo5_main ( void )
    varinfo2_main();
    varinfo3_main();
    varinfo4_main();
+   inlinetest();
+}
+
+#define INLINE    inline __attribute__((always_inline))
+
+INLINE void fun_c(int argc) {
+   croak(&argc);
+}
+
+INLINE void fun_b(int argb) {
+   fun_c(argb);
+}
+
+INLINE void fun_a(int *arga) {
+   fun_b(*arga);
+}
+
+void inlinetest(void)
+{
+   int i = 1;
+   fun_a(&i);
 }