Author: philippe
Date: Tue Jul 8 18:56:47 2014
New Revision: 14146
Log:
Apply text_debug_bias to inline IP extracted from dwarf3
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.
Modified:
trunk/coregrind/m_debuginfo/readdwarf3.c
trunk/memcheck/tests/suppvarinfo5.supp
trunk/memcheck/tests/varinfo5.stderr.exp
trunk/memcheck/tests/varinfo5.vgtest
trunk/memcheck/tests/varinfo5so.c
Modified: trunk/coregrind/m_debuginfo/readdwarf3.c
==============================================================================
--- trunk/coregrind/m_debuginfo/readdwarf3.c (original)
+++ trunk/coregrind/m_debuginfo/readdwarf3.c Tue Jul 8 18:56:47 2014
@@ -2593,6 +2593,9 @@
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 @@
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++) {
Modified: trunk/memcheck/tests/suppvarinfo5.supp
==============================================================================
--- trunk/memcheck/tests/suppvarinfo5.supp (original)
+++ trunk/memcheck/tests/suppvarinfo5.supp Tue Jul 8 18:56:47 2014
@@ -27,3 +27,12 @@
obj:*varinfo5so.so
obj:*varinfo5
}
+
+{
+ funinl_not_shown
+ Memcheck:User
+ fun:croak
+ fun:varinfo5_main
+ fun:main
+
+}
Modified: trunk/memcheck/tests/varinfo5.stderr.exp
==============================================================================
--- trunk/memcheck/tests/varinfo5.stderr.exp (original)
+++ trunk/memcheck/tests/varinfo5.stderr.exp Tue Jul 8 18:56:47 2014
@@ -178,3 +178,14 @@
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)
+
Modified: trunk/memcheck/tests/varinfo5.vgtest
==============================================================================
--- trunk/memcheck/tests/varinfo5.vgtest (original)
+++ trunk/memcheck/tests/varinfo5.vgtest Tue Jul 8 18:56:47 2014
@@ -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
Modified: trunk/memcheck/tests/varinfo5so.c
==============================================================================
--- trunk/memcheck/tests/varinfo5so.c (original)
+++ trunk/memcheck/tests/varinfo5so.c Tue Jul 8 18:56:47 2014
@@ -146,7 +146,7 @@
fprintf(stderr, "answer is %d\n", blah4(3,7) );
return 0;
}
-
+static void inlinetest(void);
/* ------------ varinfo5 ------------ */
void varinfo5_main ( void )
@@ -155,4 +155,25 @@
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);
}
|