Author: sewardj
Date: 2008-02-14 00:44:17 +0000 (Thu, 14 Feb 2008)
New Revision: 7406

Log:
Primarily, try and free up at least some of the variable type info at
munmap time.  Only partially successful.  Also, a bit more removal of
duplicated code.



Modified:
   branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
   branches/DATASYMS/coregrind/m_debuginfo/misc.c
   branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h
   branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h
   branches/DATASYMS/coregrind/m_debuginfo/priv_tytypes.h
   branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c
   branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
   branches/DATASYMS/coregrind/m_debuginfo/readelf.c
   branches/DATASYMS/coregrind/m_debuginfo/readstabs.c
   branches/DATASYMS/coregrind/m_debuginfo/tytypes.c


Modified: branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/debuginfo.c 2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -204,6 +204,48 @@
       next = chunk->next;
       ML_(dinfo_free)(chunk);
    }
+
+   { TyAdmin *admin1, *admin2;
+     for (admin1 = di->tyadmins; admin1; admin1 = admin2) {
+        admin2 = admin1->next;
+        //ML_(dinfo_free)(admin1);
+        ML_(delete_TyAdmin_and_payload)(admin1);
+     }
+     GExpr *gexpr1, *gexpr2;
+     for (gexpr1 = di->gexprs; gexpr1; gexpr1 = gexpr2) {
+        gexpr2 = gexpr1->next;
+        ML_(dinfo_free)(gexpr1);
+     }
+   }
+
+   Word i, j;
+   if (di->varinfo) {
+      for (i = 0; i < VG_(sizeXA)(di->varinfo); i++) {
+         OSet* scope = *(OSet**)VG_(indexXA)(di->varinfo, i);
+         if (!scope) continue;
+         // iterate over all entries in 'scope'
+         VG_(OSetGen_ResetIter)(scope);
+         while (True) {
+            DiAddrRange* arange = VG_(OSetGen_Next)(scope);
+            if (!arange) break;
+            // for each var in 'arange'
+            vg_assert(arange->vars);
+            for (j = 0; j < VG_(sizeXA)( arange->vars ); j++) {
+               DiVariable* var = (DiVariable*)VG_(indexXA)(arange->vars,j);
+               vg_assert(var);
+               /////////////////////////////
+               //if (var->name && 0xDD != *(var->name)) 
+               //   ML_(dinfo_free)(var->name);
+               // var->name gets used more than once .. can't free it
+               /////////////////////////////
+            }
+            ML_(dinfo_free)(arange->vars);
+         }
+         VG_(OSetGen_Destroy)(scope);
+      }
+      VG_(deleteXA)(di->varinfo);
+   }
+
    ML_(dinfo_free)(di);
 }
 
@@ -1531,7 +1573,8 @@
    Therefore specify "*" to search all the objects.  On TOC-afflicted
    platforms, a symbol is deemed to be found only if it has a nonzero
    TOC pointer.  */
-Bool VG_(lookup_symbol_SLOW)(UChar* sopatt, UChar* name, Addr* pEnt, Addr* 
pToc)
+Bool VG_(lookup_symbol_SLOW)(UChar* sopatt, UChar* name, 
+                             Addr* pEnt, Addr* pToc)
 {
    Bool     require_pToc = False;
    Int      i;

Modified: branches/DATASYMS/coregrind/m_debuginfo/misc.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/misc.c      2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/misc.c      2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -37,6 +37,8 @@
 #include "pub_core_libcbase.h"
 #include "pub_core_libcassert.h"
 #include "pub_core_mallocfree.h"
+#include "pub_core_xarray.h"
+
 #include "priv_misc.h"            /* self */
 
 
@@ -48,12 +50,15 @@
    VG_(memset)(v, 0, szB);
    return v;
 }
+
 void ML_(dinfo_free) ( void* v ) {
    VG_(arena_free)( VG_AR_DINFO, v );
 }
