]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Try to sort out signedness problems in hg_wordfm.[ch], and do a bunch
authorJulian Seward <jseward@acm.org>
Fri, 15 Feb 2008 22:02:30 +0000 (22:02 +0000)
committerJulian Seward <jseward@acm.org>
Fri, 15 Feb 2008 22:02:30 +0000 (22:02 +0000)
of other tidying too.

* All these word-based abstractions (WordFM, WordSet, WordBag) now
  operate on unsigned words (UWord), whereas they previously operated
  on signed words (Word).  This became a problem, when using unboxed
  comparisons, with the introduction of HG_(initIterAtFM), which
  allows iteration over parts of mappings.  Iterating over a mapping in
  increasing order of signed Word keys is not what callers expect when
  iterating through maps whose keys representing addresses (Addr) since
  Addr is unsigned, and causes logical problems and assertion
  failures.

* Change various size-of-things types from signed to unsigned, and
  make them consistently word sized.  For example the return type
  of HG_(sizeFM) used to be an Int, which never made any sense
  (the size can't be negative, and, on a 64-bit platform, the
  map could have more than 2G elements, in which case an Int can't
  represent the result).  So make the return value a UWord instead.
  This should generally help avoid obscure overflow problems on 64-bit
  platforms.

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

helgrind/hg_main.c
helgrind/hg_wordfm.c
helgrind/hg_wordfm.h
helgrind/hg_wordset.c
helgrind/hg_wordset.h

index 825b84d3d30e7e1543c5d9b65b9dfb3735d9d4a5..0fe26d52e525aa5f8f02ff9aa26cadf79946e406 100644 (file)
@@ -2516,7 +2516,7 @@ static void threads__sanity_check ( Char* who )
    Char*     how = "no error";
    Thread*   thr;
    WordSetID wsA, wsW;
-   Word*     ls_words;
+   UWord*    ls_words;
    Word      ls_size, i;
    Lock*     lk;
    Segment*  seg;
@@ -2676,7 +2676,7 @@ static void shmem__sanity_check ( Char* who )
    Word    smga;
    SecMap* sm;
    Word    i, j, ws_size, n_valid_tags;
-   Word*   ws_words;
+   UWord*  ws_words;
    Addr*   valid_tags;
    HG_(initIterFM)( map_shmem );
    // for sm in SecMaps {
@@ -6614,7 +6614,7 @@ typedef
    }
    LAOGLinkExposition;
 
