summaryrefslogtreecommitdiffstats
path: root/contrib/libstdc++/scripts
diff options
context:
space:
mode:
authorkan <kan@FreeBSD.org>2007-05-19 01:25:07 +0000
committerkan <kan@FreeBSD.org>2007-05-19 01:25:07 +0000
commit7865836f4b0f698454c31b4593effcb032c22c1e (patch)
treeea6c2718dc1e45ed535d194df808ef31f0ebac92 /contrib/libstdc++/scripts
parent1f9ea4d0a40cca64d60cf4dab152349da7b9dddf (diff)
downloadFreeBSD-src-7865836f4b0f698454c31b4593effcb032c22c1e.zip
FreeBSD-src-7865836f4b0f698454c31b4593effcb032c22c1e.tar.gz
GCC 4.2.0 release C++ standard library and runtime support code.
Diffstat (limited to 'contrib/libstdc++/scripts')
-rwxr-xr-xcontrib/libstdc++/scripts/check_performance66
-rwxr-xr-xcontrib/libstdc++/scripts/create_testsuite_files25
-rwxr-xr-xcontrib/libstdc++/scripts/extract_symvers2
-rw-r--r--contrib/libstdc++/scripts/gen_bind_includers.pl30
-rw-r--r--contrib/libstdc++/scripts/gen_includers.pl126
-rw-r--r--contrib/libstdc++/scripts/gen_includers2.pl31
-rw-r--r--contrib/libstdc++/scripts/make_exports.pl144
-rwxr-xr-xcontrib/libstdc++/scripts/make_graph.py576
-rwxr-xr-xcontrib/libstdc++/scripts/make_graphs.py160
-rwxr-xr-xcontrib/libstdc++/scripts/testsuite_flags.in17
10 files changed, 1131 insertions, 46 deletions
diff --git a/contrib/libstdc++/scripts/check_performance b/contrib/libstdc++/scripts/check_performance
index 090dae8..b7bbd6d 100755
--- a/contrib/libstdc++/scripts/check_performance
+++ b/contrib/libstdc++/scripts/check_performance
@@ -23,7 +23,8 @@ case $BASH_VERSION in
esac
flags_script=$BUILD_DIR/scripts/testsuite_flags
-INCLUDES="`$flags_script --build-includes` -include bits/stdc++.h"
+INCLUDES=`$flags_script --build-includes`
+PCH_FLAGS=`$flags_script --cxxpchflags`
FLAGS=`$flags_script --cxxflags`
THREAD_FLAG='-pthread'
COMPILER=`$flags_script --build-cxx`
@@ -31,42 +32,61 @@ SH_FLAG="-Wl,--rpath -Wl,$BUILD_DIR/../../gcc \
-Wl,--rpath -Wl,$BUILD_DIR/src/.libs"
ST_FLAG="-static"
LINK=$SH_FLAG
-CXX="$COMPILER $INCLUDES $FLAGS -DNOTHREAD $LINK"
-CXX_THREAD="$COMPILER $INCLUDES $FLAGS $THREAD_FLAG $LINK"
-
-
+CXX="$COMPILER $INCLUDES $PCH_FLAGS $FLAGS $LINK"
+LIBS="./libtestc++.a"
TESTS_FILE="testsuite_files_performance"
for NAME in `cat $TESTS_FILE`
do
RUN=true
- for CYCLE in `sed -n 's,.*\(TEST_[SB][0-9]*\)$,\1,p' $SRC_DIR/testsuite/$NAME`
+ TESTNAME=$SRC_DIR/testsuite/$NAME
+ FILE_NAME="`basename $NAME`"
+ FILE_NAME="`echo $FILE_NAME | sed 's/.cc//g'`"
+
+ # TEST_S == single thread
+ # TEST_B == do both single and multi-thread
+ # TEST_T == multi-thread
+ for CYCLE in `sed -n 's,.*\(TEST_[SB][0-9]*\)$,\1,p' $TESTNAME`
do
RUN=false
echo $NAME $CYCLE
- FILE_NAME="`basename $NAME`"
- EXE_NAME="`echo $FILE_NAME-$CYCLE | sed 's/cc$/exe/'`"
- $CXX -D$CYCLE $SRC_DIR/testsuite/$NAME -o $EXE_NAME
- ./$EXE_NAME
- echo ""
+ EXE_NAME="`echo $FILE_NAME-$CYCLE.exe`"
+ $CXX -DNOTHREAD -D$CYCLE $TESTNAME $LIBS -o $EXE_NAME
+ if [ -f $EXE_NAME ]; then
+ ./$EXE_NAME
+ else
+ echo "compile error:"
+ echo "$CXX -DNOTHREAD -D$CYCLE $TESTNAME $LIBS -o $EXE_NAME"
+ fi
done
- for CYCLE in `sed -n 's,.*\(TEST_[TB][0-9]*\)$,\1,p' $SRC_DIR/testsuite/$NAME`
+
+ for CYCLE in `sed -n 's,.*\(TEST_[TB][0-9]*\)$,\1,p' $TESTNAME`
do
RUN=false
- echo $NAME $CYCLE THREAD
- FILE_NAME="`basename $NAME`"
- EXE_NAME="`echo $FILE_NAME-$CYCLE | sed 's/cc$/exe/'`"
- $CXX_THREAD -D$CYCLE $SRC_DIR/testsuite/$NAME -o $EXE_NAME
- ./$EXE_NAME
- echo ""
+ echo $NAME $CYCLE thread
+ EXE_NAME="`echo $FILE_NAME-$CYCLE.exe`"
+ $CXX $THREAD_FLAG -D$CYCLE $TESTNAME $LIBS -o $EXE_NAME
+ if [ -f $EXE_NAME ]; then
+ ./$EXE_NAME
+ else
+ echo "compile error:"
+ echo "$CXX $THREAD_FLAG -D$CYCLE $TESTNAME $LIBS -o $EXE_NAME"
+ fi
done
+
if $RUN; then
echo $NAME
- FILE_NAME="`basename $NAME`"
- EXE_NAME="`echo $FILE_NAME | sed 's/cc$/exe/'`"
- $CXX $SRC_DIR/testsuite/$NAME -o $EXE_NAME
- ./$EXE_NAME
- echo ""
+ EXE_NAME="`echo $FILE_NAME.exe`"
+ $CXX $TESTNAME $LIBS -o $EXE_NAME
+ if [ -f $EXE_NAME ]; then
+ ./$EXE_NAME >& tmp.$FILE_NAME
+ else
+ echo "compile error:"
+ echo "$CXX $TESTNAME $LIBS -o $EXE_NAME"
+ fi
+ if [ -s tmp.$FILE_NAME ]; then
+ mv tmp.$FILE_NAME $FILE_NAME.xml
+ fi
fi
done
diff --git a/contrib/libstdc++/scripts/create_testsuite_files b/contrib/libstdc++/scripts/create_testsuite_files
index 50f2e13..8d87e09 100755
--- a/contrib/libstdc++/scripts/create_testsuite_files
+++ b/contrib/libstdc++/scripts/create_testsuite_files
@@ -32,30 +32,23 @@ cd $srcdir
# This is the ugly version of "everything but the current directory". It's
# what has to happen when find(1) doesn't support -mindepth, or -xtype.
dlist=`echo [0-9][0-9]*`
-for d in [a-z]*; do
- test -d $d && dlist="$dlist $d"
-done
-find $dlist "(" -type f -o -type l ")" -name "*.cc" -print | sort > $tmp.1
+dlist="$dlist abi backward ext performance thread tr1"
+find $dlist "(" -type f -o -type l ")" -name "*.cc" -print > $tmp.01
+find $dlist "(" -type f -o -type l ")" -name "*.c" -print > $tmp.02
+cat $tmp.01 $tmp.02 | sort > $tmp.1
if test ! -s "$tmp.1"; then
exit 1
fi
-# If the library is not configured to support wchar_t, don't run those tests.
-if test -f "$outdir/testsuite_wchar_t"; then
- mv $tmp.1 $tmp.2
-else
- grep -v wchar_t $tmp.1 > $tmp.2
-fi
-
# Now filter out classes of tests. These classes are run using special rules.
-grep _xin $tmp.2 > $tests_file_inter
-grep -v _xin $tmp.2 > $tmp.3
+grep _xin $tmp.1 > $tests_file_inter
+grep -v _xin $tmp.1 > $tmp.4
-grep performance $tmp.3 > $tests_file_perf
-grep -v performance $tmp.3 > $tmp.4
+grep performance $tmp.4 > $tests_file_perf
+grep -v performance $tmp.4 > $tmp.5
# ...more filters go here.
-cp $tmp.4 $tests_file_normal
+cp $tmp.5 $tests_file_normal
rm $tmp*
exit 0
diff --git a/contrib/libstdc++/scripts/extract_symvers b/contrib/libstdc++/scripts/extract_symvers
index c7798b7..8a74db9 100755
--- a/contrib/libstdc++/scripts/extract_symvers
+++ b/contrib/libstdc++/scripts/extract_symvers
@@ -15,7 +15,7 @@
#
# You should have received a copy of the GNU General Public License along
# with this library; see the file COPYING. If not, write to the Free
-# Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+# Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
# USA.
#
# As a special exception, you may use this file as part of a free software
diff --git a/contrib/libstdc++/scripts/gen_bind_includers.pl b/contrib/libstdc++/scripts/gen_bind_includers.pl
new file mode 100644
index 0000000..52b11d2
--- /dev/null
+++ b/contrib/libstdc++/scripts/gen_bind_includers.pl
@@ -0,0 +1,30 @@
+#!/usr/bin/perl -w
+use English;
+
+$max = shift @ARGV;
+
+$template_params = "typename _U1";
+$template_args = "_U1";
+$params = "_U1& __u1";
+$args = "__u1";
+
+for ($num_args = 2; $num_args <= $max; ++$num_args) {
+ $template_params .= ", typename _U$num_args";
+ $template_args .= ", _U$num_args";
+ $params .= ", _U$num_args& __u$num_args";
+ $args .= ", __u$num_args";
+ print "#define _GLIBCXX_BIND_NUM_ARGS $num_args\n";
+ print "#define _GLIBCXX_BIND_COMMA ,\n";
+ print "#define _GLIBCXX_BIND_TEMPLATE_PARAMS $template_params\n";
+ print "#define _GLIBCXX_BIND_TEMPLATE_ARGS $template_args\n";
+ print "#define _GLIBCXX_BIND_PARAMS $params\n";
+ print "#define _GLIBCXX_BIND_ARGS $args\n";
+ print "#include _GLIBCXX_BIND_REPEAT_HEADER\n";
+ print "#undef _GLIBCXX_BIND_ARGS\n";
+ print "#undef _GLIBCXX_BIND_PARAMS\n";
+ print "#undef _GLIBCXX_BIND_TEMPLATE_ARGS\n";
+ print "#undef _GLIBCXX_BIND_TEMPLATE_PARAMS\n";
+ print "#undef _GLIBCXX_BIND_COMMA\n";
+ print "#undef _GLIBCXX_BIND_NUM_ARGS\n";
+ print "\n";
+}
diff --git a/contrib/libstdc++/scripts/gen_includers.pl b/contrib/libstdc++/scripts/gen_includers.pl
new file mode 100644
index 0000000..477f028
--- /dev/null
+++ b/contrib/libstdc++/scripts/gen_includers.pl
@@ -0,0 +1,126 @@
+#!/usr/bin/perl -w
+use English;
+
+$max = shift @ARGV;
+
+$template_params = "typename _T1";
+$template_params_unnamed = "typename";
+$template_args = "_T1";
+$params = "_T1 __a1";
+$ref_params = "_T1& __a1";
+$args = "__a1";
+$bind_members = "_T1 _M_arg1;";
+$bind_members_init = "_M_arg1(__a1)";
+$mu_get_tuple_args = "::std::tr1::get<0>(__tuple)";
+$bind_v_template_args = "typename result_of<_Mu<_T1> _CV(_T1, tuple<_GLIBCXX_BIND_TEMPLATE_ARGS>)>::type";
+$bind_v_args = "_Mu<_T1>()(_M_arg1, ::std::tr1::tie(_GLIBCXX_BIND_ARGS))";
+$tuple_add_cref = "typename __add_c_ref<_T1>::type __a1";
+$tuple_copy_init = "_M_arg1(__in._M_arg1)";
+$tuple_assign = "_M_arg1 = __in._M_arg1;";
+$template_params_null_class = "typename _T1 = _NullClass";
+$template_args_stripped = "typename __strip_reference_wrapper<_T1>::__type";
+$template_params_u = "typename _U1";
+$template_args_u = "_U1";
+$ref_wrap_params = "ref(__a1)";
+$ref_template_args = "_T1&";
+for ($num_args = 2; $num_args <= $max; ++$num_args) {
+ $prev_args = $num_args - 1;
+ $next_args = $num_args + 1;
+ $template_params_shifted = $template_params;
+ $template_args_shifted = $template_args;
+ $params_shifted = $params;
+ $args_shifted = $args;
+ $template_params .= ", typename _T$num_args";
+ $template_params_unnamed .= ", typename";
+ $template_args .= ", _T$num_args";
+ $params .= ", _T$num_args __a$num_args";
+ $ref_params .=", _T$num_args& __a$num_args";
+ $args .= ", __a$num_args";
+ $bind_members .= " _T$num_args _M_arg$num_args;";
+ $bind_members_init .= ", _M_arg$num_args(__a$num_args)";
+ $mu_get_tuple_args .= ", ::std::tr1::get<$prev_args>(__tuple)";
+ $bind_v_template_args .= ", typename result_of<_Mu<_T$num_args> _CV(_T$num_args, tuple<_GLIBCXX_BIND_TEMPLATE_ARGS>)>::type";
+ $bind_v_args .= ", _Mu<_T$num_args>()(_M_arg$num_args, ::std::tr1::tie(_GLIBCXX_BIND_ARGS))";
+ $tuple_add_cref .= ", typename __add_c_ref<_T$num_args>::type __a$num_args";
+ $tuple_copy_init .= ", _M_arg$num_args(__in._M_arg$num_args)";
+ $tuple_assign .= " _M_arg$num_args = __in._M_arg$num_args;";
+ $template_params_null_class .= ", typename _T$num_args = _NullClass";
+ $template_args_stripped .= ", typename __strip_reference_wrapper<_T$num_args>::__type";
+ $template_params_u .= ", typename _U$num_args";
+ $template_args_u .= ", _U$num_args";
+ $ref_wrap_params .= ", ref(__a$num_args)";
+ $ref_template_args .= ", _T$num_args&";
+
+ if ($num_args == $max) {
+ print "#define _GLIBCXX_LAST_INCLUDE\n"
+ }
+ print "#define _GLIBCXX_NUM_ARGS $num_args\n";
+ print "#define _GLIBCXX_COMMA ,\n";
+ print "#define _GLIBCXX_TEMPLATE_PARAMS $template_params\n";
+ print "#define _GLIBCXX_TEMPLATE_ARGS $template_args\n";
+ print "#define _GLIBCXX_PARAMS $params\n";
+ print "#define _GLIBCXX_REF_PARAMS $ref_params\n";
+ print "#define _GLIBCXX_ARGS $args\n";
+ print "#define _GLIBCXX_COMMA_SHIFTED ,\n";
+ print "#define _GLIBCXX_TEMPLATE_PARAMS_SHIFTED $template_params_shifted\n";
+ print "#define _GLIBCXX_TEMPLATE_ARGS_SHIFTED $template_args_shifted\n";
+ print "#define _GLIBCXX_PARAMS_SHIFTED $params_shifted\n";
+ print "#define _GLIBCXX_ARGS_SHIFTED $args_shifted\n";
+ print "#define _GLIBCXX_BIND_MEMBERS $bind_members\n";
+ print "#define _GLIBCXX_BIND_MEMBERS_INIT $bind_members_init\n";
+ print "#define _GLIBCXX_MU_GET_TUPLE_ARGS $mu_get_tuple_args\n";
+ print "#define _GLIBCXX_BIND_V_TEMPLATE_ARGS(_CV) $bind_v_template_args\n";
+ print "#define _GLIBCXX_BIND_V_ARGS $bind_v_args\n";
+ print "#define _GLIBCXX_TUPLE_ADD_CREF $tuple_add_cref\n";
+ print "#define _GLIBCXX_TUPLE_COPY_INIT $tuple_copy_init\n";
+ print "#define _GLIBCXX_TUPLE_ASSIGN $tuple_assign\n";
+ print "#define _GLIBCXX_TEMPLATE_PARAMS_NULL_CLASS $template_params_null_class\n";
+ print "#define _GLIBCXX_TEMPLATE_ARGS_STRIPPED $template_args_stripped\n";
+ print "#define _GLIBCXX_TEMPLATE_PARAMS_U $template_params_u\n";
+ print "#define _GLIBCXX_TEMPLATE_ARGS_U $template_args_u\n";
+ print "#define _GLIBCXX_REF_WRAP_PARAMS $ref_wrap_params\n";
+ print "#define _GLIBCXX_REF_TEMPLATE_ARGS $ref_template_args\n";
+ print "#define _GLIBCXX_NUM_ARGS_PLUS_1 $next_args\n";
+ print "#define _GLIBCXX_T_NUM_ARGS_PLUS_1 _T$next_args\n";
+ print "#include _GLIBCXX_REPEAT_HEADER\n";
+ print "#undef _GLIBCXX_T_NUM_ARGS_PLUS_1\n";
+ print "#undef _GLIBCXX_NUM_ARGS_PLUS_1\n";
+ print "#undef _GLIBCXX_REF_TEMPLATE_ARGS\n";
+ print "#undef _GLIBCXX_REF_WRAP_PARAMS\n";
+ print "#undef _GLIBCXX_TEMPLATE_ARGS_U\n";
+ print "#undef _GLIBCXX_TEMPLATE_PARAMS_U\n";
+ print "#undef _GLIBCXX_TEMPLATE_ARGS_STRIPPED\n";
+ print "#undef _GLIBCXX_TEMPLATE_PARAMS_NULL_CLASS\n";
+ print "#undef _GLIBCXX_TUPLE_ASSIGN\n";
+ print "#undef _GLIBCXX_TUPLE_COPY_INIT\n";
+ print "#undef _GLIBCXX_TUPLE_ADD_CREF\n";
+ print "#undef _GLIBCXX_BIND_V_ARGS\n";
+ print "#undef _GLIBCXX_BIND_V_TEMPLATE_ARGS\n";
+ print "#undef _GLIBCXX_MU_GET_TUPLE_ARGS\n";
+ print "#undef _GLIBCXX_BIND_MEMBERS_INIT\n";
+ print "#undef _GLIBCXX_BIND_MEMBERS\n";
+ print "#undef _GLIBCXX_ARGS_SHIFTED\n";
+ print "#undef _GLIBCXX_PARAMS_SHIFTED\n";
+ print "#undef _GLIBCXX_TEMPLATE_ARGS_SHIFTED\n";
+ print "#undef _GLIBCXX_TEMPLATE_PARAMS_SHIFTED\n";
+ print "#undef _GLIBCXX_COMMA_SHIFTED\n";
+ print "#undef _GLIBCXX_ARGS\n";
+ print "#undef _GLIBCXX_REF_PARAMS\n";
+ print "#undef _GLIBCXX_PARAMS\n";
+ print "#undef _GLIBCXX_TEMPLATE_ARGS\n";
+ print "#undef _GLIBCXX_TEMPLATE_PARAMS\n";
+ print "#undef _GLIBCXX_COMMA\n";
+ print "#undef _GLIBCXX_NUM_ARGS\n";
+ if ($num_args == $max) {
+ print "#undef _GLIBCXX_LAST_INCLUDE\n"
+ }
+}
+
+print "\n";
+print "#ifndef _GLIBCXX_TUPLE_ALL_TEMPLATE_PARAMS\n";
+print "# define _GLIBCXX_TUPLE_ALL_TEMPLATE_PARAMS $template_params\n";
+print "# define _GLIBCXX_TUPLE_ALL_TEMPLATE_PARAMS_UNNAMED $template_params_unnamed\n";
+print "# define _GLIBCXX_TUPLE_ALL_TEMPLATE_ARGS $template_args\n";
+print "#endif\n";
+print "\n";
+
diff --git a/contrib/libstdc++/scripts/gen_includers2.pl b/contrib/libstdc++/scripts/gen_includers2.pl
new file mode 100644
index 0000000..88e9bec
--- /dev/null
+++ b/contrib/libstdc++/scripts/gen_includers2.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/perl -w
+use English;
+
+$max = shift @ARGV;
+
+$template_params = "typename _U1";
+$template_args = "_U1";
+$params = "_U1& __u1";
+$args = "__u1";
+
+for ($num_args = 2; $num_args <= $max; ++$num_args) {
+ $template_params .= ", typename _U$num_args";
+ $template_args .= ", _U$num_args";
+ $params .= ", _U$num_args& __u$num_args";
+ $args .= ", __u$num_args";
+ print "#define _GLIBCXX_BIND_NUM_ARGS $num_args\n";
+ print "#define _GLIBCXX_BIND_COMMA ,\n";
+ print "#define _GLIBCXX_BIND_TEMPLATE_PARAMS $template_params\n";
+ print "#define _GLIBCXX_BIND_TEMPLATE_ARGS $template_args\n";
+ print "#define _GLIBCXX_BIND_PARAMS $params\n";
+ print "#define _GLIBCXX_BIND_ARGS $args\n";
+ print "#include _GLIBCXX_BIND_REPEAT_HEADER\n";
+ print "#undef _GLIBCXX_BIND_ARGS\n";
+ print "#undef _GLIBCXX_BIND_PARAMS\n";
+ print "#undef _GLIBCXX_BIND_TEMPLATE_ARGS\n";
+ print "#undef _GLIBCXX_BIND_TEMPLATE_PARAMS\n";
+ print "#undef _GLIBCXX_BIND_COMMA\n";
+ print "#undef _GLIBCXX_BIND_NUM_ARGS\n";
+ print "\n";
+}
+
diff --git a/contrib/libstdc++/scripts/make_exports.pl b/contrib/libstdc++/scripts/make_exports.pl
new file mode 100644
index 0000000..7c9e4e3
--- /dev/null
+++ b/contrib/libstdc++/scripts/make_exports.pl
@@ -0,0 +1,144 @@
+#!/usr/bin/perl -w
+
+# This script takes two arguments, a version script and a dynamic library
+# (in that order), and prints a list of symbols to be exported from the
+# library.
+# It expects a 'nm' with the POSIX '-P' option, but everyone has one of
+# those, right? It also expects that symbol names have a leading underscore,
+# which is somewhat less likely.
+
+use File::Glob ':glob';
+use FileHandle;
+use IPC::Open2;
+
+# The glob patterns that are to be applied to the demangled name
+my @cxx_globs = ();
+# The glob patterns that apply directly to the name in the .o files
+my @globs = ();
+# The patterns for local variables (usually just '*').
+my @ignored = ();
+
+##########
+# Fill in the various glob arrays.
+
+# The next pattern will go into this array.
+my $glob = \@globs;
+my $symvers = shift;
+
+open F,$symvers or die $!;
+
+while (<F>) {
+ chomp;
+ # Lines of the form '} SOME_VERSION_NAME_1.0;'
+ if (/^[ \t]*\}[ \tA-Z0-9_.a-z]*;[ \t]*$/) {
+ $glob = \@globs;
+ next;
+ }
+ # Comment and blank lines
+ next if (/^[ \t]*\#/);
+ next if (/^[ \t]*$/);
+ # Lines of the form 'SOME_VERSION_NAME_1.1 {'
+ next if (/^[A-Z0-9_. \t]*{$/);
+ # Ignore 'global:'
+ next if (/^[ \t]*global:$/);
+ # After 'local:', globs should be ignored, they won't be exported.
+ if (/^[ \t]*local:$/) {
+ $glob = \@ignored;
+ next;
+ }
+ # After 'extern "C++"', globs are C++ patterns
+ if (/^[ \t]*extern \"C\+\+\"[ \t]*$/) {
+ $glob = \@cxx_globs;
+ next;
+ }
+ # Catch globs. Note that '{}' is not allowed in globs by this script,
+ # so only '*' and '[]' are available.
+ if (/^[ \t]*([^ \t;{}#]+);?[ \t]*$/) {
+ my $ptn = $1;
+ # Turn the glob into a regex by replacing '*' with '.*'.
+ $ptn =~ s/\*/\.\*/g;
+ push @$glob,$ptn;
+ next;
+ }
+ # Important sanity check. This script can't handle lots of formats
+ # that GNU ld can, so be sure to error out if one is seen!
+ die "strange line `$_'";
+}
+close F;
+
+# Make 'if (1)' for debugging.
+if (0) {
+ print "cxx:\n";
+ (printf "%s\n",$_) foreach (@cxx_globs);
+ print "globs:\n";
+ (printf "%s\n", $_) foreach (@globs);
+ print "ignored:\n";
+ (printf "%s\n", $_) foreach (@ignored);
+}
+
+##########
+# Combine the arrays into single regular expressions
+# This cuts the time required from about 30 seconds to about 0.5 seconds.
+
+my $glob_regex = '^_(' . (join '|',@globs) . ')$';
+my $cxx_regex = (join '|',@cxx_globs);
+
+##########
+# Get all the symbols from the library, match them, and add them to a hash.
+
+my %export_hash = ();
+my $nm = $ENV{'NM_FOR_TARGET'} || "nm";
+# Process each symbol.
+print STDERR $nm.' -P '.(join ' ',@ARGV).'|';
+open NM,$nm.' -P '.(join ' ',@ARGV).'|' or die $!;
+# Talk to c++filt through a pair of file descriptors.
+open2(*FILTIN, *FILTOUT, "c++filt -_") or die $!;
+NAME: while (<NM>) {
+ my $i;
+ chomp;
+
+ # nm prints out stuff at the start, ignore it.
+ next if (/^$/);
+ next if (/:$/);
+ # Ignore undefined and local symbols.
+ next if (/^([^ ]+) [Ua-z] /);
+
+ # $sym is the name of the symbol, $noeh_sym is the same thing with
+ # any '.eh' suffix removed.
+ die "unknown nm output $_" if (! /^([^ ]+) [A-Z] /);
+ my $sym = $1;
+ my $noeh_sym = $sym;
+ $noeh_sym =~ s/\.eh$//;
+
+ # Maybe it matches one of the patterns based on the symbol in the .o file.
+ if ($noeh_sym =~ /$glob_regex/) {
+ $export_hash{$sym} = 1;
+ next NAME;
+ }
+
+ # No? Well, maybe its demangled form matches one of those patterns.
+ printf FILTOUT "%s\n",$noeh_sym;
+ my $dem = <FILTIN>;
+ chomp $dem;
+ if ($dem =~ /$cxx_regex/) {
+ $export_hash{$sym} = 2;
+ next NAME;
+ }
+
+ # No? Well, then ignore it.
+}
+close NM or die "nm error";
+close FILTOUT or die "c++filt error";
+close FILTIN or die "c++filt error";
+
+##########
+# Print out the export file
+
+# Print information about generating this file
+print "# This is a generated file.\n";
+print "# It was generated by:\n";
+printf "# %s %s %s\n", $0, $symvers, (join ' ',@ARGV);
+
+foreach my $i (keys %export_hash) {
+ printf "%s\n",$i or die;
+}
diff --git a/contrib/libstdc++/scripts/make_graph.py b/contrib/libstdc++/scripts/make_graph.py
new file mode 100755
index 0000000..61e18be
--- /dev/null
+++ b/contrib/libstdc++/scripts/make_graph.py
@@ -0,0 +1,576 @@
+#!/usr/bin/python
+
+import string
+import sys
+import re
+import os
+import platform
+import commands
+from Numeric import *
+from pychart import *
+from xml.dom import minidom
+
+class exception:
+ pass
+
+
+def comp_platform_info(compiler):
+ ret = '<ul>\n'
+ so = commands.getstatusoutput('cat /proc/cpuinfo | grep \'cpu MHz\'')
+ if so[0] == 0:
+ ret += '<li>CPU speed - %s</li>\n' % so[1]
+ so = commands.getstatusoutput('cat /proc/meminfo | grep \'MemTotal\'')
+ if so[0] == 0:
+ ret += '<li>Memory - %s</li>\n' % so[1]
+ ret += '<li>Platform - %s</li>\n' % platform.platform()
+ so = commands.getstatusoutput(compiler + ' --version')
+ if so[0] == 0:
+ ret += '<li>Compiler - %s</li>\n' % so[1]
+ ret += '</ul>\n'
+ return ret
+
+
+class res:
+ """
+ A 'structure' representing the results of a test.
+ """
+ def __init__(self, x_label, y_label, cntnr_list, cntnr_descs, res_sets):
+ self.x_label = x_label
+ self.y_label = y_label
+ self.cntnr_list = cntnr_list
+ self.cntnr_descs = cntnr_descs
+ self.res_sets = res_sets
+
+
+class res_getter:
+ """
+ This class returns a res object for some test.
+ """
+ class __sorter:
+ def __accum(self, results):
+ total = 0
+ for result in results:
+ total = total + result[1]
+ return total
+
+ def sort(self, cntnr_list, res_sets):
+ cntnrs_and_totals = []
+ for cntnr in cntnr_list:
+ results = res_sets[cntnr]
+ total = self.__accum(results)
+ cntnrs_and_totals.append((cntnr, total))
+ by_total = lambda x,y: x[1] > y[1] and -1 or 1
+ cntnrs_and_totals.sort(by_total)
+ ret = []
+ for cntnr_and_total in cntnrs_and_totals:
+ cntnr = cntnr_and_total[0]
+ ret.append(cntnr)
+ return ret
+
+ def __init__(self, test_infos_f_name):
+ self.__test_to_container_res_sets = {}
+ self.__test_to_f_names = {}
+ tests_dat = minidom.parse(test_infos_f_name)
+ for test in tests_dat.getElementsByTagName('test'):
+ test_name = test.attributes['name'].value
+ self.__test_to_f_names[test_name] = test.getElementsByTagName('file')[0].attributes['name'].value
+ cntnr_list = []
+ for cntnr in test.getElementsByTagName('cntnr'):
+ cntnr_list.append(cntnr.attributes['name'].value)
+ self.__test_to_container_res_sets[test_name] = cntnr_list
+
+ def __get_label(self, tst_dat, label_name):
+ label = tst_dat.getElementsByTagName(label_name)[0].firstChild.data
+ label = string.strip(label, '\n')
+ label = string.strip(label)
+ return label
+
+ def __parse_res_sets(self, f_name, cntnr_list):
+ tst_dat = minidom.parse(f_name)
+ x_label = self.__get_label(tst_dat, 'x_name')
+ y_label = self.__get_label(tst_dat, 'y_name')
+ parsed_container_list = tst_dat.getElementsByTagName('cntnr')
+ res_sets = {}
+ cntnr_descs = {}
+ for cntnr in parsed_container_list:
+ cntnr_name = cntnr.attributes["name"].value
+ res_sets[cntnr_name] = []
+ for cntnr in parsed_container_list:
+ cntnr_name = cntnr.attributes["name"].value
+ cntnr_desc = cntnr.getElementsByTagName('desc')
+ if res_sets.has_key(cntnr_name):
+ res_set = []
+ result_list = cntnr.getElementsByTagName('result')
+ for result in result_list:
+ x = string.atol(result.attributes["x"].value)
+ y = string.atof(result.attributes["y"].value)
+ res_set.append((x, y))
+ res_sets[cntnr_name] = res_set
+ cntnr_descs[cntnr_name] = cntnr_desc[0]
+ return (x_label, y_label, cntnr_descs, res_sets)
+
+ def get(self, res_dir, test_name):
+ cntnr_list = self.__test_to_container_res_sets[test_name]
+ f_name = res_dir + '/' + self.__test_to_f_names[test_name]
+ parsed = self.__parse_res_sets(f_name, cntnr_list)
+ x_label = parsed[0]
+ y_label = parsed[1]
+ cntnr_descs = parsed[2]
+ res_sets = parsed[3]
+ cntnr_list = self.__sorter().sort(cntnr_list, res_sets)
+ return res(x_label, y_label, cntnr_list, cntnr_descs, res_sets)
+
+
+class png_maker:
+ """
+ This class creates a png file from a result set.
+ """
+ class __style_chooser:
+ def __init__(self):
+ self.native_re = re.compile(r'n_(?:.*?)')
+
+ self.native_tick_mark_0 = tick_mark.Circle(size = 4)
+ self.native_tick_mark_1 = tick_mark.Square(size = 4)
+ self.native_line_style_0 = line_style.T(color = color.black, width=2)
+ self.native_line_style_1 = line_style.T(color = color.black, width=2)
+
+ self.mask_re = re.compile(r'mask(?:.*?)')
+ self.mod_re = re.compile(r'mod(?:.*?)')
+
+ self.rb_tree_mmap_rb_tree_set_re = re.compile(r'rb_tree_mmap_rb_tree_set(?:.*?)')
+ self.rb_tree_mmap_lu_mtf_set_re = re.compile(r'rb_tree_mmap_lu_mtf_set(?:.*?)')
+
+ self.splay_re = re.compile(r'splay(?:.*?)')
+ self.rb_tree_re = re.compile(r'rb_tree(?:.*?)')
+ self.ov_tree_re = re.compile(r'ov_tree(?:.*?)')
+ self.splay_tree_re = re.compile(r'splay_tree(?:.*?)')
+
+ self.pat_trie_re = re.compile(r'pat_trie(?:.*?)')
+
+ self.lc_1div8_1div2_re = re.compile(r'lc_1div8_1div2(?:.*?)')
+ self.lc_1div8_1div1_re = re.compile(r'lc_1div8_1div1(?:.*?)')
+ self.mcolc_1div2_re = re.compile(r'mcolc_1div2(?:.*?)')
+
+ def choose(self, cntnr):
+ if self.native_re.search(cntnr):
+ if cntnr == 'n_pq_vector':
+ return (self.native_tick_mark_1, self.native_line_style_1)
+
+ return (self.native_tick_mark_0, self.native_line_style_0)
+
+ # tick_mark predefined
+ # square, circle3, dia, tri, dtri, star, plus5, x5, gray70dia, blackdtri, blackdia
+ if self.mask_re.search(cntnr):
+ clr = color.navy
+ elif self.mod_re.search(cntnr):
+ clr = color.green4
+ elif self.rb_tree_mmap_rb_tree_set_re.search(cntnr):
+ clr = color.mediumblue
+ tm = tick_mark.square
+ elif self.rb_tree_mmap_lu_mtf_set_re.search(cntnr) or cntnr == 'rc_binomial_heap':
+ clr = color.gray50
+ tm = tick_mark.dia
+ elif self.splay_tree_re.search(cntnr) or cntnr == 'binomial_heap':
+ clr = color.gray58
+ tm = tick_mark.tri
+ elif self.rb_tree_re.search(cntnr) or cntnr == 'binary_heap':
+ clr = color.red3
+ tm = tick_mark.dtri
+ elif self.ov_tree_re.search(cntnr) or cntnr == 'thin_heap':
+ clr = color.orangered1
+ tm = tick_mark.star
+ elif self.pat_trie_re.search(cntnr) or cntnr == 'pairing_heap':
+ clr = color.blueviolet
+ tm = tick_mark.plus5
+ else:
+ sys.stderr.write(cntnr + '\n')
+ raise exception
+
+ # mask / mod
+ if cntnr.find('lc_1div8_1div') <> -1:
+ if cntnr.find('mask') <> -1:
+ # mask
+ if self.lc_1div8_1div2_re.search(cntnr):
+ if cntnr.find('nsth') <> -1:
+ tm = tick_mark.x5
+ else:
+ tm = tick_mark.gray70dia
+ if self.lc_1div8_1div1_re.search(cntnr):
+ if cntnr.find('nsth') <> -1:
+ tm = tick_mark.dia
+ else:
+ tm = tick_mark.circle3
+ else:
+ # mod
+ if self.lc_1div8_1div2_re.search(cntnr):
+ if cntnr.find('nsth') <> -1:
+ tm = tick_mark.tri
+ else:
+ tm = tick_mark.square
+ if self.lc_1div8_1div1_re.search(cntnr):
+ if cntnr.find('nsth') <> -1:
+ tm = tick_mark.dtri
+ else:
+ tm = tick_mark.star
+
+ if self.mcolc_1div2_re.search(cntnr):
+ tm = tick_mark.circle3
+
+ return (tm, line_style.T(color = clr, width = 2))
+
+
+ def __init__(self):
+ self.__sc = self.__style_chooser()
+ self.__mmap_re = re.compile('mmap_')
+
+ def __container_label_name(self, cntnr):
+ return self.__mmap_re.sub('\nmmap_\n', cntnr)
+
+ def make(self, res, of_name):
+ theme.output_format = 'png'
+ theme.output_file = of_name
+ theme.scale_factor = 2
+# theme.default_font_size = 5
+ theme.use_color = 1
+ theme.reinitialize()
+ y_tick_interval = self.__get_y_tics(res)
+ xaxis = axis.X(format = '/a90/hL%d',
+ tic_interval = 200,
+ label = res.x_label)
+ yaxis = axis.Y(format = '%.2e',
+ tic_interval = y_tick_interval,
+ label = res.y_label)
+ legend_lines = len(res.cntnr_list)
+ legend_vloc = 50 + (legend_lines * 10)
+ ar = area.T(x_axis = xaxis, y_axis = yaxis,
+ legend = legend.T(loc=(0,-legend_vloc),
+ frame_line_style=None,
+ inter_row_sep=2),
+ size=(240,110))
+ plot_list = []
+ for cntnr in res.cntnr_list:
+ style = self.__sc.choose(cntnr)
+ print cntnr
+ pl = line_plot.T(label = self.__container_label_name(cntnr),
+ data = res.res_sets[cntnr],
+ tick_mark = style[0],
+ line_style = style[1])
+ plot_list.append(pl)
+ for plot in plot_list:
+ ar.add_plot(plot)
+ ar.draw()
+
+
+ def __get_y_tics(self, res):
+ mx = 0
+ for cntnr in res.cntnr_list:
+ m = max(d[1] for d in res.res_sets[cntnr])
+ mx = max(m, mx)
+ return mx / 5
+
+
+
+def make_tt(s):
+ return '<tt>' + s + '</tt>'
+
+def make_b(s):
+ return '<b>' + s + '</b>'
+
+def make_ttb(s):
+ return '<tt><b>' + s + '</b></tt>'
+
+def make_i(s):
+ return '<i>' + s + '</i>'
+
+def make_pb_ds_class_href(c_name):
+ return '<a href = "' + c_name + '.html">' + make_tt(c_name) + '</a>\n'
+
+def build_value_to_pb_ds_class_href(s_desc):
+ value = s_desc.attributes['value'].value
+ ret = make_pb_ds_class_href(value)
+ return ret
+
+class hash_desc_to_html_builder:
+ def build_specific_comb_hash_fn(self, s_desc):
+ comb_hash_fn_desc = s_desc.getElementsByTagName('Comb_Hash_Fn')[0]
+ ret = make_tt('Comb_Hash_Fn')
+ ret = ret + ' = '
+ ret = ret + build_value_to_pb_ds_class_href(comb_hash_fn_desc)
+ return ret
+
+ def __build_nom_denom(self, s_desc):
+ nom_denom = s_desc.attributes['nom'].value + '/' + s_desc.attributes['denom'].value
+ return make_i(nom_denom)
+
+ def __build_lc_trigger_desc(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + ' with ' + make_i('&alpha;<sub>min</sub>')
+ ret = ret + ' = ' + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_min')[0])
+ ret = ret + ' and ' + make_i('&alpha;<sub>max</sub>')
+ ret = ret + ' = ' + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_max')[0])
+ return ret
+
+ def build_specific_resize_policy(self, s_desc):
+ ret = make_tt('Resize_Policy')
+ ret = ret + ' = '
+ resize_policy_desc = s_desc.getElementsByTagName('Resize_Policy')[0]
+ ret = ret + build_value_to_pb_ds_class_href(resize_policy_desc)
+ ret = ret + ' with ' + make_tt('Size_Policy')
+ ret = ret + ' = '
+ size_policy_desc = resize_policy_desc.getElementsByTagName('Size_Policy')[0]
+ ret = ret + build_value_to_pb_ds_class_href(size_policy_desc)
+ ret = ret + ', and ' + make_tt('Trigger_Policy')
+ ret = ret + ' = '
+ trigger_policy_desc = resize_policy_desc.getElementsByTagName('Trigger_Policy')[0]
+ if trigger_policy_desc.attributes['value'].value == 'hash_load_check_resize_trigger':
+ ret = ret + self.__build_lc_trigger_desc(trigger_policy_desc)
+ else:
+ raise exception
+ return ret
+
+
+class cc_hash_desc_to_html_builder:
+ def __init__(self):
+ self.__hash_builder = hash_desc_to_html_builder()
+
+ def build(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + 'with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc)
+ ret = ret + ', and ' + self.__hash_builder.build_specific_resize_policy(s_desc)
+ return ret
+
+
+class gp_hash_desc_to_html_builder:
+ def __init__(self):
+ self.__hash_builder = hash_desc_to_html_builder()
+
+ def build(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + ' with ' + self.__hash_builder.build_specific_comb_hash_fn(s_desc)
+ ret = ret + ', ' + self.__hash_builder.build_specific_resize_policy(s_desc)
+ ret = ret + ', and ' + make_tt('Probe_Fn')
+ ret = ret + ' = '
+ probe_fn = s_desc.getElementsByTagName('Probe_Fn')[0].attributes['value'].value
+ ret = ret + make_pb_ds_class_href(probe_fn)
+ return ret
+
+
+class basic_tree_like_desc_to_html_builder:
+ def build_tag(self, s_desc):
+ ret = make_tt('Tag')
+ ret = ret + ' = '
+ tag_desc = s_desc.getElementsByTagName('Tag')[0]
+ ret = ret + build_value_to_pb_ds_class_href(tag_desc)
+ return ret
+
+ def build_node_update(self, s_desc):
+ ret = make_tt('Node_Update')
+ ret = ret + ' = '
+ node_update_desc = s_desc.getElementsByTagName('Node_Update')[0]
+ ret = ret + build_value_to_pb_ds_class_href(node_update_desc)
+ return ret
+
+
+class basic_tree_desc_to_html_builder:
+ def __init__(self):
+ self.__tree_like_builder = basic_tree_like_desc_to_html_builder()
+
+ def build(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc)
+ ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc)
+ return ret
+
+
+class basic_trie_desc_to_html_builder:
+ def __init__(self):
+ self.__tree_like_builder = basic_tree_like_desc_to_html_builder()
+
+ def build(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + ' with ' + self.__tree_like_builder.build_tag(s_desc)
+ ret = ret + ', and ' + self.__tree_like_builder.build_node_update(s_desc)
+ return ret
+
+class lu_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = build_value_to_pb_ds_class_href(s_desc)
+ ret = ret + ' with ' + make_tt('Update_Policy')
+ ret = ret + ' = '
+ update_policy_desc = s_desc.getElementsByTagName('Update_Policy')[0]
+ ret = ret + build_value_to_pb_ds_class_href(update_policy_desc)
+ return ret
+
+
+class std_desc_to_html_builder:
+ def build(self, s_desc):
+ value = s_desc.attributes['value'].value
+ return make_tt(value.replace('std_', 'std::'))
+
+
+class std_tr1_desc_to_html_builder:
+ def build(self, s_desc):
+ value = s_desc.attributes['value'].value
+ ret = make_tt(value.replace('std_tr1_', 'std::tr1::'))
+ ret = ret + ' with ' + make_tt('cache_hash_code')
+ ret = ret + ' = '
+ cache_hash_code = s_desc.getElementsByTagName('cache_hash_code')[0].attributes['value'].value
+ ret = ret + make_ttb(cache_hash_code)
+ return ret
+
+class gnucxx_desc_to_html_builder:
+ def build(self, s_desc):
+ value = s_desc.attributes['value'].value
+ return make_tt(value.replace('__gnucxx_', '__gnucxx::'))
+
+class stdext_desc_to_html_builder:
+ def build(self, s_desc):
+ value = s_desc.attributes['value'].value
+ return make_tt(value.replace('stdext_', 'stdext::'))
+
+class npq_desc_to_html_builder:
+ def build(self, vector):
+ if vector:
+ under = make_tt('std::vector')
+ else:
+ under = make_tt('std::deque')
+
+ return make_tt('std::priority_queue') + ' adapting ' + under
+
+class binary_heap_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = make_pb_ds_class_href('priority_queue')
+ ret = ret + ' with ' + make_tt('Tag')
+ ret = ret + ' = ' + make_pb_ds_class_href('binary_heap_tag')
+ return ret
+
+class thin_heap_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = make_pb_ds_class_href('priority_queue')
+ ret = ret + ' with ' + make_tt('Tag')
+ ret = ret + ' = ' + make_pb_ds_class_href('thin_heap_tag')
+ return ret
+
+class binomial_heap_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = make_pb_ds_class_href('priority_queue')
+ ret = ret + ' with ' + make_tt('Tag')
+ ret = ret + ' = ' + make_pb_ds_class_href('binomial_heap_tag')
+ return ret
+
+class rc_binomial_heap_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = make_pb_ds_class_href('priority_queue')
+ ret = ret + ' with ' + make_tt('Tag')
+ ret = ret + ' = ' + make_pb_ds_class_href('rc_binomial_heap_tag')
+ return ret
+
+class pairing_heap_desc_to_html_builder:
+ def build(self, s_desc):
+ ret = make_pb_ds_class_href('priority_queue')
+ ret = ret + ' with ' + make_tt('Tag')
+ ret = ret + ' = ' + make_pb_ds_class_href('pairing_heap_tag')
+ return ret
+
+class legend_desc_builder:
+ """
+ Returns a string corresponding to a specific container type.
+ """
+ def __init__(self):
+ self.__cc_hash_builder = cc_hash_desc_to_html_builder()
+ self.__gp_hash_builder = gp_hash_desc_to_html_builder()
+ self.__basic_tree_builder = basic_tree_desc_to_html_builder()
+ self.__basic_trie_builder = basic_trie_desc_to_html_builder()
+ self.__lu_builder = lu_desc_to_html_builder()
+ self.__std_builder = std_desc_to_html_builder()
+ self.__std_tr1_builder = std_tr1_desc_to_html_builder()
+ self.__gnucxx_builder = gnucxx_desc_to_html_builder()
+ self.__stdext_builder = stdext_desc_to_html_builder()
+ self.__npq_builder = npq_desc_to_html_builder()
+ self.__thin_heap_builder = thin_heap_desc_to_html_builder()
+ self.__thin_heap_builder = thin_heap_desc_to_html_builder()
+ self.__binary_heap_builder = binary_heap_desc_to_html_builder()
+ self.__binomial_heap_builder = binomial_heap_desc_to_html_builder()
+ self.__rc_binomial_heap_builder = rc_binomial_heap_desc_to_html_builder()
+ self.__pairing_heap_builder = pairing_heap_desc_to_html_builder()
+
+ def __build_specific(self, s_desc):
+ type = s_desc.attributes['value'].value
+
+ if type == 'thin_heap':
+ return self.__thin_heap_builder.build(s_desc)
+ if type == 'binary_heap':
+ return self.__binary_heap_builder.build(s_desc)
+ if type == 'binomial_heap':
+ return self.__binomial_heap_builder.build(s_desc)
+ if type == 'rc_binomial_heap':
+ return self.__rc_binomial_heap_builder.build(s_desc)
+ if type == 'pairing_heap':
+ return self.__pairing_heap_builder.build(s_desc)
+ if type == 'cc_hash_table':
+ ret = self.__cc_hash_builder.build(s_desc)
+ elif type == 'gp_hash_table':
+ ret = self.__gp_hash_builder.build(s_desc)
+ elif type == 'tree':
+ ret = self.__basic_tree_builder.build(s_desc)
+ elif type == 'trie':
+ ret = self.__basic_trie_builder.build(s_desc)
+ elif type == 'list_update':
+ ret = self.__lu_builder.build(s_desc)
+ elif type == 'std::priority_queue_vector':
+ return self.__npq_builder.build(True)
+ elif type == 'std::priority_queue_deque':
+ return self.__npq_builder.build(False)
+ elif type == 'std_set' or type == 'std_map' or type == 'std_multimap':
+ return self.__std_builder.build(s_desc)
+ elif type == 'std_tr1_unordered_set' or type == 'std_tr1_unordered_map':
+ return self.__std_tr1_builder.build(s_desc)
+ elif type == 'stdext_hash_set' or type == 'stdext_hash_map' or type == 'stdext_hash_multimap':
+ return self.__stdext_builder.build(s_desc)
+ elif type == '__gnucxx_hash_set' or type == '__gnucxx_hash_map' or type == '__gnucxx_hash_multimap':
+ return self.__gnucxx_builder.build(s_desc)
+ else:
+ sys.stderr.write('cannot recognize %s\n' % type)
+ raise exception
+ return ret
+
+
+ def build(self, desc):
+ s_descs = desc.getElementsByTagName('type')
+ if s_descs.length == 0:
+ print desc.toxml()
+ raise exception
+ ret = ''
+ count = 0
+ for s_desc in s_descs:
+ if count > 0:
+ ret = ret + ', mapping each key to '
+ ret = ret + self.__build_specific(s_desc)
+ count = count + 1
+ return ret
+
+
+def main(doc_dir, res_dir, test_infos_f_name, test_name, build_name):
+ res_gtr = res_getter(test_infos_f_name)
+ res = res_gtr.get(res_dir, test_name)
+ png_mkr = png_maker()
+ png_of_name = doc_dir + '/' + test_name + '_' + build_name + '.png'
+ print png_of_name
+ png_mkr.make(res, png_of_name)
+
+
+if __name__ == "__main__":
+ """
+ This module takes 6 parameters from the command line:
+ Docs directory
+ Results directory
+ Tests info XML file name
+ Test name
+ Build name
+ Compiler name
+ """
+ usg = "make_graph.py <doc_dir> <res_dir> <test_info_file> <test_name> <build_name>\n"
+ if len(sys.argv) != 6:
+ sys.stderr.write(usg)
+ raise exception
+ main(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
diff --git a/contrib/libstdc++/scripts/make_graphs.py b/contrib/libstdc++/scripts/make_graphs.py
new file mode 100755
index 0000000..0b5daf2
--- /dev/null
+++ b/contrib/libstdc++/scripts/make_graphs.py
@@ -0,0 +1,160 @@
+#!/usr/bin/python
+
+import sys
+import commands
+import re
+from xml.dom import minidom
+from BeautifulSoup import BeautifulSoup
+import make_graph
+
+class exception:
+ pass
+
+res_div_re = re.compile('(.*?)_res_div')
+settings_div_re = re.compile('(.*?)_settings_div')
+
+
+gray_border_div_str = '<div style = "border-style: dotted; border-width: 1px; border-color: lightgray">'
+space_div_str = '<div style = "width: 100%; height: 20px">'
+
+
+
+def logical_build_from_build(build):
+ if build == 'gcc':
+ return 'g++'
+ if build == 'msvc':
+ return 'msvc++'
+ if build == 'local':
+ return 'local'
+ sys.stderr.write(build)
+ raise exception
+
+
+def img_title_from_origs(label, title, base_build_ref, build_name, logical_build_name):
+ title = title.replace('_tt_', '<tt>')
+ title = title.replace('_455tt_', '</tt>')
+ title = title.replace('_b_', '<b>')
+ title = title.replace('_455b_', '</b>')
+ title = title.replace('_456', ',')
+ title = title.replace('_457', '[]')
+ title = title.replace('_', ' ')
+ return '%s: %s - <a href = "%s_performance_tests.html#%s">%s</a>' % (
+ label,
+ title,
+ base_build_ref,
+ build_name,
+ logical_build_name)
+
+
+def make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name):
+ cmd_str = '%s/scripts/make_graph.py %s %s %s %s %s' % (
+ src_dir, doc_dir,
+ res_dir,
+ tests_info_xml_f_name,
+ test_name,
+ build_name)
+ # Must start a new process for pychart - otherwise pngs overlap.
+ so = commands.getstatusoutput(cmd_str)
+ if(so[0] != 0):
+ sys.stderr.write(cmd_str + '\n')
+ sys.stderr.write(so[1] + '\n')
+ sys.exit(-1)
+
+
+def make_png_str(label, test_name, build):
+ ret = '<h6 class="c1">'
+ ret += '<a name="%s" id= "%s">' % (label, label)
+ ret += '<img src="%s" ' % (test_name + '_' + build + '.png')
+ ret += 'alt="no image" />'
+ ret += '</a></h6>'
+ return ret
+
+def process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name):
+ doc_dir = src_dir + "/docs/html/ext/pb_ds"
+ res_dir = build_dir
+ html_f = open(doc_dir + '/' + html_f_name)
+ soup = BeautifulSoup(html_f.read())
+ html_f.close()
+ platform_comp_re = re.compile('platform_comp_%s' % build_name)
+ for d in soup('div'):
+ try:
+ settings_m = settings_div_re.match(d['id'])
+ res_m = res_div_re.match(d['id'])
+ except:
+ settings_m = None
+ res_m = None
+
+ if settings_m:
+ build = settings_m.groups()[0]
+ if build == build_name:
+ logical_build_name = logical_build_from_build(build)
+ info = gray_border_div_str
+ info += '<h3><a name = "%s"><u>%s</u></a></h3>' % (build, logical_build_name)
+ info += make_graph.comp_platform_info(compiler_name)
+ info += '</div>%s</div>' % space_div_str
+ d.contents = info
+ elif res_m:
+ label = res_m.groups()[0]
+ d = d.divTag
+
+ build = d['id'].replace('%s_' % label, '')
+
+ if build == build_name:
+ logical_build_name = logical_build_from_build(build)
+ d = d.divTag
+ test_name = d['id'].replace('%s_' % label, '')
+ d = d.divTag
+ base_build_ref = d['id'].replace('%s_' % label, '')
+ d = d.divTag
+ title = d['id'].replace('%s_' % label, '')
+ img_title = img_title_from_origs(label, title, base_build_ref, build, logical_build_name)
+
+ make_png(src_dir, doc_dir, res_dir, tests_info_xml_f_name, build_name, test_name)
+ png_str = make_png_str(label, test_name, build)
+ content = gray_border_div_str
+ content += png_str
+ content += img_title
+# content += make_graph.legend(doc_dir, res_dir, tests_info_xml_f_name, test_name, build_name)
+ content += '</div>%s</div>' % space_div_str
+ d.contents = content
+
+ return soup
+
+
+
+if __name__ == "__main__":
+ """
+ Doc dir
+ This module takes 6 parameters from the command line:
+ Source directory
+ Build directory
+ HTMLs XML file name
+ Tests info XML file name
+ Build name
+ Compiler name
+ """
+
+ usg = "make_graph.py <src_dir> <build_dir> <htmls_xml_f_name> <tests_info_xml_f_name> <build_name> <compiler_name>\n"
+
+ if len(sys.argv) != 7:
+ sys.stderr.write(usg)
+ raise exception
+
+ src_dir = sys.argv[1]
+ build_dir = sys.argv[2]
+ htmls_xml_f_name = sys.argv[3]
+ tests_info_xml_f_name = sys.argv[4]
+ build_name = sys.argv[5]
+ compiler_name = sys.argv[6]
+ doc_dir = src_dir + "/docs/html/ext/pb_ds"
+ htmls_dat = minidom.parse(htmls_xml_f_name)
+ for html in htmls_dat.getElementsByTagName('html'):
+ html_f_name = html.attributes['name'].value
+
+ new_soup = process_html(html_f_name, src_dir, build_dir, htmls_xml_f_name, tests_info_xml_f_name, build_name, compiler_name)
+
+ html_f = open(doc_dir + '/' + html_f_name, 'w')
+ html_f.write(str(new_soup))
+ html_f.close()
+
+
diff --git a/contrib/libstdc++/scripts/testsuite_flags.in b/contrib/libstdc++/scripts/testsuite_flags.in
index 2a74f47..4b841ca 100755
--- a/contrib/libstdc++/scripts/testsuite_flags.in
+++ b/contrib/libstdc++/scripts/testsuite_flags.in
@@ -18,6 +18,7 @@ Usage:
--install-cxx
--cxxflags
--cxxpchflags
+ --cxxldflags
EOF
}
@@ -29,12 +30,12 @@ query=$1
case ${query} in
--install-includes)
- INCLUDES="-I${SRC_DIR}/testsuite"
+ INCLUDES="-I${SRC_DIR}/testsuite/util"
echo ${INCLUDES}
;;
--build-includes)
- INCLUDES="-nostdinc++ @GLIBCXX_INCLUDES@ -I${SRC_DIR}/libsupc++
- -I${SRC_DIR}/include/backward -I${SRC_DIR}/testsuite"
+ INCLUDES="-nostdinc++ @GLIBCXX_INCLUDES@
+ -I${SRC_DIR}/include/backward -I${SRC_DIR}/testsuite/util"
echo ${INCLUDES}
;;
--install-cxx)
@@ -48,16 +49,20 @@ case ${query} in
;;
--cxxflags)
CXXFLAGS_save="-g -O2 -D_GLIBCXX_ASSERT"
- CXXFLAGS_config='@SECTION_FLAGS@ @SECTION_LDFLAGS@ -fmessage-length=0
- @EXTRA_CXX_FLAGS@ -DLOCALEDIR="@glibcxx_localedir@" '
+ CXXFLAGS_config='@SECTION_FLAGS@ -fmessage-length=0
+ @CXXFLAGS@ @EXTRA_CXX_FLAGS@ '
echo ${CXXFLAGS_save} ${CXXFLAGS_config}
;;
--cxxpchflags)
PCHFLAGS="@glibcxx_PCHFLAGS@"
echo ${PCHFLAGS}
;;
+ --cxxldflags)
+ SECTIONLDFLAGS="@SECTION_LDFLAGS@"
+ echo ${SECTIONLDFLAGS}
+ ;;
*)
- print_usagex
+ print_usage
;;
esac
OpenPOWER on IntegriCloud