URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
Compare Revisions
- This comparison shows the changes necessary to convert path
/openrisc/trunk/gnu-stable/gcc-4.5.1/libstdc++-v3/python
- from Rev 816 to Rev 826
- ↔ Reverse comparison
Rev 816 → Rev 826
/Makefile.in
0,0 → 1,533
# Makefile.in generated by automake 1.11.1 from Makefile.am. |
# @configure_input@ |
|
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, |
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, |
# Inc. |
# This Makefile.in is free software; the Free Software Foundation |
# gives unlimited permission to copy and/or distribute it, |
# with or without modifications, as long as this notice is preserved. |
|
# This program is distributed in the hope that it will be useful, |
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without |
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A |
# PARTICULAR PURPOSE. |
|
@SET_MAKE@ |
|
VPATH = @srcdir@ |
pkgdatadir = $(datadir)/@PACKAGE@ |
pkgincludedir = $(includedir)/@PACKAGE@ |
pkglibdir = $(libdir)/@PACKAGE@ |
pkglibexecdir = $(libexecdir)/@PACKAGE@ |
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd |
install_sh_DATA = $(install_sh) -c -m 644 |
install_sh_PROGRAM = $(install_sh) -c |
install_sh_SCRIPT = $(install_sh) -c |
INSTALL_HEADER = $(INSTALL_DATA) |
transform = $(program_transform_name) |
NORMAL_INSTALL = : |
PRE_INSTALL = : |
POST_INSTALL = : |
NORMAL_UNINSTALL = : |
PRE_UNINSTALL = : |
POST_UNINSTALL = : |
build_triplet = @build@ |
host_triplet = @host@ |
target_triplet = @target@ |
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ |
$(top_srcdir)/fragment.am |
subdir = python |
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 |
am__aclocal_m4_deps = $(top_srcdir)/../config/enable.m4 \ |
$(top_srcdir)/../config/futex.m4 \ |
$(top_srcdir)/../config/iconv.m4 \ |
$(top_srcdir)/../config/lead-dot.m4 \ |
$(top_srcdir)/../config/lib-ld.m4 \ |
$(top_srcdir)/../config/lib-link.m4 \ |
$(top_srcdir)/../config/lib-prefix.m4 \ |
$(top_srcdir)/../config/multi.m4 \ |
$(top_srcdir)/../config/no-executables.m4 \ |
$(top_srcdir)/../config/override.m4 \ |
$(top_srcdir)/../config/stdint.m4 \ |
$(top_srcdir)/../config/unwind_ipinfo.m4 \ |
$(top_srcdir)/../libtool.m4 $(top_srcdir)/../ltoptions.m4 \ |
$(top_srcdir)/../ltsugar.m4 $(top_srcdir)/../ltversion.m4 \ |
$(top_srcdir)/../lt~obsolete.m4 $(top_srcdir)/crossconfig.m4 \ |
$(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \ |
$(top_srcdir)/../config/tls.m4 $(top_srcdir)/configure.ac |
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ |
$(ACLOCAL_M4) |
CONFIG_HEADER = $(top_builddir)/config.h |
CONFIG_CLEAN_FILES = |
CONFIG_CLEAN_VPATH_FILES = |
depcomp = |
am__depfiles_maybe = |
SOURCES = |
DIST_SOURCES = |
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; |
am__vpath_adj = case $$p in \ |
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ |
*) f=$$p;; \ |
esac; |
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; |
am__install_max = 40 |
am__nobase_strip_setup = \ |
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` |
am__nobase_strip = \ |
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" |
am__nobase_list = $(am__nobase_strip_setup); \ |
for p in $$list; do echo "$$p $$p"; done | \ |
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ |
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ |
if (++n[$$2] == $(am__install_max)) \ |
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ |
END { for (dir in files) print dir, files[dir] }' |
am__base_list = \ |
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ |
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' |
am__installdirs = "$(DESTDIR)$(pythondir)" |
DATA = $(nobase_python_DATA) |
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) |
ABI_TWEAKS_SRCDIR = @ABI_TWEAKS_SRCDIR@ |
ACLOCAL = @ACLOCAL@ |
ALLOCATOR_H = @ALLOCATOR_H@ |
ALLOCATOR_NAME = @ALLOCATOR_NAME@ |
AMTAR = @AMTAR@ |
AR = @AR@ |
AS = @AS@ |
ATOMICITY_SRCDIR = @ATOMICITY_SRCDIR@ |
ATOMIC_FLAGS = @ATOMIC_FLAGS@ |
ATOMIC_WORD_SRCDIR = @ATOMIC_WORD_SRCDIR@ |
AUTOCONF = @AUTOCONF@ |
AUTOHEADER = @AUTOHEADER@ |
AUTOMAKE = @AUTOMAKE@ |
AWK = @AWK@ |
BASIC_FILE_CC = @BASIC_FILE_CC@ |
BASIC_FILE_H = @BASIC_FILE_H@ |
CC = @CC@ |
CCODECVT_CC = @CCODECVT_CC@ |
CCOLLATE_CC = @CCOLLATE_CC@ |
CCTYPE_CC = @CCTYPE_CC@ |
CFLAGS = @CFLAGS@ |
CLOCALE_CC = @CLOCALE_CC@ |
CLOCALE_H = @CLOCALE_H@ |
CLOCALE_INTERNAL_H = @CLOCALE_INTERNAL_H@ |
CMESSAGES_CC = @CMESSAGES_CC@ |
CMESSAGES_H = @CMESSAGES_H@ |
CMONEY_CC = @CMONEY_CC@ |
CNUMERIC_CC = @CNUMERIC_CC@ |
CPP = @CPP@ |
CPPFLAGS = @CPPFLAGS@ |
CPU_DEFINES_SRCDIR = @CPU_DEFINES_SRCDIR@ |
CSTDIO_H = @CSTDIO_H@ |
CTIME_CC = @CTIME_CC@ |
CTIME_H = @CTIME_H@ |
CXX = @CXX@ |
CXXCPP = @CXXCPP@ |
CXXFLAGS = @CXXFLAGS@ |
CYGPATH_W = @CYGPATH_W@ |
C_INCLUDE_DIR = @C_INCLUDE_DIR@ |
DEBUG_FLAGS = @DEBUG_FLAGS@ |
DEFS = @DEFS@ |
DSYMUTIL = @DSYMUTIL@ |
DUMPBIN = @DUMPBIN@ |
ECHO_C = @ECHO_C@ |
ECHO_N = @ECHO_N@ |
ECHO_T = @ECHO_T@ |
EGREP = @EGREP@ |
ERROR_CONSTANTS_SRCDIR = @ERROR_CONSTANTS_SRCDIR@ |
EXEEXT = @EXEEXT@ |
EXTRA_CXX_FLAGS = @EXTRA_CXX_FLAGS@ |
FGREP = @FGREP@ |
GLIBCXX_INCLUDES = @GLIBCXX_INCLUDES@ |
GLIBCXX_LIBS = @GLIBCXX_LIBS@ |
GREP = @GREP@ |
INSTALL = @INSTALL@ |
INSTALL_DATA = @INSTALL_DATA@ |
INSTALL_PROGRAM = @INSTALL_PROGRAM@ |
INSTALL_SCRIPT = @INSTALL_SCRIPT@ |
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ |
LD = @LD@ |
LDFLAGS = @LDFLAGS@ |
LIBICONV = @LIBICONV@ |
LIBOBJS = @LIBOBJS@ |
LIBS = @LIBS@ |
LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@ |
LIBTOOL = @LIBTOOL@ |
LIPO = @LIPO@ |
LN_S = @LN_S@ |
LTLIBICONV = @LTLIBICONV@ |
LTLIBOBJS = @LTLIBOBJS@ |
MAINT = @MAINT@ |
MAKEINFO = @MAKEINFO@ |
MKDIR_P = @MKDIR_P@ |
NM = @NM@ |
NMEDIT = @NMEDIT@ |
OBJDUMP = @OBJDUMP@ |
OBJEXT = @OBJEXT@ |
OPTIMIZE_CXXFLAGS = @OPTIMIZE_CXXFLAGS@ |
OPT_LDFLAGS = @OPT_LDFLAGS@ |
OS_INC_SRCDIR = @OS_INC_SRCDIR@ |
OTOOL = @OTOOL@ |
OTOOL64 = @OTOOL64@ |
PACKAGE = @PACKAGE@ |
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ |
PACKAGE_NAME = @PACKAGE_NAME@ |
PACKAGE_STRING = @PACKAGE_STRING@ |
PACKAGE_TARNAME = @PACKAGE_TARNAME@ |
PACKAGE_URL = @PACKAGE_URL@ |
PACKAGE_VERSION = @PACKAGE_VERSION@ |
PATH_SEPARATOR = @PATH_SEPARATOR@ |
RANLIB = @RANLIB@ |
SECTION_FLAGS = @SECTION_FLAGS@ |
SECTION_LDFLAGS = @SECTION_LDFLAGS@ |
SED = @SED@ |
SET_MAKE = @SET_MAKE@ |
SHELL = @SHELL@ |
STRIP = @STRIP@ |
SYMVER_FILE = @SYMVER_FILE@ |
TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ |
USE_NLS = @USE_NLS@ |
VERSION = @VERSION@ |
WARN_FLAGS = @WARN_FLAGS@ |
WERROR = @WERROR@ |
abs_builddir = @abs_builddir@ |
abs_srcdir = @abs_srcdir@ |
abs_top_builddir = @abs_top_builddir@ |
abs_top_srcdir = @abs_top_srcdir@ |
ac_ct_CC = @ac_ct_CC@ |
ac_ct_CXX = @ac_ct_CXX@ |
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ |
am__leading_dot = @am__leading_dot@ |
am__tar = @am__tar@ |
am__untar = @am__untar@ |
baseline_dir = @baseline_dir@ |
bindir = @bindir@ |
build = @build@ |
build_alias = @build_alias@ |
build_cpu = @build_cpu@ |
build_os = @build_os@ |
build_vendor = @build_vendor@ |
builddir = @builddir@ |
check_msgfmt = @check_msgfmt@ |
datadir = @datadir@ |
datarootdir = @datarootdir@ |
docdir = @docdir@ |
dvidir = @dvidir@ |
enable_shared = @enable_shared@ |
enable_static = @enable_static@ |
exec_prefix = @exec_prefix@ |
glibcxx_MOFILES = @glibcxx_MOFILES@ |
glibcxx_PCHFLAGS = @glibcxx_PCHFLAGS@ |
glibcxx_POFILES = @glibcxx_POFILES@ |
glibcxx_builddir = @glibcxx_builddir@ |
glibcxx_localedir = @glibcxx_localedir@ |
glibcxx_prefixdir = @glibcxx_prefixdir@ |
glibcxx_srcdir = @glibcxx_srcdir@ |
glibcxx_thread_h = @glibcxx_thread_h@ |
glibcxx_toolexecdir = @glibcxx_toolexecdir@ |
glibcxx_toolexeclibdir = @glibcxx_toolexeclibdir@ |
gxx_include_dir = @gxx_include_dir@ |
host = @host@ |
host_alias = @host_alias@ |
host_cpu = @host_cpu@ |
host_os = @host_os@ |
host_vendor = @host_vendor@ |
htmldir = @htmldir@ |
includedir = @includedir@ |
infodir = @infodir@ |
install_sh = @install_sh@ |
libdir = @libdir@ |
libexecdir = @libexecdir@ |
libtool_VERSION = @libtool_VERSION@ |
localedir = @localedir@ |
localstatedir = @localstatedir@ |
mandir = @mandir@ |
mkdir_p = @mkdir_p@ |
multi_basedir = @multi_basedir@ |
oldincludedir = @oldincludedir@ |
pdfdir = @pdfdir@ |
port_specific_symbol_files = @port_specific_symbol_files@ |
prefix = @prefix@ |
program_transform_name = @program_transform_name@ |
psdir = @psdir@ |
sbindir = @sbindir@ |
sharedstatedir = @sharedstatedir@ |
srcdir = @srcdir@ |
sysconfdir = @sysconfdir@ |
target = @target@ |
target_alias = @target_alias@ |
target_cpu = @target_cpu@ |
target_os = @target_os@ |
target_vendor = @target_vendor@ |
top_build_prefix = @top_build_prefix@ |
top_builddir = @top_builddir@ |
top_srcdir = @top_srcdir@ |
toplevel_srcdir = @toplevel_srcdir@ |
|
# May be used by various substitution variables. |
gcc_version := $(shell cat $(top_srcdir)/../gcc/BASE-VER) |
MAINT_CHARSET = latin1 |
mkinstalldirs = $(SHELL) $(toplevel_srcdir)/mkinstalldirs |
PWD_COMMAND = $${PWDCMD-pwd} |
STAMP = echo timestamp > |
toolexecdir = $(glibcxx_toolexecdir) |
toolexeclibdir = $(glibcxx_toolexeclibdir) |
|
# These bits are all figured out from configure. Look in acinclude.m4 |
# or configure.ac to see how they are set. See GLIBCXX_EXPORT_FLAGS. |
CONFIG_CXXFLAGS = \ |
$(SECTION_FLAGS) $(EXTRA_CXX_FLAGS) |
|
WARN_CXXFLAGS = \ |
$(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once |
|
|
# -I/-D flags to pass when compiling. |
AM_CPPFLAGS = $(GLIBCXX_INCLUDES) |
pythondir = $(datadir)/gcc-$(gcc_version)/python |
nobase_python_DATA = \ |
libstdcxx/v6/printers.py \ |
libstdcxx/v6/__init__.py \ |
libstdcxx/__init__.py |
|
all: all-am |
|
.SUFFIXES: |
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/fragment.am $(am__configure_deps) |
@for dep in $?; do \ |
case '$(am__configure_deps)' in \ |
*$$dep*) \ |
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ |
&& { if test -f $@; then exit 0; else break; fi; }; \ |
exit 1;; \ |
esac; \ |
done; \ |
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign --ignore-deps python/Makefile'; \ |
$(am__cd) $(top_srcdir) && \ |
$(AUTOMAKE) --foreign --ignore-deps python/Makefile |
.PRECIOUS: Makefile |
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status |
@case '$?' in \ |
*config.status*) \ |
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ |
*) \ |
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ |
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ |
esac; |
|
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) |
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh |
|
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) |
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh |
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) |
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh |
$(am__aclocal_m4_deps): |
|
mostlyclean-libtool: |
-rm -f *.lo |
|
clean-libtool: |
-rm -rf .libs _libs |
install-nobase_pythonDATA: $(nobase_python_DATA) |
@$(NORMAL_INSTALL) |
test -z "$(pythondir)" || $(MKDIR_P) "$(DESTDIR)$(pythondir)" |
@list='$(nobase_python_DATA)'; test -n "$(pythondir)" || list=; \ |
$(am__nobase_list) | while read dir files; do \ |
xfiles=; for file in $$files; do \ |
if test -f "$$file"; then xfiles="$$xfiles $$file"; \ |
else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ |
test -z "$$xfiles" || { \ |
test "x$$dir" = x. || { \ |
echo "$(MKDIR_P) '$(DESTDIR)$(pythondir)/$$dir'"; \ |
$(MKDIR_P) "$(DESTDIR)$(pythondir)/$$dir"; }; \ |
echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pythondir)/$$dir'"; \ |
$(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pythondir)/$$dir" || exit $$?; }; \ |
done |
|
uninstall-nobase_pythonDATA: |
@$(NORMAL_UNINSTALL) |
@list='$(nobase_python_DATA)'; test -n "$(pythondir)" || list=; \ |
$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ |
test -n "$$files" || exit 0; \ |
echo " ( cd '$(DESTDIR)$(pythondir)' && rm -f" $$files ")"; \ |
cd "$(DESTDIR)$(pythondir)" && rm -f $$files |
tags: TAGS |
TAGS: |
|
ctags: CTAGS |
CTAGS: |
|
|
distdir: $(DISTFILES) |
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ |
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ |
list='$(DISTFILES)'; \ |
dist_files=`for file in $$list; do echo $$file; done | \ |
sed -e "s|^$$srcdirstrip/||;t" \ |
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ |
case $$dist_files in \ |
*/*) $(MKDIR_P) `echo "$$dist_files" | \ |
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ |
sort -u` ;; \ |
esac; \ |
for file in $$dist_files; do \ |
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ |
if test -d $$d/$$file; then \ |
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ |
if test -d "$(distdir)/$$file"; then \ |
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ |
fi; \ |
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ |
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ |
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ |
fi; \ |
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ |
else \ |
test -f "$(distdir)/$$file" \ |
|| cp -p $$d/$$file "$(distdir)/$$file" \ |
|| exit 1; \ |
fi; \ |
done |
check-am: all-am |
check: check-am |
all-am: Makefile $(DATA) all-local |
installdirs: |
for dir in "$(DESTDIR)$(pythondir)"; do \ |
test -z "$$dir" || $(MKDIR_P) "$$dir"; \ |
done |
install: install-am |
install-exec: install-exec-am |
install-data: install-data-am |
uninstall: uninstall-am |
|
install-am: all-am |
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am |
|
installcheck: installcheck-am |
install-strip: |
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ |
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ |
`test -z '$(STRIP)' || \ |
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install |
mostlyclean-generic: |
|
clean-generic: |
|
distclean-generic: |
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) |
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) |
|
maintainer-clean-generic: |
@echo "This command is intended for maintainers to use" |
@echo "it deletes files that may require special tools to rebuild." |
clean: clean-am |
|
clean-am: clean-generic clean-libtool mostlyclean-am |
|
distclean: distclean-am |
-rm -f Makefile |
distclean-am: clean-am distclean-generic |
|
dvi: dvi-am |
|
dvi-am: |
|
html: html-am |
|
html-am: |
|
info: info-am |
|
info-am: |
|
install-data-am: install-data-local install-nobase_pythonDATA |
|
install-dvi: install-dvi-am |
|
install-dvi-am: |
|
install-exec-am: |
|
install-html: install-html-am |
|
install-html-am: |
|
install-info: install-info-am |
|
install-info-am: |
|
install-man: |
|
install-pdf: install-pdf-am |
|
install-pdf-am: |
|
install-ps: install-ps-am |
|
install-ps-am: |
|
installcheck-am: |
|
maintainer-clean: maintainer-clean-am |
-rm -f Makefile |
maintainer-clean-am: distclean-am maintainer-clean-generic |
|
mostlyclean: mostlyclean-am |
|
mostlyclean-am: mostlyclean-generic mostlyclean-libtool |
|
pdf: pdf-am |
|
pdf-am: |
|
ps: ps-am |
|
ps-am: |
|
uninstall-am: uninstall-nobase_pythonDATA |
|
.MAKE: install-am install-strip |
|
.PHONY: all all-am all-local check check-am clean clean-generic \ |
clean-libtool distclean distclean-generic distclean-libtool \ |
distdir dvi dvi-am html html-am info info-am install \ |
install-am install-data install-data-am install-data-local \ |
install-dvi install-dvi-am install-exec install-exec-am \ |
install-html install-html-am install-info install-info-am \ |
install-man install-nobase_pythonDATA install-pdf \ |
install-pdf-am install-ps install-ps-am install-strip \ |
installcheck installcheck-am installdirs maintainer-clean \ |
maintainer-clean-generic mostlyclean mostlyclean-generic \ |
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ |
uninstall-nobase_pythonDATA |
|
|
all-local: gdb.py |
|
gdb.py: hook.in Makefile |
sed -e 's,@pythondir@,$(pythondir),' \ |
-e 's,@toolexeclibdir@,$(toolexeclibdir),' < $(srcdir)/hook.in > $@ |
|
install-data-local: gdb.py |
@$(mkdir_p) $(DESTDIR)$(toolexeclibdir) |
@here=`pwd`; cd $(DESTDIR)$(toolexeclibdir); \ |
for file in libstdc++*; do \ |
case $$file in \ |
*-gdb.py) ;; \ |
*.la) ;; \ |
*) if test -h $$file; then \ |
continue; \ |
fi; \ |
libname=$$file;; \ |
esac; \ |
done; \ |
cd $$here; \ |
echo " $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py"; \ |
$(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py |
|
# Tell versions [3.59,3.63) of GNU make to not export all variables. |
# Otherwise a system limit (for SysV at least) may be exceeded. |
.NOEXPORT: |
/libstdcxx/__init__.py
0,0 → 1,533
|
/libstdcxx/v6/__init__.py
0,0 → 1,533
|
/libstdcxx/v6/printers.py
0,0 → 1,763
# Pretty-printers for libstc++. |
|
# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
|
# This program 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 3 of the License, or |
# (at your option) any later version. |
# |
# This program 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 program. If not, see <http://www.gnu.org/licenses/>. |
|
import gdb |
import itertools |
import re |
|
class StdPointerPrinter: |
"Print a smart pointer of some kind" |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
if self.val['_M_refcount']['_M_pi'] == 0: |
return '%s (empty) %s' % (self.typename, self.val['_M_ptr']) |
return '%s (count %d) %s' % (self.typename, |
self.val['_M_refcount']['_M_pi']['_M_use_count'], |
self.val['_M_ptr']) |
|
class UniquePointerPrinter: |
"Print a unique_ptr" |
|
def __init__ (self, val): |
self.val = val |
|
def to_string (self): |
return self.val['_M_t'] |
|
class StdListPrinter: |
"Print a std::list" |
|
class _iterator: |
def __init__(self, nodetype, head): |
self.nodetype = nodetype |
self.base = head['_M_next'] |
self.head = head.address |
self.count = 0 |
|
def __iter__(self): |
return self |
|
def next(self): |
if self.base == self.head: |
raise StopIteration |
elt = self.base.cast(self.nodetype).dereference() |
self.base = elt['_M_next'] |
count = self.count |
self.count = self.count + 1 |
return ('[%d]' % count, elt['_M_data']) |
|
def __init__(self, typename, val): |
self.typename = typename |
self.val = val |
|
def children(self): |
itype = self.val.type.template_argument(0) |
# If the inferior program is compiled with -D_GLIBCXX_DEBUG |
# some of the internal implementation details change. |
if self.typename == "std::list": |
nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer() |
elif self.typename == "std::__debug::list": |
nodetype = gdb.lookup_type('std::__norm::_List_node<%s>' % itype).pointer() |
else: |
raise ValueError, "Cannot cast list node for list printer." |
return self._iterator(nodetype, self.val['_M_impl']['_M_node']) |
|
def to_string(self): |
if self.val['_M_impl']['_M_node'].address == self.val['_M_impl']['_M_node']['_M_next']: |
return 'empty %s' % (self.typename) |
return '%s' % (self.typename) |
|
class StdListIteratorPrinter: |
"Print std::list::iterator" |
|
def __init__(self, typename, val): |
self.val = val |
self.typename = typename |
|
def to_string(self): |
itype = self.val.type.template_argument(0) |
# If the inferior program is compiled with -D_GLIBCXX_DEBUG |
# some of the internal implementation details change. |
if self.typename == "std::_List_iterator" or self.typename == "std::_List_const_iterator": |
nodetype = gdb.lookup_type('std::_List_node<%s>' % itype).pointer() |
elif self.typename == "std::__norm::_List_iterator" or self.typename == "std::__norm::_List_const_iterator": |
nodetype = gdb.lookup_type('std::__norm::_List_node<%s>' % itype).pointer() |
else: |
raise ValueError, "Cannot cast list node for list iterator printer." |
return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] |
|
class StdSlistPrinter: |
"Print a __gnu_cxx::slist" |
|
class _iterator: |
def __init__(self, nodetype, head): |
self.nodetype = nodetype |
self.base = head['_M_head']['_M_next'] |
self.count = 0 |
|
def __iter__(self): |
return self |
|
def next(self): |
if self.base == 0: |
raise StopIteration |
elt = self.base.cast(self.nodetype).dereference() |
self.base = elt['_M_next'] |
count = self.count |
self.count = self.count + 1 |
return ('[%d]' % count, elt['_M_data']) |
|
def __init__(self, val): |
self.val = val |
|
def children(self): |
itype = self.val.type.template_argument(0) |
nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer() |
return self._iterator(nodetype, self.val) |
|
def to_string(self): |
if self.val['_M_head']['_M_next'] == 0: |
return 'empty __gnu_cxx::slist' |
return '__gnu_cxx::slist' |
|
class StdSlistIteratorPrinter: |
"Print __gnu_cxx::slist::iterator" |
|
def __init__(self, val): |
self.val = val |
|
def to_string(self): |
itype = self.val.type.template_argument(0) |
nodetype = gdb.lookup_type('__gnu_cxx::_Slist_node<%s>' % itype).pointer() |
return self.val['_M_node'].cast(nodetype).dereference()['_M_data'] |
|
class StdVectorPrinter: |
"Print a std::vector" |
|
class _iterator: |
def __init__ (self, start, finish): |
self.item = start |
self.finish = finish |
self.count = 0 |
|
def __iter__(self): |
return self |
|
def next(self): |
if self.item == self.finish: |
raise StopIteration |
count = self.count |
self.count = self.count + 1 |
elt = self.item.dereference() |
self.item = self.item + 1 |
return ('[%d]' % count, elt) |
|
def __init__(self, typename, val): |
self.typename = typename |
self.val = val |
|
def children(self): |
return self._iterator(self.val['_M_impl']['_M_start'], |
self.val['_M_impl']['_M_finish']) |
|
def to_string(self): |
start = self.val['_M_impl']['_M_start'] |
finish = self.val['_M_impl']['_M_finish'] |
end = self.val['_M_impl']['_M_end_of_storage'] |
return ('%s of length %d, capacity %d' |
% (self.typename, int (finish - start), int (end - start))) |
|
def display_hint(self): |
return 'array' |
|
class StdVectorIteratorPrinter: |
"Print std::vector::iterator" |
|
def __init__(self, val): |
self.val = val |
|
def to_string(self): |
return self.val['_M_current'].dereference() |
|
class StdTuplePrinter: |
"Print a std::tuple" |
|
class _iterator: |
def __init__ (self, head): |
self.head = head |
|
# Set the base class as the initial head of the |
# tuple. |
nodes = self.head.type.fields () |
if len (nodes) != 1: |
raise ValueError, "Top of tuple tree does not consist of a single node." |
|
# Set the actual head to the first pair. |
self.head = self.head.cast (nodes[0].type) |
self.count = 0 |
|
def __iter__ (self): |
return self |
|
def next (self): |
nodes = self.head.type.fields () |
# Check for further recursions in the inheritance tree. |
if len (nodes) == 0: |
raise StopIteration |
# Check that this iteration has an expected structure. |
if len (nodes) != 2: |
raise ValueError, "Cannot parse more than 2 nodes in a tuple tree." |
|
# - Left node is the next recursion parent. |
# - Right node is the actual class contained in the tuple. |
|
# Process right node. |
impl = self.head.cast (nodes[1].type) |
|
# Process left node and set it as head. |
self.head = self.head.cast (nodes[0].type) |
self.count = self.count + 1 |
|
# Finally, check the implementation. If it is |
# wrapped in _M_head_impl return that, otherwise return |
# the value "as is". |
fields = impl.type.fields () |
if len (fields) < 1 or fields[0].name != "_M_head_impl": |
return ('[%d]' % self.count, impl) |
else: |
return ('[%d]' % self.count, impl['_M_head_impl']) |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val; |
|
def children (self): |
return self._iterator (self.val) |
|
def to_string (self): |
return '%s containing' % (self.typename) |
|
class StdStackOrQueuePrinter: |
"Print a std::stack or std::queue" |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.visualizer = gdb.default_visualizer(val['c']) |
|
def children (self): |
return self.visualizer.children() |
|
def to_string (self): |
return '%s wrapping: %s' % (self.typename, |
self.visualizer.to_string()) |
|
def display_hint (self): |
if hasattr (self.visualizer, 'display_hint'): |
return self.visualizer.display_hint () |
return None |
|
class RbtreeIterator: |
def __init__(self, rbtree): |
self.size = rbtree['_M_t']['_M_impl']['_M_node_count'] |
self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left'] |
self.count = 0 |
|
def __iter__(self): |
return self |
|
def __len__(self): |
return int (self.size) |
|
def next(self): |
if self.count == self.size: |
raise StopIteration |
result = self.node |
self.count = self.count + 1 |
if self.count < self.size: |
# Compute the next node. |
node = self.node |
if node.dereference()['_M_right']: |
node = node.dereference()['_M_right'] |
while node.dereference()['_M_left']: |
node = node.dereference()['_M_left'] |
else: |
parent = node.dereference()['_M_parent'] |
while node == parent.dereference()['_M_right']: |
node = parent |
parent = parent.dereference()['_M_parent'] |
if node.dereference()['_M_right'] != parent: |
node = parent |
self.node = node |
return result |
|
# This is a pretty printer for std::_Rb_tree_iterator (which is |
# std::map::iterator), and has nothing to do with the RbtreeIterator |
# class above. |
class StdRbtreeIteratorPrinter: |
"Print std::map::iterator" |
|
def __init__ (self, val): |
self.val = val |
|
def to_string (self): |
valuetype = self.val.type.template_argument(0) |
nodetype = gdb.lookup_type('std::_Rb_tree_node < %s >' % valuetype) |
nodetype = nodetype.pointer() |
return self.val.cast(nodetype).dereference()['_M_value_field'] |
|
class StdDebugIteratorPrinter: |
"Print a debug enabled version of an iterator" |
|
def __init__ (self, val): |
self.val = val |
|
# Just strip away the encapsulating __gnu_debug::_Safe_iterator |
# and return the wrapped iterator value. |
def to_string (self): |
itype = self.val.type.template_argument(0) |
return self.val['_M_current'].cast(itype) |
|
class StdMapPrinter: |
"Print a std::map or std::multimap" |
|
# Turn an RbtreeIterator into a pretty-print iterator. |
class _iter: |
def __init__(self, rbiter, type): |
self.rbiter = rbiter |
self.count = 0 |
self.type = type |
|
def __iter__(self): |
return self |
|
def next(self): |
if self.count % 2 == 0: |
n = self.rbiter.next() |
n = n.cast(self.type).dereference()['_M_value_field'] |
self.pair = n |
item = n['first'] |
else: |
item = self.pair['second'] |
result = ('[%d]' % self.count, item) |
self.count = self.count + 1 |
return result |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
return '%s with %d elements' % (self.typename, |
len (RbtreeIterator (self.val))) |
|
def children (self): |
keytype = self.val.type.template_argument(0).const() |
valuetype = self.val.type.template_argument(1) |
nodetype = gdb.lookup_type('std::_Rb_tree_node< std::pair< %s, %s > >' % (keytype, valuetype)) |
nodetype = nodetype.pointer() |
return self._iter (RbtreeIterator (self.val), nodetype) |
|
def display_hint (self): |
return 'map' |
|
class StdSetPrinter: |
"Print a std::set or std::multiset" |
|
# Turn an RbtreeIterator into a pretty-print iterator. |
class _iter: |
def __init__(self, rbiter, type): |
self.rbiter = rbiter |
self.count = 0 |
self.type = type |
|
def __iter__(self): |
return self |
|
def next(self): |
item = self.rbiter.next() |
item = item.cast(self.type).dereference()['_M_value_field'] |
# FIXME: this is weird ... what to do? |
# Maybe a 'set' display hint? |
result = ('[%d]' % self.count, item) |
self.count = self.count + 1 |
return result |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
return '%s with %d elements' % (self.typename, |
len (RbtreeIterator (self.val))) |
|
def children (self): |
keytype = self.val.type.template_argument(0) |
nodetype = gdb.lookup_type('std::_Rb_tree_node< %s >' % keytype).pointer() |
return self._iter (RbtreeIterator (self.val), nodetype) |
|
class StdBitsetPrinter: |
"Print a std::bitset" |
|
def __init__(self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
# If template_argument handled values, we could print the |
# size. Or we could use a regexp on the type. |
return '%s' % (self.typename) |
|
def children (self): |
words = self.val['_M_w'] |
wtype = words.type |
|
# The _M_w member can be either an unsigned long, or an |
# array. This depends on the template specialization used. |
# If it is a single long, convert to a single element list. |
if wtype.code == gdb.TYPE_CODE_ARRAY: |
tsize = wtype.target ().sizeof |
else: |
words = [words] |
tsize = wtype.sizeof |
|
nwords = wtype.sizeof / tsize |
result = [] |
byte = 0 |
while byte < nwords: |
w = words[byte] |
bit = 0 |
while w != 0: |
if (w & 1) != 0: |
# Another spot where we could use 'set'? |
result.append(('[%d]' % (byte * tsize * 8 + bit), 1)) |
bit = bit + 1 |
w = w >> 1 |
byte = byte + 1 |
return result |
|
class StdDequePrinter: |
"Print a std::deque" |
|
class _iter: |
def __init__(self, node, start, end, last, buffer_size): |
self.node = node |
self.p = start |
self.end = end |
self.last = last |
self.buffer_size = buffer_size |
self.count = 0 |
|
def __iter__(self): |
return self |
|
def next(self): |
if self.p == self.last: |
raise StopIteration |
|
result = ('[%d]' % self.count, self.p.dereference()) |
self.count = self.count + 1 |
|
# Advance the 'cur' pointer. |
self.p = self.p + 1 |
if self.p == self.end: |
# If we got to the end of this bucket, move to the |
# next bucket. |
self.node = self.node + 1 |
self.p = self.node[0] |
self.end = self.p + self.buffer_size |
|
return result |
|
def __init__(self, typename, val): |
self.typename = typename |
self.val = val |
self.elttype = val.type.template_argument(0) |
size = self.elttype.sizeof |
if size < 512: |
self.buffer_size = int (512 / size) |
else: |
self.buffer_size = 1 |
|
def to_string(self): |
start = self.val['_M_impl']['_M_start'] |
end = self.val['_M_impl']['_M_finish'] |
|
delta_n = end['_M_node'] - start['_M_node'] - 1 |
delta_s = start['_M_last'] - start['_M_cur'] |
delta_e = end['_M_cur'] - end['_M_first'] |
|
size = self.buffer_size * delta_n + delta_s + delta_e |
|
return '%s with %d elements' % (self.typename, long (size)) |
|
def children(self): |
start = self.val['_M_impl']['_M_start'] |
end = self.val['_M_impl']['_M_finish'] |
return self._iter(start['_M_node'], start['_M_cur'], start['_M_last'], |
end['_M_cur'], self.buffer_size) |
|
def display_hint (self): |
return 'array' |
|
class StdDequeIteratorPrinter: |
"Print std::deque::iterator" |
|
def __init__(self, val): |
self.val = val |
|
def to_string(self): |
return self.val['_M_cur'].dereference() |
|
class StdStringPrinter: |
"Print a std::basic_string of some kind" |
|
def __init__(self, val): |
self.val = val |
|
def to_string(self): |
# Make sure &string works, too. |
type = self.val.type |
if type.code == gdb.TYPE_CODE_REF: |
type = type.target () |
|
# Calculate the length of the string so that to_string returns |
# the string according to length, not according to first null |
# encountered. |
ptr = self.val ['_M_dataplus']['_M_p'] |
realtype = type.unqualified ().strip_typedefs () |
reptype = gdb.lookup_type (str (realtype) + '::_Rep').pointer () |
header = ptr.cast(reptype) - 1 |
len = header.dereference ()['_M_length'] |
return self.val['_M_dataplus']['_M_p'].lazy_string (length = len) |
|
def display_hint (self): |
return 'string' |
|
class Tr1HashtableIterator: |
def __init__ (self, hash): |
self.count = 0 |
self.n_buckets = hash['_M_element_count'] |
if self.n_buckets == 0: |
self.node = False |
else: |
self.bucket = hash['_M_buckets'] |
self.node = self.bucket[0] |
self.update () |
|
def __iter__ (self): |
return self |
|
def update (self): |
# If we advanced off the end of the chain, move to the next |
# bucket. |
while self.node == 0: |
self.bucket = self.bucket + 1 |
self.node = self.bucket[0] |
|
# If we advanced off the end of the bucket array, then |
# we're done. |
if self.count == self.n_buckets: |
self.node = False |
else: |
self.count = self.count + 1 |
|
def next (self): |
if not self.node: |
raise StopIteration |
result = self.node.dereference()['_M_v'] |
self.node = self.node.dereference()['_M_next'] |
self.update () |
return result |
|
class Tr1UnorderedSetPrinter: |
"Print a tr1::unordered_set" |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
return '%s with %d elements' % (self.typename, self.val['_M_element_count']) |
|
@staticmethod |
def format_count (i): |
return '[%d]' % i |
|
def children (self): |
counter = itertools.imap (self.format_count, itertools.count()) |
return itertools.izip (counter, Tr1HashtableIterator (self.val)) |
|
class Tr1UnorderedMapPrinter: |
"Print a tr1::unordered_map" |
|
def __init__ (self, typename, val): |
self.typename = typename |
self.val = val |
|
def to_string (self): |
return '%s with %d elements' % (self.typename, self.val['_M_element_count']) |
|
@staticmethod |
def flatten (list): |
for elt in list: |
for i in elt: |
yield i |
|
@staticmethod |
def format_one (elt): |
return (elt['first'], elt['second']) |
|
@staticmethod |
def format_count (i): |
return '[%d]' % i |
|
def children (self): |
counter = itertools.imap (self.format_count, itertools.count()) |
# Map over the hash table and flatten the result. |
data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.val))) |
# Zip the two iterators together. |
return itertools.izip (counter, data) |
|
def display_hint (self): |
return 'map' |
|
def register_libstdcxx_printers (obj): |
"Register libstdc++ pretty-printers with objfile Obj." |
|
if obj == None: |
obj = gdb |
|
obj.pretty_printers.append (lookup_function) |
|
def lookup_function (val): |
"Look-up and return a pretty-printer that can print val." |
|
# Get the type. |
type = val.type |
|
# If it points to a reference, get the reference. |
if type.code == gdb.TYPE_CODE_REF: |
type = type.target () |
|
# Get the unqualified type, stripped of typedefs. |
type = type.unqualified ().strip_typedefs () |
|
# Get the type name. |
typename = type.tag |
if typename == None: |
return None |
|
# Iterate over local dictionary of types to determine |
# if a printer is registered for that type. Return an |
# instantiation of the printer if found. |
for function in pretty_printers_dict: |
if function.search (typename): |
return pretty_printers_dict[function] (val) |
|
# Cannot find a pretty printer. Return None. |
return None |
|
def build_libstdcxx_dictionary (): |
# libstdc++ objects requiring pretty-printing. |
# In order from: |
# http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01847.html |
pretty_printers_dict[re.compile('^std::basic_string<.*>$')] = lambda val: StdStringPrinter(val) |
pretty_printers_dict[re.compile('^std::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::bitset", val) |
pretty_printers_dict[re.compile('^std::deque<.*>$')] = lambda val: StdDequePrinter("std::deque", val) |
pretty_printers_dict[re.compile('^std::list<.*>$')] = lambda val: StdListPrinter("std::list", val) |
pretty_printers_dict[re.compile('^std::map<.*>$')] = lambda val: StdMapPrinter("std::map", val) |
pretty_printers_dict[re.compile('^std::multimap<.*>$')] = lambda val: StdMapPrinter("std::multimap", val) |
pretty_printers_dict[re.compile('^std::multiset<.*>$')] = lambda val: StdSetPrinter("std::multiset", val) |
pretty_printers_dict[re.compile('^std::priority_queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::priority_queue", val) |
pretty_printers_dict[re.compile('^std::queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::queue", val) |
pretty_printers_dict[re.compile('^std::tuple<.*>$')] = lambda val: StdTuplePrinter("std::tuple", val) |
pretty_printers_dict[re.compile('^std::set<.*>$')] = lambda val: StdSetPrinter("std::set", val) |
pretty_printers_dict[re.compile('^std::stack<.*>$')] = lambda val: StdStackOrQueuePrinter("std::stack", val) |
pretty_printers_dict[re.compile('^std::unique_ptr<.*>$')] = UniquePointerPrinter |
pretty_printers_dict[re.compile('^std::vector<.*>$')] = lambda val: StdVectorPrinter("std::vector", val) |
# vector<bool> |
|
# Printer registrations for classes compiled with -D_GLIBCXX_DEBUG. |
pretty_printers_dict[re.compile('^std::__debug::bitset<.*>$')] = lambda val: StdBitsetPrinter("std::__debug::bitset", val) |
pretty_printers_dict[re.compile('^std::__debug::deque<.*>$')] = lambda val: StdDequePrinter("std::__debug::deque", val) |
pretty_printers_dict[re.compile('^std::__debug::list<.*>$')] = lambda val: StdListPrinter("std::__debug::list", val) |
pretty_printers_dict[re.compile('^std::__debug::map<.*>$')] = lambda val: StdMapPrinter("std::__debug::map", val) |
pretty_printers_dict[re.compile('^std::__debug::multimap<.*>$')] = lambda val: StdMapPrinter("std::__debug::multimap", val) |
pretty_printers_dict[re.compile('^std::__debug::multiset<.*>$')] = lambda val: StdSetPrinter("std::__debug::multiset", val) |
pretty_printers_dict[re.compile('^std::__debug::priority_queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::priority_queue", val) |
pretty_printers_dict[re.compile('^std::__debug::queue<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::queue", val) |
pretty_printers_dict[re.compile('^std::__debug::set<.*>$')] = lambda val: StdSetPrinter("std::__debug::set", val) |
pretty_printers_dict[re.compile('^std::__debug::stack<.*>$')] = lambda val: StdStackOrQueuePrinter("std::__debug::stack", val) |
pretty_printers_dict[re.compile('^std::__debug::unique_ptr<.*>$')] = UniquePointerPrinter |
pretty_printers_dict[re.compile('^std::__debug::vector<.*>$')] = lambda val: StdVectorPrinter("std::__debug::vector", val) |
|
# These are the TR1 and C++0x printers. |
# For array - the default GDB pretty-printer seems reasonable. |
pretty_printers_dict[re.compile('^std::shared_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::shared_ptr', val) |
pretty_printers_dict[re.compile('^std::weak_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::weak_ptr', val) |
pretty_printers_dict[re.compile('^std::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::unordered_map', val) |
pretty_printers_dict[re.compile('^std::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::unordered_set', val) |
pretty_printers_dict[re.compile('^std::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::unordered_multimap', val) |
pretty_printers_dict[re.compile('^std::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::unordered_multiset', val) |
|
pretty_printers_dict[re.compile('^std::tr1::shared_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::tr1::shared_ptr', val) |
pretty_printers_dict[re.compile('^std::tr1::weak_ptr<.*>$')] = lambda val: StdPointerPrinter ('std::tr1::weak_ptr', val) |
pretty_printers_dict[re.compile('^std::tr1::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_map', val) |
pretty_printers_dict[re.compile('^std::tr1::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_set', val) |
pretty_printers_dict[re.compile('^std::tr1::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::tr1::unordered_multimap', val) |
pretty_printers_dict[re.compile('^std::tr1::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::tr1::unordered_multiset', val) |
|
# These are the C++0x printer registrations for -D_GLIBCXX_DEBUG cases. |
# The tr1 namespace printers do not seem to have any debug |
# equivalents, so do no register them. |
pretty_printers_dict[re.compile('^std::__debug::unordered_map<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::__debug::unordered_map', val) |
pretty_printers_dict[re.compile('^std::__debug::unordered_set<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::__debug::unordered_set', val) |
pretty_printers_dict[re.compile('^std::__debug::unordered_multimap<.*>$')] = lambda val: Tr1UnorderedMapPrinter ('std::__debug::unordered_multimap', val) |
pretty_printers_dict[re.compile('^std::__debug::unordered_multiset<.*>$')] = lambda val: Tr1UnorderedSetPrinter ('std::__debug:unordered_multiset', val) |
|
|
# Extensions. |
pretty_printers_dict[re.compile('^__gnu_cxx::slist<.*>$')] = StdSlistPrinter |
|
if True: |
# These shouldn't be necessary, if GDB "print *i" worked. |
# But it often doesn't, so here they are. |
pretty_printers_dict[re.compile('^std::_List_iterator<.*>$')] = lambda val: StdListIteratorPrinter("std::_List_iterator",val) |
pretty_printers_dict[re.compile('^std::_List_const_iterator<.*>$')] = lambda val: StdListIteratorPrinter("std::_List_const_iterator",val) |
pretty_printers_dict[re.compile('^std::_Rb_tree_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val) |
pretty_printers_dict[re.compile('^std::_Rb_tree_const_iterator<.*>$')] = lambda val: StdRbtreeIteratorPrinter(val) |
pretty_printers_dict[re.compile('^std::_Deque_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) |
pretty_printers_dict[re.compile('^std::_Deque_const_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) |
pretty_printers_dict[re.compile('^__gnu_cxx::__normal_iterator<.*>$')] = lambda val: StdVectorIteratorPrinter(val) |
pretty_printers_dict[re.compile('^__gnu_cxx::_Slist_iterator<.*>$')] = lambda val: StdSlistIteratorPrinter(val) |
|
# Debug (compiled with -D_GLIBCXX_DEBUG) printer registrations. |
# The Rb_tree debug iterator when unwrapped from the encapsulating __gnu_debug::_Safe_iterator |
# does not have the __norm namespace. Just use the existing printer registration for that. |
pretty_printers_dict[re.compile('^__gnu_debug::_Safe_iterator<.*>$')] = lambda val: StdDebugIteratorPrinter(val) |
pretty_printers_dict[re.compile('^std::__norm::_List_iterator<.*>$')] = lambda val: StdListIteratorPrinter ("std::__norm::_List_iterator",val) |
pretty_printers_dict[re.compile('^std::__norm::_List_const_iterator<.*>$')] = lambda val: StdListIteratorPrinter ("std::__norm::_List_const_iterator",val) |
pretty_printers_dict[re.compile('^std::__norm::_Deque_const_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) |
pretty_printers_dict[re.compile('^std::__norm::_Deque_iterator<.*>$')] = lambda val: StdDequeIteratorPrinter(val) |
|
pretty_printers_dict = {} |
|
build_libstdcxx_dictionary () |
/hook.in
0,0 → 1,60
# -*- python -*- |
# Copyright (C) 2009 Free Software Foundation, Inc. |
|
# This program 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 3 of the License, or |
# (at your option) any later version. |
# |
# This program 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 program. If not, see <http://www.gnu.org/licenses/>. |
|
import sys |
import gdb |
import os |
import os.path |
|
pythondir = '@pythondir@' |
libdir = '@toolexeclibdir@' |
|
# This file might be loaded when there is no current objfile. This |
# can happen if the user loads it manually. In this case we don't |
# update sys.path; instead we just hope the user managed to do that |
# beforehand. |
if gdb.current_objfile () is not None: |
# Update module path. We want to find the relative path from libdir |
# to pythondir, and then we want to apply that relative path to the |
# directory holding the objfile with which this file is associated. |
# This preserves relocatability of the gcc tree. |
|
# Do a simple normalization that removes duplicate separators. |
pythondir = os.path.normpath (pythondir) |
libdir = os.path.normpath (libdir) |
|
prefix = os.path.commonprefix ([libdir, pythondir]) |
# In some bizarre configuration we might have found a match in the |
# middle of a directory name. |
if prefix[-1] != '/': |
prefix = os.path.dirname (prefix) + '/' |
|
# Strip off the prefix. |
pythondir = pythondir[len (prefix):] |
libdir = libdir[len (prefix):] |
|
# Compute the ".."s needed to get from libdir to the prefix. |
dotdots = ('..' + os.sep) * len (libdir.split (os.sep)) |
|
objfile = gdb.current_objfile ().filename |
dir = os.path.join (os.path.dirname (objfile), dotdots, pythondir) |
|
if not dir in sys.path: |
sys.path.insert(0, dir) |
|
# Load the pretty-printers. |
from libstdcxx.v6.printers import register_libstdcxx_printers |
register_libstdcxx_printers (gdb.current_objfile ()) |
/Makefile.am
0,0 → 1,60
## Makefile for the python subdirectory of the GNU C++ Standard library. |
## |
## Copyright (C) 2009 Free Software Foundation, Inc. |
## |
## This file is part of the libstdc++ version 3 distribution. |
## Process this file with automake to produce Makefile.in. |
|
## 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. |
|
include $(top_srcdir)/fragment.am |
|
## Where to install the module code. |
pythondir = $(datadir)/gcc-$(gcc_version)/python |
|
all-local: gdb.py |
|
nobase_python_DATA = \ |
libstdcxx/v6/printers.py \ |
libstdcxx/v6/__init__.py \ |
libstdcxx/__init__.py |
|
gdb.py: hook.in Makefile |
sed -e 's,@pythondir@,$(pythondir),' \ |
-e 's,@toolexeclibdir@,$(toolexeclibdir),' < $(srcdir)/hook.in > $@ |
|
install-data-local: gdb.py |
@$(mkdir_p) $(DESTDIR)$(toolexeclibdir) |
## We want to install gdb.py as SOMETHING-gdb.py. SOMETHING is the |
## full name of the final library. We want to ignore symlinks, the |
## .la file, and any previous -gdb.py file. This is inherently |
## fragile, but there does not seem to be a better option, because |
## libtool hides the real names from us. |
@here=`pwd`; cd $(DESTDIR)$(toolexeclibdir); \ |
for file in libstdc++*; do \ |
case $$file in \ |
*-gdb.py) ;; \ |
*.la) ;; \ |
*) if test -h $$file; then \ |
continue; \ |
fi; \ |
libname=$$file;; \ |
esac; \ |
done; \ |
cd $$here; \ |
echo " $(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py"; \ |
$(INSTALL_DATA) gdb.py $(DESTDIR)$(toolexeclibdir)/$$libname-gdb.py |
Makefile.am
Property changes :
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+Id
\ No newline at end of property