[pkg-wine-party] [SCM] Debian Wine packaging branch, wheezy, updated. wine-1.4-7-302-gb61b690

Alexandre Julliard julliard at winehq.org
Sun Jun 17 20:03:33 UTC 2012


The following commit has been merged in the wheezy branch:
commit 2740260a652dbf3438ce3d8fe9e1e80efa553fe0
Author: Eric Pouech <eric.pouech at orange.fr>
Date:   Wed Apr 4 22:30:38 2012 +0200

    winedbg: Fix set instruction when sizeof(int) <> sizeof register.
    (cherry picked from commit 88949b2c59f5613ff1a3964e7ce538474578d6c3)

diff --git a/programs/winedbg/be_arm.c b/programs/winedbg/be_arm.c
index 0bd5601..cd892df 100644
--- a/programs/winedbg/be_arm.c
+++ b/programs/winedbg/be_arm.c
@@ -241,6 +241,13 @@ static int be_arm_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
     return FALSE;
 }
 
+static int be_arm_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
+                                unsigned is_signed, LONGLONG val)
+{
+    dbg_printf("be_arm_store_integer: not done\n");
+    return FALSE;
+}
+
 struct backend_cpu be_arm =
 {
     IMAGE_FILE_MACHINE_ARMV7,
@@ -266,5 +273,6 @@ struct backend_cpu be_arm =
     be_arm_adjust_pc_for_break,
     be_arm_fetch_integer,
     be_arm_fetch_float,
+    be_arm_store_integer,
 };
 #endif
diff --git a/programs/winedbg/be_cpu.h b/programs/winedbg/be_cpu.h
index ce9c32f..356980a 100644
--- a/programs/winedbg/be_cpu.h
+++ b/programs/winedbg/be_cpu.h
@@ -112,6 +112,8 @@ struct backend_cpu
     int                 (*fetch_integer)(const struct dbg_lvalue* lvalue, unsigned size, unsigned is_signed, LONGLONG*);
     /* Reads a real from memory and stores it inside a long double */
     int                 (*fetch_float)(const struct dbg_lvalue* lvalue, unsigned size, long double*);
+    /* Writes an integer to memory */
+    int                 (*store_integer)(const struct dbg_lvalue* lvalue, unsigned size, unsigned is_signed, LONGLONG);
 };
 
 extern struct backend_cpu*      be_cpu;
diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c
index c294f2d..d9fb67c 100644
--- a/programs/winedbg/be_i386.c
+++ b/programs/winedbg/be_i386.c
@@ -772,6 +772,13 @@ static int be_i386_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
     return TRUE;
 }
 
+static int be_i386_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
+                                 unsigned is_signed, LONGLONG val)
+{
+    /* this is simple as we're on a little endian CPU */
+    return memory_write_value(lvalue, size, &val);
+}
+
 struct backend_cpu be_i386 =
 {
     IMAGE_FILE_MACHINE_I386,
@@ -797,5 +804,6 @@ struct backend_cpu be_i386 =
     be_i386_adjust_pc_for_break,
     be_i386_fetch_integer,
     be_i386_fetch_float,
+    be_i386_store_integer,
 };
 #endif
diff --git a/programs/winedbg/be_ppc.c b/programs/winedbg/be_ppc.c
index 0d076bc..3de5d9d 100644
--- a/programs/winedbg/be_ppc.c
+++ b/programs/winedbg/be_ppc.c
@@ -173,6 +173,13 @@ static int be_ppc_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
     return FALSE;
 }
 
+static int be_ppc_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
+                                unsigned is_signed, LONGLONG val)
+{
+    dbg_printf("be_ppc_store_integer: not done\n");
+    return FALSE;
+}
+
 struct backend_cpu be_ppc =
 {
     IMAGE_FILE_MACHINE_POWERPC,
@@ -198,5 +205,6 @@ struct backend_cpu be_ppc =
     be_ppc_adjust_pc_for_break,
     be_ppc_fetch_integer,
     be_ppc_fetch_float,
+    be_ppc_store_integer,
 };
 #endif
diff --git a/programs/winedbg/be_sparc.c b/programs/winedbg/be_sparc.c
index 3435759..3d5ce36 100644
--- a/programs/winedbg/be_sparc.c
+++ b/programs/winedbg/be_sparc.c
@@ -148,6 +148,13 @@ static int be_sparc_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
     return FALSE;
 }
 
