Index: tools/wine_valgrind/valgrind_stop_frame.patch |
=================================================================== |
--- tools/wine_valgrind/valgrind_stop_frame.patch (revision 75330) |
+++ tools/wine_valgrind/valgrind_stop_frame.patch (working copy) |
@@ -1,147 +0,0 @@ |
-This patch adds a "STOP" frame to valgrind suppressions |
-so we can do exact matches. This is filed as |
-https://bugs.kde.org/show_bug.cgi?id=222604 |
-TODO(thestig) update the matcher spec and submit upstream. |
-Index: include/pub_tool_seqmatch.h |
-=================================================================== |
---- include/pub_tool_seqmatch.h (revision 10880) |
-+++ include/pub_tool_seqmatch.h (working copy) |
-@@ -76,6 +76,7 @@ |
- void* input, SizeT szbInput, UWord nInput, UWord ixInput, |
- Bool (*pIsStar)(void*), |
- Bool (*pIsQuery)(void*), |
-+ Bool (*pIsStop)(void*), |
- Bool (*pattEQinp)(void*,void*) |
- ); |
- |
-Index: coregrind/m_errormgr.c |
-=================================================================== |
---- coregrind/m_errormgr.c (revision 10880) |
-+++ coregrind/m_errormgr.c (working copy) |
-@@ -194,7 +194,8 @@ |
- NoName, /* Error case */ |
- ObjName, /* Name is of an shared object file. */ |
- FunName, /* Name is of a function. */ |
-- DotDotDot /* Frame-level wildcard */ |
-+ DotDotDot, /* Frame-level wildcard */ |
-+ STOP /* STOP sign */ |
- } |
- SuppLocTy; |
- |
-@@ -1074,6 +1075,11 @@ |
- p->ty = DotDotDot; |
- return True; |
- } |
-+ if (VG_(strcmp)(p->name, "STOP") == 0) { |
-+ p->name = NULL; |
-+ p->ty = STOP; |
-+ return True; |
-+ } |
- VG_(printf)("location should be \"...\", or should start " |
- "with \"fun:\" or \"obj:\"\n"); |
- return False; |
-@@ -1243,13 +1249,17 @@ |
- } while (!eof && !VG_STREQ(buf, "}")); |
- } |
- |
-- // Reject entries which are entirely composed of frame |
-- // level wildcards. |
- vg_assert(i > 0); // guaranteed by frame-descriptor reading loop |
-+ // Reject any pattern where STOP is not the last entry. |
-+ for (j = 0; j < i - 1; j++) { |
-+ if (tmp_callers[j].ty == STOP) |
-+ BOMB("STOP must be the last entry in a suppression"); |
-+ } |
-+ // Reject entries which are entirely composed of frame level wildcards. |
- for (j = 0; j < i; j++) { |
- if (tmp_callers[j].ty == FunName || tmp_callers[j].ty == ObjName) |
- break; |
-- vg_assert(tmp_callers[j].ty == DotDotDot); |
-+ vg_assert(tmp_callers[j].ty == DotDotDot || tmp_callers[j].ty == STOP); |
- } |
- vg_assert(j >= 0 && j <= i); |
- if (j == i) { |
-@@ -1324,6 +1334,12 @@ |
- return False; /* there's no '?' equivalent in the supp syntax */ |
- } |
- |
-+static Bool supploc_IsStop ( void* supplocV ) |
-+{ |
-+ SuppLoc* supploc = (SuppLoc*)supplocV; |
-+ return supploc->ty == STOP; |
-+} |
-+ |
- static Bool supp_pattEQinp ( void* supplocV, void* addrV ) |
- { |
- SuppLoc* supploc = (SuppLoc*)supplocV; /* PATTERN */ |
-@@ -1340,6 +1356,8 @@ |
- should never get called with a pattern value for which the |
- _IsStar or _IsQuery function would return True. Hence |
- this can't happen. */ |
-+ case STOP: |
-+ // Ditto. |
- vg_assert(0); |
- case ObjName: |
- /* Get the object name into 'caller_name', or "???" |
-@@ -1389,7 +1407,7 @@ |
- matchAll, |
- /*PATT*/supps, szbPatt, n_supps, 0/*initial Ix*/, |
- /*INPUT*/ips, szbInput, n_ips, 0/*initial Ix*/, |
-- supploc_IsStar, supploc_IsQuery, supp_pattEQinp |
-+ supploc_IsStar, supploc_IsQuery, supploc_IsStop, supp_pattEQinp |
- ); |
- } |
- |
-Index: coregrind/m_seqmatch.c |
-=================================================================== |
---- coregrind/m_seqmatch.c (revision 10880) |
-+++ coregrind/m_seqmatch.c (working copy) |
-@@ -45,6 +45,7 @@ |
- void* input, SizeT szbInput, UWord nInput, UWord ixInput, |
- Bool (*pIsStar)(void*), |
- Bool (*pIsQuery)(void*), |
-+ Bool (*pIsStop)(void*), |
- Bool (*pattEQinp)(void*,void*) |
- ) |
- { |
-@@ -102,7 +103,7 @@ |
- if (VG_(generic_match)( matchAll, |
- patt, szbPatt, nPatt, ixPatt+1, |
- input,szbInput,nInput, ixInput+0, |
-- pIsStar,pIsQuery,pattEQinp) ) { |
-+ pIsStar,pIsQuery,pIsStop,pattEQinp) ) { |
- return True; |
- } |
- // but we can tail-recurse for the second call |
-@@ -125,6 +126,9 @@ |
- } |
- } |
- |
-+ if (havePatt && pIsStop(currPatt)) |
-+ return !haveInput; |
-+ |
- // obvious case with literal chars in the pattern |
- // |
- // ma (p:ps) (i:is) = p == i && ma ps is |
-@@ -163,10 +167,11 @@ |
- */ |
- static Bool charIsStar ( void* pV ) { return *(Char*)pV == '*'; } |
- static Bool charIsQuery ( void* pV ) { return *(Char*)pV == '?'; } |
-+static Bool charIsStop ( void* pV ) { return *(Char*)pV == '!'; } |
- static Bool char_p_EQ_i ( void* pV, void* cV ) { |
- Char p = *(Char*)pV; |
- Char c = *(Char*)cV; |
-- vg_assert(p != '*' && p != '?'); |
-+ vg_assert(p != '*' && p != '?' && p != '!'); |
- return p == c; |
- } |
- Bool VG_(string_match) ( const Char* patt, const Char* input ) |
-@@ -175,7 +180,7 @@ |
- True/* match-all */, |
- (void*)patt, sizeof(UChar), VG_(strlen)(patt), 0, |
- (void*)input, sizeof(UChar), VG_(strlen)(input), 0, |
-- charIsStar, charIsQuery, char_p_EQ_i |
-+ charIsStar, charIsQuery, charIsStop, char_p_EQ_i |
- ); |
- } |
- |