+
 UChar* ML_(dinfo_strdup) ( const UChar* str ) {
    return VG_(arena_strdup)( VG_AR_DINFO, str );
 }
+
 UChar* ML_(dinfo_memdup)( UChar* mem, UWord nbytes ) {
    UChar* r = VG_(arena_malloc)( VG_AR_DINFO, nbytes );
    if (nbytes > 0)
@@ -61,6 +66,15 @@
    return r;
 }
 
+
+void ML_(copy_bytes_into_XA) ( XArray* /* of UChar */ xa, 
+                               void* bytes, Word nbytes ) {
+   Word i;
+   for (i = 0; i < nbytes; i++)
+      VG_(addToXA)( xa, & ((UChar*)bytes)[i] );
+}
+
+
 /*--------------------------------------------------------------------*/
 /*--- end                                                   misc.c ---*/
 /*--------------------------------------------------------------------*/

Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h 2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h 2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -52,6 +52,11 @@
 UChar* ML_(dinfo_strdup)( const UChar* str );
 UChar* ML_(dinfo_memdup)( UChar* mem, UWord nbytes );
 
+/* Copy bytes into an XArray of what are assumed to be, well,
+   bytes. */
+void ML_(copy_bytes_into_XA) ( XArray* /* of UChar */ xa, 
+                               void* bytes, Word nbytes );
+
 #endif /* ndef __PRIV_MISC_H */
 
 /*--------------------------------------------------------------------*/

Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h      2008-02-13 
05:05:58 UTC (rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_storage.h      2008-02-14 
00:44:17 UTC (rev 7406)
@@ -351,7 +351,7 @@
    UInt    cfsi_size;
    Addr    cfsi_minaddr;
    Addr    cfsi_maxaddr;
-   XArray* cfsi_exprs; /* XArray of CfSiExpr */
+   XArray* cfsi_exprs; /* XArray of CfiExpr */
 
    /* Expandable arrays of characters -- the string table.  Pointers
       into this are stable (the arrays are not reallocated). */
@@ -383,6 +383,10 @@
       range pair, one that covers the entire address space.
    */
    XArray* /* of OSet of DiAddrRange */varinfo;
+
+   /* For the purposes of deletion: */
+   TyAdmin* tyadmins;
+   GExpr*   gexprs;
 };
 
 /* --------------------- functions --------------------- */

Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_tytypes.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_tytypes.h      2008-02-13 
05:05:58 UTC (rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_tytypes.h      2008-02-14 
00:44:17 UTC (rev 7406)
@@ -58,12 +58,12 @@
 
 /* an enumeration value */
 struct _TyAtom {
-   UChar* name;
+   UChar* name; /* AR_DINFO, unshared */
    Long   value;
 };
 
 struct _TyField {
-   UChar*  name;
+   UChar*  name; /* AR_DINFO, unshared */
    Type*   typeR;
    D3Expr* loc;
    Bool    isStruct;
@@ -78,7 +78,7 @@
 };
 
 struct _D3Expr {
-   UChar* bytes;
+   UChar* bytes; /* AR_DINFO, unshared */
    UWord  nbytes;
 };
 
@@ -87,7 +87,7 @@
           Ty_Enum, Ty_Array, Ty_Fn, Ty_Qual, Ty_Void } tag;
    union {
       struct {
-         UChar* name;
+         UChar* name; /* AR_DINFO, unshared */
          Int    szB;
          UChar  enc; /* S:signed U:unsigned F:floating */
       } Base;
@@ -97,18 +97,18 @@
          Bool  isPtr;
       } PorR;
       struct {
-         UChar* name;
+         UChar* name;  /* AR_DINFO, unshared */
          Type*  typeR; /* MAY BE NULL, denoting unknown */
       } TyDef;
       struct {
-         UChar*  name;
+         UChar*  name; /* AR_DINFO, unshared */
          UWord   szB;
          XArray* /* of TyField* */ fields;
          Bool    complete;
          Bool    isStruct;
       } StOrUn;
       struct {
-         UChar*  name;
+         UChar*  name; /* AR_DINFO, unshared */
          Int     szB;
          XArray* /* of TyAtom* */ atomRs;
       } Enum;
