Hello, I changed type in __base_class_type_info to wide-enough type only for llp64 target. By this we have no (new) side-effects to other targets.
ChangeLog 2012-12-21 Kai Tietz * config/os/mingw32/os_defines.h (_GLIBCXX_LLP64): Define if llp64 abi is used. * config/os/mingw32-w64/os_defines.h: Likewise. * libsupc++/cxxabi.h (__base_class_type_info): Adjust type of __offset_flags for llp64. * libsupc++/eh_alloc.cc (EMERGENCY_OBJ_SIZE): Define proper for llp64 abi. (EMERGENCY_OBJ_COUNT): Likewise. (bitmask_type): Likewise. * ibsupc++/hash_bytes.cc (_Hash_bytes): Handle llp64. Tested for i686-w64-mingw32, x86_64-w64-mingw32, and x86_64-unknown-linux-gnu. Ok for apply? Regards, Kai Index: config/os/mingw32/os_defines.h =================================================================== --- config/os/mingw32/os_defines.h (Revision 194655) +++ config/os/mingw32/os_defines.h (Arbeitskopie) @@ -72,4 +72,8 @@ #define _GLIBCXX_CDTOR_CALLABI __thiscall #endif +#ifdef __x86_64__ +#define _GLIBCXX_LLP64 1 #endif + +#endif Index: config/os/mingw32-w64/os_defines.h =================================================================== --- config/os/mingw32-w64/os_defines.h (Revision 194655) +++ config/os/mingw32-w64/os_defines.h (Arbeitskopie) @@ -74,4 +74,8 @@ #define _GLIBCXX_CDTOR_CALLABI __thiscall #endif +#ifdef __x86_64__ +#define _GLIBCXX_LLP64 1 #endif + +#endif Index: libsupc++/cxxabi.h =================================================================== --- libsupc++/cxxabi.h (Revision 194655) +++ libsupc++/cxxabi.h (Arbeitskopie) @@ -356,7 +356,11 @@ namespace __cxxabiv1 { public: const __class_type_info* __base_type; // Base class type. +#ifdef _GLIBCXX_LLP64 + long long __offset_flags; // Offset and info. +#else long __offset_flags; // Offset and info. +#endif enum __offset_flags_masks { Index: libsupc++/eh_alloc.cc =================================================================== --- libsupc++/eh_alloc.cc (Revision 194655) +++ libsupc++/eh_alloc.cc (Arbeitskopie) @@ -60,7 +60,7 @@ using namespace __cxxabiv1; #if INT_MAX == 32767 # define EMERGENCY_OBJ_SIZE 128 # define EMERGENCY_OBJ_COUNT 16 -#elif LONG_MAX == 2147483647 +#elif !defined (_GLIBCXX_LLP64) && LONG_MAX == 2147483647 # define EMERGENCY_OBJ_SIZE 512 # define EMERGENCY_OBJ_COUNT 32 #else @@ -76,8 +76,12 @@ using namespace __cxxabiv1; #if INT_MAX == 32767 || EMERGENCY_OBJ_COUNT <= 32 typedef unsigned int bitmask_type; #else +#if defined (_GLIBCXX_LLP64) +typedef unsigned long long bitmask_type; +#else typedef unsigned long bitmask_type; #endif +#endif typedef char one_buffer[EMERGENCY_OBJ_SIZE] __attribute__((aligned)); Index: libsupc++/hash_bytes.cc =================================================================== --- libsupc++/hash_bytes.cc (Revision 194655) +++ libsupc++/hash_bytes.cc (Arbeitskopie) @@ -128,7 +128,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION size_t _Hash_bytes(const void* ptr, size_t len, size_t seed) { - static const size_t mul = (0xc6a4a793UL << 32UL) + 0x5bd1e995UL; + static const size_t mul = (((size_t) 0xc6a4a793UL) << 32UL) + + (size_t) 0x5bd1e995UL; const char* const buf = static_cast<const char*>(ptr); // Remove the bytes not divisible by the sizeof(size_t). This Index: testsuite/18_support/50594.cc =================================================================== --- testsuite/18_support/50594.cc (Revision 194655) +++ testsuite/18_support/50594.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-fwhole-program" } +// { dg-options "-fwhole-program -static-libstdc++" { target *-*-mingw* } } // Copyright (C) 2011 Free Software Foundation // Index: testsuite/19_diagnostics/error_code/cons/1.cc =================================================================== --- testsuite/19_diagnostics/error_code/cons/1.cc (Revision 194655) +++ testsuite/19_diagnostics/error_code/cons/1.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // 2007-08-22 Benjamin Kosnik <b...@redhat.com> // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. Index: testsuite/19_diagnostics/error_code/operators/bool.cc =================================================================== --- testsuite/19_diagnostics/error_code/operators/bool.cc (Revision 194655) +++ testsuite/19_diagnostics/error_code/operators/bool.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // 2007-08-22 Benjamin Kosnik <b...@redhat.com> // Copyright (C) 2007, 2009 Free Software Foundation, Inc. Index: testsuite/19_diagnostics/error_code/operators/equal.cc =================================================================== --- testsuite/19_diagnostics/error_code/operators/equal.cc (Revision 194655) +++ testsuite/19_diagnostics/error_code/operators/equal.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // 2007-08-22 Benjamin Kosnik <b...@redhat.com> // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. Index: testsuite/19_diagnostics/error_code/operators/not_equal.cc =================================================================== --- testsuite/19_diagnostics/error_code/operators/not_equal.cc (Revision 194655) +++ testsuite/19_diagnostics/error_code/operators/not_equal.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // 2007-08-22 Benjamin Kosnik <b...@redhat.com> // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc. Index: testsuite/19_diagnostics/error_condition/cons/1.cc =================================================================== --- testsuite/19_diagnostics/error_condition/cons/1.cc (Revision 194655) +++ testsuite/19_diagnostics/error_condition/cons/1.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-additional-options "-static-libstdc++" { target *-*-mingw* } } // Copyright (C) 2008, 2009 Free Software Foundation, Inc. // Index: testsuite/19_diagnostics/error_condition/operators/bool.cc =================================================================== --- testsuite/19_diagnostics/error_condition/operators/bool.cc (Revision 194655) +++ testsuite/19_diagnostics/error_condition/operators/bool.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // Copyright (C) 2008, 2009 Free Software Foundation, Inc. // Index: testsuite/19_diagnostics/error_condition/operators/equal.cc =================================================================== --- testsuite/19_diagnostics/error_condition/operators/equal.cc (Revision 194655) +++ testsuite/19_diagnostics/error_condition/operators/equal.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // Copyright (C) 2008, 2009 Free Software Foundation, Inc. // Index: testsuite/19_diagnostics/error_condition/operators/not_equal.cc =================================================================== --- testsuite/19_diagnostics/error_condition/operators/not_equal.cc (Revision 194655) +++ testsuite/19_diagnostics/error_condition/operators/not_equal.cc (Arbeitskopie) @@ -1,4 +1,5 @@ // { dg-options "-std=gnu++0x" } +// { dg-options "-std=gnu++0x -static-libstdc++" { target *-*-mingw* } } // Copyright (C) 2008, 2009 Free Software Foundation, Inc. //