+static int be_sparc_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
+                                  unsigned is_signed, LONGLONG val)
+{
+    dbg_printf("be_sparc_store_integer: not done\n");
+    return FALSE;
+}
+
 struct backend_cpu be_sparc =
 {
     IMAGE_FILE_MACHINE_SPARC,
@@ -173,5 +180,6 @@ struct backend_cpu be_sparc =
     be_sparc_adjust_pc_for_break,
     be_sparc_fetch_integer,
     be_sparc_fetch_float,
+    be_sparc_store_integer,
 };
 #endif
diff --git a/programs/winedbg/be_x86_64.c b/programs/winedbg/be_x86_64.c
index 7dbd301..0dd11c2 100644
--- a/programs/winedbg/be_x86_64.c
+++ b/programs/winedbg/be_x86_64.c
@@ -638,6 +638,13 @@ static int be_x86_64_fetch_float(const struct dbg_lvalue* lvalue, unsigned size,
     return TRUE;
 }
 
+static int be_x86_64_store_integer(const struct dbg_lvalue* lvalue, unsigned size,
+                                   unsigned is_signed, LONGLONG val)
+{
+    /* this is simple as we're on a little endian CPU */
+    return memory_write_value(lvalue, size, &val);
+}
+
 struct backend_cpu be_x86_64 =
 {
     IMAGE_FILE_MACHINE_AMD64,
@@ -663,5 +670,6 @@ struct backend_cpu be_x86_64 =
     be_x86_64_adjust_pc_for_break,
     be_x86_64_fetch_integer,
     be_x86_64_fetch_float,
+    be_x86_64_store_integer,
 };
 #endif
diff --git a/programs/winedbg/dbg.y b/programs/winedbg/dbg.y
index 26f4a79..5929b87 100644
--- a/programs/winedbg/dbg.y
+++ b/programs/winedbg/dbg.y
@@ -204,7 +204,7 @@ disassemble_command:
     ;
 
 set_command:
-      tSET lvalue_addr '=' expr_rvalue { memory_write_value(&$2, sizeof(int), &$4); }
+      tSET lvalue_addr '=' expr_lvalue { types_store_value(&$2, &$4); }
     | tSET '+' tIDENTIFIER      { info_wine_dbg_channel(TRUE, NULL, $3); }
     | tSET '+' tALL             { info_wine_dbg_channel(TRUE, NULL, "all"); }
     | tSET '-' tIDENTIFIER      { info_wine_dbg_channel(FALSE, NULL, $3); }
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 6e6d465..a776d27 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -437,8 +437,9 @@ extern void             print_value(const struct dbg_lvalue* addr, char format,
 extern int              types_print_type(const struct dbg_type*, BOOL details);
 extern int              print_types(void);
 extern long int         types_extract_as_integer(const struct dbg_lvalue*);
-extern LONGLONG         types_extract_as_longlong(const struct dbg_lvalue*, unsigned* psize);
+extern LONGLONG         types_extract_as_longlong(const struct dbg_lvalue*, unsigned* psize, BOOL *pissigned);
 extern void             types_extract_as_address(const struct dbg_lvalue*, ADDRESS64*);
+extern BOOL             types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lvalue_from);
 extern BOOL             types_udt_find_element(struct dbg_lvalue* value, const char* name, long int* tmpbuf);
 extern BOOL             types_array_index(const struct dbg_lvalue* value, int index, struct dbg_lvalue* result);
 extern BOOL             types_get_info(const struct dbg_type*, IMAGEHLP_SYMBOL_TYPE_INFO, void*);
diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index 7a0b085..735ef53 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -524,7 +524,7 @@ void print_basic(const struct dbg_lvalue* lvalue, char format)
     if (format != 0)
     {
         unsigned size;
-        LONGLONG res = types_extract_as_longlong(lvalue, &size);
+        LONGLONG res = types_extract_as_longlong(lvalue, &size, NULL);
         WCHAR wch;
 
         switch (format)
@@ -557,7 +557,7 @@ void print_basic(const struct dbg_lvalue* lvalue, char format)
     }
     if (lvalue->type.id == dbg_itype_segptr)
     {
-        dbg_print_longlong(types_extract_as_longlong(lvalue, NULL), TRUE);
+        dbg_print_longlong(types_extract_as_longlong(lvalue, NULL, NULL), TRUE);
     }
     else print_typed_basic(lvalue);
 }
diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c
index 6d50c81..9ac49f2 100644
--- a/programs/winedbg/types.c
+++ b/programs/winedbg/types.c
@@ -53,12 +53,14 @@ BOOL types_get_real_type(struct dbg_type* type, DWORD* tag)
  * Given a lvalue, try to get an integral (or pointer/address) value
  * out of it
  */
-LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* psize)
+LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue,
+                                   unsigned* psize, BOOL *issigned)
 {
     LONGLONG            rtn;
     DWORD               tag, bt;
     DWORD64             size;
     struct dbg_type     type = lvalue->type;
+    BOOL                s = FALSE;
 
     if (!types_get_real_type(&type, &tag))
         RaiseException(DEBUG_STATUS_NOT_AN_INTEGER, 0, 0, NULL);
@@ -69,6 +71,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* ps
     }
 
     if (psize) *psize = 0;
+    if (issigned) *issigned = FALSE;
     switch (tag)
     {
     case SymTagBaseType:
@@ -87,30 +90,31 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* ps
         {
         case btChar:
         case btInt:
-            if (!be_cpu->fetch_integer(lvalue, (unsigned)size, TRUE, &rtn))
+            if (!be_cpu->fetch_integer(lvalue, (unsigned)size, s = TRUE, &rtn))
                 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
             break;
         case btUInt:
-            if (!be_cpu->fetch_integer(lvalue, (unsigned)size, FALSE, &rtn))
+            if (!be_cpu->fetch_integer(lvalue, (unsigned)size, s = FALSE, &rtn))
                 RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
             break;
         case btFloat:
             RaiseException(DEBUG_STATUS_NOT_AN_INTEGER, 0, 0, NULL);
         }
         if (psize) *psize = (unsigned)size;
+        if (issigned) *issigned = s;
         break;
     case SymTagPointerType:
-        if (!be_cpu->fetch_integer(lvalue, sizeof(void*), FALSE, &rtn))
+        if (!be_cpu->fetch_integer(lvalue, sizeof(void*), s = FALSE, &rtn))
             RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
         break;
     case SymTagArrayType:
     case SymTagUDT:
-        if (!be_cpu->fetch_integer(lvalue, sizeof(unsigned), FALSE, &rtn))
+        if (!be_cpu->fetch_integer(lvalue, sizeof(unsigned), s = FALSE, &rtn))
             RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
         break;
     case SymTagEnum:
         /* FIXME: we don't handle enum size */
-        if (!be_cpu->fetch_integer(lvalue, sizeof(unsigned), FALSE, &rtn))
+        if (!be_cpu->fetch_integer(lvalue, sizeof(unsigned), s = FALSE, &rtn))
             RaiseException(DEBUG_STATUS_INTERNAL_ERROR, 0, 0, NULL);
         break;
     case SymTagFunctionType:
@@ -133,7 +137,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* ps
  */
 long int types_extract_as_integer(const struct dbg_lvalue* lvalue)
 {
-    return types_extract_as_longlong(lvalue, NULL);
+    return types_extract_as_longlong(lvalue, NULL, NULL);
 }
 
 /******************************************************************
@@ -150,10 +154,27 @@ void types_extract_as_address(const struct dbg_lvalue* lvalue, ADDRESS64* addr)
     else
     {
         addr->Mode = AddrModeFlat;
-        addr->Offset = types_extract_as_longlong(lvalue, NULL);
+        addr->Offset = types_extract_as_longlong(lvalue, NULL, NULL);
     }
 }
 
+BOOL types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lvalue_from)
+{
+    LONGLONG    val;
+    DWORD64     size;
+    BOOL        is_signed;
+
+    if (!types_get_info(&lvalue_to->type, TI_GET_LENGTH, &size)) return FALSE;
+    if (sizeof(val) < size)
+    {
+        dbg_printf("Unsufficient size\n");
+        return FALSE;
+    }
+    /* FIXME: should support floats as well */
+    val = types_extract_as_longlong(lvalue_from, NULL, &is_signed);
+    return be_cpu->store_integer(lvalue_to, size, is_signed, val);
+}
+
 /******************************************************************
  *		types_get_udt_element_lvalue
  *

-- 
Debian Wine packaging



More information about the pkg-wine-party mailing list