* amd64-windows-tdep.c (amd64_skip_main_prologue): New function.
authorPierre Muller <muller@sourceware.org>
Mon, 27 Sep 2010 22:05:40 +0000 (22:05 +0000)
committerPierre Muller <muller@sourceware.org>
Mon, 27 Sep 2010 22:05:40 +0000 (22:05 +0000)
(amd64_windows_init_abi): Register amd64_skip_main_prologue as gdbarch
skip_main_prologue method.

gdb/ChangeLog
gdb/amd64-windows-tdep.c

index 8f91dd1be2f4df7a7494ed8b1c4892d89a3b386d..440f1411846b1fc313a33990710f59619e9e4445 100644 (file)
@@ -1,3 +1,9 @@
+2010-09-27  Pierre Muller  <muller@ics.u-strasbg.fr>
+
+       * amd64-windows-tdep.c (amd64_skip_main_prologue): New function.
+       (amd64_windows_init_abi): Register amd64_skip_main_prologue as gdbarch
+       skip_main_prologue method.
+
 2010-09-27  Tom Tromey  <tromey@redhat.com>
 
        * dwarf2read.c (dwarf2_read_index): Only allow version 3.
index 05d082458c76d15e51edfd99a0119ca5eef4c7fe..0a4456284bb55f6158ba4cdc615e2ea9d1d68fde 100644 (file)
@@ -122,6 +122,38 @@ amd64_windows_return_value (struct gdbarch *gdbarch, struct type *func_type,
     }
 }
 
+/* Check that the code pointed to by PC corresponds to a call to
+   __main, skip it if so.  Return PC otherwise.  */
+
+static CORE_ADDR
+amd64_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
+  gdb_byte op;
+
+  target_read_memory (pc, &op, 1);
+  if (op == 0xe8)
+    {
+      gdb_byte buf[4];
+
+      if (target_read_memory (pc + 1, buf, sizeof buf) == 0)
+       {
+         struct minimal_symbol *s;
+         CORE_ADDR call_dest;
+
+         call_dest = pc + 5 + extract_signed_integer (buf, 4, byte_order);
+         s = lookup_minimal_symbol_by_pc (call_dest);
+         if (s != NULL
+             && SYMBOL_LINKAGE_NAME (s) != NULL
+             && strcmp (SYMBOL_LINKAGE_NAME (s), "__main") == 0)
+           pc += 5;
+       }
+    }
+
+  return pc;
+}
+
+
 static void
 amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -140,6 +172,7 @@ amd64_windows_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   tdep->memory_args_by_pointer = 1;
   tdep->integer_param_regs_saved_in_caller_frame = 1;
   set_gdbarch_return_value (gdbarch, amd64_windows_return_value);
+  set_gdbarch_skip_main_prologue (gdbarch, amd64_skip_main_prologue);
 
   set_solib_ops (gdbarch, &solib_target_so_ops);
 }