[PATCH] [libc++] Eliminate more symbols multiply defined between libsupc++ and libc++.

Howard Hinnant howard.hinnant at gmail.com
Sun Oct 6 13:14:03 PDT 2013


On Oct 3, 2013, at 6:08 PM, Peter Collingbourne <peter at pcc.me.uk> wrote:

> The remaining multiple definitions were flushed out by attempting to
> link libsupc++ and libc++ into the same executable with --whole-archive,
> e.g.
> 
> clang++ -I../llvm/projects/libcxx/include -nodefaultlibs -Wl,--whole-archive lib/libc++.a /usr/lib/gcc/x86_64-linux-gnu/4.6/libsupc++.a -Wl,--no-whole-archive -lgcc -lgcc_s -lc -lpthread -lrt
> 
> (The same technique was used to flush out multiple definitions in
> libstdc++.)
> 
> http://llvm-reviews.chandlerc.com/D1824
> 
> Files:
>  src/exception.cpp
>  src/new.cpp
> 
> Index: src/exception.cpp
> ===================================================================
> --- src/exception.cpp
> +++ src/exception.cpp
> @@ -189,10 +189,14 @@
> {
> }
> 
> +#if !defined(__GLIBCXX__)
> +
> nested_exception::~nested_exception() _NOEXCEPT
> {
> }
> 
> +#endif
> +
> _LIBCPP_NORETURN
> void
> nested_exception::rethrow_nested() const
> Index: src/new.cpp
> ===================================================================
> --- src/new.cpp
> +++ src/new.cpp
> @@ -30,11 +30,13 @@
>     #if defined(LIBCXXRT) || __has_include(<cxxabi.h>)
>         #include <cxxabi.h>
>     #endif  // __has_include(<cxxabi.h>)
> -    #ifndef _LIBCPPABI_VERSION
> +    #if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
>         static std::new_handler __new_handler;
>     #endif  // _LIBCPPABI_VERSION
> #endif
> 
> +#ifndef __GLIBCXX__
> +
> // Implement all new and delete operators as weak definitions
> // in this shared library, so that they can be overriden by programs
> // that define non-weak copies of the functions.
> @@ -143,13 +145,19 @@
>     ::operator delete[](ptr);
> }
> 
> +#endif // !__GLIBCXX__
> +
> namespace std
> {
> 
> +#ifndef __GLIBCXX__
> const nothrow_t nothrow = {};
> +#endif
> 
> #ifndef _LIBCPPABI_VERSION
> 
> +#ifndef __GLIBCXX__
> +
> new_handler
> set_new_handler(new_handler handler) _NOEXCEPT
> {
> @@ -162,12 +170,16 @@
>     return __sync_fetch_and_add(&__new_handler, (new_handler)0);
> }
> 
> +#endif // !__GLIBCXX__
> +
> #ifndef LIBCXXRT
> 
> bad_alloc::bad_alloc() _NOEXCEPT
> {
> }
> 
> +#ifndef __GLIBCXX__
> +
> bad_alloc::~bad_alloc() _NOEXCEPT
> {
> }
> @@ -178,6 +190,8 @@
>     return "std::bad_alloc";
> }
> 
> +#endif // !__GLIBCXX__
> +
> #endif //LIBCXXRT
> 
> bad_array_new_length::bad_array_new_length() _NOEXCEPT
> <D1824.1.patch>_______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Thanks, please commit.

Howard





More information about the cfe-commits mailing list