@@ -135,6 +135,8 @@
 Type*     ML_(new_Type)     ( void );
 D3Expr*   ML_(new_D3Expr)   ( UChar* bytes, UWord nbytes );
 
+void ML_(delete_TyAdmin_and_payload) ( TyAdmin* ad );
+
 void ML_(pp_TyAdmin)  ( TyAdmin* admin );
 void ML_(pp_TyAtom)   ( TyAtom* atom );
 void ML_(pp_TyField)  ( TyField* field );

Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c 2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf.c 2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -40,6 +40,7 @@
 #include "pub_core_options.h"
 #include "pub_core_xarray.h"
 #include "priv_misc.h"             /* dinfo_zalloc/free/strdup */
+#include "priv_d3basics.h"
 #include "priv_tytypes.h"
 #include "priv_storage.h"
 #include "priv_readdwarf.h"        /* self */
@@ -2444,175 +2445,6 @@
 
 /* ------------ Run/show DWARF3 expressions ---------- */
 
-/* Taken from binutils-2.17/include/elf/dwarf2.h */
-enum dwarf_location_atom
-  {
-    DW_OP_addr = 0x03,
-    DW_OP_deref = 0x06,
-    DW_OP_const1u = 0x08,
-    DW_OP_const1s = 0x09,
-    DW_OP_const2u = 0x0a,
-    DW_OP_const2s = 0x0b,
-    DW_OP_const4u = 0x0c,
-    DW_OP_const4s = 0x0d,
-    DW_OP_const8u = 0x0e,
-    DW_OP_const8s = 0x0f,
-    DW_OP_constu = 0x10,
-    DW_OP_consts = 0x11,
-    DW_OP_dup = 0x12,
-    DW_OP_drop = 0x13,
-    DW_OP_over = 0x14,
-    DW_OP_pick = 0x15,
-    DW_OP_swap = 0x16,
-    DW_OP_rot = 0x17,
-    DW_OP_xderef = 0x18,
-    DW_OP_abs = 0x19,
-    DW_OP_and = 0x1a,
-    DW_OP_div = 0x1b,
-    DW_OP_minus = 0x1c,
-    DW_OP_mod = 0x1d,
-    DW_OP_mul = 0x1e,
-    DW_OP_neg = 0x1f,
-    DW_OP_not = 0x20,
-    DW_OP_or = 0x21,
-    DW_OP_plus = 0x22,
-    DW_OP_plus_uconst = 0x23,
-    DW_OP_shl = 0x24,
-    DW_OP_shr = 0x25,
-    DW_OP_shra = 0x26,
-    DW_OP_xor = 0x27,
-    DW_OP_bra = 0x28,
-    DW_OP_eq = 0x29,
-    DW_OP_ge = 0x2a,
-    DW_OP_gt = 0x2b,
-    DW_OP_le = 0x2c,
-    DW_OP_lt = 0x2d,
-    DW_OP_ne = 0x2e,
-    DW_OP_skip = 0x2f,
-    DW_OP_lit0 = 0x30,
-    DW_OP_lit1 = 0x31,
-    DW_OP_lit2 = 0x32,
-    DW_OP_lit3 = 0x33,
-    DW_OP_lit4 = 0x34,
-    DW_OP_lit5 = 0x35,
-    DW_OP_lit6 = 0x36,
-    DW_OP_lit7 = 0x37,
-    DW_OP_lit8 = 0x38,
-    DW_OP_lit9 = 0x39,
-    DW_OP_lit10 = 0x3a,
-    DW_OP_lit11 = 0x3b,
-    DW_OP_lit12 = 0x3c,
-    DW_OP_lit13 = 0x3d,
-    DW_OP_lit14 = 0x3e,
-    DW_OP_lit15 = 0x3f,
-    DW_OP_lit16 = 0x40,
-    DW_OP_lit17 = 0x41,
-    DW_OP_lit18 = 0x42,
-    DW_OP_lit19 = 0x43,
-    DW_OP_lit20 = 0x44,
-    DW_OP_lit21 = 0x45,
-    DW_OP_lit22 = 0x46,
-    DW_OP_lit23 = 0x47,
-    DW_OP_lit24 = 0x48,
-    DW_OP_lit25 = 0x49,
-    DW_OP_lit26 = 0x4a,
-    DW_OP_lit27 = 0x4b,
-    DW_OP_lit28 = 0x4c,
-    DW_OP_lit29 = 0x4d,
-    DW_OP_lit30 = 0x4e,
-    DW_OP_lit31 = 0x4f,
-    DW_OP_reg0 = 0x50,
-    DW_OP_reg1 = 0x51,
-    DW_OP_reg2 = 0x52,
-    DW_OP_reg3 = 0x53,
-    DW_OP_reg4 = 0x54,
-    DW_OP_reg5 = 0x55,
-    DW_OP_reg6 = 0x56,
-    DW_OP_reg7 = 0x57,
-    DW_OP_reg8 = 0x58,
-    DW_OP_reg9 = 0x59,
-    DW_OP_reg10 = 0x5a,
-    DW_OP_reg11 = 0x5b,
-    DW_OP_reg12 = 0x5c,
-    DW_OP_reg13 = 0x5d,
-    DW_OP_reg14 = 0x5e,
-    DW_OP_reg15 = 0x5f,
-    DW_OP_reg16 = 0x60,
-    DW_OP_reg17 = 0x61,
-    DW_OP_reg18 = 0x62,
-    DW_OP_reg19 = 0x63,
-    DW_OP_reg20 = 0x64,
-    DW_OP_reg21 = 0x65,
-    DW_OP_reg22 = 0x66,
-    DW_OP_reg23 = 0x67,
-    DW_OP_reg24 = 0x68,
-    DW_OP_reg25 = 0x69,
-    DW_OP_reg26 = 0x6a,
-    DW_OP_reg27 = 0x6b,
-    DW_OP_reg28 = 0x6c,
-    DW_OP_reg29 = 0x6d,
-    DW_OP_reg30 = 0x6e,
-    DW_OP_reg31 = 0x6f,
-    DW_OP_breg0 = 0x70,
-    DW_OP_breg1 = 0x71,
-    DW_OP_breg2 = 0x72,
-    DW_OP_breg3 = 0x73,
-    DW_OP_breg4 = 0x74,
-    DW_OP_breg5 = 0x75,
-    DW_OP_breg6 = 0x76,
-    DW_OP_breg7 = 0x77,
-    DW_OP_breg8 = 0x78,
-    DW_OP_breg9 = 0x79,
-    DW_OP_breg10 = 0x7a,
-    DW_OP_breg11 = 0x7b,
-    DW_OP_breg12 = 0x7c,
-    DW_OP_breg13 = 0x7d,
-    DW_OP_breg14 = 0x7e,
-    DW_OP_breg15 = 0x7f,
-    DW_OP_breg16 = 0x80,
-    DW_OP_breg17 = 0x81,
-    DW_OP_breg18 = 0x82,
-    DW_OP_breg19 = 0x83,
-    DW_OP_breg20 = 0x84,
-    DW_OP_breg21 = 0x85,
-    DW_OP_breg22 = 0x86,
-    DW_OP_breg23 = 0x87,
-    DW_OP_breg24 = 0x88,
-    DW_OP_breg25 = 0x89,
-    DW_OP_breg26 = 0x8a,
-    DW_OP_breg27 = 0x8b,
-    DW_OP_breg28 = 0x8c,
-    DW_OP_breg29 = 0x8d,
-    DW_OP_breg30 = 0x8e,
-    DW_OP_breg31 = 0x8f,
-    DW_OP_regx = 0x90,
-    DW_OP_fbreg = 0x91,
-    DW_OP_bregx = 0x92,
-    DW_OP_piece = 0x93,
-    DW_OP_deref_size = 0x94,
-    DW_OP_xderef_size = 0x95,
-    DW_OP_nop = 0x96,
-    /* DWARF 3 extensions.  */
-    DW_OP_push_object_address = 0x97,
-    DW_OP_call2 = 0x98,
-    DW_OP_call4 = 0x99,
-    DW_OP_call_ref = 0x9a,
-    DW_OP_form_tls_address = 0x9b,
-    DW_OP_call_frame_cfa = 0x9c,
-    DW_OP_bit_piece = 0x9d,
-    /* GNU extensions.  */
-    DW_OP_GNU_push_tls_address = 0xe0,
-    /* HP extensions.  */
-    DW_OP_HP_unknown     = 0xe0, /* Ouch, the same as GNU_push_tls_address.  */
-    DW_OP_HP_is_value    = 0xe1,
-    DW_OP_HP_fltconst4   = 0xe2,
-    DW_OP_HP_fltconst8   = 0xe3,
-    DW_OP_HP_mod_range   = 0xe4,
-    DW_OP_HP_unmod_range = 0xe5,
-    DW_OP_HP_tls         = 0xe6
-  };
-
-
 /* Convert the DWARF3 expression in expr[0 .. exprlen-1] into a dag
    (of CfiExprs) stored in ctx->exprs, and return the index in
    ctx->exprs of the root node.  Or fail in which case return -1. */

Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c        2008-02-13 
05:05:58 UTC (rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c        2008-02-14 
00:44:17 UTC (rev 7406)
@@ -57,8 +57,8 @@
 #include "pub_core_xarray.h"
 #include "priv_misc.h"             /* dinfo_zalloc/free/strdup */
 #include "priv_tytypes.h"
+#include "priv_d3basics.h"
 #include "priv_storage.h"
-#include "priv_d3basics.h"
 #include "priv_readdwarf3.h"       /* self */
 
 
@@ -387,12 +387,6 @@
    location list.  Zero length ranges, with aMax == aMin-1, are not
    allowed.
 */
-static void copy_bytes_into_XA ( XArray* /* of UChar */ xa, 
-                                 void* bytes, Word nbytes ) {
-   Word i;
-   for (i = 0; i < nbytes; i++)
-      VG_(addToXA)( xa, & ((UChar*)bytes)[i] );
-}
 void ML_(pp_GX) ( GExpr* gx ) {
    Addr   aMin, aMax;
    UChar  uc;
@@ -542,11 +536,11 @@
          c = 0; /* !isEnd*/
          VG_(addToXA)( xa, &c );
          w = w1    + base + svma_of_referencing_CU;
-         copy_bytes_into_XA( xa, &w, sizeof(w) );
+         ML_(copy_bytes_into_XA)( xa, &w, sizeof(w) );
          w = w2 -1 + base + svma_of_referencing_CU;
-         copy_bytes_into_XA( xa, &w, sizeof(w) );
+         ML_(copy_bytes_into_XA)( xa, &w, sizeof(w) );
          s = (UShort)len;
-         copy_bytes_into_XA( xa, &s, sizeof(s) );
+         ML_(copy_bytes_into_XA)( xa, &s, sizeof(s) );
       }
 
       while (len > 0) {
@@ -2750,7 +2744,7 @@
       have at least one type entry to refer to.  D3_FAKEVOID_CUOFF is
       huge and presumably will not occur in any valid DWARF3 file --
       it would need to have a .debug_info section 4GB long for that to
-      happen. */
+      happen.  These type entries end up in the DebugInfo. */
    admin = NULL;
    { Type* tVoid = ML_(new_Type)();
      tVoid->tag = Ty_Void;
@@ -2760,7 +2754,13 @@
      admin->tag     = TyA_Type;
    }
 
+   /* List of variables we're accumulating.  These don't end up in the
+      DebugInfo; instead their contents are handed to ML_(addVar) and
+      the list elements are then deleted. */
    tempvars = NULL;
+
+   /* List of GExprs we're accumulating.  These wind up in the
+      DebugInfo. */
    gexprs = NULL;
 
    /* We need a D3TypeParser to keep track of partially constructed
@@ -2968,7 +2968,12 @@
    }
    tempvars = NULL;
 
-   /* FIXME: record adminp in di so it can be freed later */
+   /* record the TyAdmins and the GExprs in di so they can be freed
+      later */
+   vg_assert(!di->tyadmins);
+   di->tyadmins = admin;
+   vg_assert(!di->gexprs);
+   di->gexprs = gexprs;
 }
 
 

Modified: branches/DATASYMS/coregrind/m_debuginfo/readelf.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readelf.c   2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/readelf.c   2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -47,6 +47,7 @@
 #include "pub_core_tooliface.h"    /* VG_(needs) */
 #include "pub_core_xarray.h"
 #include "priv_misc.h"             /* dinfo_zalloc/free/strdup */
+#include "priv_d3basics.h"
 #include "priv_tytypes.h"
 #include "priv_storage.h"
 #include "priv_readelf.h"          /* self */

Modified: branches/DATASYMS/coregrind/m_debuginfo/readstabs.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readstabs.c 2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/readstabs.c 2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -41,6 +41,7 @@
 #include "pub_core_xarray.h"
 #include "priv_misc.h"             /* dinfo_zalloc/free/strdup */
 #include "priv_tytypes.h"
+#include "priv_d3basics.h"
 #include "priv_storage.h"
 #include "priv_readstabs.h"        /* self */
 

Modified: branches/DATASYMS/coregrind/m_debuginfo/tytypes.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/tytypes.c   2008-02-13 05:05:58 UTC 
(rev 7405)
+++ branches/DATASYMS/coregrind/m_debuginfo/tytypes.c   2008-02-14 00:44:17 UTC 
(rev 7406)
@@ -80,6 +80,88 @@
    return type;
 }
 