-static Word cmp_LAOGLinkExposition ( Word llx1W, Word llx2W ) {
+static Word cmp_LAOGLinkExposition ( UWord llx1W, UWord llx2W ) {
    /* Compare LAOGLinkExposition*s by (src_ga,dst_ga) field pair. */
    LAOGLinkExposition* llx1 = (LAOGLinkExposition*)llx1W;
    LAOGLinkExposition* llx2 = (LAOGLinkExposition*)llx2W;
@@ -6631,7 +6631,7 @@ static WordFM* laog_exposition = NULL; /* WordFM LAOGLinkExposition* NULL */
 
 static void laog__show ( Char* who ) {
    Word i, ws_size;
-   Word* ws_words;
+   UWord* ws_words;
    Lock* me;
    LAOGLinks* links;
    VG_(printf)("laog (requested by %s) {\n", who);
@@ -6791,7 +6791,7 @@ static WordSetID /* in univ_laog */ laog__preds ( Lock* lk ) {
 __attribute__((noinline))
 static void laog__sanity_check ( Char* who ) {
    Word i, ws_size;
-   Word* ws_words;
+   UWord* ws_words;
    Lock* me;
    LAOGLinks* links;
    if ( !laog )
@@ -6845,7 +6845,7 @@ Lock* laog__do_dfs_from_to ( Lock* src, WordSetID dsts /* univ_lsets */ )
    Lock*     here;
    WordSetID succs;
    Word      succs_size;
-   Word*     succs_words;
+   UWord*    succs_words;
    //laog__sanity_check();
 
    /* If the destination set is empty, we can never get there from
@@ -6897,7 +6897,7 @@ static void laog__pre_thread_acquires_lock (
                Lock*   lk
             )
 {
-   Word*    ls_words;
+   UWord*   ls_words;
    Word     ls_size, i;
    Lock*    other;
 
@@ -6982,7 +6982,7 @@ static void laog__handle_one_lock_deletion ( Lock* lk )
 {
    WordSetID preds, succs;
    Word preds_size, succs_size, i, j;
-   Word *preds_words, *succs_words;
+   UWord *preds_words, *succs_words;
 
    preds = laog__preds( lk );
    succs = laog__succs( lk );
@@ -7012,8 +7012,8 @@ static void laog__handle_lock_deletions (
                WordSetID /* in univ_laog */ locksToDelete
             )
 {
-   Word  i, ws_size;
-   Word* ws_words;
+   Word   i, ws_size;
+   UWord* ws_words;
 
    if (!laog)
       laog = HG_(newFM)( hg_zalloc, hg_free, NULL/*unboxedcmp*/ );
@@ -7716,7 +7716,7 @@ Bool hg_handle_client_request ( ThreadId tid, UWord* args, UWord* ret)
 /* maps (by value) strings to a copy of them in ARENA_TOOL */
 static UWord stats__string_table_queries = 0;
 static WordFM* string_table = NULL;
-static Word string_table_cmp ( Word s1, Word s2 ) {
+static Word string_table_cmp ( UWord s1, UWord s2 ) {
    return (Word)VG_(strcmp)( (HChar*)s1, (HChar*)s2 );
 }
 static HChar* string_table_strdup ( HChar* str ) {
@@ -7744,7 +7744,7 @@ static HChar* string_table_strdup ( HChar* str ) {
 /* maps from Lock .unique fields to LockP*s */
 static UWord stats__ga_LockN_to_P_queries = 0;
 static WordFM* yaWFM = NULL;
-static Word lock_unique_cmp ( Word lk1W, Word lk2W )
+static Word lock_unique_cmp ( UWord lk1W, UWord lk2W )
 {
    Lock* lk1 = (Lock*)lk1W;
    Lock* lk2 = (Lock*)lk2W;
@@ -8084,8 +8084,8 @@ static Int cmp_Thread_by_errmsg_index ( void* thr1V, void* thr2V ) {
 static XArray* /* of Thread* */ get_sorted_thread_set ( WordSetID tset )
 {
    XArray* xa;
-   Word*   ts_words;
-   Word    ts_size, i;
+   UWord*  ts_words;
+   UWord   ts_size, i;
    xa = VG_(newXA)( hg_zalloc, hg_free, sizeof(Thread*) );
    tl_assert(xa);
    HG_(getPayloadWS)( &ts_words, &ts_size, univ_tsets, tset );
index e5ed37c1c31292b65b63139f823193ad4af044fb..db41c5df8f4c5aa939b21877d3d2e9156f6a1ce6 100644 (file)
@@ -82,8 +82,8 @@
 /* One element of the AVL tree */
 typedef
    struct _AvlNode {
-      Word key;
-      Word val;
+      UWord key;
+      UWord val;
       struct _AvlNode* child[2]; /* [0] is left subtree, [1] is right */
       Char balance; /* do not make this unsigned */
    }
@@ -91,7 +91,7 @@ typedef
 
 typedef 
    struct {
-      Word w;
+      UWord w;
       Bool b;
    }
    MaybeWord;
@@ -102,14 +102,14 @@ struct _WordFM {
    AvlNode* root;
    void*    (*alloc_nofail)( SizeT );
    void     (*dealloc)(void*);
-   Word     (*kCmp)(Word,Word);
+   Word     (*kCmp)(UWord,UWord);
    AvlNode* nodeStack[WFM_STKMAX]; // Iterator node stack
    Int      numStack[WFM_STKMAX];  // Iterator num stack
    Int      stackTop;              // Iterator stack pointer, one past end
 }; 
 
 /* forward */
-static Bool avl_removeroot_wrk(AvlNode** t, Word(*kCmp)(Word,Word));
+static Bool avl_removeroot_wrk(AvlNode** t, Word(*kCmp)(UWord,UWord));
 
 /* Swing to the left.  Warning: no balance maintainance. */
 static void avl_swl ( AvlNode** root )
@@ -154,16 +154,16 @@ static void avl_nasty ( AvlNode* root )
 }
 
 /* Find size of a non-NULL tree. */
-static Word size_avl_nonNull ( AvlNode* nd )
+static UWord size_avl_nonNull ( AvlNode* nd )
 {
    return 1 + (nd->child[0] ? size_avl_nonNull(nd->child[0]) : 0)
             + (nd->child[1] ? size_avl_nonNull(nd->child[1]) : 0);
 }
 
-/* Signedly compare w1 and w2.  If w1 < w2, produce a negative number;
-   if w1 > w2 produce a positive number, and if w1 == w2 produce
-   zero. */
-static inline Word cmp_signed_Words ( Word w1, Word w2 ) {
+/* Unsignedly compare w1 and w2.  If w1 < w2, produce a negative
+   number; if w1 > w2 produce a positive number, and if w1 == w2
+   produce zero. */
+static inline Word cmp_unsigned_Words ( UWord w1, UWord w2 ) {
    if (w1 < w2) return -1;
    if (w1 > w2) return 1;
    return 0;
@@ -179,7 +179,7 @@ static
 Bool avl_insert_wrk ( AvlNode**         rootp, 
                       /*OUT*/MaybeWord* oldV,
                       AvlNode*          a, 
-                      Word              (*kCmp)(Word,Word) )
+                      Word              (*kCmp)(UWord,UWord) )
 {
    Word cmpres;
 
@@ -196,8 +196,8 @@ Bool avl_insert_wrk ( AvlNode**         rootp,
    }
 
    cmpres = kCmp ? /*boxed*/   kCmp( (*rootp)->key, a->key )
-                 : /*unboxed*/ cmp_signed_Words( (Word)(*rootp)->key,
-                                                 (Word)a->key );
+                 : /*unboxed*/ cmp_unsigned_Words( (UWord)(*rootp)->key,
+                                                   (UWord)a->key );
 
    if (cmpres > 0) {
       /* insert into the left subtree */
@@ -280,13 +280,13 @@ Bool avl_insert_wrk ( AvlNode**         rootp,
 static
 Bool avl_remove_wrk ( AvlNode** rootp, 
                       AvlNode*  a, 
-                      Word(*kCmp)(Word,Word) )
+                      Word(*kCmp)(UWord,UWord) )
 {
    Bool ch;
    Word cmpres;
    cmpres = kCmp ? /*boxed*/   kCmp( (*rootp)->key, a->key )
-                 : /*unboxed*/ cmp_signed_Words( (Word)(*rootp)->key,
-                                                 (Word)a->key );
+                 : /*unboxed*/ cmp_unsigned_Words( (UWord)(*rootp)->key,
+                                                   (UWord)a->key );
 
    if (cmpres > 0){
       /* remove from the left subtree */
@@ -372,7 +372,7 @@ Bool avl_remove_wrk ( AvlNode** rootp,
  */
 static 
 Bool avl_removeroot_wrk ( AvlNode** rootp, 
-                          Word(*kCmp)(Word,Word) )
+                          Word(*kCmp)(UWord,UWord) )
 {
    Bool     ch;
    AvlNode* a;
@@ -407,7 +407,7 @@ Bool avl_removeroot_wrk ( AvlNode** rootp,
 }
 
 static 
-AvlNode* avl_find_node ( AvlNode* t, Word k, Word(*kCmp)(Word,Word) )
+AvlNode* avl_find_node ( AvlNode* t, Word k, Word(*kCmp)(UWord,UWord) )
 {
    if (kCmp) {
       /* Boxed comparisons */
@@ -425,7 +425,7 @@ AvlNode* avl_find_node ( AvlNode* t, Word k, Word(*kCmp)(Word,Word) )
       UWord cmpresU; /* unsigned */
       while (True) {
          if (t == NULL) return NULL; /* unlikely ==> predictable */
-         cmpresS = cmp_signed_Words( (Word)t->key, (Word)k );
+         cmpresS = cmp_unsigned_Words( (UWord)t->key, (UWord)k );
          if (cmpresS == 0) return t; /* unlikely ==> predictable */
          cmpresU = (UWord)cmpresS;
          cmpresU >>=/*unsigned*/ (8 * sizeof(cmpresU) - 1);
@@ -476,8 +476,8 @@ static inline Bool stackPop(WordFM* fm, AvlNode** n, Int* i)
 
 static 
 AvlNode* avl_dopy ( AvlNode* nd, 
-                    Word(*dopyK)(Word), 
-                    Word(*dopyV)(Word),
+                    UWord(*dopyK)(UWord), 
+                    UWord(*dopyV)(UWord),
                     void*(alloc_nofail)(SizeT) )
 {
    AvlNode* nyu;
@@ -529,7 +529,7 @@ AvlNode* avl_dopy ( AvlNode* nd,
 static void initFM ( WordFM* fm,
                      void*   (*alloc_nofail)( SizeT ),
                      void    (*dealloc)(void*),
-                     Word    (*kCmp)(Word,Word) )
+                     Word    (*kCmp)(UWord,UWord) )
 {
    fm->root         = 0;
    fm->kCmp         = kCmp;
@@ -540,10 +540,14 @@ static void initFM ( WordFM* fm,
 
 /* --- Public interface functions --- */
 
-/* Allocate and Initialise a WordFM. */
+/* Allocate and initialise a WordFM.  If kCmp is non-NULL, elements in
+   the set are ordered according to the ordering specified by kCmp,
+   which becomes obvious if you use VG_(initIterFM),
+   VG_(initIterAtFM), VG_(nextIterFM), VG_(doneIterFM) to iterate over
+   sections of the map, or the whole thing. */
 WordFM* HG_(newFM) ( void* (*alloc_nofail)( SizeT ),
                      void  (*dealloc)(void*),
-                     Word  (*kCmp)(Word,Word) )
+                     Word  (*kCmp)(UWord,UWord) )
 {
    WordFM* fm = alloc_nofail(sizeof(WordFM));
    tl_assert(fm);
@@ -552,8 +556,8 @@ WordFM* HG_(newFM) ( void* (*alloc_nofail)( SizeT ),
 }
 
 static void avl_free ( AvlNode* nd, 
-                       void(*kFin)(Word),
-                       void(*vFin)(Word),
+                       void(*kFin)(UWord),
+                       void(*vFin)(UWord),
                        void(*dealloc)(void*) )
 {
    if (!nd)
@@ -572,7 +576,7 @@ static void avl_free ( AvlNode* nd,
 
 /* Free up the FM.  If kFin is non-NULL, it is applied to keys
    before the FM is deleted; ditto with vFin for vals. */
-void HG_(deleteFM) ( WordFM* fm, void(*kFin)(Word), void(*vFin)(Word) )
+void HG_(deleteFM) ( WordFM* fm, void(*kFin)(UWord), void(*vFin)(UWord) )
 {
    void(*dealloc)(void*) = fm->dealloc;
    avl_free( fm->root, kFin, vFin, dealloc );
@@ -581,7 +585,7 @@ void HG_(deleteFM) ( WordFM* fm, void(*kFin)(Word), void(*vFin)(Word) )
 }
 
 /* Add (k,v) to fm. */
-void HG_(addToFM) ( WordFM* fm, Word k, Word v )
+void HG_(addToFM) ( WordFM* fm, UWord k, UWord v )
 {
    MaybeWord oldV;
    AvlNode* node;
@@ -599,7 +603,7 @@ void HG_(addToFM) ( WordFM* fm, Word k, Word v )
 
 // Delete key from fm, returning associated key and val if found
 Bool HG_(delFromFM) ( WordFM* fm,
-                      /*OUT*/Word* oldK, /*OUT*/Word* oldV, Word key )
+                      /*OUT*/UWord* oldK, /*OUT*/UWord* oldV, UWord key )
 {
    AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
    if (node) {
@@ -617,7 +621,7 @@ Bool HG_(delFromFM) ( WordFM* fm,
 
 // Look up in fm, assigning found key & val at spec'd addresses
 Bool HG_(lookupFM) ( WordFM* fm, 
-                     /*OUT*/Word* keyP, /*OUT*/Word* valP, Word key )
+                     /*OUT*/UWord* keyP, /*OUT*/UWord* valP, UWord key )
 {
    AvlNode* node = avl_find_node( fm->root, key, fm->kCmp );
    if (node) {
@@ -631,7 +635,7 @@ Bool HG_(lookupFM) ( WordFM* fm,
    }
 }
 
-Word HG_(sizeFM) ( WordFM* fm )
+UWord HG_(sizeFM) ( WordFM* fm )
 {
    // Hmm, this is a bad way to do this
    return fm->root ? size_avl_nonNull( fm->root ) : 0;
@@ -646,10 +650,11 @@ void HG_(initIterFM) ( WordFM* fm )
       stackPush(fm, fm->root, 1);
 }
 
-// set up FM for iteration 
-// so that the first key subsequently produced by HG_(nextIterFM) is
-// the smallest key in the map >= start_at.
-void HG_(initIterAtFM) ( WordFM* fm, Word start_at )
+// set up FM for iteration so that the first key subsequently produced
+// by HG_(nextIterFM) is the smallest key in the map >= start_at.
+// Naturally ">=" is defined by the comparison function supplied to
+// HG_(newFM), as documented above.
+void HG_(initIterAtFM) ( WordFM* fm, UWord start_at )
 {
    Int     i;
    AvlNode *n, *t;
@@ -671,7 +676,7 @@ void HG_(initIterAtFM) ( WordFM* fm, Word start_at )
 
       cmpresS 
          = fm->kCmp ? /*boxed*/   fm->kCmp( t->key, start_at )
-                    : /*unboxed*/ cmp_signed_Words( t->key, start_at );
+                    : /*unboxed*/ cmp_unsigned_Words( t->key, start_at );
 
       if (cmpresS == 0) {
          // We found the exact key -- we are done. 
@@ -699,7 +704,7 @@ void HG_(initIterAtFM) ( WordFM* fm, Word start_at )
 
 // get next key/val pair.  Will tl_assert if fm has been modified
 // or looked up in since initIter{,At}FM was called.
-Bool HG_(nextIterFM) ( WordFM* fm, /*OUT*/Word* pKey, /*OUT*/Word* pVal )
+Bool HG_(nextIterFM) ( WordFM* fm, /*OUT*/UWord* pKey, /*OUT*/UWord* pVal )
 {
    Int i = 0;
    AvlNode* n = NULL;
@@ -740,7 +745,7 @@ void HG_(doneIterFM) ( WordFM* fm )
 {
 }
 
-WordFM* HG_(dopyFM) ( WordFM* fm, Word(*dopyK)(Word), Word(*dopyV)(Word) )
+WordFM* HG_(dopyFM) ( WordFM* fm, UWord(*dopyK)(UWord), UWord(*dopyV)(UWord) )
 {
    WordFM* nyu; 
 
@@ -796,9 +801,9 @@ void HG_(deleteBag) ( WordBag* bag )
    dealloc(bag);
 }
 
-void HG_(addToBag)( WordBag* bag, Word w )
+void HG_(addToBag)( WordBag* bag, UWord w )
 {
-   Word key, count;
+   UWord key, count;
    if (HG_(lookupFM)(bag->fm, &key, &count, w)) {
       tl_assert(key == w);
       tl_assert(count >= 1);
@@ -808,9 +813,9 @@ void HG_(addToBag)( WordBag* bag, Word w )
    }
 }
 
-Word HG_(elemBag) ( WordBag* bag, Word w )
+UWord HG_(elemBag) ( WordBag* bag, UWord w )
 {
-   Word key, count;
+   UWord key, count;
    if (HG_(lookupFM)( bag->fm, &key, &count, w)) {
       tl_assert(key == w);
       tl_assert(count >= 1);
@@ -820,15 +825,15 @@ Word HG_(elemBag) ( WordBag* bag, Word w )
    }
 }
 
-Word HG_(sizeUniqueBag) ( WordBag* bag )
+UWord HG_(sizeUniqueBag) ( WordBag* bag )
 {
    return HG_(sizeFM)( bag->fm );
 }
 
-static Word sizeTotalBag_wrk ( AvlNode* nd )
+static UWord sizeTotalBag_wrk ( AvlNode* nd )
 {
    /* unchecked pre: nd is non-NULL */
-   Word w = nd->val;
+   UWord w = nd->val;
    tl_assert(w >= 1);
    if (nd->child[0])
       w += sizeTotalBag_wrk(nd->child[0]);
@@ -836,7 +841,7 @@ static Word sizeTotalBag_wrk ( AvlNode* nd )
       w += sizeTotalBag_wrk(nd->child[1]);
    return w;
 }
-Word HG_(sizeTotalBag)( WordBag* bag )
+UWord HG_(sizeTotalBag)( WordBag* bag )
 {
    if (bag->fm->root)
       return sizeTotalBag_wrk(bag->fm->root);
@@ -844,9 +849,9 @@ Word HG_(sizeTotalBag)( WordBag* bag )
       return 0;
 }
 
-Bool HG_(delFromBag)( WordBag* bag, Word w )
+Bool HG_(delFromBag)( WordBag* bag, UWord w )
 {
-   Word key, count;
+   UWord key, count;
    if (HG_(lookupFM)(bag->fm, &key, &count, w)) {
       tl_assert(key == w);
       tl_assert(count >= 1);
@@ -879,7 +884,7 @@ Bool HG_(isSingletonTotalBag)( WordBag* bag )
    return nd->val == 1;
 }
 
-Word HG_(anyElementOfBag)( WordBag* bag )
+UWord HG_(anyElementOfBag)( WordBag* bag )
 {
    /* Return an arbitrarily chosen element in the bag.  We might as
       well return the one at the root of the underlying AVL tree. */
@@ -894,7 +899,7 @@ void HG_(initIterBag)( WordBag* bag )
    HG_(initIterFM)(bag->fm);
 }
 
-Bool HG_(nextIterBag)( WordBag* bag, /*OUT*/Word* pVal, /*OUT*/Word* pCount )
+Bool HG_(nextIterBag)( WordBag* bag, /*OUT*/UWord* pVal, /*OUT*/UWord* pCount )
 {
    return HG_(nextIterFM)( bag->fm, pVal, pCount );
 }
@@ -924,14 +929,14 @@ void HG_(doneIterBag)( WordBag* bag )
 // Just lookup for each element in range and count. 
 int search_all_elements_in_range_1(WordFM *map, long beg, long end)
 {
-   int n_found = 0;
-   int i;
-   for(i = beg; i < end; i++) {
-      Word key, val;
-      if(HG_(lookupFM)(map, &key, &val, (Word)i)){
+   long n_found = 0;
+   long i;
+   for (i = beg; i < end; i++) {
+      UWord key, val;
+      if (HG_(lookupFM)(map, &key, &val, (Word)i)) {
          n_found++;
          assert(key == -val);
-         assert(key == (Word)i);
+         assert(key == (UWord)i);
       }
    }
    return n_found;
@@ -943,9 +948,9 @@ int search_all_elements_in_range_1(WordFM *map, long beg, long end)
 int search_all_elements_in_range_2(WordFM *map, long beg, long end)
 {
    int n_found = 0;
-   Word key, val;
+   UWord key, val;
    HG_(initIterAtFM)(map, beg);
-   while(HG_(nextIterFM)(map, &key, &val) && (int)key < end) {
+   while (HG_(nextIterFM)(map, &key, &val) && (long)key < end) {
       assert(key == -val);
       n_found++;
    }
@@ -955,11 +960,11 @@ int search_all_elements_in_range_2(WordFM *map, long beg, long end)
 
 int main(void)
 {
-   int i, n = 10;
-   Word key, val;
-   int beg, end;
+   long i, n = 10;
+   UWord key, val;
+   long beg, end;
 
-   printf("Create the map, n=%d\n", n);
+   printf("Create the map, n=%ld\n", n);
    WordFM *map = HG_(newFM)(malloc, free, NULL/*unboxed Word cmp*/);
 
    printf("Add keys: ");
@@ -968,12 +973,12 @@ int main(void)
       printf("%ld ", val);
       HG_(addToFM)(map, val, -val);
    }
-   assert(HG_(sizeFM)(map) == n);
+   assert(HG_(sizeFM)(map) == (UWord)n);
    printf("\n");
    printf("Iterate elements, size=%d\n", (int)HG_(sizeFM)(map));
    HG_(initIterFM)(map);
 
-   while(HG_(nextIterFM(map, &key, &val))){
+   while (HG_(nextIterFM(map, &key, &val))) {
    //   int j;
    //   printf("Stack k=%d\n", (int)key);
    //   for(j = map->stackTop-1; j >= 0; j--) {
@@ -988,7 +993,7 @@ int main(void)
    for(beg = 0; beg <= n*2; beg++) {
       HG_(initIterAtFM)(map, (Word)beg);
       int prev = -1; 
-      printf("StartWith: %d: ", beg);
+      printf("StartWith: %ld: ", beg);
       int n_iter = 0;
 
       while(HG_(nextIterFM(map, &key, &val))) {
index b333bcdf50fbd064c62a043d128d23b5712ca8d5..dea053543e5eea56af0545e623e7d1af8d90e29c 100644 (file)
 
 typedef  struct _WordFM  WordFM; /* opaque */
 
-/* Allocate and initialise a WordFM */
+/* Allocate and initialise a WordFM.  If kCmp is non-NULL, elements in
+   the set are ordered according to the ordering specified by kCmp,
+   which becomes obvious if you use VG_(initIterFM),
+   VG_(initIterAtFM), VG_(nextIterFM), VG_(doneIterFM) to iterate over
+   sections of the map, or the whole thing. */
 WordFM* HG_(newFM) ( void* (*alloc_nofail)( SizeT ),
                      void  (*dealloc)(void*),
-                     Word  (*kCmp)(Word,Word) );
+                     Word  (*kCmp)(UWord,UWord) );
 
 /* Free up the FM.  If kFin is non-NULL, it is applied to keys
    before the FM is deleted; ditto with vFin for vals. */
-void HG_(deleteFM) ( WordFM*, void(*kFin)(Word), void(*vFin)(Word) );
+void HG_(deleteFM) ( WordFM*, void(*kFin)(UWord), void(*vFin)(UWord) );
 
 /* Add (k,v) to fm.  If a binding for k already exists, it is updated
    to map to this new v.  In that case we should really return the
    previous v so that caller can finalise it.  Oh well. */
-void HG_(addToFM) ( WordFM* fm, Word k, Word v );
+void HG_(addToFM) ( WordFM* fm, UWord k, UWord v );
 
 // Delete key from fm, returning associated key and val if found
 Bool HG_(delFromFM) ( WordFM* fm,
-                      /*OUT*/Word* oldK, /*OUT*/Word* oldV, Word key );
+                      /*OUT*/UWord* oldK, /*OUT*/UWord* oldV, UWord key );
 
 // Look up in fm, assigning found key & val at spec'd addresses
 Bool HG_(lookupFM) ( WordFM* fm, 
-                     /*OUT*/Word* keyP, /*OUT*/Word* valP, Word key );
+                     /*OUT*/UWord* keyP, /*OUT*/UWord* valP, UWord key );
 
 // How many elements are there in fm?
-Word HG_(sizeFM) ( WordFM* fm );
+UWord HG_(sizeFM) ( WordFM* fm );
 
 // set up FM for iteration
 void HG_(initIterFM) ( WordFM* fm );
 
-// set up FM for iteration 
-// so that the first key subsequently produced by HG_(nextIterFM) is
-// the smallest key in the map >= start_at.
-void HG_(initIterAtFM) ( WordFM* fm, Word start_at );
+// set up FM for iteration so that the first key subsequently produced
+// by HG_(nextIterFM) is the smallest key in the map >= start_at.
+// Naturally ">=" is defined by the comparison function supplied to
+// HG_(newFM), as documented above.
+void HG_(initIterAtFM) ( WordFM* fm, UWord start_at );
 
 // get next key/val pair.  Will assert if fm has been modified
 // or looked up in since initIterFM/initIterWithStartFM was called.
 Bool HG_(nextIterFM) ( WordFM* fm,
-                       /*OUT*/Word* pKey, /*OUT*/Word* pVal );
+                       /*OUT*/UWord* pKey, /*OUT*/UWord* pVal );
 
 // clear the I'm iterating flag
 void HG_(doneIterFM) ( WordFM* fm );
@@ -107,7 +112,7 @@ void HG_(doneIterFM) ( WordFM* fm );
 // could not allocate memory, in which case the copy is abandoned
 // and NULL is returned.  Ditto with dopyV for values.
 WordFM* HG_(dopyFM) ( WordFM* fm,
-                      Word(*dopyK)(Word), Word(*dopyV)(Word) );
+                      UWord(*dopyK)(UWord), UWord(*dopyV)(UWord) );
 
 //------------------------------------------------------------------//
 //---                         end WordFM                         ---//
@@ -129,13 +134,13 @@ WordBag* HG_(newBag) ( void* (*alloc_nofail)( SizeT ),
 void HG_(deleteBag) ( WordBag* );
 
 /* Add a word. */
-void HG_(addToBag)( WordBag*, Word );
+void HG_(addToBag)( WordBag*, UWord );
 
 /* Find out how many times the given word exists in the bag. */
-Word HG_(elemBag) ( WordBag*, Word );
+UWord HG_(elemBag) ( WordBag*, UWord );
 
 /* Delete a word from the bag. */
-Bool HG_(delFromBag)( WordBag*, Word );
+Bool HG_(delFromBag)( WordBag*, UWord );
 
 /* Is the bag empty? */
 Bool HG_(isEmptyBag)( WordBag* );
@@ -144,15 +149,15 @@ Bool HG_(isEmptyBag)( WordBag* );
 Bool HG_(isSingletonTotalBag)( WordBag* );
 
 /* Return an arbitrary element from the bag. */
-Word HG_(anyElementOfBag)( WordBag* );
+UWord HG_(anyElementOfBag)( WordBag* );
 
 /* How many different / total elements are in the bag? */
-Word HG_(sizeUniqueBag)( WordBag* ); /* fast */
-Word HG_(sizeTotalBag)( WordBag* );  /* warning: slow */
+UWord HG_(sizeUniqueBag)( WordBag* ); /* fast */
+UWord HG_(sizeTotalBag)( WordBag* );  /* warning: slow */
 
 /* Iterating over the elements of a bag. */
 void HG_(initIterBag)( WordBag* );
-Bool HG_(nextIterBag)( WordBag*, /*OUT*/Word* pVal, /*OUT*/Word* pCount );
+Bool HG_(nextIterBag)( WordBag*, /*OUT*/UWord* pVal, /*OUT*/UWord* pCount );
 void HG_(doneIterBag)( WordBag* );
 
 //------------------------------------------------------------------//
index 51325f80af363862ca4928458e172cae4b782a18..a85effcc4aabaa57af47df733e4eb61afb382347 100644 (file)
@@ -62,8 +62,8 @@ typedef
 typedef
    struct {
       WCacheEnt ent[N_WCACHE_STAT_MAX];
-      Word      dynMax; /* 1 .. N_WCACHE_STAT_MAX inclusive */
-      Word      inUse;  /* 0 .. dynMax inclusive */
+      UWord     dynMax; /* 1 .. N_WCACHE_STAT_MAX inclusive */
+      UWord     inUse;  /* 0 .. dynMax inclusive */
    }
    WCache;
 
@@ -77,7 +77,7 @@ typedef
 
 #define WCache_LOOKUP_AND_RETURN(_retty,_zzcache,_zzarg1,_zzarg2)    \
    do {                                                              \
-      Word    _i;                                                    \
+      UWord   _i;                                                    \
       UWord   _arg1  = (UWord)(_zzarg1);                             \
       UWord   _arg2  = (UWord)(_zzarg2);                             \
       WCache* _cache = &(_zzcache);                                  \
@@ -130,8 +130,8 @@ typedef
 typedef
    struct {
       WordSetU* owner; /* for sanity checking */
-      Word*     words;
-      Int       size; /* Really this should be SizeT */
+      UWord*    words;
+      UWord     size; /* Really this should be SizeT */
    }
    WordVec;
 
@@ -144,8 +144,8 @@ struct _WordSetU {
       void      (*dealloc)(void*);
       WordFM*   vec2ix; /* WordVec-to-WordSet mapping tree */
       WordVec** ix2vec; /* WordSet-to-WordVec mapping array */
-      UInt      ix2vec_size;
-      UInt      ix2vec_used;
+      UWord     ix2vec_size;
+      UWord     ix2vec_used;
       WordSet   empty; /* cached, for speed */
       /* Caches for some operations */
       WCache    cache_addTo;
@@ -172,7 +172,7 @@ struct _WordSetU {
 
 /* Create a new WordVec of the given size. */
 
-static WordVec* new_WV_of_size ( WordSetU* wsu, Int sz )
+static WordVec* new_WV_of_size ( WordSetU* wsu, UWord sz )
 {
    WordVec* wv;
    tl_assert(sz >= 0);
@@ -181,7 +181,7 @@ static WordVec* new_WV_of_size ( WordSetU* wsu, Int sz )
    wv->words = NULL;
    wv->size = sz;
    if (sz > 0) {
-     wv->words = wsu->alloc( (SizeT)sz * sizeof(Word) );
+     wv->words = wsu->alloc( (SizeT)sz * sizeof(UWord) );
    }
    return wv;
 }
@@ -194,16 +194,16 @@ static void delete_WV ( WordVec* wv )
    }
    dealloc(wv);
 }
-static void delete_WV_for_FM ( Word wv ) {
+static void delete_WV_for_FM ( UWord wv ) {
    delete_WV( (WordVec*)wv );
 }
 
-static Word cmp_WordVecs_for_FM ( Word wv1W, Word wv2W )
+static Word cmp_WordVecs_for_FM ( UWord wv1W, UWord wv2W )
 {
-   Int      i;
+   UWord    i;
    WordVec* wv1    = (WordVec*)wv1W;
    WordVec* wv2    = (WordVec*)wv2W;
-   Int      common = wv1->size < wv2->size ? wv1->size : wv2->size;
+   UWord    common = wv1->size < wv2->size ? wv1->size : wv2->size;
    for (i = 0; i < common; i++) {
       if (wv1->words[i] == wv2->words[i])
          continue;
@@ -275,7 +275,7 @@ static WordSet add_or_dealloc_WordVec( WordSetU* wsu, WordVec* wv_new )
 {
    Bool     have;
    WordVec* wv_old;
-   Word/*Set*/ ix_old = -1;
+   UWord/*Set*/ ix_old = -1;
    /* Really WordSet, but need something that can safely be casted to
       a Word* in the lookupFM.  Making it WordSet (which is 32 bits)
       causes failures on a 64-bit platform. */
@@ -358,7 +358,7 @@ Bool HG_(isEmptyWS) ( WordSetU* wsu, WordSet ws )
    }
 }
 
-Bool HG_(isSingletonWS) ( WordSetU* wsu, WordSet ws, Word w )
+Bool HG_(isSingletonWS) ( WordSetU* wsu, WordSet ws, UWord w )
 {
    WordVec* wv;
    tl_assert(wsu);
@@ -367,7 +367,7 @@ Bool HG_(isSingletonWS) ( WordSetU* wsu, WordSet ws, Word w )
    return (Bool)(wv->size == 1 && wv->words[0] == w);
 }
 
-Int HG_(cardinalityWS) ( WordSetU* wsu, WordSet ws )
+UWord HG_(cardinalityWS) ( WordSetU* wsu, WordSet ws )
 {
    WordVec* wv;
    tl_assert(wsu);
@@ -376,7 +376,7 @@ Int HG_(cardinalityWS) ( WordSetU* wsu, WordSet ws )
    return wv->size;
 }
 
-Word HG_(anyElementOfWS) ( WordSetU* wsu, WordSet ws )
+UWord HG_(anyElementOfWS) ( WordSetU* wsu, WordSet ws )
 {
    WordVec* wv;
    tl_assert(wsu);
@@ -386,13 +386,13 @@ Word HG_(anyElementOfWS) ( WordSetU* wsu, WordSet ws )
    return wv->words[0];
 }
 
-Int HG_(cardinalityWSU) ( WordSetU* wsu )
+UWord HG_(cardinalityWSU) ( WordSetU* wsu )
 {
    tl_assert(wsu);
-   return (Int)wsu->ix2vec_used;
+   return wsu->ix2vec_used;
 }
 
-void HG_(getPayloadWS) ( /*OUT*/Word** words, /*OUT*/Word* nWords, 
+void HG_(getPayloadWS) ( /*OUT*/UWord** words, /*OUT*/UWord* nWords, 
                          WordSetU* wsu, WordSet ws )
 {
    WordVec* wv;
@@ -414,7 +414,7 @@ Bool HG_(plausibleWS) ( WordSetU* wsu, WordSet ws )
 Bool HG_(saneWS_SLOW) ( WordSetU* wsu, WordSet ws )
 {
    WordVec* wv;
-   Int      i;
+   UWord    i;
    if (wsu == NULL) return False;
    if (ws < 0 || ws >= wsu->ix2vec_used)
       return False;
@@ -431,9 +431,9 @@ Bool HG_(saneWS_SLOW) ( WordSetU* wsu, WordSet ws )
    return True;
 }
 
-Bool HG_(elemWS) ( WordSetU* wsu, WordSet ws, Word w )
+Bool HG_(elemWS) ( WordSetU* wsu, WordSet ws, UWord w )
 {
-   Int      i;
+   UWord    i;
    WordVec* wv = do_ix2vec( wsu, ws );
    wsu->n_elem++;
    for (i = 0; i < wv->size; i++) {
@@ -443,7 +443,7 @@ Bool HG_(elemWS) ( WordSetU* wsu, WordSet ws, Word w )
    return False;
 }
 
-WordSet HG_(doubletonWS) ( WordSetU* wsu, Word w1, Word w2 )
+WordSet HG_(doubletonWS) ( WordSetU* wsu, UWord w1, UWord w2 )
 {
    WordVec* wv;
    wsu->n_doubleton++;
@@ -465,7 +465,7 @@ WordSet HG_(doubletonWS) ( WordSetU* wsu, Word w1, Word w2 )
    return add_or_dealloc_WordVec( wsu, wv );
 }
 
-WordSet HG_(singletonWS) ( WordSetU* wsu, Word w )
+WordSet HG_(singletonWS) ( WordSetU* wsu, UWord w )
 {
    return HG_(doubletonWS)( wsu, w, w );
 }
@@ -478,7 +478,7 @@ WordSet HG_(isSubsetOf) ( WordSetU* wsu, WordSet small, WordSet big )
 
 void HG_(ppWS) ( WordSetU* wsu, WordSet ws )
 {
-   Int      i;
+   UWord    i;
    WordVec* wv;
    tl_assert(wsu);
    wv = do_ix2vec( wsu, ws );
@@ -511,9 +511,9 @@ void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name )
    VG_(printf)("      isSubsetOf   %10u\n",   wsu->n_isSubsetOf);
 }
 
-WordSet HG_(addToWS) ( WordSetU* wsu, WordSet ws, Word w )
+WordSet HG_(addToWS) ( WordSetU* wsu, WordSet ws, UWord w )
 {
-   Int      k, j;
+   UWord    k, j;
    WordVec* wv_new;
    WordVec* wv;
    WordSet  result = (WordSet)(-1); /* bogus */
@@ -552,9 +552,9 @@ WordSet HG_(addToWS) ( WordSetU* wsu, WordSet ws, Word w )
    return result;
 }
 
-WordSet HG_(delFromWS) ( WordSetU* wsu, WordSet ws, Word w )
+WordSet HG_(delFromWS) ( WordSetU* wsu, WordSet ws, UWord w )
 {
-   Int      i, j, k;
+   UWord    i, j, k;
    WordVec* wv_new;
    WordSet  result = (WordSet)(-1); /* bogus */
    WordVec* wv = do_ix2vec( wsu, ws );
@@ -605,7 +605,7 @@ WordSet HG_(delFromWS) ( WordSetU* wsu, WordSet ws, Word w )
 
 WordSet HG_(unionWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 {
-   Int      i1, i2, k, sz;
+   UWord    i1, i2, k, sz;
    WordVec* wv_new;
    WordVec* wv1 = do_ix2vec( wsu, ws1 );
    WordVec* wv2 = do_ix2vec( wsu, ws2 );
@@ -675,7 +675,7 @@ WordSet HG_(unionWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 
 WordSet HG_(intersectWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 {
-   Int      i1, i2, k, sz;
+   UWord    i1, i2, k, sz;
    WordSet  ws_new = (WordSet)(-1); /* bogus */
    WordVec* wv_new;
    WordVec* wv1; 
@@ -756,7 +756,7 @@ WordSet HG_(intersectWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 
 WordSet HG_(minusWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 {
-   Int      i1, i2, k, sz;
+   UWord    i1, i2, k, sz;
    WordSet  ws_new = (WordSet)(-1); /* bogus */
    WordVec* wv_new;
    WordVec* wv1;
@@ -833,7 +833,7 @@ WordSet HG_(minusWS) ( WordSetU* wsu, WordSet ws1, WordSet ws2 )
 static __attribute__((unused))
 void show_WS ( WordSetU* wsu, WordSet ws )
 {
-   Int i;
+   UWord i;
    WordVec* wv = do_ix2vec( wsu, ws );
    VG_(printf)("#%u{", ws);
    for (i = 0; i < wv->size; i++) {
index a2157fcc73487c024cbd51b4b5eb138150374cd7..631d519ef5db3570445a5012e2d3d16c270e33c4 100644 (file)
@@ -55,7 +55,7 @@ WordSetU* HG_(newWordSetU) ( void* (*alloc_nofail)( SizeT ),
 void HG_(deleteWordSetU) ( WordSetU* );
 
 /* Get the number of elements in this WordSetU. */
-Int HG_(cardinalityWSU) ( WordSetU* );
+UWord HG_(cardinalityWSU) ( WordSetU* );
 
 /* Show performance stats for this WordSetU. */
 void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name );
@@ -66,25 +66,25 @@ void HG_(ppWSUstats) ( WordSetU* wsu, HChar* name );
    represents the empty set. */
 
 WordSet HG_(emptyWS)        ( WordSetU* );
-WordSet HG_(addToWS)        ( WordSetU*, WordSet, Word );
-WordSet HG_(delFromWS)      ( WordSetU*, WordSet, Word );
+WordSet HG_(addToWS)        ( WordSetU*, WordSet, UWord );
+WordSet HG_(delFromWS)      ( WordSetU*, WordSet, UWord );
 WordSet HG_(unionWS)        ( WordSetU*, WordSet, WordSet );
 WordSet HG_(intersectWS)    ( WordSetU*, WordSet, WordSet );
 WordSet HG_(minusWS)        ( WordSetU*, WordSet, WordSet );
 Bool    HG_(isEmptyWS)      ( WordSetU*, WordSet );
-Bool    HG_(isSingletonWS)  ( WordSetU*, WordSet, Word );
-Word    HG_(anyElementOfWS) ( WordSetU*, WordSet );
-Int     HG_(cardinalityWS)  ( WordSetU*, WordSet );
-Bool    HG_(elemWS)         ( WordSetU*, WordSet, Word );
-WordSet HG_(doubletonWS)    ( WordSetU*, Word, Word );
-WordSet HG_(singletonWS)    ( WordSetU*, Word );
+Bool    HG_(isSingletonWS)  ( WordSetU*, WordSet, UWord );
+UWord   HG_(anyElementOfWS) ( WordSetU*, WordSet );
+UWord   HG_(cardinalityWS)  ( WordSetU*, WordSet );
+Bool    HG_(elemWS)         ( WordSetU*, WordSet, UWord );
+WordSet HG_(doubletonWS)    ( WordSetU*, UWord, UWord );
+WordSet HG_(singletonWS)    ( WordSetU*, UWord );
 WordSet HG_(isSubsetOf)     ( WordSetU*, WordSet, WordSet );
 
 Bool    HG_(plausibleWS)    ( WordSetU*, WordSet );
 Bool    HG_(saneWS_SLOW)    ( WordSetU*, WordSet );
 
 void    HG_(ppWS)           ( WordSetU*, WordSet );
-void    HG_(getPayloadWS)   ( /*OUT*/Word** words, /*OUT*/Word* nWords, 
+void    HG_(getPayloadWS)   ( /*OUT*/UWord** words, /*OUT*/UWord* nWords, 
                              WordSetU*, WordSet );