From 2077db1be5b18b94a91095a3fb380bbc4a81e61b Mon Sep 17 00:00:00 2001 From: Caroline Tice Date: Tue, 6 Aug 2013 20:38:59 -0700 Subject: Commit the vtable verification feature. Commit the vtable verification feature. This feature is designed to detect, at run time, if/when the vtable pointer in a C++ object has been corrupted, before allowing virtual calls through that pointer. If pointer corruption is detected, execution of the program is halted. libstdc++-v3 ChangeLog: 2013-08-06 Caroline Tice * fragment.am: Add XTEMPLATE_FLAGS. * configure.ac: Add definitions for --enable-vtable-verify. * acinclude.m4: Add --enable-vtable-verify and --disable-vtable-verify; define --enable-vtable-verify; define VTV_CXXFLAGS, VTV_PCH_CXXFLAGS and VTV_CXXLINKFLAGS. * config/abi/pre/gnu.ver: Export symbols for vtable verification. * libsupc++/Makefile.am: Define vtv_sources and add it to libsupc___la_SOURCES and libsupc__convenience_la_SOURCES. * libsupc++/vtv_stubs.cc: New file. * include/Makefile.am: Add VTV_PCH_CXXFLAGS to PCHFLAGS. * src/Makefile.am: Add VTV_CXXFLAGS to AM_CXXFLAGS; add VTV_CXXLINKFLAGS to CXXLINK. * src/c++98/Makefile.am: Comment out XTEMPLATE_FLAGS; add VTV_CXXFLAGS to AM_CXXFLAGS; add VTV_CXXXLINKFLAGS to CXXLINK. * src/C++11/Makefile.am: Ditto. * doc/xml/manual/configure.xml: Add entry for --enable-vtable-verify. * scripts/testsuite_flags.in: Add cxxvtvflags to Usage; cause cxxvtvflags to use VTV_CXXFLAGS and VTV_CXXLINKFLAGS. * testsuite/lib/libstdc++.exp: Add cxxvtvflags; add code to locate libvtv if --enable-vtable-verify was used; set cxxvtvflags; add cxxvtvflags to cxx_final. * testsuite/18_support/bad_exception/23591_thread-1.c: Add -fvtable-verify=none to compiler flags. * testsuite/17_intro/freestanding.cc: Add -fvtable-verify=none to compiler flags. * configure: Regenerated. * Makefile.in: Regenerated. * python/Makefile.in: Regenerated. * include/Makefile.in: Regenerated. * libsupc++/Makefile.in: Regenerated. * config.h.in: Regenerated. * po/Makefile.in: Regenerated. * src/Makefile.in: Regenerated. * src/c++98/Makefile.in: Regenerated. * src/c++11/Makefile.in: Regenerated. * doc/Makefile.in: Regenerated. * testsuite/Makefile.in: Regenerated. top level ChangeLog: 2013-08-06 Caroline Tice * configure.ac: Add target-libvtv to target_libraries; disable libvtv on non-linux systems; add target-libvtv to noconfigdirs; add libsupc++/.libs to C++ library search paths. * configure: Regenerated. * Makefile.def: Add libvtv to target_modules; make libvtv depend on libstdc++ and libgcc. * Makefile.in: Regenerated. include/ChangeLog: 2013-08-06 Caroline Tice * vtv-change-permission.h: New file. contrib/ChangeLog: 2013-08-06 Caroline Tice4 * gcc_update: Add libvtv files. libgcc/ChangeLog: 2013-08-06 Caroline Tice config.host (extra_parts): Add vtv_start.o, vtv_end.o vtv_start_preinit.o and vtv_end_preinit.o. configure.ac: Add code to check/set enable_vtable_verify. Makefile.in: Add rules to build vtv_*.o, if enable_vtable_verify is true. vtv_start_preinit.c: New file. vtv_end_preinit.c: New file. vtv_start.c: New file. vtv_end.c: New file. configure: Regenerated. gcc/ChangeLog: 2013-08-06 Caroline Tice * gcc.c (VTABLE_VERIFICATION_SPEC): New definition. (LINK_COMMAND_SPEC): Add VTABLE_VERIFICATION_SPEC. * tree-pass.h: Add pass_vtable_verify. * varasm.c (assemble_variable): Add code to properly set the comdat section and name for the .vtable_map_vars section. (assemble_vtyv_preinit_initializer): New function. (default_sectin_type_flags): Make sure .vtable_map_vars section has LINK_ONCE flag. * output.h: Add function decl for assemble_vtv_preinit_initializer. * vtable-verify.c: New file. * vtable-verify.h: New file. * flag-types.h (enum vtv_priority): Defintions for flag_vtable_verify initialiation levels. * timevar.def (TV_VTABLE_VERIFICATION): New definition. * passes.def: Insert pass_vtable_verify. * aclocal.m4: Reorder includes. * doc/invoke.texi: Add documentation for the flags -fvtable-verify=, -fvtv-debug and -fvtv-counts. * config/gnu-user.h (GNU_USER_TARGET_STARTFILE_SPEC): Add vtv_start*.o, as appropriate, if -fvtable-verify=... is used. (GNU_USER_TARGET_ENDFILE_SPEC): Add vtv_end*.o as appropriate, if -fvtable-verify=... is used. * Makefile.in (OBJS): Add vtable-verify.o to list. (vtable-verify.o): Add new build rule. (GTFILES): Add vtable-verify.c to list. * common.opt (fvtable-verify=): New flag. (vtv_priority): Values for fvtable-verify= flag. (fvtv-counts): New flag. (fvtv-debug): New flag. * tree.h (save_vtable_map_decl): New extern function decl. gcc/cp/ChangeLog: 2013-08-06 Caroline Tice * Make-lang.in (*CXX_AND_OBJCXX_OBJS): Add vtable-class-hierarchy.o to list. (vtable-class-hierarchy.o): Add build rule. * cp-tree.h (vtv_start_verification_constructor_init_function): New extern function decl. (vtv_finish_verification_constructor_init_function): New extern function decl. (build_vtbl_address): New extern function decl. (get_mangled_vtable_map_var_name): New extern function decl. (vtv_compute_class_hierarchy_transitive_closure): New extern function decl. (vtv_generate_init_routine): New extern function decl. (vtv_save_class_info): New extern function decl. (vtv_recover_class_info): New extern function decl. (vtv_build_vtable_verify_fndecl): New extern function decl. * class.c (finish_struct_1): Add call to vtv_save_class_info if flag_vtable_verify is true. * config-lang.in: Add vtable-class-hierarchy.c to gtfiles list. * vtable-class-hierarchy.c: New file. * mangle.c (get_mangled_vtable_map_var_name): New function. * decl2.c (start_objects): Update function comment. (cp_write_global_declarations): Call vtv_recover_class_info, vtv_compute_class_hierarchy_transitive_closure and vtv_build_vtable_verify_fndecl, before calling finalize_compilation_unit, and call vtv_generate_init_rount after, IFF flag_vtable_verify is true. (vtv_start_verification_constructor_init_function): New function. (vtv_finish_verification_constructor_init_function): New function. * init.c (build_vtbl_address): Remove static qualifier from function. libvtv/ChangeLog: 2013-08-06 Caroline Tice Initial check-in of new vtable verification feature. * configure.ac : New file. * acinclude.m4 : New file. * Makefile.am : New file. * aclocal.m4 : New file. * configure.tgt : New file. * configure: New file (generated). * Makefile.in: New file (generated). * vtv_set.h : New file. * vtv_utils.cc : New file. * vtv_utils.h : New file. * vtv_malloc.cc : New file. * vtv_rts.cc : New file. * vtv_malloc.h : New file. * vtv_rts.h : New file. * vtv_fail.cc : New file. * vtv_fail.h : New file. * vtv_map.h : New file. * scripts/run-testsuite.sh : New file. * scripts/sum-vtv-counts.c : New file. * testsuite/parts-test-main.h : New file. * testusite/dataentry.cc : New file. * testsuite/temp_deriv.cc : New file. * testsuite/register_pair.cc : New file. * testsuite/virtual_inheritance.cc : New file. * testsuite/field-test.cc : New file. * testsuite/nested_vcall_test.cc : New file. * testsuite/template-list-iostream.cc : New file. * testsuite/register_pair_inserts.cc : New file. * testsuite/register_pair_inserts_mt.cc : New file. * testsuite/event.list : New file. * testsuite/parts-test-extra-parts-views.cc : New file. * testsuite/parts-test-extra-parts-views.h : New file. * testsuite/environment-fail-32.s : New file. * testsuite/parts-test-extra-parts.h : New file. * testsuite/temp_deriv2.cc : New file. * testsuite/dlopen_mt.cc : New file. * testsuite/event.h : New file. * testsuite/template-list.cc : New file. * testsuite/replace-fail.cc : New file. * testsuite/Makefile.am : New file. * testsuite/Makefile.in: New file (generated). * testsuite/mempool_negative.c : New file. * testsuite/parts-test-main.cc : New file. * testsuite/event-private.cc : New file. * testsuite/thunk.cc : New file. * testsuite/event-defintiions.cc : New file. * testsuite/event-private.h : New file. * testsuite/parts-test.list : New file. * testusite/register_pair_mt.cc : New file. * testsuite/povray-derived.cc : New file. * testsuite/event-main.cc : New file. * testsuite/environment.cc : New file. * testsuite/template-list2.cc : New file. * testsuite/thunk_vtable_map_attack.cc : New file. * testsuite/parts-test-extra-parts.cc : New file. * testsuite/environment-fail-64.s : New file. * testsuite/dlopen.cc : New file. * testsuite/so.cc : New file. * testsuite/temp_deriv3.cc : New file. * testsuite/const_vtable.cc : New file. * testsuite/mempool_positive.c : New file. * testsuite/dup_name.cc : New file. From-SVN: r201555 --- libstdc++-v3/ChangeLog | 40 +++++++++ libstdc++-v3/Makefile.in | 5 ++ libstdc++-v3/acinclude.m4 | 32 +++++++ libstdc++-v3/config.h.in | 7 +- libstdc++-v3/config/abi/pre/gnu.ver | 10 +++ libstdc++-v3/configure | 82 ++++++++++++++--- libstdc++-v3/configure.ac | 7 ++ libstdc++-v3/doc/Makefile.in | 5 ++ libstdc++-v3/doc/xml/manual/configure.xml | 12 +++ libstdc++-v3/fragment.am | 6 ++ libstdc++-v3/include/Makefile.am | 2 +- libstdc++-v3/include/Makefile.in | 7 +- libstdc++-v3/libsupc++/Makefile.am | 15 +++- libstdc++-v3/libsupc++/Makefile.in | 24 ++++- libstdc++-v3/libsupc++/vtv_stubs.cc | 100 +++++++++++++++++++++ libstdc++-v3/po/Makefile.in | 5 ++ libstdc++-v3/python/Makefile.in | 5 ++ libstdc++-v3/scripts/testsuite_flags.in | 11 ++- libstdc++-v3/src/Makefile.am | 5 +- libstdc++-v3/src/Makefile.in | 8 +- libstdc++-v3/src/c++11/Makefile.am | 7 +- libstdc++-v3/src/c++11/Makefile.in | 13 ++- libstdc++-v3/src/c++98/Makefile.am | 7 +- libstdc++-v3/src/c++98/Makefile.in | 13 ++- libstdc++-v3/testsuite/17_intro/freestanding.cc | 2 +- .../18_support/bad_exception/23591_thread-1.c | 2 +- libstdc++-v3/testsuite/Makefile.in | 5 ++ libstdc++-v3/testsuite/lib/libstdc++.exp | 17 +++- 28 files changed, 412 insertions(+), 42 deletions(-) create mode 100644 libstdc++-v3/libsupc++/vtv_stubs.cc (limited to 'libstdc++-v3') diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 66cbccc..40d569e 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,43 @@ +2013-08-06 Caroline Tice + + * fragment.am: Add XTEMPLATE_FLAGS. + * configure.ac: Add definitions for --enable-vtable-verify. + * acinclude.m4: Add --enable-vtable-verify and + --disable-vtable-verify; define --enable-vtable-verify; define + VTV_CXXFLAGS, VTV_PCH_CXXFLAGS and VTV_CXXLINKFLAGS. + * config/abi/pre/gnu.ver: Export symbols for vtable verification. + * libsupc++/Makefile.am: Define vtv_sources and add it to + libsupc___la_SOURCES and libsupc__convenience_la_SOURCES. + * libsupc++/vtv_stubs.cc: New file. + * include/Makefile.am: Add VTV_PCH_CXXFLAGS to PCHFLAGS. + * src/Makefile.am: Add VTV_CXXFLAGS to AM_CXXFLAGS; add + VTV_CXXLINKFLAGS to CXXLINK. + * src/c++98/Makefile.am: Comment out XTEMPLATE_FLAGS; add VTV_CXXFLAGS + to AM_CXXFLAGS; add VTV_CXXXLINKFLAGS to CXXLINK. + * src/C++11/Makefile.am: Ditto. + * doc/xml/manual/configure.xml: Add entry for --enable-vtable-verify. + * scripts/testsuite_flags.in: Add cxxvtvflags to Usage; cause + cxxvtvflags to use VTV_CXXFLAGS and VTV_CXXLINKFLAGS. + * testsuite/lib/libstdc++.exp: Add cxxvtvflags; add code to locate + libvtv if --enable-vtable-verify was used; set cxxvtvflags; add + cxxvtvflags to cxx_final. + * testsuite/18_support/bad_exception/23591_thread-1.c: Add + -fvtable-verify=none to compiler flags. + * testsuite/17_intro/freestanding.cc: Add -fvtable-verify=none + to compiler flags. + * configure: Regenerated. + * Makefile.in: Regenerated. + * python/Makefile.in: Regenerated. + * include/Makefile.in: Regenerated. + * libsupc++/Makefile.in: Regenerated. + * config.h.in: Regenerated. + * po/Makefile.in: Regenerated. + * src/Makefile.in: Regenerated. + * src/c++98/Makefile.in: Regenerated. + * src/c++11/Makefile.in: Regenerated. + * doc/Makefile.in: Regenerated. + * testsuite/Makefile.in: Regenerated. + 2013-08-06 Paolo Carlini Revert the last commit. diff --git a/libstdc++-v3/Makefile.in b/libstdc++-v3/Makefile.in index ab7caaf..bede542 100644 --- a/libstdc++-v3/Makefile.in +++ b/libstdc++-v3/Makefile.in @@ -203,6 +203,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -299,6 +302,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4 index d68768e..72b90a8 100644 --- a/libstdc++-v3/acinclude.m4 +++ b/libstdc++-v3/acinclude.m4 @@ -2285,6 +2285,38 @@ AC_DEFUN([GLIBCXX_ENABLE_EXTERN_TEMPLATE], [ ]) dnl +dnl Use vtable verification. +dnl +dnl --enable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 1 +dnl --disable-vtable-verify defines _GLIBCXX_VTABLE_VERIFY to 0 + +dnl + Usage: GLIBCXX_ENABLE_VTABLE_VERIFY[(DEFAULT)] +dnl Where DEFAULT is `yes' or `no'. +dnl +AC_DEFUN([GLIBCXX_ENABLE_VTABLE_VERIFY], [ + + GLIBCXX_ENABLE(vtable-verify,$1,,[enable vtable verify]) + + AC_MSG_CHECKING([for vtable verify support]) + AC_MSG_RESULT([$enable_vtable_verify]) + + if test $enable_vtable_verify = yes; then + VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end" + VTV_PCH_CXXFLAGS="-fvtable-verify=std" + VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs" + else + VTV_CXXFLAGS= + VTV_PCH_CXXFLAGS= + VTV_CXXLINKFLAGS= + fi + + AC_SUBST(VTV_CXXFLAGS) + AC_SUBST(VTV_PCH_CXXFLAGS) + AC_SUBST(VTV_CXXLINKFLAGS) + GLIBCXX_CONDITIONAL(ENABLE_VTABLE_VERIFY, test $enable_vtable_verify = yes) +]) + +dnl dnl Check for parallel mode pre-requisites, including OpenMP support. dnl dnl + Usage: GLIBCXX_ENABLE_PARALLEL diff --git a/libstdc++-v3/config.h.in b/libstdc++-v3/config.h.in index 61ac3ab..4c029d2 100644 --- a/libstdc++-v3/config.h.in +++ b/libstdc++-v3/config.h.in @@ -810,12 +810,13 @@ namespace std::tr1. */ #undef _GLIBCXX_USE_C99_STDINT_TR1 +/* Defined if clock_gettime syscall has monotonic and realtime clock support. + */ +#undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL + /* Defined if clock_gettime has monotonic clock support. */ #undef _GLIBCXX_USE_CLOCK_MONOTONIC -/* Defined if clock_gettime syscall has monotonic and realtime clock support. */ -#undef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL - /* Defined if clock_gettime has realtime clock support. */ #undef _GLIBCXX_USE_CLOCK_REALTIME diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 9e1f4da..8972fcf 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1572,6 +1572,16 @@ CXXABI_1.3.8 { __cxa_throw_bad_array_length; _Z*St16bad_array_length*; + + # Virtual table verification stub functions. + _Z17__VLTRegisterPair*; + _Z22__VLTRegisterPairDebug*; + _Z16__VLTRegisterSet*; + _Z21__VLTRegisterSetDebug*; + _Z24__VLTVerifyVtablePointer*; + _Z29__VLTVerifyVtablePointerDebug*; + __VLTChangePermission; + } CXXABI_1.3.7; # Symbols in the support library (libsupc++) supporting transactional memory. diff --git a/libstdc++-v3/configure b/libstdc++-v3/configure index 994fbe3..f3b4b13 100755 --- a/libstdc++-v3/configure +++ b/libstdc++-v3/configure @@ -664,6 +664,11 @@ LIBICONV OPT_LDFLAGS SECTION_LDFLAGS GLIBCXX_LIBS +ENABLE_VTABLE_VERIFY_FALSE +ENABLE_VTABLE_VERIFY_TRUE +VTV_CXXLINKFLAGS +VTV_PCH_CXXFLAGS +VTV_CXXFLAGS ENABLE_WERROR_FALSE ENABLE_WERROR_TRUE ENABLE_PYTHONDIR_FALSE @@ -866,6 +871,7 @@ enable_fully_dynamic_string enable_extern_template with_python_dir enable_werror +enable_vtable_verify enable_libstdcxx_time enable_tls enable_rpath @@ -1558,6 +1564,7 @@ Optional Features: --enable-extern-template enable extern template [default=yes] --enable-werror turns on -Werror [default=yes] + --enable-vtable-verify enable vtable verify [default=no] --enable-libstdcxx-time[=KIND] use KIND for check type [default=auto] --enable-tls Use thread-local storage [default=yes] @@ -11513,7 +11520,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11516 "configure" +#line 11523 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11619,7 +11626,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 11622 "configure" +#line 11629 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -14906,6 +14913,12 @@ esac +if test "$enable_vtable_verify" = yes; then + predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o" + postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o" +fi + + # libtool variables for C++ shared and position-independent compiles. # # Use glibcxx_lt_pic_flag to designate the automake variable @@ -15033,7 +15046,7 @@ fi # # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style. cat > conftest.$ac_ext << EOF -#line 15036 "configure" +#line 15049 "configure" struct S { ~S(); }; void bar(); void foo() @@ -15383,7 +15396,7 @@ $as_echo "$glibcxx_cv_atomic_long_long" >&6; } # Fake what AC_TRY_COMPILE does. cat > conftest.$ac_ext << EOF -#line 15386 "configure" +#line 15399 "configure" int main() { typedef bool atomic_type; @@ -15418,7 +15431,7 @@ $as_echo "$glibcxx_cv_atomic_bool" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15421 "configure" +#line 15434 "configure" int main() { typedef short atomic_type; @@ -15453,7 +15466,7 @@ $as_echo "$glibcxx_cv_atomic_short" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15456 "configure" +#line 15469 "configure" int main() { // NB: _Atomic_word not necessarily int. @@ -15489,7 +15502,7 @@ $as_echo "$glibcxx_cv_atomic_int" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15492 "configure" +#line 15505 "configure" int main() { typedef long long atomic_type; @@ -15568,7 +15581,7 @@ $as_echo "$as_me: WARNING: Performance of certain classes will degrade as a resu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 15571 "configure" +#line 15584 "configure" int main() { _Decimal32 d1; @@ -15610,7 +15623,7 @@ ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # unnecessary for this test. cat > conftest.$ac_ext << EOF -#line 15613 "configure" +#line 15626 "configure" template struct same { typedef T2 type; }; @@ -15644,7 +15657,7 @@ $as_echo "$enable_int128" >&6; } rm -f conftest* cat > conftest.$ac_ext << EOF -#line 15647 "configure" +#line 15660 "configure" template struct same { typedef T2 type; }; @@ -17379,6 +17392,42 @@ $as_echo "$enable_werror" >&6; } + + # Check whether --enable-vtable-verify was given. +if test "${enable_vtable_verify+set}" = set; then : + enableval=$enable_vtable_verify; + case "$enableval" in + yes|no) ;; + *) as_fn_error "Argument to enable/disable vtable-verify must be yes or no" "$LINENO" 5 ;; + esac + +else + enable_vtable_verify=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vtable verify support" >&5 +$as_echo_n "checking for vtable verify support... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_vtable_verify" >&5 +$as_echo "$enable_vtable_verify" >&6; } + + if test $enable_vtable_verify = yes; then + VTV_CXXFLAGS="-fvtable-verify=std -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end" + VTV_PCH_CXXFLAGS="-fvtable-verify=std" + VTV_CXXLINKFLAGS="-L${toplevel_builddir}/libvtv/.libs -Wl,--rpath -Wl,${toplevel_builddir}/libvtv/.libs" + else + VTV_CXXFLAGS= + VTV_PCH_CXXFLAGS= + VTV_CXXLINKFLAGS= + fi + + + + + + + # Checks for operating systems support that doesn't require linking. @@ -72960,6 +73009,15 @@ else fi + if test $enable_vtable_verify = yes; then + ENABLE_VTABLE_VERIFY_TRUE= + ENABLE_VTABLE_VERIFY_FALSE='#' +else + ENABLE_VTABLE_VERIFY_TRUE='#' + ENABLE_VTABLE_VERIFY_FALSE= +fi + + if test $enable_symvers != no; then ENABLE_SYMVERS_TRUE= ENABLE_SYMVERS_FALSE='#' @@ -73403,6 +73461,10 @@ if test -z "${ENABLE_WERROR_TRUE}" && test -z "${ENABLE_WERROR_FALSE}"; then as_fn_error "conditional \"ENABLE_WERROR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi +if test -z "${ENABLE_VTABLE_VERIFY_TRUE}" && test -z "${ENABLE_VTABLE_VERIFY_FALSE}"; then + as_fn_error "conditional \"ENABLE_VTABLE_VERIFY\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi if test -z "${ENABLE_SYMVERS_TRUE}" && test -z "${ENABLE_SYMVERS_FALSE}"; then as_fn_error "conditional \"ENABLE_SYMVERS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index f6ba176..dd13b01 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -97,6 +97,12 @@ ACX_LT_HOST_FLAGS AC_SUBST(enable_shared) AC_SUBST(enable_static) +if test "$enable_vtable_verify" = yes; then + predep_objects_CXX="${predep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_start.o" + postdep_objects_CXX="${postdep_objects_CXX} ${glibcxx_builddir}/../libgcc/vtv_end.o" +fi + + # libtool variables for C++ shared and position-independent compiles. # # Use glibcxx_lt_pic_flag to designate the automake variable @@ -168,6 +174,7 @@ GLIBCXX_ENABLE_FULLY_DYNAMIC_STRING([no]) GLIBCXX_ENABLE_EXTERN_TEMPLATE([yes]) GLIBCXX_ENABLE_PYTHON GLIBCXX_ENABLE_WERROR([yes]) +GLIBCXX_ENABLE_VTABLE_VERIFY([no]) # Checks for operating systems support that doesn't require linking. GLIBCXX_CHECK_STDIO_PROTO diff --git a/libstdc++-v3/doc/Makefile.in b/libstdc++-v3/doc/Makefile.in index 9816fc8..04e0d7d 100644 --- a/libstdc++-v3/doc/Makefile.in +++ b/libstdc++-v3/doc/Makefile.in @@ -175,6 +175,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ @@ -281,6 +284,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. diff --git a/libstdc++-v3/doc/xml/manual/configure.xml b/libstdc++-v3/doc/xml/manual/configure.xml index 05f6eba..cf09897 100644 --- a/libstdc++-v3/doc/xml/manual/configure.xml +++ b/libstdc++-v3/doc/xml/manual/configure.xml @@ -382,6 +382,18 @@ + --enable-vtable-verify[default] + + Use -fvtable-verify=std to compile the C++ + runtime with instrumentation for vtable verification. All virtual + functions in the standard library will be verified at runtime. + Types impacted include locale and + iostream, and others. Disabling means that + the C++ runtime is compiled without support for vtable + verification. By default, this option is off. + + + diff --git a/libstdc++-v3/fragment.am b/libstdc++-v3/fragment.am index 5b1d503..0036ae8 100644 --- a/libstdc++-v3/fragment.am +++ b/libstdc++-v3/fragment.am @@ -19,6 +19,12 @@ else WERROR_FLAG= endif +if ENABLE_EXTERN_TEMPLATE +XTEMPLATE_FLAGS = -fno-implicit-templates +else +XTEMPLATE_FLAGS = +endif + # 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 = \ diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am index 801a885..d08864c 100644 --- a/libstdc++-v3/include/Makefile.am +++ b/libstdc++-v3/include/Makefile.am @@ -893,7 +893,7 @@ pch_output_dirs = \ ${pch1_output_builddir} ${pch2_output_builddir} ${pch3_output_builddir} pch_output_anchors = \ ${pch1_output_anchor} ${pch2_output_anchor} ${pch3_output_anchor} -PCHFLAGS=-x c++-header -nostdinc++ $(CXXFLAGS) +PCHFLAGS=-x c++-header -nostdinc++ $(CXXFLAGS) $(VTV_PCH_CXXFLAGS) if GLIBCXX_BUILD_PCH pch_build = ${pch_output} else diff --git a/libstdc++-v3/include/Makefile.in b/libstdc++-v3/include/Makefile.in index 995b898..95c5697 100644 --- a/libstdc++-v3/include/Makefile.in +++ b/libstdc++-v3/include/Makefile.in @@ -175,6 +175,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -271,6 +274,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. @@ -1147,7 +1152,7 @@ pch_output_dirs = \ pch_output_anchors = \ ${pch1_output_anchor} ${pch2_output_anchor} ${pch3_output_anchor} -PCHFLAGS = -x c++-header -nostdinc++ $(CXXFLAGS) +PCHFLAGS = -x c++-header -nostdinc++ $(CXXFLAGS) $(VTV_PCH_CXXFLAGS) @GLIBCXX_BUILD_PCH_FALSE@pch_build = @GLIBCXX_BUILD_PCH_TRUE@pch_build = ${pch_output} diff --git a/libstdc++-v3/libsupc++/Makefile.am b/libstdc++-v3/libsupc++/Makefile.am index b4e86f5..f0ab602 100644 --- a/libstdc++-v3/libsupc++/Makefile.am +++ b/libstdc++-v3/libsupc++/Makefile.am @@ -26,6 +26,7 @@ include $(top_srcdir)/fragment.am # separately too. # 1) separate libsupc++.la toolexeclib_LTLIBRARIES = libsupc++.la + # 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a noinst_LTLIBRARIES = libsupc++convenience.la @@ -96,8 +97,13 @@ sources = \ vmi_class_type_info.cc \ vterminate.cc -libsupc___la_SOURCES = $(sources) $(c_sources) -libsupc__convenience_la_SOURCES = $(sources) $(c_sources) +if ENABLE_VTABLE_VERIFY + vtv_sources = \ + vtv_stubs.cc +endif + +libsupc___la_SOURCES = $(sources) $(c_sources) $(vtv_sources) +libsupc__convenience_la_SOURCES = $(sources) $(c_sources) $(vtv_sources) cp-demangle.c: rm -f $@ @@ -282,3 +288,8 @@ uninstall-bitsHEADERS: q=`echo $$p | sed -e 's,.*/,,'`; \ rm -f $(DESTDIR)$(bitsdir)/$$q; \ done + + +# By adding these files here, automake will remove them for 'make clean' +CLEANFILES = stamp-* + diff --git a/libstdc++-v3/libsupc++/Makefile.in b/libstdc++-v3/libsupc++/Makefile.in index 0f2c1ee..88b237e 100644 --- a/libstdc++-v3/libsupc++/Makefile.in +++ b/libstdc++-v3/libsupc++/Makefile.in @@ -105,10 +105,13 @@ am__objects_1 = array_type_info.lo atexit_arm.lo atexit_thread.lo \ pointer_type_info.lo pure.lo si_class_type_info.lo tinfo.lo \ tinfo2.lo vec.lo vmi_class_type_info.lo vterminate.lo @GLIBCXX_HOSTED_TRUE@am__objects_2 = cp-demangle.lo -am_libsupc___la_OBJECTS = $(am__objects_1) $(am__objects_2) +@ENABLE_VTABLE_VERIFY_TRUE@am__objects_3 = vtv_stubs.lo +am_libsupc___la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) libsupc___la_OBJECTS = $(am_libsupc___la_OBJECTS) libsupc__convenience_la_LIBADD = -am_libsupc__convenience_la_OBJECTS = $(am__objects_1) $(am__objects_2) +am_libsupc__convenience_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) libsupc__convenience_la_OBJECTS = \ $(am_libsupc__convenience_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) @@ -235,6 +238,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -331,6 +337,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. @@ -348,6 +356,7 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) # separately too. # 1) separate libsupc++.la toolexeclib_LTLIBRARIES = libsupc++.la + # 2) integrated libsupc++convenience.la that is to be a part of libstdc++.a noinst_LTLIBRARIES = libsupc++convenience.la std_HEADERS = \ @@ -414,8 +423,11 @@ sources = \ vmi_class_type_info.cc \ vterminate.cc -libsupc___la_SOURCES = $(sources) $(c_sources) -libsupc__convenience_la_SOURCES = $(sources) $(c_sources) +@ENABLE_VTABLE_VERIFY_TRUE@vtv_sources = \ +@ENABLE_VTABLE_VERIFY_TRUE@ vtv_stubs.cc + +libsupc___la_SOURCES = $(sources) $(c_sources) $(vtv_sources) +libsupc__convenience_la_SOURCES = $(sources) $(c_sources) $(vtv_sources) # AM_CXXFLAGS needs to be in each subdirectory so that it can be # modified in a per-library or per-sub-library way. Need to manually @@ -499,6 +511,9 @@ CXXLINK = \ # prepending each of $(*_HEADERS) with VPATH below. stddir = $(gxx_include_dir) bitsdir = $(gxx_include_dir)/bits + +# By adding these files here, automake will remove them for 'make clean' +CLEANFILES = stamp-* all: all-am .SUFFIXES: @@ -683,6 +698,7 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) diff --git a/libstdc++-v3/libsupc++/vtv_stubs.cc b/libstdc++-v3/libsupc++/vtv_stubs.cc new file mode 100644 index 0000000..a41d943 --- /dev/null +++ b/libstdc++-v3/libsupc++/vtv_stubs.cc @@ -0,0 +1,100 @@ +// Copyright (C) 2012-2013 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 3, 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. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +/* This is part of the vtable verification runtime library. For more + information about this feature, see the comments in libvtv/vtv_rts.cc. */ + +/* The functions in this file are used to create the libvtv_stubs + library, as part of the vtable verification feature. When building + a binary without vtable verification, and linking it with a + (possibly pre-built third-party) library that was built with + verification, it is possible that vtable verification will fail due + to incomplete data (rather than due to corrupt vtable pointers). In + this case we need to give programmers a way of turning off the + vtable verification in their libraries. They can do so by linking + with the libvtv_stubs library, which (as you can see) will replace + the real verification functions with a set of functions that do + nothing (so no more verification failures/aborts). */ + +#include + +// Declare as weak for libsupc++, strong definitions are in libvtv. +#if __GXX_WEAK__ +extern "C" +void +__VLTChangePermission(int) __attribute__((weak)); + +void +__VLTRegisterSet(void**, const void*, std::size_t, std::size_t, + void**) __attribute__((weak)); + +void +__VLTRegisterPair(void**, const void*, std::size_t, + const void*) __attribute__((weak)); + +const void* +__VLTVerifyVtablePointer(void**, const void*) __attribute__((weak)); + +void +__VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t, + void**) __attribute__((weak)); + +void +__VLTRegisterPairDebug(void**, const void*, std::size_t, const void*, + const char*, const char*) __attribute__((weak)); + +const void* +__VLTVerifyVtablePointerDebug(void**, const void*, const char*, + const char*) __attribute__((weak)); +#endif + +// Stub definitions. +extern "C" +void +__VLTChangePermission(int) +{ } + +void +__VLTRegisterSet(void**, const void*, std::size_t, std::size_t, void**) +{ } + +void +__VLTRegisterPair(void**, const void*, std::size_t, const void*) +{ } + +const void* +__VLTVerifyVtablePointer(void**, const void* vtable_ptr) +{ return vtable_ptr; } + +void +__VLTRegisterSetDebug(void**, const void*, std::size_t, std::size_t, void**) +{ } + +void +__VLTRegisterPairDebug(void**, const void*, std::size_t, const void*, + const char*, const char*) +{ } + +const void* +__VLTVerifyVtablePointerDebug(void**, const void* vtable_ptr, const char*, + const char*) +{ return vtable_ptr; } diff --git a/libstdc++-v3/po/Makefile.in b/libstdc++-v3/po/Makefile.in index bb0f590..52f5256 100644 --- a/libstdc++-v3/po/Makefile.in +++ b/libstdc++-v3/po/Makefile.in @@ -175,6 +175,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -271,6 +274,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. diff --git a/libstdc++-v3/python/Makefile.in b/libstdc++-v3/python/Makefile.in index 49f71a1..21d74a90 100644 --- a/libstdc++-v3/python/Makefile.in +++ b/libstdc++-v3/python/Makefile.in @@ -199,6 +199,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -295,6 +298,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. diff --git a/libstdc++-v3/scripts/testsuite_flags.in b/libstdc++-v3/scripts/testsuite_flags.in index d7710ca..cf692f8 100755 --- a/libstdc++-v3/scripts/testsuite_flags.in +++ b/libstdc++-v3/scripts/testsuite_flags.in @@ -18,8 +18,10 @@ Usage: --build-cc --install-cxx --cxxflags - --cxxpchflags --cxxldflags + --cxxpchflags + --cxxvtvflags + EOF } @@ -56,7 +58,12 @@ case ${query} in --cxxflags) CXXFLAGS_default="-D_GLIBCXX_ASSERT -fmessage-length=0" CXXFLAGS_config="@SECTION_FLAGS@ @CXXFLAGS@ @EXTRA_CXX_FLAGS@" - echo ${CXXFLAGS_default} ${CXXFLAGS_config} + echo ${CXXFLAGS_default} ${CXXFLAGS_config} + ;; + --cxxvtvflags) + CXXFLAGS_vtv="@VTV_CXXFLAGS@" + LDFLAGS_vtv="@VTV_CXXLINKFLAGS@" + echo ${CXXFLAGS_vtv} ${LDFLAGS_vtv} ;; --cxxparallelflags) CXXFLAGS_parallel="-D_GLIBCXX_PARALLEL -fopenmp diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index 3e11aa3..c3c6ab7 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -73,7 +73,6 @@ libstdc___la_LDFLAGS = \ libstdc___la_LINK = $(CXXLINK) $(libstdc___la_LDFLAGS) - # Use special rules for compatibility-ldbl.cc compilation, as we need to # pass -mlong-double-64. if GLIBCXX_LDBL_COMPAT @@ -138,7 +137,7 @@ compatibility-condvar.o: compatibility-condvar.cc # as the occasion calls for it. AM_CXXFLAGS = \ $(glibcxx_compiler_pic_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) # Libtool notes @@ -185,9 +184,9 @@ CXXLINK = \ $(LIBTOOL) --tag CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ - # Symbol versioning for shared libraries. if ENABLE_SYMVERS libstdc++-symbols.ver: ${glibcxx_srcdir}/$(SYMVER_FILE) \ diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index 93215e0..cd3943b 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -226,6 +226,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -322,6 +325,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. @@ -403,7 +408,7 @@ libstdc___la_LINK = $(CXXLINK) $(libstdc___la_LDFLAGS) # as the occasion calls for it. AM_CXXFLAGS = \ $(glibcxx_compiler_pic_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) @@ -451,6 +456,7 @@ CXXLINK = \ $(LIBTOOL) --tag CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ @ENABLE_SYMVERS_TRUE@CLEANFILES = libstdc++-symbols.ver $(version_dep) diff --git a/libstdc++-v3/src/c++11/Makefile.am b/libstdc++-v3/src/c++11/Makefile.am index e7b48ac..58d3025 100644 --- a/libstdc++-v3/src/c++11/Makefile.am +++ b/libstdc++-v3/src/c++11/Makefile.am @@ -46,13 +46,13 @@ sources = \ thread.cc if ENABLE_EXTERN_TEMPLATE -XTEMPLATE_FLAGS = -fno-implicit-templates +# XTEMPLATE_FLAGS = -fno-implicit-templates inst_sources = \ fstream-inst.cc \ string-inst.cc \ wstring-inst.cc else -XTEMPLATE_FLAGS = +# XTEMPLATE_FLAGS = inst_sources = endif @@ -75,7 +75,7 @@ hashtable_c++0x.o: hashtable_c++0x.cc AM_CXXFLAGS = \ -std=gnu++11 \ $(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) AM_MAKEFLAGS = \ @@ -125,4 +125,5 @@ CXXLINK = \ $(LIBTOOL) --tag CXX --tag disable-shared \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ diff --git a/libstdc++-v3/src/c++11/Makefile.in b/libstdc++-v3/src/c++11/Makefile.in index a410748..5daae3e 100644 --- a/libstdc++-v3/src/c++11/Makefile.in +++ b/libstdc++-v3/src/c++11/Makefile.in @@ -192,6 +192,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -288,6 +291,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. @@ -322,9 +327,10 @@ sources = \ system_error.cc \ thread.cc -@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = -@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates +# XTEMPLATE_FLAGS = @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = + +# XTEMPLATE_FLAGS = -fno-implicit-templates @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \ @ENABLE_EXTERN_TEMPLATE_TRUE@ fstream-inst.cc \ @ENABLE_EXTERN_TEMPLATE_TRUE@ string-inst.cc \ @@ -340,7 +346,7 @@ libc__11convenience_la_SOURCES = $(sources) $(inst_sources) AM_CXXFLAGS = \ -std=gnu++11 \ $(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) AM_MAKEFLAGS = \ @@ -391,6 +397,7 @@ CXXLINK = \ $(LIBTOOL) --tag CXX --tag disable-shared \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ all: all-am diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am index 2f33b96..8ebff1a 100644 --- a/libstdc++-v3/src/c++98/Makefile.am +++ b/libstdc++-v3/src/c++98/Makefile.am @@ -82,7 +82,7 @@ basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC) if ENABLE_EXTERN_TEMPLATE -XTEMPLATE_FLAGS = -fno-implicit-templates +# XTEMPLATE_FLAGS = -fno-implicit-templates inst_sources = \ allocator-inst.cc \ concept-inst.cc \ @@ -97,7 +97,7 @@ inst_sources = \ streambuf-inst.cc \ wlocale-inst.cc else -XTEMPLATE_FLAGS = +# XTEMPLATE_FLAGS = inst_sources = endif @@ -172,7 +172,7 @@ parallel_settings.o: parallel_settings.cc # as the occasion calls for it. AM_CXXFLAGS = \ $(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) AM_MAKEFLAGS = \ @@ -222,4 +222,5 @@ CXXLINK = \ $(LIBTOOL) --tag CXX --tag disable-shared \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ diff --git a/libstdc++-v3/src/c++98/Makefile.in b/libstdc++-v3/src/c++98/Makefile.in index d154b98..cf9cda5 100644 --- a/libstdc++-v3/src/c++98/Makefile.in +++ b/libstdc++-v3/src/c++98/Makefile.in @@ -208,6 +208,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -304,6 +307,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. @@ -342,9 +347,10 @@ host_sources_extra = \ basic_file.cc c++locale.cc \ ${inst_sources} ${parallel_sources} -@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = -@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates +# XTEMPLATE_FLAGS = @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = + +# XTEMPLATE_FLAGS = -fno-implicit-templates @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \ @ENABLE_EXTERN_TEMPLATE_TRUE@ allocator-inst.cc \ @ENABLE_EXTERN_TEMPLATE_TRUE@ concept-inst.cc \ @@ -412,7 +418,7 @@ PARALLEL_FLAGS = -D_GLIBCXX_PARALLEL # as the occasion calls for it. AM_CXXFLAGS = \ $(glibcxx_lt_pic_flag) $(glibcxx_compiler_shared_flag) \ - $(XTEMPLATE_FLAGS) \ + $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) AM_MAKEFLAGS = \ @@ -463,6 +469,7 @@ CXXLINK = \ $(LIBTOOL) --tag CXX --tag disable-shared \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CXX) \ + $(VTV_CXXLINKFLAGS) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ all: all-am diff --git a/libstdc++-v3/testsuite/17_intro/freestanding.cc b/libstdc++-v3/testsuite/17_intro/freestanding.cc index 4b5b491..6518af5 100644 --- a/libstdc++-v3/testsuite/17_intro/freestanding.cc +++ b/libstdc++-v3/testsuite/17_intro/freestanding.cc @@ -1,4 +1,4 @@ -// { dg-options "-x c -std=gnu++0x -lsupc++" } +// { dg-options "-x c -std=gnu++0x -lsupc++ -fvtable-verify=none" } // Copyright (C) 2010-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/18_support/bad_exception/23591_thread-1.c b/libstdc++-v3/testsuite/18_support/bad_exception/23591_thread-1.c index e7cabc3..0b8d1e2 100644 --- a/libstdc++-v3/testsuite/18_support/bad_exception/23591_thread-1.c +++ b/libstdc++-v3/testsuite/18_support/bad_exception/23591_thread-1.c @@ -1,5 +1,5 @@ // { dg-require-sharedlib "" } -// { dg-options "-g -O2 -pthread -ldl -x c" { target *-*-linux* *-*-gnu* } } +// { dg-options "-g -O2 -pthread -ldl -x c -fvtable-verify=none" { target *-*-linux* *-*-gnu* } } // Copyright (C) 2005-2013 Free Software Foundation, Inc. // diff --git a/libstdc++-v3/testsuite/Makefile.in b/libstdc++-v3/testsuite/Makefile.in index 96b3f9f..779e932 100644 --- a/libstdc++-v3/testsuite/Makefile.in +++ b/libstdc++-v3/testsuite/Makefile.in @@ -175,6 +175,9 @@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ +VTV_CXXFLAGS = @VTV_CXXFLAGS@ +VTV_CXXLINKFLAGS = @VTV_CXXLINKFLAGS@ +VTV_PCH_CXXFLAGS = @VTV_PCH_CXXFLAGS@ WARN_FLAGS = @WARN_FLAGS@ WERROR = @WERROR@ XMLLINT = @XMLLINT@ @@ -274,6 +277,8 @@ toolexecdir = $(glibcxx_toolexecdir) toolexeclibdir = $(glibcxx_toolexeclibdir) @ENABLE_WERROR_FALSE@WERROR_FLAG = @ENABLE_WERROR_TRUE@WERROR_FLAG = $(WERROR) +@ENABLE_EXTERN_TEMPLATE_FALSE@XTEMPLATE_FLAGS = +@ENABLE_EXTERN_TEMPLATE_TRUE@XTEMPLATE_FLAGS = -fno-implicit-templates # 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. diff --git a/libstdc++-v3/testsuite/lib/libstdc++.exp b/libstdc++-v3/testsuite/lib/libstdc++.exp index c339044..83a3862 100644 --- a/libstdc++-v3/testsuite/lib/libstdc++.exp +++ b/libstdc++-v3/testsuite/lib/libstdc++.exp @@ -84,7 +84,7 @@ proc libstdc++_init { testfile } { global env global v3-sharedlib v3-libgomp global srcdir blddir objdir tool_root_dir - global cc cxx cxxflags cxxpchflags cxxldflags + global cc cxx cxxflags cxxpchflags cxxldflags cxxvtvflags global includes global gluefile wrap_flags global ld_library_path @@ -157,6 +157,17 @@ proc libstdc++_init { testfile } { } v3track libgompdir 3 + # Locate libvtv. This is only required for --enable-vtable-verify. + set v3-libvtv 0 + set libvtvdir [lookfor_file $blddir/../libvtv .libs/libvtv.$shlib_ext] + if {$libvtvdir != ""} { + set v3-libvtv 1 + set libvtvdir [file dirname $libvtvdir] + append ld_library_path_tmp ":${libvtvdir}" + verbose -log "libvtv support detected" + } + v3track libvtvdir 3 + # Locate libstdc++ shared library. (ie libstdc++.so.) set v3-sharedlib 0 set sharedlibdir [lookfor_file $blddir src/.libs/libstdc++.$shlib_ext] @@ -214,6 +225,7 @@ proc libstdc++_init { testfile } { set cxx [transform "g++"] set cxxflags "-D_GLIBCXX_ASSERT -fmessage-length=0" set cxxpchflags "" + set cxxvtvflags "" set cxxldflags "" set cc [transform "gcc"] # Locate testsuite_hooks.h and other testsuite headers. @@ -261,6 +273,7 @@ proc libstdc++_init { testfile } { set cxx [exec sh $flags_file --build-cxx] set cxxflags [exec sh $flags_file --cxxflags] set cxxpchflags [exec sh $flags_file --cxxpchflags] + set cxxvtvflags [exec sh $flags_file --cxxvtvflags] set cxxldflags [exec sh $flags_file --cxxldflags] set cc [exec sh $flags_file --build-cc] set includes [exec sh $flags_file --build-includes] @@ -424,6 +437,7 @@ proc v3_target_compile { source dest type options } { global wrap_flags global cxx global cxxflags + global cxxvtvflags global cxxldflags global includes global STATIC_LIBCXXFLAGS @@ -438,6 +452,7 @@ proc v3_target_compile { source dest type options } { set cxx_final [concat $cxx_final $cxxlibglossflags] set cxx_final [concat $cxx_final $STATIC_LIBCXXFLAGS] set cxx_final [concat $cxx_final $cxxflags] + set cxx_final [concat $cxx_final $cxxvtvflags] set cxx_final [concat $cxx_final $includes] # Flag setting based on type argument. -- cgit v1.1