From a985e57862fa0aed33314de079cd44908a6b59cc Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Tue, 24 Jul 2012 19:18:52 +0200 Subject: [PATCH] tests: Add C++ self test binary. Only build and tested by self tests if a g++ with C++x0 is available. Almost empty C++ program, can be extended to test more features. Signed-off-by: Mark Wielaard --- ChangeLog | 4 ++ configure.ac | 5 ++ m4/ChangeLog | 4 ++ m4/ax_cxx_compile_stdcxx_0x.m4 | 107 +++++++++++++++++++++++++++++++++ tests/ChangeLog | 10 +++ tests/Makefile.am | 6 ++ tests/cxx-various.cc | 65 ++++++++++++++++++++ tests/test-subr.sh | 12 ++++ tests/testfile-cxx-various.bz2 | Bin 0 -> 11377 bytes 9 files changed, 213 insertions(+) create mode 100644 m4/ax_cxx_compile_stdcxx_0x.m4 create mode 100644 tests/cxx-various.cc create mode 100755 tests/testfile-cxx-various.bz2 diff --git a/ChangeLog b/ChangeLog index 5842492b8..3be157c8d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2012-07-24 Mark Wielaard + + * configure.ac: Add AX_CXX_COMPILE_STDCXX_0X check. + 2012-07-24 Mark Wielaard * TODO: Add note on shdrs after elf_cntl (ELF_C_FDREAD). diff --git a/configure.ac b/configure.ac index 793248975..50db34308 100644 --- a/configure.ac +++ b/configure.ac @@ -72,6 +72,11 @@ AC_PROG_RANLIB AC_PROG_YACC AM_PROG_LEX +# Check whether we can use g++ with -std=c++0x for the test. +AC_PROG_CXX +AX_CXX_COMPILE_STDCXX_0X +AM_CONDITIONAL(HAVE_STDCXX_0X, test "x$ax_cv_cxx_compile_cxx0x_cxx" == "xyes") + AC_CACHE_CHECK([for gcc with C99 support], ac_cv_c99, [dnl old_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -std=gnu99" diff --git a/m4/ChangeLog b/m4/ChangeLog index d4f2bc1b2..af717c431 100644 --- a/m4/ChangeLog +++ b/m4/ChangeLog @@ -1,3 +1,7 @@ +2012-07-24 Mark Wielaard + + * ax_cxx_compile_stdcxx_0x.m4: Add from autoconf-archive. + 2010-04-14 Roland McGrath * gettext.m4: Upgrade to gettext-0.17. diff --git a/m4/ax_cxx_compile_stdcxx_0x.m4 b/m4/ax_cxx_compile_stdcxx_0x.m4 new file mode 100644 index 000000000..a4e556ff9 --- /dev/null +++ b/m4/ax_cxx_compile_stdcxx_0x.m4 @@ -0,0 +1,107 @@ +# ============================================================================ +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_0x.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX_0X +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the C++0x +# standard. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 7 + +AU_ALIAS([AC_CXX_COMPILE_STDCXX_0X], [AX_CXX_COMPILE_STDCXX_0X]) +AC_DEFUN([AX_CXX_COMPILE_STDCXX_0X], [ + AC_CACHE_CHECK(if g++ supports C++0x features without additional flags, + ax_cv_cxx_compile_cxx0x_native, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c);],, + ax_cv_cxx_compile_cxx0x_native=yes, ax_cv_cxx_compile_cxx0x_native=no) + AC_LANG_RESTORE + ]) + + AC_CACHE_CHECK(if g++ supports C++0x features with -std=c++0x, + ax_cv_cxx_compile_cxx0x_cxx, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=c++0x" + AC_TRY_COMPILE([ + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c);],, + ax_cv_cxx_compile_cxx0x_cxx=yes, ax_cv_cxx_compile_cxx0x_cxx=no) + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE + ]) + + AC_CACHE_CHECK(if g++ supports C++0x features with -std=gnu++0x, + ax_cv_cxx_compile_cxx0x_gxx, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_save_CXXFLAGS="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=gnu++0x" + AC_TRY_COMPILE([ + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + typedef check> right_angle_brackets; + + int a; + decltype(a) b; + + typedef check check_type; + check_type c; + check_type&& cr = static_cast(c);],, + ax_cv_cxx_compile_cxx0x_gxx=yes, ax_cv_cxx_compile_cxx0x_gxx=no) + CXXFLAGS="$ac_save_CXXFLAGS" + AC_LANG_RESTORE + ]) + + if test "$ax_cv_cxx_compile_cxx0x_native" = yes || + test "$ax_cv_cxx_compile_cxx0x_cxx" = yes || + test "$ax_cv_cxx_compile_cxx0x_gxx" = yes; then + AC_DEFINE(HAVE_STDCXX_0X,,[Define if g++ supports C++0x features. ]) + fi +]) diff --git a/tests/ChangeLog b/tests/ChangeLog index 8ca08ea62..bce27f4fc 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,13 @@ +2012-07-24 Mark Wielaard + + * testfile-cxx-various.bz2: New testfile. + * cxx-various.cxx: New test source. + * Makefile.am (cxx_various_SOURCES): New. + (HAVE_STDCXX_0X): Add cxx-various and -std=c++0x if exists. + (EXTRA_DIST): Add cxx-various.cxx and testfile-cxx-various.bz2. + * test-subr.sh: Add testfile-cxx-various and cxx-various to + self_test_files if they exist. + 2012-07-19 Mark Wielaard * run-readelf-unknown-self.sh: New test. diff --git a/tests/Makefile.am b/tests/Makefile.am index 05705698a..4c0c7654c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -97,6 +97,11 @@ check_PROGRAMS += $(asm_TESTS) TESTS += $(asm_TESTS) endif +if HAVE_STDCXX_0X +check_PROGRAMS += cxx-various +AM_CXXFLAGS = -std=c++0x +cxx_various_SOURCES = cxx-various.cc +endif EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-show-die-info.sh run-get-files.sh run-get-lines.sh \ @@ -134,6 +139,7 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh \ run-readelf-test1.sh run-readelf-test2.sh run-readelf-test3.sh \ run-readelf-test4.sh run-readelf-twofiles.sh \ run-readelf-unknown-self.sh \ + cxx-various.cc testfile-cxx-various.bz2 \ run-bug1-test.sh testfile28.bz2 testfile28.rdwr.bz2 \ testfile29.bz2 testfile29.rdwr.bz2 \ testfile30.bz2 testfile31.bz2 testfile32.bz2 testfile33.bz2 \ diff --git a/tests/cxx-various.cc b/tests/cxx-various.cc new file mode 100644 index 000000000..5ddfc308b --- /dev/null +++ b/tests/cxx-various.cc @@ -0,0 +1,65 @@ +/* Test program for testing C++11 features are recognized. + Copyright (C) 2012 Red Hat, Inc. + This file is part of elfutils. + + This file 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. + + elfutils 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 . */ + +// NOTE this file is the source of the binary testfile-cxx-various created +// with g++ -std=c++0x -g -o testfile-cxx-various cxx-various.cc +// +// When you edit this file to add more C++ contructs either create +// a new source file, or regenerate the binary test file. We always +// want to include the source code of all our test binaries. + +#include +using namespace std; + +// Make sure we recognize the encoding of some of the standard types. +// char16_t and char_32_t use DW_ATE_UTF. +char c; +signed char sc; +unsigned char uc; +int i; +float f; +double d; +wchar_t wc; +char16_t c16; +char32_t c32; +long l; + +long +standard_types_func (char ac, signed char asc, unsigned char auc, + int ai, float af, double ad, wchar_t awc, + char16_t ac16, char32_t ac32, long al) +{ + c = ac; + sc = asc; + uc = auc; + i = ai; + f = af; + d = ad; + wc = awc; + c16 = ac16; + c32 = ac32; + l = al; + return ac + asc + auc + ai + af + ad + awc + ac16 + ac32 + al; +} + +int main () +{ + long answer; + answer = standard_types_func (1, 2, 3, 4, 5.0, 6.0, 7, 8, 9, -10L); + cout << "answer: " << answer << endl; + return 0; +} diff --git a/tests/test-subr.sh b/tests/test-subr.sh index e05d22a52..c78795f28 100644 --- a/tests/test-subr.sh +++ b/tests/test-subr.sh @@ -109,11 +109,21 @@ self_test_files=`echo ../src/addr2line ../src/elfcmp ../src/elflint \ ../src/size ../src/strip ../libelf/libelf.so ../libdw/libdw.so \ ../libasm/libasm.so ../backends/libebl_*.so` +# Prebuild binary in case we don't have a C++11 capable compiler around. +extra_self_test_files=testfile-cxx-various +self_test_files="$self_test_files $extra_self_test_files" + +# This file might not exist if we don't have a C++ compiler around. +if test -f cxx-various; then + self_test_files="$self_test_files cxx-various" +fi + # Provide a command to run on all self-test files with testrun. testrun_on_self() { exit_status=0 + testfiles $extra_self_test_files for file in $self_test_files; do testrun $* $file \ || { echo "*** failure in $* $file"; exit_status=1; } @@ -128,6 +138,7 @@ testrun_on_self_quiet() { exit_status=0 + testfiles $extra_self_test_files for file in $self_test_files; do testrun $* $file > /dev/null \ || { echo "*** failure in $* $file"; exit_status=1; } @@ -148,6 +159,7 @@ testrun_on_self_nomatch() exit_status=0 tempfiles self_matches.in self_matches.out + testfiles $extra_self_test_files for file in $self_test_files; do testrun "$@" $file > self_matches.in # egrep should fail to match anything, but we also want to show diff --git a/tests/testfile-cxx-various.bz2 b/tests/testfile-cxx-various.bz2 new file mode 100755 index 0000000000000000000000000000000000000000..518bcf8b7023490fe31f9850f2305ea76ac3c426 GIT binary patch literal 11377 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 literal 0 Hc-jL100001 -- 2.47.2