Eric Pouech : winedump: Added support for dumping long long constants.

Alexandre Julliard julliard at winehq.org
Wed Oct 1 14:09:11 CDT 2008


Module: wine
Branch: master
Commit: 3333ea8dc6a9bad5cc01ea808ac132df8777539f
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3333ea8dc6a9bad5cc01ea808ac132df8777539f

Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Mon Sep 29 21:31:01 2008 +0200

winedump: Added support for dumping long long constants.

---

 tools/winedump/msc.c |   96 ++++++++++++++++++++++++++++++--------------------
 1 files changed, 58 insertions(+), 38 deletions(-)

diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c
index 522507d..da5e602 100644
--- a/tools/winedump/msc.c
+++ b/tools/winedump/msc.c
@@ -57,14 +57,20 @@ static const char* p_string(const struct p_string* s)
     return tmp;
 }
 
-static int numeric_leaf(int* value, const unsigned short int* leaf)
+union full_value
+{
+    int                 i;
+    long long unsigned  llu;
+};
+
+static int full_numeric_leaf(union full_value* fv, const unsigned short int* leaf)
 {
     unsigned short int type = *leaf++;
     int length = 2;
 
     if (type < LF_NUMERIC)
     {
-        *value = type;
+        fv->i = type;
     }
     else
     {
@@ -72,105 +78,117 @@ static int numeric_leaf(int* value, const unsigned short int* leaf)
         {
         case LF_CHAR:
             length += 1;
-            *value = *(const char*)leaf;
+            fv->i = *(const char*)leaf;
             break;
 
         case LF_SHORT:
             length += 2;
-            *value = *(const short*)leaf;
+            fv->i = *(const short*)leaf;
             break;
 
         case LF_USHORT:
             length += 2;
-            *value = *(const unsigned short*)leaf;
+            fv->i = *(const unsigned short*)leaf;
             break;
 
         case LF_LONG:
             length += 4;
-            *value = *(const int*)leaf;
+            fv->i = *(const int*)leaf;
             break;
 
         case LF_ULONG:
             length += 4;
-            *value = *(const unsigned int*)leaf;
+            fv->i = *(const unsigned int*)leaf;
             break;
 
         case LF_QUADWORD:
+            length += 8;
+            fv->llu = *(const long long int*)leaf;
+            break;
+
         case LF_UQUADWORD:
             length += 8;
-            printf(">>> unsupported leaf value\n");
-            *value = 0;    /* FIXME */
+            fv->llu = *(const long long unsigned int*)leaf;
             break;
 
         case LF_REAL32:
             length += 4;
-            printf(">>> unsupported leaf value\n");
-            *value = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
+            fv->i = 0;    /* FIXME */
             break;
 
         case LF_REAL48:
             length += 6;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_REAL64:
             length += 8;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_REAL80:
             length += 10;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_REAL128:
             length += 16;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_COMPLEX32:
             length += 4;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_COMPLEX64:
             length += 8;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_COMPLEX80:
             length += 10;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_COMPLEX128:
             length += 16;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         case LF_VARSTRING:
             length += 2 + *leaf;
-            *value = 0;    /* FIXME */
-            printf(">>> unsupported leaf value\n");
+            fv->i = 0;    /* FIXME */
+            printf(">>> unsupported leaf value %04x\n", type);
             break;
 
         default:
 	    printf(">>> Unsupported numeric leaf-id %04x\n", type);
-            *value = 0;
+            fv->i = 0;
             break;
         }
     }
     return length;
 }
 
+static int numeric_leaf(int* value, const unsigned short int* leaf)
+{
+    union full_value fv;
+    int len = len = full_numeric_leaf(&fv, leaf);
+
+    *value = fv.i;
+    return len;
+}
+
 static const char* get_attr(unsigned attr)
 {
     static char tmp[256];
@@ -1149,23 +1167,25 @@ int codeview_dump_symbols(const void* root, unsigned long size)
 
         case S_CONSTANT_V2:
             {
-                int             val, vlen;
+                int             vlen;
+                union full_value fv;
 
-                vlen = numeric_leaf(&val, &sym->constant_v2.cvalue);
-                printf("\tS-Constant V2 '%s' = %u type:%x\n",
+                vlen = full_numeric_leaf(&fv, &sym->constant_v2.cvalue);
+                printf("\tS-Constant V2 '%s' = 0x%x%08x type:%x\n",
                        p_string(PSTRING(&sym->constant_v2.cvalue, vlen)),
-                       val, sym->constant_v2.type);
+                       (unsigned)(fv.llu >> 32), (unsigned)fv.llu, sym->constant_v2.type);
             }
             break;
 
         case S_CONSTANT_V3:
             {
-                int             val, vlen;
+                int             vlen;
+                union full_value fv;
 
-                vlen = numeric_leaf(&val, &sym->constant_v3.cvalue);
-                printf("\tS-Constant V3 '%s' = %u type:%x\n",
+                vlen = full_numeric_leaf(&fv, &sym->constant_v3.cvalue);
+                printf("\tS-Constant V3 '%s' =  0x%x%08x type:%x\n",
                        (const char*)&sym->constant_v3.cvalue + vlen,
-                       val, sym->constant_v3.type);
+                       (unsigned)(fv.llu >> 32), (unsigned)fv.llu, sym->constant_v3.type);
             }
             break;
 




More information about the wine-cvs mailing list