[binutils-gdb] ld: Avoid folding new and delete pairs

H.J. Lu hjl@sourceware.org
Sun Jun 30 22:44:15 GMT 2024


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=adf584eb92b0aaf134db99f4238eedb3e5bacb4a

commit adf584eb92b0aaf134db99f4238eedb3e5bacb4a
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sat Jun 29 22:42:43 2024 -0700

    ld: Avoid folding new and delete pairs
    
    GCC 15 may fold new and delete pairs, like
    
      A *bb = new A[10];
      delete [] bb;
      bb = new (std::nothrow) A [10];
      delete [] bb;
    
    as shown in
    
    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115712
    
    Avoid folding new and delete pairs by adding a function call between new
    and delete.
    
            * testsuite/ld-elf/dl5.cc: Include "dl5.h".
            (A): Removed.
            Call foo between new and delete.
            * testsuite/ld-elf/dl5.h: New file.
            * testsuite/ld-elf/new.cc: Include "dl5.h".
            (foo): New function.
    
    Signed-off-by: H.J. Lu <hjl.tools@gmail.com>

Diff:
---
 ld/testsuite/ld-elf/dl5.cc | 13 +++----------
 ld/testsuite/ld-elf/dl5.h  | 10 ++++++++++
 ld/testsuite/ld-elf/new.cc |  6 ++++++
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/ld/testsuite/ld-elf/dl5.cc b/ld/testsuite/ld-elf/dl5.cc
index cc404553f93..77dbb62f3d5 100644
--- a/ld/testsuite/ld-elf/dl5.cc
+++ b/ld/testsuite/ld-elf/dl5.cc
@@ -1,6 +1,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <new>
+#include "dl5.h"
 
 int pass = 0;
 
@@ -30,22 +31,14 @@ operator delete (void *ptr) throw ()
     free (ptr);
 }
 
-class A 
-{
-public:
-  A() {}
-  ~A() { }
-  int a;
-  int b;
-};
-
-
 int
 main (void)
 {
   A *bb = new A[10];
   delete [] bb;
+  foo (bb);
   bb = new (std::nothrow) A [10];
+  foo (bb);
   delete [] bb;
 
   if (pass == 4)
diff --git a/ld/testsuite/ld-elf/dl5.h b/ld/testsuite/ld-elf/dl5.h
new file mode 100644
index 00000000000..0d4a7c1bfa3
--- /dev/null
+++ b/ld/testsuite/ld-elf/dl5.h
@@ -0,0 +1,10 @@
+class A 
+{
+public:
+  A() {}
+  ~A() { }
+  int a;
+  int b;
+};
+
+extern void foo (A *);
diff --git a/ld/testsuite/ld-elf/new.cc b/ld/testsuite/ld-elf/new.cc
index 513cf2f3ad6..b038d770c6d 100644
--- a/ld/testsuite/ld-elf/new.cc
+++ b/ld/testsuite/ld-elf/new.cc
@@ -1,4 +1,5 @@
 #include <new>
+#include "dl5.h"
 
 using std::bad_alloc;
 
@@ -45,3 +46,8 @@ operator new[] (std::size_t sz, const std::nothrow_t& nothrow) throw()
 {
   return ::operator new(sz, nothrow);
 }
+
+void
+foo (A *)
+{
+}


More information about the Binutils-cvs mailing list