|
From: <sv...@va...> - 2009-07-27 07:53:20
|
Author: tom
Date: 2009-07-27 08:52:56 +0100 (Mon, 27 Jul 2009)
New Revision: 10629
Log:
Make sure the entire symbol is swapped when canonicaliseSymtab decides
that two overlapping symbols needs to be swapped. Fixes #163253.
Based on patch from John Reiser <jr...@bi...>.
Modified:
trunk/coregrind/m_debuginfo/storage.c
Modified: trunk/coregrind/m_debuginfo/storage.c
===================================================================
--- trunk/coregrind/m_debuginfo/storage.c 2009-07-26 21:59:29 UTC (rev 10628)
+++ trunk/coregrind/m_debuginfo/storage.c 2009-07-27 07:52:56 UTC (rev 10629)
@@ -1212,7 +1212,9 @@
static void canonicaliseSymtab ( struct _DebugInfo* di )
{
Word i, j, n_merged, n_truncated;
- Addr s1, s2, e1, e2;
+ Addr s1, s2, e1, e2, p1, p2;
+ UChar *n1, *n2;
+ Bool t1, t2;
# define SWAP(ty,aa,bb) \
do { ty tt = (aa); (aa) = (bb); (bb) = tt; } while (0)
@@ -1272,15 +1274,22 @@
/* Truncate one or the other. */
s1 = di->symtab[i].addr;
+ e1 = s1 + di->symtab[i].size - 1;
+ p1 = di->symtab[i].tocptr;
+ n1 = di->symtab[i].name;
+ t1 = di->symtab[i].isText;
s2 = di->symtab[i+1].addr;
- e1 = s1 + di->symtab[i].size - 1;
e2 = s2 + di->symtab[i+1].size - 1;
+ p2 = di->symtab[i+1].tocptr;
+ n2 = di->symtab[i+1].name;
+ t2 = di->symtab[i+1].isText;
if (s1 < s2) {
e1 = s2-1;
} else {
vg_assert(s1 == s2);
if (e1 > e2) {
- s1 = e2+1; SWAP(Addr,s1,s2); SWAP(Addr,e1,e2);
+ s1 = e2+1; SWAP(Addr,s1,s2); SWAP(Addr,e1,e2); SWAP(Addr,p1,p2);
+ SWAP(UChar *,n1,n2); SWAP(Bool,t1,t2);
} else
if (e1 < e2) {
s2 = e1+1;
@@ -1290,9 +1299,15 @@
}
}
di->symtab[i].addr = s1;
- di->symtab[i+1].addr = s2;
di->symtab[i].size = e1 - s1 + 1;
- di->symtab[i+1].size = e2 - s2 + 1;
+ di->symtab[i].tocptr = p1;
+ di->symtab[i].name = n1;
+ di->symtab[i].isText = t1;
+ di->symtab[i+1].addr = s2;
+ di->symtab[i+1].size = e2 - s2 + 1;
+ di->symtab[i+1].tocptr = p2;
+ di->symtab[i+1].name = n2;
+ di->symtab[i+1].isText = t2;
vg_assert(s1 <= s2);
vg_assert(di->symtab[i].size > 0);
vg_assert(di->symtab[i+1].size > 0);
|