* win32-nat.c (mappings): Remove HAVE_SSE conditional.
authorChristopher Faylor <me+cygwin@cgf.cx>
Sat, 20 Sep 2003 02:38:39 +0000 (02:38 +0000)
committerChristopher Faylor <me+cygwin@cgf.cx>
Sat, 20 Sep 2003 02:38:39 +0000 (02:38 +0000)
gdb/ChangeLog
gdb/symtab.c
gdb/win32-nat.c
gdb/windows-nat.c

index 39d5a98..d4e9877 100644 (file)
@@ -1,3 +1,7 @@
+2003-09-19  Christopher Faylor  <cgf@redhat.com>
+
+       * win32-nat.c (mappings): Remove HAVE_SSE conditional.
+
 2003-09-19  Jim Blandy  <jimb@redhat.com>
 
        * macrotab.c (macro_include): Use the correct comparison to find
index d984a35..9f4e72f 100644 (file)
@@ -434,6 +434,10 @@ create_demangled_names_hash (struct objfile *objfile)
      NULL, objfile->md, xmcalloc, xmfree);
 }
 
+#ifndef LINKER_SYMBOLS_HAVE_WIN32_STDCALL_ARG_SIZES
+#define LINKER_SYMBOLS_HAVE_WIN32_STDCALL_ARG_SIZES (0)
+#endif
+
 /* Try to determine the demangled name for a symbol, based on the
    language of that symbol.  If the language is set to language_auto,
    it will attempt to find any demangling algorithm that works and
@@ -446,6 +450,39 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
 {
   char *demangled = NULL;
 
+  /* On Windows, some functions use the `stdcall' calling convention,
+     in which the callee is expected to pop the arguments off the
+     stack.  Normally, the caller takes care of this, because only the
+     caller knows how many arguments it really passed.  To avoid
+     confusion, the linker symbols for `stdcall' functions have names
+     with a suffix "@N" attached to them, where "N" is the number of
+     bytes they'll pop.  That way, if a caller thinks some `stdcall'
+     function `foo' expects M argument bytes, but the definition of
+     `foo' expects N argument bytes, N != M, then the call will be a
+     reference to `foo@M', but the definition will have a linker
+     symbol `foo@N', and you'll get a link-time `symbol not found'
+     error, instead of a crash at run-time.
+
+     (Note how this fails to address calls through function pointers,
+     since the byte count isn't part of the function pointer's type.
+     Go, Microsoft!)
+
+     Whatever.  But our demangler doesn't like that '@N' suffix, so we
+     need to strip it off.  */
+  if (LINKER_SYMBOLS_HAVE_WIN32_STDCALL_ARG_SIZES)
+    {
+      char *arg_byte_suffix = strchr (mangled, '@');
+      if (arg_byte_suffix)
+        {
+          int prefix_len = arg_byte_suffix - mangled;
+          char *mangled_sans_suffix = alloca (prefix_len + 1);
+          memcpy (mangled_sans_suffix, mangled, prefix_len);
+          mangled_sans_suffix[prefix_len] = '\0';
+
+          mangled = mangled_sans_suffix;
+        }
+    }
+
   if (gsymbol->language == language_unknown)
     gsymbol->language = language_auto;
 
index f0d87ef..0fed828 100644 (file)
@@ -182,7 +182,6 @@ static const int mappings[] =
   context_offset (FloatSave.DataSelector),
   context_offset (FloatSave.DataOffset),
   context_offset (FloatSave.ErrorSelector)
-#ifdef HAVE_SSE_REGS
   /* XMM0-7 */ ,
   context_offset (ExtendedRegisters[10*16]),
   context_offset (ExtendedRegisters[11*16]),
@@ -194,7 +193,6 @@ static const int mappings[] =
   context_offset (ExtendedRegisters[17*16]),
   /* MXCSR */
   context_offset (ExtendedRegisters[24])
-#endif
 };
 
 #undef context_offset
index f0d87ef..0fed828 100644 (file)
@@ -182,7 +182,6 @@ static const int mappings[] =
   context_offset (FloatSave.DataSelector),
   context_offset (FloatSave.DataOffset),
   context_offset (FloatSave.ErrorSelector)
-#ifdef HAVE_SSE_REGS
   /* XMM0-7 */ ,
   context_offset (ExtendedRegisters[10*16]),
   context_offset (ExtendedRegisters[11*16]),
@@ -194,7 +193,6 @@ static const int mappings[] =
   context_offset (ExtendedRegisters[17*16]),
   /* MXCSR */
   context_offset (ExtendedRegisters[24])
-#endif
 };
 
 #undef context_offset