+void ML_(delete_TyAtom)( TyAtom* atom ) {
+   if (atom->name)
+      ML_(dinfo_free)(atom->name);
+   ML_(dinfo_free)(atom);
+}
+void ML_(delete_TyField)( TyField* field ) {
+   if (field->name)
+      ML_(dinfo_free)(field->name);
+   /* typeR and loc will be on the admin list; no need to free */
+   ML_(dinfo_free)(field);
+}
+void ML_(delete_TyBounds)( TyBounds* bounds ) {
+   ML_(dinfo_free)(bounds);
+}
+void ML_(delete_D3Expr)( D3Expr* expr ) {
+   if (expr->bytes)
+      ML_(dinfo_free)(expr->bytes);
+   ML_(dinfo_free)(expr);
+}
+void ML_(delete_Type)( Type* ty ) {
+   switch (ty->tag) {
+      case Ty_Base:
+         if (ty->Ty.Base.name)
+            ML_(dinfo_free)(ty->Ty.Base.name);
+         break;
+      case Ty_PorR:
+         /* typeR will be on the admin list */
+         break;
+      case Ty_TyDef:
+         if (ty->Ty.TyDef.name)
+            ML_(dinfo_free)(ty->Ty.TyDef.name);
+         /* typeR will be on the admin list */
+         break;
+      case Ty_StOrUn:
+         if (ty->Ty.StOrUn.name)
+            ML_(dinfo_free)(ty->Ty.StOrUn.name);
+         /* Just dump the containing XArray.  The fields themselves
+            will be on the admin list. */
+         if (ty->Ty.StOrUn.fields)
+            VG_(deleteXA)(ty->Ty.StOrUn.fields);
+         break;
+      case Ty_Enum:
+         if (ty->Ty.Enum.name)
+            ML_(dinfo_free)(ty->Ty.Enum.name);
+         if (ty->Ty.Enum.atomRs)
+            VG_(deleteXA)( ty->Ty.Enum.atomRs);
+         /* Just dump the containing XArray.  The atoms themselves
+            will be on the admin list. */
+         break;
+      case Ty_Array:
+         if (ty->Ty.Array.bounds)
+            VG_(deleteXA)( ty->Ty.Array.bounds);
+         /* Just dump the containing XArray.  The bounds themselves
+            will be on the admin list. */
+         break;
+      case Ty_Fn:
+         break;
+      case Ty_Qual:
+         /* typeR will be on the admin list */
+         break;
+      case Ty_Void:
+         break;
+      default:
+         vg_assert(0);
+   }
+}
+
+void ML_(delete_TyAdmin_and_payload) ( TyAdmin* ad ) {
+   vg_assert(ad->payload);
+   switch (ad->tag) {
+      case TyA_Type:   ML_(delete_Type)(ad->payload);     break;
+      case TyA_Atom:   ML_(delete_TyAtom)(ad->payload);   break;
+      case TyA_Expr:   ML_(delete_D3Expr)(ad->payload);   break;
+      case TyA_Field:  ML_(delete_TyField)(ad->payload);  break;
+      case TyA_Bounds: ML_(delete_TyBounds)(ad->payload); break;
+      default:         vg_assert(0);
+   }
+   ML_(dinfo_free)(ad);
+}
+
+
+
 static void pp_XArray_of_pointersOrRefs ( XArray* xa ) {
    Word i;
    VG_(printf)("{");
@@ -321,21 +403,14 @@
 }
 
 
