From: Christopher Faylor Date: Sat, 20 Sep 2003 02:38:39 +0000 (+0000) Subject: * win32-nat.c (mappings): Remove HAVE_SSE conditional. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f4f99b11c4d67717803e4dc62e1d522c8ce9c898;p=binutils-gdb.git * win32-nat.c (mappings): Remove HAVE_SSE conditional. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 39d5a98d495..d4e9877a7ac 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2003-09-19 Christopher Faylor + + * win32-nat.c (mappings): Remove HAVE_SSE conditional. + 2003-09-19 Jim Blandy * macrotab.c (macro_include): Use the correct comparison to find diff --git a/gdb/symtab.c b/gdb/symtab.c index d984a354205..9f4e72faabc 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -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; diff --git a/gdb/win32-nat.c b/gdb/win32-nat.c index f0d87efe24f..0fed828d3de 100644 --- a/gdb/win32-nat.c +++ b/gdb/win32-nat.c @@ -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 diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index f0d87efe24f..0fed828d3de 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -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