svn commit: r258429 - in head/contrib/libstdc++: include/bits include/ext libsupc++ src
Pedro F. Giffuni
pfg at FreeBSD.org
Thu Nov 21 16:44:38 UTC 2013
Author: pfg
Date: Thu Nov 21 16:44:36 2013
New Revision: 258429
URL: http://svnweb.freebsd.org/changeset/base/258429
Log:
libstdc++: merge non-abi changes from Apple's developer tools
Take some changes from Apple's Developer Tools 4.0 [1]:
block.patch
emergency-buffer-reduction.patch
test_cleanup.patch
vector_copy_no_alloc.patch
problem/6473222 copy-constructing a std::vector from an
empty std::vector calls malloc
2008-10-27 Howard Hinnant
stl_tree_system_header.patch
Added #pragma GCC system_header to stl_tree.h.
copy_doc.patch
Corrected documentation concerning copy in stl_algobase.h.
string_compare.patch
Fixed basic_string.h, basic_string.tcc, incorrect 64bit to
32bit narrowing.
Reference:
[1] http://opensource.apple.com/source/libstdcxx/libstdcxx-39/patches-4.2.1/
Obtained from: Apple
MFC after: 1 month
Modified:
head/contrib/libstdc++/include/bits/basic_string.h
head/contrib/libstdc++/include/bits/basic_string.tcc
head/contrib/libstdc++/include/bits/stl_algobase.h
head/contrib/libstdc++/include/bits/stl_tree.h
head/contrib/libstdc++/include/bits/stl_vector.h
head/contrib/libstdc++/include/ext/mt_allocator.h
head/contrib/libstdc++/include/ext/throw_allocator.h
head/contrib/libstdc++/libsupc++/eh_alloc.cc
head/contrib/libstdc++/src/mt_allocator.cc
Modified: head/contrib/libstdc++/include/bits/basic_string.h
==============================================================================
--- head/contrib/libstdc++/include/bits/basic_string.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/bits/basic_string.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -390,6 +390,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
_S_copy_chars(_CharT* __p, const _CharT* __k1, const _CharT* __k2)
{ _M_copy(__p, __k1, __k2 - __k1); }
+ static int
+ _S_compare(size_type __x, size_type __y)
+ {
+ if (__x > __y)
+ return 1;
+ if (__x < __y)
+ return -1;
+ return 0;
+ }
+
void
_M_mutate(size_type __pos, size_type __len1, size_type __len2);
@@ -1934,7 +1944,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
int __r = traits_type::compare(_M_data(), __str.data(), __len);
if (!__r)
- __r = __size - __osize;
+ __r = _S_compare(__size, __osize);
return __r;
}
Modified: head/contrib/libstdc++/include/bits/basic_string.tcc
==============================================================================
--- head/contrib/libstdc++/include/bits/basic_string.tcc Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/bits/basic_string.tcc Thu Nov 21 16:44:36 2013 (r258429)
@@ -903,7 +903,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n, __osize);
int __r = traits_type::compare(_M_data() + __pos, __str.data(), __len);
if (!__r)
- __r = __n - __osize;
+ __r = _S_compare(__n, __osize);
return __r;
}
@@ -921,7 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
int __r = traits_type::compare(_M_data() + __pos1,
__str.data() + __pos2, __len);
if (!__r)
- __r = __n1 - __n2;
+ __r = _S_compare(__n1, __n2);
return __r;
}
@@ -936,7 +936,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__size, __osize);
int __r = traits_type::compare(_M_data(), __s, __len);
if (!__r)
- __r = __size - __osize;
+ __r = _S_compare(__size, __osize);
return __r;
}
@@ -952,7 +952,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n1, __osize);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
- __r = __n1 - __osize;
+ __r = _S_compare(__n1, __osize);
return __r;
}
@@ -968,7 +968,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
const size_type __len = std::min(__n1, __n2);
int __r = traits_type::compare(_M_data() + __pos, __s, __len);
if (!__r)
- __r = __n1 - __n2;
+ __r = _S_compare(__n1, __n2);
return __r;
}
Modified: head/contrib/libstdc++/include/bits/stl_algobase.h
==============================================================================
--- head/contrib/libstdc++/include/bits/stl_algobase.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/bits/stl_algobase.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -373,7 +373,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
* @param first An input iterator.
* @param last An input iterator.
* @param result An output iterator.
- * @return result + (first - last)
+ * @return result + (last - first)
*
* This inline function will boil down to a call to @c memmove whenever
* possible. Failing that, if random access iterators are passed, then the
Modified: head/contrib/libstdc++/include/bits/stl_tree.h
==============================================================================
--- head/contrib/libstdc++/include/bits/stl_tree.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/bits/stl_tree.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -64,6 +64,8 @@
#ifndef _TREE_H
#define _TREE_H 1
+#pragma GCC system_header
+
#include <bits/stl_algobase.h>
#include <bits/allocator.h>
#include <bits/stl_construct.h>
Modified: head/contrib/libstdc++/include/bits/stl_vector.h
==============================================================================
--- head/contrib/libstdc++/include/bits/stl_vector.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/bits/stl_vector.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -119,9 +119,12 @@ _GLIBCXX_BEGIN_NESTED_NAMESPACE(std, _GL
_Vector_base(size_t __n, const allocator_type& __a)
: _M_impl(__a)
{
- this->_M_impl._M_start = this->_M_allocate(__n);
- this->_M_impl._M_finish = this->_M_impl._M_start;
- this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
+ if (__n)
+ {
+ this->_M_impl._M_start = this->_M_allocate(__n);
+ this->_M_impl._M_finish = this->_M_impl._M_start;
+ this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
+ }
}
~_Vector_base()
Modified: head/contrib/libstdc++/include/ext/mt_allocator.h
==============================================================================
--- head/contrib/libstdc++/include/ext/mt_allocator.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/ext/mt_allocator.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -342,12 +342,12 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
{ return _M_bin[__which]; }
void
- _M_adjust_freelist(const _Bin_record& __bin, _Block_record* __block,
+ _M_adjust_freelist(const _Bin_record& __bin, _Block_record* __block_record,
size_t __thread_id)
{
if (__gthread_active_p())
{
- __block->_M_thread_id = __thread_id;
+ __block_record->_M_thread_id = __thread_id;
--__bin._M_free[__thread_id];
++__bin._M_used[__thread_id];
}
@@ -697,11 +697,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
{
// Already reserved.
typedef typename __pool_type::_Block_record _Block_record;
- _Block_record* __block = __bin._M_first[__thread_id];
- __bin._M_first[__thread_id] = __block->_M_next;
+ _Block_record* __block_record = __bin._M_first[__thread_id];
+ __bin._M_first[__thread_id] = __block_record->_M_next;
- __pool._M_adjust_freelist(__bin, __block, __thread_id);
- __c = reinterpret_cast<char*>(__block) + __pool._M_get_align();
+ __pool._M_adjust_freelist(__bin, __block_record, __thread_id);
+ __c = reinterpret_cast<char*>(__block_record) + __pool._M_get_align();
}
else
{
Modified: head/contrib/libstdc++/include/ext/throw_allocator.h
==============================================================================
--- head/contrib/libstdc++/include/ext/throw_allocator.h Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/include/ext/throw_allocator.h Thu Nov 21 16:44:36 2013 (r258429)
@@ -423,11 +423,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
s += buf;
s += tab;
s += "label: ";
- sprintf(buf, "%u", ref.second.first);
+ sprintf(buf, "%lu", ref.second.first);
s += buf;
s += tab;
s += "size: ";
- sprintf(buf, "%u", ref.second.second);
+ sprintf(buf, "%lu", ref.second.second);
s += buf;
s += '\n';
}
Modified: head/contrib/libstdc++/libsupc++/eh_alloc.cc
==============================================================================
--- head/contrib/libstdc++/libsupc++/eh_alloc.cc Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/libsupc++/eh_alloc.cc Thu Nov 21 16:44:36 2013 (r258429)
@@ -78,6 +78,14 @@ using namespace __cxxabiv1;
# define EMERGENCY_OBJ_COUNT 4
#endif
+/* APPLE LOCAL begin reduce emergency buffer size */
+/* 256 bytes is more than large enough for an std::bad_alloc object */
+#undef EMERGENCY_OBJ_SIZE
+#undef EMERGENCY_OBJ_COUNT
+#define EMERGENCY_OBJ_SIZE 256
+#define EMERGENCY_OBJ_COUNT 2
+/* APPLE LOCAL end reduce emergency buffer size */
+
#if INT_MAX == 32767 || EMERGENCY_OBJ_COUNT <= 32
typedef unsigned int bitmask_type;
#else
Modified: head/contrib/libstdc++/src/mt_allocator.cc
==============================================================================
--- head/contrib/libstdc++/src/mt_allocator.cc Thu Nov 21 16:38:57 2013 (r258428)
+++ head/contrib/libstdc++/src/mt_allocator.cc Thu Nov 21 16:44:36 2013 (r258429)
@@ -107,11 +107,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
_Bin_record& __bin = _M_bin[__which];
char* __c = __p - _M_get_align();
- _Block_record* __block = reinterpret_cast<_Block_record*>(__c);
+ _Block_record* __block_record = reinterpret_cast<_Block_record*>(__c);
// Single threaded application - return to global pool.
- __block->_M_next = __bin._M_first[0];
- __bin._M_first[0] = __block;
+ __block_record->_M_next = __bin._M_first[0];
+ __bin._M_first[0] = __block_record;
}
char*
@@ -134,22 +134,22 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
__bin._M_address = __address;
char* __c = static_cast<char*>(__v) + sizeof(_Block_address);
- _Block_record* __block = reinterpret_cast<_Block_record*>(__c);
- __bin._M_first[__thread_id] = __block;
+ _Block_record* __block_record = reinterpret_cast<_Block_record*>(__c);
+ __bin._M_first[__thread_id] = __block_record;
while (--__block_count > 0)
{
__c += __bin_size;
- __block->_M_next = reinterpret_cast<_Block_record*>(__c);
- __block = __block->_M_next;
+ __block_record->_M_next = reinterpret_cast<_Block_record*>(__c);
+ __block_record = __block_record->_M_next;
}
- __block->_M_next = NULL;
+ __block_record->_M_next = NULL;
- __block = __bin._M_first[__thread_id];
- __bin._M_first[__thread_id] = __block->_M_next;
+ __block_record = __bin._M_first[__thread_id];
+ __bin._M_first[__thread_id] = __block_record->_M_next;
// NB: For alignment reasons, we can't use the first _M_align
// bytes, even when sizeof(_Block_record) < _M_align.
- return reinterpret_cast<char*>(__block) + __options._M_align;
+ return reinterpret_cast<char*>(__block_record) + __options._M_align;
}
void
@@ -256,7 +256,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// Know __p not null, assume valid block.
char* __c = __p - _M_get_align();
- _Block_record* __block = reinterpret_cast<_Block_record*>(__c);
+ _Block_record* __block_record = reinterpret_cast<_Block_record*>(__c);
if (__gthread_active_p())
{
// Calculate the number of records to remove from our freelist:
@@ -313,13 +313,13 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// Return this block to our list and update counters and
// owner id as needed.
- if (__block->_M_thread_id == __thread_id)
+ if (__block_record->_M_thread_id == __thread_id)
--__bin._M_used[__thread_id];
else
- __atomic_add(&__reclaimed_base[__block->_M_thread_id], 1);
+ __atomic_add(&__reclaimed_base[__block_record->_M_thread_id], 1);
- __block->_M_next = __bin._M_first[__thread_id];
- __bin._M_first[__thread_id] = __block;
+ __block_record->_M_next = __bin._M_first[__thread_id];
+ __bin._M_first[__thread_id] = __block_record;
++__bin._M_free[__thread_id];
}
@@ -327,8 +327,8 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
{
// Not using threads, so single threaded application - return
// to global pool.
- __block->_M_next = __bin._M_first[0];
- __bin._M_first[0] = __block;
+ __block_record->_M_next = __bin._M_first[0];
+ __bin._M_first[0] = __block_record;
}
}
@@ -354,7 +354,7 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// blocks on global list (and if not add new ones) and
// get the first one.
_Bin_record& __bin = _M_bin[__which];
- _Block_record* __block = NULL;
+ _Block_record* __block_record = NULL;
if (__gthread_active_p())
{
// Resync the _M_used counters.
@@ -378,16 +378,16 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
// No need to hold the lock when we are adding a whole
// chunk to our own list.
char* __c = static_cast<char*>(__v) + sizeof(_Block_address);
- __block = reinterpret_cast<_Block_record*>(__c);
+ __block_record = reinterpret_cast<_Block_record*>(__c);
__bin._M_free[__thread_id] = __block_count;
- __bin._M_first[__thread_id] = __block;
+ __bin._M_first[__thread_id] = __block_record;
while (--__block_count > 0)
{
__c += __bin_size;
- __block->_M_next = reinterpret_cast<_Block_record*>(__c);
- __block = __block->_M_next;
+ __block_record->_M_next = reinterpret_cast<_Block_record*>(__c);
+ __block_record = __block_record->_M_next;
}
- __block->_M_next = NULL;
+ __block_record->_M_next = NULL;
}
else
{
@@ -405,11 +405,11 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
{
__bin._M_free[__thread_id] = __block_count;
__bin._M_free[0] -= __block_count;
- __block = __bin._M_first[0];
+ __block_record = __bin._M_first[0];
while (--__block_count > 0)
- __block = __block->_M_next;
- __bin._M_first[0] = __block->_M_next;
- __block->_M_next = NULL;
+ __block_record = __block_record->_M_next;
+ __bin._M_first[0] = __block_record->_M_next;
+ __block_record->_M_next = NULL;
}
__gthread_mutex_unlock(__bin._M_mutex);
}
@@ -423,30 +423,30 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
__bin._M_address = __address;
char* __c = static_cast<char*>(__v) + sizeof(_Block_address);
- __block = reinterpret_cast<_Block_record*>(__c);
- __bin._M_first[0] = __block;
+ __block_record = reinterpret_cast<_Block_record*>(__c);
+ __bin._M_first[0] = __block_record;
while (--__block_count > 0)
{
__c += __bin_size;
- __block->_M_next = reinterpret_cast<_Block_record*>(__c);
- __block = __block->_M_next;
+ __block_record->_M_next = reinterpret_cast<_Block_record*>(__c);
+ __block_record = __block_record->_M_next;
}
- __block->_M_next = NULL;
+ __block_record->_M_next = NULL;
}
- __block = __bin._M_first[__thread_id];
- __bin._M_first[__thread_id] = __block->_M_next;
+ __block_record = __bin._M_first[__thread_id];
+ __bin._M_first[__thread_id] = __block_record->_M_next;
if (__gthread_active_p())
{
- __block->_M_thread_id = __thread_id;
+ __block_record->_M_thread_id = __thread_id;
--__bin._M_free[__thread_id];
++__bin._M_used[__thread_id];
}
// NB: For alignment reasons, we can't use the first _M_align
// bytes, even when sizeof(_Block_record) < _M_align.
- return reinterpret_cast<char*>(__block) + __options._M_align;
+ return reinterpret_cast<char*>(__block_record) + __options._M_align;
}
void
More information about the svn-src-head
mailing list