|
From: Jeremy F. <je...@go...> - 2004-03-05 05:50:25
|
CVS commit by fitzhardinge:
Fix bug 76780 - implement stabs type '@' for pointer to member.
M +41 -23 vg_stabs.c 1.7
--- valgrind/coregrind/vg_stabs.c #1.6:1.7
@@ -301,33 +301,39 @@ static StabType *getStabType(StabTypeTab
}
-static Bool isdigit(Char c, Int base, Int *v)
+static Bool isdigit(Char c, Int base, Int *vp)
{
+ Bool ret = False;
+ Int v = 0;
+
switch(base) {
case 10:
case 0:
- *v = c - '0';
- return c >= '0' && c <= '9';
+ v = c - '0';
+ ret = (c >= '0' && c <= '9');
+ break;
case 8:
- *v = c - '0';
- return c >= '0' && c <= '7';
+ v = c - '0';
+ ret = (c >= '0' && c <= '7');
+ break;
case 16:
if (c >= '0' && c <= '9') {
- *v = c - '0';
- return True;
- }
- if (c >= 'a' && c <= 'f') {
- *v = c - 'a';
- return True;
- }
- if (c >= 'A' && c <= 'F') {
- *v = c - 'F';
- return True;
+ v = c - '0';
+ ret = True;
+ } else if (c >= 'a' && c <= 'f') {
+ v = c - 'a';
+ ret = True;
+ } else if (c >= 'A' && c <= 'F') {
+ v = c - 'F';
+ ret = True;
}
- return False;
+ break;
}
- return False;
+ if (vp && ret)
+ *vp = v;
+
+ return ret;
}
@@ -535,6 +541,9 @@ static SymType *stabtype_parser(SegInfo
VG_(printf)("defining type %p (%d,%d) = %s\n", symtype, file, sym, p);
- /* skip type attributes */
- while(*p == '@')
+ /* Skip type attributes
+ '@' could also be pointer-to-member, so we need to see if
+ the following character looks like a type reference or not.
+ */
+ while(*p == '@' && !(VG_(isdigit)(p[1]) || p[1] == '-' || p[1] == '(') )
p = SKIPPAST(p+1, ';', "type attrib");
@@ -645,5 +654,5 @@ static SymType *stabtype_parser(SegInfo
case '&': /* reference */
case '*': { /* pointer */
- /* '*' TYPE */
+ /* ('*' | '&') TYPE */
type = stabtype_parser(si, NULL, &p);
type = VG_(st_mkpointer)(def, type);
@@ -653,5 +662,5 @@ static SymType *stabtype_parser(SegInfo
case 'k': /* const */
case 'B': { /* volatile */
- /* 'k' TYPE */
+ /* ('k' | 'B') TYPE */
type = stabtype_parser(si, NULL, &p);
break;
@@ -702,5 +711,5 @@ static SymType *stabtype_parser(SegInfo
case 'P': /* packed array */
case 'a': { /* array */
- /* a IDX-TYPE TYPE */
+ /* ( 'a' | 'P' ) IDX-TYPE TYPE */
SymType *idxtype;
SymType *artype;
@@ -733,5 +742,5 @@ static SymType *stabtype_parser(SegInfo
/* Gad. Here we go:
- 's' SIZE
+ ( 's' | 'u' ) SIZE
( '!' NBASE ',' ( VIRT PUB OFF ',' BASE-TYPE ){NBASE} )?
@@ -932,4 +941,13 @@ static SymType *stabtype_parser(SegInfo
break;
+ case '@': /* pointer to member */
+ /* '@' CLASS-TYPE ',' MEMBER-TYPE */
+ type = VG_(st_mkint)(def, sizeof(int), False); /* make it an int for our use */
+
+ stabtype_parser(si, NULL, &p); /* CLASS-TYPE */
+ EXPECT(',', "member-pointer CLASS-TYPE");
+ stabtype_parser(si, NULL, &p); /* MEMBER-TYPE */
+ break;
+
default:
VG_(printf)(" @@ don't know what type '%c' is\n", t);
|