components/gcc49/patches/026-basic_string.patch
author Stefan Teleman <stefan.teleman@oracle.com>
Wed, 16 Dec 2015 20:20:50 -0800
changeset 5205 eaff9ab86216
permissions -rw-r--r--
21637184 integrate GCC 4.9.3 in Solaris 21637193 enable CilkPlus support for SPARC in GCC 4.9.3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5205
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     1
# Stefan Teleman <[email protected]>
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     2
# 1. Clearer cast not relying on array index -1.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     3
# 2. Optimization based on initial std::string size and capacity.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     4
# Internal patch. Not submitted upstream yet.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     5
--- libstdc++-v3/include/bits/basic_string.h	2015-05-28 12:27:46.000000000 -0400
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     6
+++ libstdc++-v3/include/bits/basic_string.h	2015-09-14 01:16:05.666069507 -0400
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     7
@@ -131,6 +131,15 @@
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     8
       typedef std::reverse_iterator<iterator>		    reverse_iterator;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
     9
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    10
     private:
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    11
+      // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    12
+      struct _Alloc_hider : _Alloc
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    13
+      {
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    14
+	_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    15
+	: _Alloc(__a), _M_p(__dat) { }
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    16
+
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    17
+	_CharT* _M_p; // The actual data.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    18
+      };
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    19
+
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    20
       // _Rep: string representation
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    21
       //   Invariants:
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    22
       //   1. String really contains _M_length + 1 characters: due to 21.3.4
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    23
@@ -268,15 +277,6 @@
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    24
 	_M_clone(const _Alloc&, size_type __res = 0);
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    25
       };
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    26
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    27
-      // Use empty-base optimization: http://www.cantrip.org/emptyopt.html
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    28
-      struct _Alloc_hider : _Alloc
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    29
-      {
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    30
-	_Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    31
-	: _Alloc(__a), _M_p(__dat) { }
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    32
-
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    33
-	_CharT* _M_p; // The actual data.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    34
-      };
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    35
-
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    36
     public:
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    37
       // Data Members (public):
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    38
       // NB: This is an unsigned type, and thus represents the maximum
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    39
@@ -298,7 +298,10 @@
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    40
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    41
       _Rep*
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    42
       _M_rep() const _GLIBCXX_NOEXCEPT
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    43
-      { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    44
+      {
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    45
+        _Rep* __r = static_cast<_Rep*>(reinterpret_cast<void*>(_M_data()));
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    46
+        return --__r;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    47
+      }
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    48
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    49
       // For the internal use we have functions similar to `begin'/`end'
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    50
       // but they do not call _M_leak.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    51
--- libstdc++-v3/include/bits/basic_string.tcc	2014-01-02 17:30:10.000000000 -0500
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    52
+++ libstdc++-v3/include/bits/basic_string.tcc	2015-09-14 01:16:09.408163359 -0400
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    53
@@ -575,7 +575,8 @@
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    54
       // malloc implementations that allocate memory blocks rounded up
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    55
       // to a size which is a power of 2).
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    56
       const size_type __pagesize = 4096;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    57
-      const size_type __malloc_header_size = 4 * sizeof(void*);
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    58
+      const size_type __min_capacity = 32;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    59
+      const size_type __malloc_header_size = 8 * sizeof(void*);
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    60
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    61
       // The below implements an exponential growth policy, necessary to
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    62
       // meet amortized linear time requirements of the library: see
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    63
@@ -586,6 +587,9 @@
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    64
       if (__capacity > __old_capacity && __capacity < 2 * __old_capacity)
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    65
 	__capacity = 2 * __old_capacity;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    66
 
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    67
+      if (__capacity < __min_capacity)
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    68
+        __capacity = __min_capacity;
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    69
+
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    70
       // NB: Need an array of char_type[__capacity], plus a terminating
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    71
       // null char_type() element, plus enough for the _Rep data structure.
eaff9ab86216 21637184 integrate GCC 4.9.3 in Solaris
Stefan Teleman <stefan.teleman@oracle.com>
parents:
diff changeset
    72
       // Whew. Seemingly so needy, yet so elemental.