On Fri, Dec 21, 2012 at 1:59 AM, Kai Tietz <ktiet...@googlemail.com> wrote: > Hello, > > this patch fixes some remaining issues with pointer-sizes for llp64 > abi in libstdc++.
See comments below. > > 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): Change > type __offset_flags to intptr_t. > * 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,7 @@ namespace __cxxabiv1 > { > public: > const __class_type_info* __base_type; // Base class type. > - long __offset_flags; // Offset and info. > + intptr_t __offset_flags; // Offset and info. this should use ptrdiff_t. > > 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 Use size_t here > > > 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