diff options
Diffstat (limited to 'contrib/libstdc++/scripts')
-rwxr-xr-x | contrib/libstdc++/scripts/check_performance | 93 | ||||
-rwxr-xr-x | contrib/libstdc++/scripts/create_testsuite_files | 54 | ||||
-rwxr-xr-x | contrib/libstdc++/scripts/extract_symvers | 67 | ||||
-rw-r--r-- | contrib/libstdc++/scripts/gen_bind_includers.pl | 30 | ||||
-rw-r--r-- | contrib/libstdc++/scripts/gen_includers.pl | 126 | ||||
-rw-r--r-- | contrib/libstdc++/scripts/gen_includers2.pl | 31 | ||||
-rw-r--r-- | contrib/libstdc++/scripts/make_exports.pl | 144 | ||||
-rwxr-xr-x | contrib/libstdc++/scripts/make_graph.py | 576 | ||||
-rwxr-xr-x | contrib/libstdc++/scripts/make_graphs.py | 160 | ||||
-rwxr-xr-x | contrib/libstdc++/scripts/testsuite_flags.in | 69 |
10 files changed, 1350 insertions, 0 deletions
diff --git a/contrib/libstdc++/scripts/check_performance b/contrib/libstdc++/scripts/check_performance new file mode 100755 index 0000000..b7bbd6d --- /dev/null +++ b/contrib/libstdc++/scripts/check_performance @@ -0,0 +1,93 @@ +#!/usr/bin/env bash + +# Script to do performance testing. + +# Invocation +# check_performance SRC_DIR BUILD_DIR + +# 1: variables +# +SRC_DIR=$1 +BUILD_DIR=$2 + +# Now that we've successfully translated the numerical option into +# a symbolic one, we can safely ignore it. +shift + +# This has been true all along. Found out about it the hard way... +case $BASH_VERSION in + 1*) + echo 'You need bash 2.x to run check_performance. Exiting.'; + exit 1 ;; + *) ;; +esac + +flags_script=$BUILD_DIR/scripts/testsuite_flags +INCLUDES=`$flags_script --build-includes` +PCH_FLAGS=`$flags_script --cxxpchflags` +FLAGS=`$flags_script --cxxflags` +THREAD_FLAG='-pthread' +COMPILER=`$flags_script --build-cxx` +SH_FLAG="-Wl,--rpath -Wl,$BUILD_DIR/../../gcc \ + -Wl,--rpath -Wl,$BUILD_DIR/src/.libs" +ST_FLAG="-static" +LINK=$SH_FLAG +CXX="$COMPILER $INCLUDES $PCH_FLAGS $FLAGS $LINK" +LIBS="./libtestc++.a" +TESTS_FILE="testsuite_files_performance" + +for NAME in `cat $TESTS_FILE` +do + RUN=true + 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 + 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' $TESTNAME` + do + RUN=false + 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 + 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 + +exit 0 diff --git a/contrib/libstdc++/scripts/create_testsuite_files b/contrib/libstdc++/scripts/create_testsuite_files new file mode 100755 index 0000000..8d87e09 --- /dev/null +++ b/contrib/libstdc++/scripts/create_testsuite_files @@ -0,0 +1,54 @@ +#!/bin/sh + +# Constructs lists of source files (full pathnames) to test. Two +# files are constructed: testsuite_files, which is used to test with +# the default dg-runtest command, and testsuite_files_interactive, +# which is used to test cases that require input to be entered. In +# addition, both lists are pruned of wchar_t tests if the toolchain +# under test does not support wchar_t functionality. +# +# We mimic the mkcheck script in that the first time this is run, all +# existing files are listed in "testsuite_files" in the output +# directory. Subsequent runs pull the list from that file, allowing +# users to trim the list down to problematic tests, or just run +# paticular directories or sub-directories of tests. +# +# Selecting individual tests can also be done with RUNTESTFLAGS, but +# that doesn't really do all that we are trying to accomplish here. + +LC_ALL=C +export LC_ALL + +# Both of these are in the appropriate testsuite subdirectories. +srcdir="$1" +outdir="$2" + +tmp="${TMPDIR:-/tmp}/ctt$$" +tests_file_normal="$outdir/testsuite_files" +tests_file_inter="$outdir/testsuite_files_interactive" +tests_file_perf="$outdir/testsuite_files_performance" + +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]*` +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 + +# Now filter out classes of tests. These classes are run using special rules. +grep _xin $tmp.1 > $tests_file_inter +grep -v _xin $tmp.1 > $tmp.4 + +grep performance $tmp.4 > $tests_file_perf +grep -v performance $tmp.4 > $tmp.5 + +# ...more filters go here. +cp $tmp.5 $tests_file_normal + +rm $tmp* +exit 0 diff --git a/contrib/libstdc++/scripts/extract_symvers b/contrib/libstdc++/scripts/extract_symvers new file mode 100755 index 0000000..8a74db9 --- /dev/null +++ b/contrib/libstdc++/scripts/extract_symvers @@ -0,0 +1,67 @@ +#!/bin/sh + +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# +# 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 +# terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# 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, 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 +# library without restriction. Specifically, if other files instantiate +# templates or use macros or inline functions from this file, or you compile +# this file and link it with other files to produce an executable, this +# file does not by itself cause the resulting executable to be covered by +# the GNU General Public License. This exception does not however +# invalidate any other reasons why the executable file might be covered by +# the GNU General Public License. + + +if test ${#} -lt 2 || test $1 = '--help'; then + echo "Usage: extract_symvers shared_lib output_file" 1>&2 + exit 1 +fi + +lib=$1 +output=$2 + +# GNU binutils, somewhere after version 2.11.2, requires -W/--wide to avoid +# default line truncation. -W is not supported and truncation did not occur +# by default before that point. +readelf="readelf --symbols" +if readelf --help | grep -- --wide > /dev/null; then + readelf="$readelf --wide" +fi + +# This avoids weird sorting problems later. +LC_ALL=C +export LC_ALL +LANG=C +export LANG + +tmp=extract.$$ + +${readelf} ${lib} | sed '/\.dynsym/,/^$/p;d' | egrep -v ' (LOCAL|UND) ' |\ +awk '{ if ($4 == "FUNC" || $4 == "NOTYPE") + printf "%s:%s\n", $4, $8; + else if ($4 == "OBJECT") + printf "%s:%s:%s\n", $4, $3, $8; + }' | sort | uniq > $tmp 2>&1 +# else printf "Huh? What is %s?\n", $8; + + +# I think we'll be doing some more with this file, but for now, dump. +mv $tmp $output + +exit 0 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('α<sub>min</sub>') + ret = ret + ' = ' + self.__build_nom_denom(s_desc.getElementsByTagName('alpha_min')[0]) + ret = ret + ' and ' + make_i('α<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 new file mode 100755 index 0000000..4b841ca --- /dev/null +++ b/contrib/libstdc++/scripts/testsuite_flags.in @@ -0,0 +1,69 @@ +#!/bin/sh + +# +# This script computes the various flags needed to run GNU C++ testsuites +# (compiler specific as well as library specific). +# +# Written by Benjamin Kosnik <bkoz@redhat.com> +# Gabriel Dos Reis <gdr@codesourcery.com> +# + +# Print a message saying how this script is intended to be invoked +print_usage() { + cat <<EOF +Usage: + testsuite_flags --install-includes + --build-includes + --build-cxx + --install-cxx + --cxxflags + --cxxpchflags + --cxxldflags +EOF +} + +# Establish configure-generated directory structure. +BUILD_DIR=@glibcxx_builddir@ +SRC_DIR=@glibcxx_srcdir@ +PREFIX_DIR=@glibcxx_prefixdir@ +query=$1 + +case ${query} in + --install-includes) + INCLUDES="-I${SRC_DIR}/testsuite/util" + echo ${INCLUDES} + ;; + --build-includes) + INCLUDES="-nostdinc++ @GLIBCXX_INCLUDES@ + -I${SRC_DIR}/include/backward -I${SRC_DIR}/testsuite/util" + echo ${INCLUDES} + ;; + --install-cxx) + CXX=${PREFIX_DIR}/bin/g++ + echo ${CXX} + ;; + --build-cxx) + CXX_build="@CXX@" + CXX=`echo "$CXX_build" | sed 's,gcc/xgcc ,gcc/g++ ,'` + echo ${CXX} + ;; + --cxxflags) + CXXFLAGS_save="-g -O2 -D_GLIBCXX_ASSERT" + 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_usage + ;; +esac + +exit 0 |