mirror of
https://gcc.gnu.org/git/gcc.git
synced 2025-01-15 00:04:33 +08:00
re PR libstdc++/29722 (Linking with libsupc++.a creates link time undefined references)
2006-11-07 Benjamin Kosnik <bkoz@redhat.com> PR libstdc++/29722 * include/ext/concurrence.h (concurrence_lock_error): New. (concurrence_unlock_error): New. (__throw_concurrence_lock_error): New. (__throw_concurrence_unlock_error): New. (__mutex): Use functions. (__recursive_mutex): Same. * testsuite/abi/cxx_runtime_only_linkage.cc: New. * include/ext/pb_ds/exception.hpp: Keep exception classes defined even when -fno-exceptions is passed, consistent with other usage. From-SVN: r118564
This commit is contained in:
parent
120b24f7ba
commit
f15e02d250
@ -1,3 +1,17 @@
|
|||||||
|
2006-11-07 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
|
PR libstdc++/29722
|
||||||
|
* include/ext/concurrence.h (concurrence_lock_error): New.
|
||||||
|
(concurrence_unlock_error): New.
|
||||||
|
(__throw_concurrence_lock_error): New.
|
||||||
|
(__throw_concurrence_unlock_error): New.
|
||||||
|
(__mutex): Use functions.
|
||||||
|
(__recursive_mutex): Same.
|
||||||
|
* testsuite/abi/cxx_runtime_only_linkage.cc: New.
|
||||||
|
|
||||||
|
* include/ext/pb_ds/exception.hpp: Keep exception classes defined
|
||||||
|
even when -fno-exceptions is passed, consistent with other usage.
|
||||||
|
|
||||||
2006-11-07 Benjamin Kosnik <bkoz@redhat.com>
|
2006-11-07 Benjamin Kosnik <bkoz@redhat.com>
|
||||||
|
|
||||||
* include/ext/pb_ds/exception.hpp (pb_ds): Modify for -fno-exceptions.
|
* include/ext/pb_ds/exception.hpp (pb_ds): Modify for -fno-exceptions.
|
||||||
|
@ -36,6 +36,8 @@
|
|||||||
#ifndef _CONCURRENCE_H
|
#ifndef _CONCURRENCE_H
|
||||||
#define _CONCURRENCE_H 1
|
#define _CONCURRENCE_H 1
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <exception>
|
||||||
#include <bits/gthr.h>
|
#include <bits/gthr.h>
|
||||||
#include <bits/functexcept.h>
|
#include <bits/functexcept.h>
|
||||||
|
|
||||||
@ -62,6 +64,45 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||||||
#else
|
#else
|
||||||
_S_single;
|
_S_single;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// NB: As this is used in libsupc++, need to only depend on
|
||||||
|
// exception. No stdexception classes, no use of std::string.
|
||||||
|
class concurrence_lock_error : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual char const*
|
||||||
|
what() const throw()
|
||||||
|
{ return "__gnu_cxx::concurrence_lock_error"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
class concurrence_unlock_error : public std::exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual char const*
|
||||||
|
what() const throw()
|
||||||
|
{ return "__gnu_cxx::concurrence_unlock_error"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
// Substitute for concurrence_error object in the case of -fno-exceptions.
|
||||||
|
inline void
|
||||||
|
__throw_concurrence_lock_error()
|
||||||
|
{
|
||||||
|
#if __EXCEPTIONS
|
||||||
|
throw concurrence_lock_error();
|
||||||
|
#else
|
||||||
|
std::abort();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
__throw_concurrence_unlock_error()
|
||||||
|
{
|
||||||
|
#if __EXCEPTIONS
|
||||||
|
throw concurrence_unlock_error();
|
||||||
|
#else
|
||||||
|
std::abort();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
class __mutex
|
class __mutex
|
||||||
{
|
{
|
||||||
@ -93,7 +134,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||||||
if (__gthread_active_p())
|
if (__gthread_active_p())
|
||||||
{
|
{
|
||||||
if (__gthread_mutex_lock(&_M_mutex) != 0)
|
if (__gthread_mutex_lock(&_M_mutex) != 0)
|
||||||
std::__throw_runtime_error(__N("__mutex::lock"));
|
__throw_concurrence_lock_error();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -104,7 +145,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||||||
if (__gthread_active_p())
|
if (__gthread_active_p())
|
||||||
{
|
{
|
||||||
if (__gthread_mutex_unlock(&_M_mutex) != 0)
|
if (__gthread_mutex_unlock(&_M_mutex) != 0)
|
||||||
std::__throw_runtime_error(__N("__mutex::unlock"));
|
__throw_concurrence_unlock_error();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -140,7 +181,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||||||
if (__gthread_active_p())
|
if (__gthread_active_p())
|
||||||
{
|
{
|
||||||
if (__gthread_recursive_mutex_lock(&_M_mutex) != 0)
|
if (__gthread_recursive_mutex_lock(&_M_mutex) != 0)
|
||||||
std::__throw_runtime_error(__N("__recursive_mutex::lock"));
|
__throw_concurrence_lock_error();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -151,7 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
|
|||||||
if (__gthread_active_p())
|
if (__gthread_active_p())
|
||||||
{
|
{
|
||||||
if (__gthread_recursive_mutex_unlock(&_M_mutex) != 0)
|
if (__gthread_recursive_mutex_unlock(&_M_mutex) != 0)
|
||||||
std::__throw_runtime_error(__N("__recursive_mutex::unlock"));
|
__throw_concurrence_unlock_error();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -51,13 +51,11 @@
|
|||||||
|
|
||||||
namespace pb_ds
|
namespace pb_ds
|
||||||
{
|
{
|
||||||
#if __EXCEPTIONS
|
|
||||||
|
|
||||||
// Base class for exceptions.
|
// Base class for exceptions.
|
||||||
struct container_error : public std::logic_error
|
struct container_error : public std::logic_error
|
||||||
{
|
{
|
||||||
container_error()
|
container_error()
|
||||||
: std::logic_error(__N("policy based data structure exception")) { }
|
: std::logic_error(__N("pb_ds::container_error")) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
// An entry cannot be inserted into a container object for logical
|
// An entry cannot be inserted into a container object for logical
|
||||||
@ -72,6 +70,7 @@ namespace pb_ds
|
|||||||
// A container cannot be resized.
|
// A container cannot be resized.
|
||||||
struct resize_error : public container_error { };
|
struct resize_error : public container_error { };
|
||||||
|
|
||||||
|
#if __EXCEPTIONS
|
||||||
void
|
void
|
||||||
__throw_container_error(void)
|
__throw_container_error(void)
|
||||||
{ throw container_error(); }
|
{ throw container_error(); }
|
||||||
@ -87,9 +86,7 @@ namespace pb_ds
|
|||||||
void
|
void
|
||||||
__throw_resize_error(void)
|
__throw_resize_error(void)
|
||||||
{ throw resize_error(); }
|
{ throw resize_error(); }
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void
|
void
|
||||||
__throw_container_error(void)
|
__throw_container_error(void)
|
||||||
{ std::abort(); }
|
{ std::abort(); }
|
||||||
@ -105,7 +102,6 @@ namespace pb_ds
|
|||||||
void
|
void
|
||||||
__throw_resize_error(void)
|
__throw_resize_error(void)
|
||||||
{ std::abort(); }
|
{ std::abort(); }
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
} // namespace pb_ds
|
} // namespace pb_ds
|
||||||
|
|
||||||
|
26
libstdc++-v3/testsuite/abi/cxx_runtime_only_linkage.cc
Normal file
26
libstdc++-v3/testsuite/abi/cxx_runtime_only_linkage.cc
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// { dg-do link }
|
||||||
|
// { dg-options "-x c -L../libsupc++/.libs -lsupc++" }
|
||||||
|
// Copyright (C) 2006 Free Software Foundation, Inc.
|
||||||
|
//
|
||||||
|
// This file is part of the GNU ISO C++ Library. This library is free
|
||||||
|
// software; you can redistribute it and/or modify it under the
|
||||||
|
// terms of the GNU General Public License as published by the
|
||||||
|
// Free Software Foundation; either version 2, or (at your option)
|
||||||
|
// any later version.
|
||||||
|
|
||||||
|
// This library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this library; see the file COPYING. If not, write to
|
||||||
|
// the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||||
|
// Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
// Must be able to link C++ apps compiled with gcc and libsupc++.
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user