Commit f0999267 by Paolo Carlini Committed by Paolo Carlini

29134.cc: Adjust for profile-mode too.

2010-05-05  Paolo Carlini  <paolo.carlini@oracle.com>

	* testsuite/23_containers/vector/bool/capacity/29134.cc: Adjust
	for profile-mode too.
	* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc:
	Likewise.

2010-05-05  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/profile/unordered_map (unordered_map<>::insert(_InputIter,
	_InputIter), unordered_multimap<>::insert(_InputIter, _InputIter)):
	Fix typo, don't call base() on __first and __last.

2010-05-05  Paolo Carlini  <paolo.carlini@oracle.com>

	Fix profile-mode vs -std=c++0x
	* include/profile/impl/profiler_trace.h: Do not include the
	whole <algorithm>, include <bits/stl_heap.h> (additionally
	to <bits/stl_algobase.h>).
	(__write_cost_factors): Replace std::for_each with open-coding.
	(__set_cost_factors): Likewise.
	(__report): Likewise; use std::make_heap / std::sort_heap
	instead of std::sort.
	(__report_cost_factors): Replace std::remove with open-coding.
	(__warn, __cost_factor_writer, __cost_factor_setter): Remove.

From-SVN: r159082
parent 0f559c16
2010-05-05 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/23_containers/vector/bool/capacity/29134.cc: Adjust
for profile-mode too.
* testsuite/23_containers/vector/bool/modifiers/insert/31370.cc:
Likewise.
2010-05-05 Paolo Carlini <paolo.carlini@oracle.com>
* include/profile/unordered_map (unordered_map<>::insert(_InputIter,
_InputIter), unordered_multimap<>::insert(_InputIter, _InputIter)):
Fix typo, don't call base() on __first and __last.
2010-05-05 Paolo Carlini <paolo.carlini@oracle.com>
Fix profile-mode vs -std=c++0x
* include/profile/impl/profiler_trace.h: Do not include the
whole <algorithm>, include <bits/stl_heap.h> (additionally
to <bits/stl_algobase.h>).
(__write_cost_factors): Replace std::for_each with open-coding.
(__set_cost_factors): Likewise.
(__report): Likewise; use std::make_heap / std::sort_heap
instead of std::sort.
(__report_cost_factors): Replace std::remove with open-coding.
(__warn, __cost_factor_writer, __cost_factor_setter): Remove.
2010-05-04 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2010-05-04 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
PR other/43620 PR other/43620
......
...@@ -53,10 +53,10 @@ ...@@ -53,10 +53,10 @@
#define _GLIBCXX_IMPL_UNORDERED_MAP std::tr1::unordered_map #define _GLIBCXX_IMPL_UNORDERED_MAP std::tr1::unordered_map
#endif #endif
#include <algorithm>
#include <fstream> #include <fstream>
#include <string> #include <string>
#include <utility> #include <utility>
#include <bits/stl_heap.h> // for std::make_heap, std::sort_heap
#if (defined _GLIBCXX_PROFILE_THREADS) && !(defined _GLIBCXX_HAVE_TLS) #if (defined _GLIBCXX_PROFILE_THREADS) && !(defined _GLIBCXX_HAVE_TLS)
#error You do not seem to have TLS support, which is required by the profile \ #error You do not seem to have TLS support, which is required by the profile \
...@@ -98,29 +98,20 @@ struct __warning_data ...@@ -98,29 +98,20 @@ struct __warning_data
__stack_t __context; __stack_t __context;
const char* __warning_id; const char* __warning_id;
const char* __warning_message; const char* __warning_message;
__warning_data();
__warning_data(float __m, __stack_t __c, const char* __id,
const char* __msg);
bool operator>(const struct __warning_data& other) const;
};
inline __warning_data::__warning_data() __warning_data()
: __magnitude(0.0), __context(NULL), __warning_id(NULL), : __magnitude(0.0), __context(NULL), __warning_id(NULL),
__warning_message(NULL) __warning_message(NULL) { }
{
}
inline __warning_data::__warning_data(float __m, __stack_t __c, __warning_data(float __m, __stack_t __c, const char* __id,
const char* __id, const char* __msg) const char* __msg)
: __magnitude(__m), __context(__c), __warning_id(__id), : __magnitude(__m), __context(__c), __warning_id(__id),
__warning_message(__msg) __warning_message(__msg) { }
{
}
inline bool __warning_data::operator>(const struct __warning_data& other) const bool
{ operator>(const struct __warning_data& __other) const
return __magnitude > other.__magnitude; { return __magnitude > __other.__magnitude; }
} };
typedef std::_GLIBCXX_STD_PR::vector<__warning_data> __warning_vector_t; typedef std::_GLIBCXX_STD_PR::vector<__warning_data> __warning_vector_t;
...@@ -433,23 +424,6 @@ inline int __log_magnitude(float f) ...@@ -433,23 +424,6 @@ inline int __log_magnitude(float f)
return sign * result; return sign * result;
} }
struct __warn
{
FILE* __file;
__warn(FILE* __f) { __file = __f; }
void operator() (const __warning_data& __info)
{
fprintf(__file, __info.__warning_id);
fprintf(__file, ": improvement = %d", __log_magnitude(__info.__magnitude));
fprintf(__file, ": call stack = ");
__gnu_profile::__write(__file, __info.__context);
fprintf(__file, ": advice = %s\n", __info.__warning_message);
free(
const_cast<void*>(
reinterpret_cast<const void*>(__info.__warning_message)));
}
};
inline FILE* __open_output_file(const char* extension) inline FILE* __open_output_file(const char* extension)
{ {
// The path is made of _S_trace_file_name + "." + extension. // The path is made of _S_trace_file_name + "." + extension.
...@@ -496,12 +470,27 @@ inline void __report(void) ...@@ -496,12 +470,27 @@ inline void __report(void)
size_t __cutoff = __min(_GLIBCXX_PROFILE_DATA(_S_max_warn_count), size_t __cutoff = __min(_GLIBCXX_PROFILE_DATA(_S_max_warn_count),
__warnings.size()); __warnings.size());
std::sort(__warnings.begin(), __warnings.end(), std::make_heap(__warnings.begin(), __warnings.end(),
std::greater<__warning_vector_t::value_type>()); std::greater<__warning_vector_t::value_type>());
std::sort_heap(__warnings.begin(), __warnings.end(),
std::greater<__warning_vector_t::value_type>());
__warnings.resize(__cutoff); __warnings.resize(__cutoff);
FILE* __warn_file = __open_output_file("txt"); FILE* __warn_file = __open_output_file("txt");
std::for_each(__warnings.begin(), __warnings.end(), __warn(__warn_file));
for (__warning_vector_t::iterator __it = __warnings.begin();
__it != __warnings.end(); ++__it)
{
fprintf(__warn_file, __it->__warning_id);
fprintf(__warn_file, ": improvement = %d",
__log_magnitude(__it->__magnitude));
fprintf(__warn_file, ": call stack = ");
__gnu_profile::__write(__warn_file, __it->__context);
fprintf(__warn_file, ": advice = %s\n", __it->__warning_message);
free(const_cast<void*>(reinterpret_cast<const void*>
(__it->__warning_message)));
}
fclose(__warn_file); fclose(__warn_file);
__unlock(_GLIBCXX_PROFILE_DATA(__global_lock)); __unlock(_GLIBCXX_PROFILE_DATA(__global_lock));
...@@ -537,59 +526,56 @@ inline void __read_cost_factors() ...@@ -537,59 +526,56 @@ inline void __read_cost_factors()
std::ifstream __conf_file(__conf_file_name.c_str()); std::ifstream __conf_file(__conf_file_name.c_str());
if (__conf_file.is_open()) { if (__conf_file.is_open())
std::string __line; {
std::string __line;
while (getline(__conf_file, __line)) {
std::string::size_type __i = __line.find_first_not_of(" \t\n\v"); while (getline(__conf_file, __line))
{
if (__line.length() <= 0 || __line[__i] == '#') { std::string::size_type __i = __line.find_first_not_of(" \t\n\v");
// Skip empty lines or comments.
continue; if (__line.length() <= 0 || __line[__i] == '#') {
} // Skip empty lines or comments.
continue;
// Trim. }
__line.erase(std::remove(__line.begin(), __line.end(), ' '),
__line.end()); // Trim.
std::string::size_type __pos = __line.find("="); if (__line.begin() != __line.end())
std::string __factor_name = __line.substr(0, __pos); {
std::string::size_type __end = __line.find_first_of(";\n"); // A simple remove operation.
std::string __factor_value = __line.substr(__pos + 1, __end - __pos); std::string::iterator __first = __line.begin();
std::string::iterator __result = __first;
setenv(__factor_name.c_str(), __factor_value.c_str(), 0); ++__first;
for(; __first != __line.end(); ++__first)
if(!(*__first == ' '))
{
*__result = *__first;
++__result;
}
__line.erase(__result, __line.end());
}
std::string::size_type __pos = __line.find("=");
std::string __factor_name = __line.substr(0, __pos);
std::string::size_type __end = __line.find_first_of(";\n");
std::string __factor_value = __line.substr(__pos + 1, __end - __pos);
setenv(__factor_name.c_str(), __factor_value.c_str(), 0);
}
} }
}
} }
struct __cost_factor_writer
{
FILE* __file;
__cost_factor_writer(FILE* __f) : __file(__f) {}
void operator() (const __cost_factor* __factor)
{
fprintf(__file, "%s = %f\n", __factor->__env_var, __factor->__value);
}
};
inline void __write_cost_factors() inline void __write_cost_factors()
{ {
FILE* __file = __open_output_file("conf.out"); FILE* __file = __open_output_file("conf.out");
std::for_each(_GLIBCXX_PROFILE_DATA(__cost_factors)->begin(),
_GLIBCXX_PROFILE_DATA(__cost_factors)->end(), for (__decltype(_GLIBCXX_PROFILE_DATA(__cost_factors)->begin()) __it
__cost_factor_writer(__file)); = _GLIBCXX_PROFILE_DATA(__cost_factors)->begin();
__it != _GLIBCXX_PROFILE_DATA(__cost_factors)->end(); ++__it)
fprintf(__file, "%s = %f\n", (*__it)->__env_var, (*__it)->__value);
fclose(__file); fclose(__file);
} }
struct __cost_factor_setter
{
void operator() (__cost_factor* __factor)
{
char* __env_cost_factor;
if (__env_cost_factor = getenv(__factor->__env_var))
__factor->__value = atof(__env_cost_factor);
}
};
inline void __set_cost_factors() inline void __set_cost_factors()
{ {
_GLIBCXX_PROFILE_DATA(__cost_factors) = new __cost_factor_vector; _GLIBCXX_PROFILE_DATA(__cost_factors) = new __cost_factor_vector;
...@@ -621,9 +607,13 @@ inline void __set_cost_factors() ...@@ -621,9 +607,13 @@ inline void __set_cost_factors()
&_GLIBCXX_PROFILE_DATA(__umap_find_cost_factor)); &_GLIBCXX_PROFILE_DATA(__umap_find_cost_factor));
_GLIBCXX_PROFILE_DATA(__cost_factors)->push_back( _GLIBCXX_PROFILE_DATA(__cost_factors)->push_back(
&_GLIBCXX_PROFILE_DATA(__umap_iterate_cost_factor)); &_GLIBCXX_PROFILE_DATA(__umap_iterate_cost_factor));
std::for_each(_GLIBCXX_PROFILE_DATA(__cost_factors)->begin(),
_GLIBCXX_PROFILE_DATA(__cost_factors)->end(),
__cost_factor_setter()); for (__decltype(_GLIBCXX_PROFILE_DATA(__cost_factors)->begin()) __it
= _GLIBCXX_PROFILE_DATA(__cost_factors)->begin();
__it != _GLIBCXX_PROFILE_DATA(__cost_factors)->end(); ++__it)
if (char* __env_cost_factor = getenv((*__it)->__env_var))
(*__it)->__value = atof(__env_cost_factor);
} }
inline void __profcxx_init_unconditional() inline void __profcxx_init_unconditional()
......
...@@ -196,7 +196,7 @@ namespace __profile ...@@ -196,7 +196,7 @@ namespace __profile
insert(_InputIter __first, _InputIter __last) insert(_InputIter __first, _InputIter __last)
{ {
size_type __old_size = _Base::bucket_count(); size_type __old_size = _Base::bucket_count();
_Base::insert(__first.base(), __last.base()); _Base::insert(__first, __last);
_M_profile_resize(__old_size, _Base::bucket_count()); _M_profile_resize(__old_size, _Base::bucket_count());
} }
...@@ -430,7 +430,7 @@ namespace __profile ...@@ -430,7 +430,7 @@ namespace __profile
insert(_InputIter __first, _InputIter __last) insert(_InputIter __first, _InputIter __last)
{ {
size_type __old_size = _Base::bucket_count(); size_type __old_size = _Base::bucket_count();
_Base::insert(__first.base(), __last.base()); _Base::insert(__first, __last);
_M_profile_resize(__old_size, _Base::bucket_count()); _M_profile_resize(__old_size, _Base::bucket_count());
} }
......
// Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. // Copyright (C) 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // 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 // software; you can redistribute it and/or modify it under the
...@@ -29,10 +29,12 @@ void test01() ...@@ -29,10 +29,12 @@ void test01()
using std::vector; using std::vector;
using std::numeric_limits; using std::numeric_limits;
#ifndef _GLIBCXX_DEBUG #ifdef _GLIBCXX_DEBUG
using std::_S_word_bit;
#else
using std::_GLIBCXX_STD_D::_S_word_bit; using std::_GLIBCXX_STD_D::_S_word_bit;
#elif defined(_GLIBCXX_PROFILE)
using std::_GLIBCXX_STD_PR::_S_word_bit;
#else
using std::_S_word_bit;
#endif #endif
// Actually, vector<bool> is special, see libstdc++/31370. // Actually, vector<bool> is special, see libstdc++/31370.
......
// Copyright (C) 2007, 2009 Free Software Foundation, Inc. // Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // 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 // software; you can redistribute it and/or modify it under the
...@@ -23,10 +23,12 @@ ...@@ -23,10 +23,12 @@
#include <stdexcept> #include <stdexcept>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
#ifndef _GLIBCXX_DEBUG #ifdef _GLIBCXX_DEBUG
using std::_S_word_bit;
#else
using std::_GLIBCXX_STD_D::_S_word_bit; using std::_GLIBCXX_STD_D::_S_word_bit;
#elif defined(_GLIBCXX_PROFILE)
using std::_GLIBCXX_STD_PR::_S_word_bit;
#else
using std::_S_word_bit;
#endif #endif
inline void inline void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment