Author: phosek Date: Sat Feb 2 13:15:49 2019 New Revision: 352966 URL: http://llvm.org/viewvc/llvm-project?rev=352966&view=rev Log: [libunwind] Provide placement new definition
While Clang automatically generates the code for placement new, g++ doesn't do that so we need to provide our own definition. Differential Revision: https://reviews.llvm.org/D57455 Modified: libunwind/trunk/src/Unwind-seh.cpp libunwind/trunk/src/UnwindCursor.hpp libunwind/trunk/src/libunwind.cpp Modified: libunwind/trunk/src/Unwind-seh.cpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/Unwind-seh.cpp?rev=352966&r1=352965&r2=352966&view=diff ============================================================================== --- libunwind/trunk/src/Unwind-seh.cpp (original) +++ libunwind/trunk/src/Unwind-seh.cpp Sat Feb 2 13:15:49 2019 @@ -49,10 +49,6 @@ using namespace libunwind; /// Class of foreign exceptions based on unrecognized SEH exceptions. static const uint64_t kSEHExceptionClass = 0x434C4E4753454800; // CLNGSEH\0 -// libunwind does not and should not depend on C++ library which means that we -// need our own declaration of global placement new. -void *operator new(size_t, void*); - /// Exception cleanup routine used by \c _GCC_specific_handler to /// free foreign exceptions. static void seh_exc_cleanup(_Unwind_Reason_Code urc, _Unwind_Exception *exc) { @@ -452,20 +448,23 @@ _Unwind_GetRegionStart(struct _Unwind_Co static int _unw_init_seh(unw_cursor_t *cursor, CONTEXT *context) { #ifdef _LIBUNWIND_TARGET_X86_64 - new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_x86_64>( - context, LocalAddressSpace::sThisAddressSpace); + new (reinterpret_cast<UnwindCursor<LocalAddressSpace, Registers_x86_64> *>(cursor)) + UnwindCursor<LocalAddressSpace, Registers_x86_64>( + context, LocalAddressSpace::sThisAddressSpace); auto *co = reinterpret_cast<AbstractUnwindCursor *>(cursor); co->setInfoBasedOnIPRegister(); return UNW_ESUCCESS; #elif defined(_LIBUNWIND_TARGET_ARM) - new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm>( - context, LocalAddressSpace::sThisAddressSpace); + new (reinterpret_cast<UnwindCursor<LocalAddressSpace, Registers_arm> *>(cursor)) + UnwindCursor<LocalAddressSpace, Registers_arm>( + context, LocalAddressSpace::sThisAddressSpace); auto *co = reinterpret_cast<AbstractUnwindCursor *>(cursor); co->setInfoBasedOnIPRegister(); return UNW_ESUCCESS; #elif defined(_LIBUNWIND_TARGET_AARCH64) - new ((void *)cursor) UnwindCursor<LocalAddressSpace, Registers_arm64>( - context, LocalAddressSpace::sThisAddressSpace); + new (reinterpret_cast<UnwindCursor<LocalAddressSpace, Registers_arm64> *>(cursor)) + UnwindCursor<LocalAddressSpace, Registers_arm64>( + context, LocalAddressSpace::sThisAddressSpace); auto *co = reinterpret_cast<AbstractUnwindCursor *>(cursor); co->setInfoBasedOnIPRegister(); return UNW_ESUCCESS; Modified: libunwind/trunk/src/UnwindCursor.hpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/UnwindCursor.hpp?rev=352966&r1=352965&r2=352966&view=diff ============================================================================== --- libunwind/trunk/src/UnwindCursor.hpp (original) +++ libunwind/trunk/src/UnwindCursor.hpp Sat Feb 2 13:15:49 2019 @@ -894,6 +894,10 @@ public: virtual void saveVFPAsX(); #endif + // libunwind does not and should not depend on C++ library which means that we + // need our own defition of inline placement new. + static void *operator new(size_t, UnwindCursor<A, R> *p) { return p; } + private: #if defined(_LIBUNWIND_ARM_EHABI) Modified: libunwind/trunk/src/libunwind.cpp URL: http://llvm.org/viewvc/llvm-project/libunwind/trunk/src/libunwind.cpp?rev=352966&r1=352965&r2=352966&view=diff ============================================================================== --- libunwind/trunk/src/libunwind.cpp (original) +++ libunwind/trunk/src/libunwind.cpp Sat Feb 2 13:15:49 2019 @@ -23,10 +23,6 @@ using namespace libunwind; -// libunwind does not and should not depend on C++ library which means that we -// need our own declaration of global placement new. -void *operator new(size_t, void*); - /// internal object to represent this processes address space LocalAddressSpace LocalAddressSpace::sThisAddressSpace; @@ -70,8 +66,9 @@ _LIBUNWIND_EXPORT int unw_init_local(unw # error Architecture not supported #endif // Use "placement new" to allocate UnwindCursor in the cursor buffer. - new ((void *)cursor) UnwindCursor<LocalAddressSpace, REGISTER_KIND>( - context, LocalAddressSpace::sThisAddressSpace); + new (reinterpret_cast<UnwindCursor<LocalAddressSpace, REGISTER_KIND> *>(cursor)) + UnwindCursor<LocalAddressSpace, REGISTER_KIND>( + context, LocalAddressSpace::sThisAddressSpace); #undef REGISTER_KIND AbstractUnwindCursor *co = (AbstractUnwindCursor *)cursor; co->setInfoBasedOnIPRegister(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits