]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Define memory resource key functions non-inline (PR93208)
authorJonathan Wakely <jwakely@redhat.com>
Thu, 9 Jan 2020 13:18:37 +0000 (13:18 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 9 Jan 2020 13:18:37 +0000 (13:18 +0000)
This prevents the vtables and RTTI from being emitted in every object
file that uses memory_resource and monotonic_buffer_resource.

Objects compiled by GCC 9.1 or 9.2 will contain inline definitions of
the destructors, vtable and RTTI, but this is harmless. The inline
definitions have identical effects to the ones that are now defined in
libstdc++.so so it doesn't matter if the inline ones are used instead of
calling the symbols exported from the runtime library.

PR libstdc++/93208
* config/abi/pre/gnu.ver: Add new exports.
* include/std/memory_resource (memory_resource::~memory_resource()):
Do not define inline.
(monotonic_buffer_resource::~monotonic_buffer_resource()): Likewise.
* src/c++17/memory_resource.cc (memory_resource::~memory_resource()):
Define.
(monotonic_buffer_resource::~monotonic_buffer_resource()): Define.
* testsuite/20_util/monotonic_buffer_resource/93208.cc: New test.

From-SVN: r280045

libstdc++-v3/ChangeLog
libstdc++-v3/config/abi/pre/gnu.ver
libstdc++-v3/include/std/memory_resource
libstdc++-v3/src/c++17/memory_resource.cc
libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/93208.cc [new file with mode: 0644]

index 0180d7737cb68c8f9e141bcdb4e9c4f64a312b0b..abc85ede370fae213b5a7275eaf9714f54c490b3 100644 (file)
@@ -1,3 +1,15 @@
+2020-01-09  Jonathan Wakely  <jwakely@redhat.com>
+
+       PR libstdc++/93208
+       * config/abi/pre/gnu.ver: Add new exports.
+       * include/std/memory_resource (memory_resource::~memory_resource()):
+       Do not define inline.
+       (monotonic_buffer_resource::~monotonic_buffer_resource()): Likewise.
+       * src/c++17/memory_resource.cc (memory_resource::~memory_resource()):
+       Define.
+       (monotonic_buffer_resource::~monotonic_buffer_resource()): Define.
+       * testsuite/20_util/monotonic_buffer_resource/93208.cc: New test.
+
 2020-01-08  Jonathan Wakely  <jwakely@redhat.com>
 
        PR libstdc++/93201
index 07a0003682795a34f4f12fe4099562cc0acdf9c8..ff1cc32614d838fbfaf09724bb16865217dc3ab1 100644 (file)
@@ -2292,6 +2292,12 @@ GLIBCXX_3.4.28 {
     _ZNSt12__shared_ptrINSt10filesystem28recursive_directory_iterator10_Dir_stackELN9__gnu_cxx12_Lock_policyE[012]EEC2EOS5_;
     _ZNSt12__shared_ptrINSt10filesystem7__cxx1128recursive_directory_iterator10_Dir_stackELN9__gnu_cxx12_Lock_policyE[012]EEC2EOS6_;
 
+    # key functions, vtables and rtti for memory resources
+    _ZNSt3pmr15memory_resourceD[0125]Ev;
+    _ZT[ISV]NSt3pmr15memory_resourceE;
+    _ZNSt3pmr25monotonic_buffer_resourceD[0125]Ev;
+    _ZT[ISV]NSt3pmr25monotonic_buffer_resourceE;
+
 } GLIBCXX_3.4.27;
 
 # Symbols in the support library (libsupc++) have their own tag.
index 7f1f0ca5e916e9fddebab71c130d299efaa9e16c..7ff5d17afe7920158623de7055333e6a6f3ed079 100644 (file)
@@ -88,7 +88,7 @@ namespace pmr
   public:
     memory_resource() = default;
     memory_resource(const memory_resource&) = default;
-    virtual ~memory_resource() = default;
+    virtual ~memory_resource(); // key function
 
     memory_resource& operator=(const memory_resource&) = default;
 
@@ -600,7 +600,7 @@ namespace pmr
 
     monotonic_buffer_resource(const monotonic_buffer_resource&) = delete;
 
-    virtual ~monotonic_buffer_resource() { release(); }
+    virtual ~monotonic_buffer_resource(); // key function
 
     monotonic_buffer_resource&
     operator=(const monotonic_buffer_resource&) = delete;
index b6698011f5cdec8bef88f338b51f332df5763ddf..e28526d1bfed420150b0df4137b245e208207759 100644 (file)
@@ -37,6 +37,10 @@ namespace std _GLIBCXX_VISIBILITY(default)
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 namespace pmr
 {
+  // This was defined inline in 9.1 and 9.2 so code compiled by those
+  // versions will not use this symbol.
+  memory_resource::~memory_resource() = default;
+
   namespace
   {
     class newdel_res_t final : public memory_resource
@@ -167,6 +171,10 @@ namespace pmr
 
   // Member functions for std::pmr::monotonic_buffer_resource
 
+  // This was defined inline in 9.1 and 9.2 so code compiled by those
+  // versions will not use this symbol.
+  monotonic_buffer_resource::~monotonic_buffer_resource() { release(); }
+
   // Memory allocated by the upstream resource is managed in a linked list
   // of _Chunk objects. A _Chunk object recording the size and alignment of
   // the allocated block and a pointer to the previous chunk is placed
diff --git a/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/93208.cc b/libstdc++-v3/testsuite/20_util/monotonic_buffer_resource/93208.cc
new file mode 100644 (file)
index 0000000..b0cfdbd
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright (C) 2020 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 3, 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 COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++17" }
+// { dg-do compile { target c++17 } }
+// { dg-final { scan-assembler-not "_ZT\[IS\]NSt3pmr15memory_resourceE" } }
+// { dg-final { scan-assembler-not "_ZT\[IS\]NSt3pmr25monotonic\[a-z_\]*E" } }
+
+#include <memory_resource>
+
+void* f(int n)
+{
+  std::pmr::monotonic_buffer_resource res;
+  return res.allocate(n);
+}