-static void copy_bytes_into_XA ( XArray* /* of UChar */ xa, 
-                                 void* bytes, Word nbytes ) {
-   Word i;
-   for (i = 0; i < nbytes; i++)
-      VG_(addToXA)( xa, & ((UChar*)bytes)[i] );
-}
 static void copy_UWord_into_XA ( XArray* /* of UChar */ xa,
                                  UWord uw ) {
    UChar buf[32];
    VG_(memset)(buf, 0, sizeof(buf));
    VG_(sprintf)(buf, "%lu", uw);
-   copy_bytes_into_XA( xa, buf, VG_(strlen)(buf));
+   ML_(copy_bytes_into_XA)( xa, buf, VG_(strlen)(buf));
 }
 
-
 /* Describe where in the type 'offset' falls.  Caller must
    deallocate the resulting XArray. */
 XArray* /*UChar*/ ML_(describe_type)( /*OUT*/OffT* residual_offset,
@@ -386,9 +461,9 @@
                goto done; /* No.  Give up. */
             /* Yes.  'field' is it. */
             if (!field->name) goto done;
-            copy_bytes_into_XA( xa, ".", 1 );
-            copy_bytes_into_XA( xa, field->name,
-                                VG_(strlen)(field->name) );
+            ML_(copy_bytes_into_XA)( xa, ".", 1 );
+            ML_(copy_bytes_into_XA)( xa, field->name,
+                                     VG_(strlen)(field->name) );
             offset -= offMin;
             ty = field->typeR;
             if (!ty) goto done;
@@ -415,9 +490,9 @@
             eszB = ML_(sizeOfType)( ty->Ty.Array.typeR );
             if (eszB == 0) goto done;
             ix = offset / eszB;
-            copy_bytes_into_XA( xa, "[", 1 );
+            ML_(copy_bytes_into_XA)( xa, "[", 1 );
             copy_UWord_into_XA( xa, ix );
-            copy_bytes_into_XA( xa, "]", 1 );
+            ML_(copy_bytes_into_XA)( xa, "]", 1 );
             ty = ty->Ty.Array.typeR;
             offset -= ix * eszB;
             /* keep going; look inside the array element. */
@@ -447,7 +522,7 @@
 
   done:
    *residual_offset = offset;
-   copy_bytes_into_XA( xa, "\0", 1 );
+   ML_(copy_bytes_into_XA)( xa, "\0", 1 );
    return xa;
 }
 


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Valgrind-developers mailing list
Valgrind-developers@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-developers

Reply via email to