1*00b67f09SDavid van Moolenbroekdnl 2*00b67f09SDavid van Moolenbroekdnl Automated Testing Framework (atf) 3*00b67f09SDavid van Moolenbroekdnl 4*00b67f09SDavid van Moolenbroekdnl Copyright (c) 2008 The NetBSD Foundation, Inc. 5*00b67f09SDavid van Moolenbroekdnl All rights reserved. 6*00b67f09SDavid van Moolenbroekdnl 7*00b67f09SDavid van Moolenbroekdnl Redistribution and use in source and binary forms, with or without 8*00b67f09SDavid van Moolenbroekdnl modification, are permitted provided that the following conditions 9*00b67f09SDavid van Moolenbroekdnl are met: 10*00b67f09SDavid van Moolenbroekdnl 1. Redistributions of source code must retain the above copyright 11*00b67f09SDavid van Moolenbroekdnl notice, this list of conditions and the following disclaimer. 12*00b67f09SDavid van Moolenbroekdnl 2. Redistributions in binary form must reproduce the above copyright 13*00b67f09SDavid van Moolenbroekdnl notice, this list of conditions and the following disclaimer in the 14*00b67f09SDavid van Moolenbroekdnl documentation and/or other materials provided with the distribution. 15*00b67f09SDavid van Moolenbroekdnl 16*00b67f09SDavid van Moolenbroekdnl THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17*00b67f09SDavid van Moolenbroekdnl CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18*00b67f09SDavid van Moolenbroekdnl INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19*00b67f09SDavid van Moolenbroekdnl MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*00b67f09SDavid van Moolenbroekdnl IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21*00b67f09SDavid van Moolenbroekdnl DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22*00b67f09SDavid van Moolenbroekdnl DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23*00b67f09SDavid van Moolenbroekdnl GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24*00b67f09SDavid van Moolenbroekdnl INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25*00b67f09SDavid van Moolenbroekdnl IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26*00b67f09SDavid van Moolenbroekdnl OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27*00b67f09SDavid van Moolenbroekdnl IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*00b67f09SDavid van Moolenbroekdnl 29*00b67f09SDavid van Moolenbroek 30*00b67f09SDavid van MoolenbroekAC_DEFUN([ATF_ATTRIBUTE_FORMAT_PRINTF], [ 31*00b67f09SDavid van Moolenbroek AC_MSG_CHECKING( 32*00b67f09SDavid van Moolenbroek [whether __attribute__((__format__(__printf__, a, b))) is supported]) 33*00b67f09SDavid van Moolenbroek AC_COMPILE_IFELSE( 34*00b67f09SDavid van Moolenbroek [AC_LANG_PROGRAM([ 35*00b67f09SDavid van Moolenbroek#include <stdarg.h> 36*00b67f09SDavid van Moolenbroek#include <stdio.h> 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroekstatic void test_printf(const char *, ...) 39*00b67f09SDavid van Moolenbroek __attribute__((__format__(__printf__, 1, 2))); 40*00b67f09SDavid van Moolenbroek 41*00b67f09SDavid van Moolenbroekstatic void 42*00b67f09SDavid van Moolenbroektest_printf(const char *format, ...) 43*00b67f09SDavid van Moolenbroek{ 44*00b67f09SDavid van Moolenbroek va_list ap; 45*00b67f09SDavid van Moolenbroek 46*00b67f09SDavid van Moolenbroek va_start(ap, format); 47*00b67f09SDavid van Moolenbroek vprintf(format, ap); 48*00b67f09SDavid van Moolenbroek va_end(ap); 49*00b67f09SDavid van Moolenbroek}], [ 50*00b67f09SDavid van Moolenbroek test_printf("foo %s", "bar"); 51*00b67f09SDavid van Moolenbroek return 0; 52*00b67f09SDavid van Moolenbroek])], 53*00b67f09SDavid van Moolenbroek [AC_MSG_RESULT(yes) 54*00b67f09SDavid van Moolenbroek value="__attribute__((__format__(__printf__, a, b)))"], 55*00b67f09SDavid van Moolenbroek [AC_MSG_RESULT(no) 56*00b67f09SDavid van Moolenbroek value=""] 57*00b67f09SDavid van Moolenbroek ) 58*00b67f09SDavid van Moolenbroek AC_SUBST([ATTRIBUTE_FORMAT_PRINTF], [${value}]) 59*00b67f09SDavid van Moolenbroek]) 60*00b67f09SDavid van Moolenbroek 61*00b67f09SDavid van MoolenbroekAC_DEFUN([ATF_ATTRIBUTE_NORETURN], [ 62*00b67f09SDavid van Moolenbroek dnl XXX This check is overly simple and should be fixed. For example, 63*00b67f09SDavid van Moolenbroek dnl Sun's cc does support the noreturn attribute but CC (the C++ 64*00b67f09SDavid van Moolenbroek dnl compiler) does not. And in that case, CC just raises a warning 65*00b67f09SDavid van Moolenbroek dnl during compilation, not an error, which later breaks the 66*00b67f09SDavid van Moolenbroek dnl atf-c++/t_pkg_config:cxx_build check. 67*00b67f09SDavid van Moolenbroek AC_CACHE_CHECK( 68*00b67f09SDavid van Moolenbroek [whether __attribute__((__noreturn__)) is supported], 69*00b67f09SDavid van Moolenbroek [kyua_cv_attribute_noreturn], [ 70*00b67f09SDavid van Moolenbroek AC_RUN_IFELSE( 71*00b67f09SDavid van Moolenbroek [AC_LANG_PROGRAM([], [ 72*00b67f09SDavid van Moolenbroek#if ((__GNUC__ == 2 && __GNUC_MINOR__ >= 5) || __GNUC__ > 2) 73*00b67f09SDavid van Moolenbroek return 0; 74*00b67f09SDavid van Moolenbroek#else 75*00b67f09SDavid van Moolenbroek return 1; 76*00b67f09SDavid van Moolenbroek#endif 77*00b67f09SDavid van Moolenbroek])], 78*00b67f09SDavid van Moolenbroek [kyua_cv_attribute_noreturn=yes], 79*00b67f09SDavid van Moolenbroek [kyua_cv_attribute_noreturn=no]) 80*00b67f09SDavid van Moolenbroek ]) 81*00b67f09SDavid van Moolenbroek if test x"${kyua_cv_attribute_noreturn}" = xyes; then 82*00b67f09SDavid van Moolenbroek value="__attribute__((__noreturn__))" 83*00b67f09SDavid van Moolenbroek else 84*00b67f09SDavid van Moolenbroek value="" 85*00b67f09SDavid van Moolenbroek fi 86*00b67f09SDavid van Moolenbroek AC_SUBST([ATTRIBUTE_NORETURN], [${value}]) 87*00b67f09SDavid van Moolenbroek]) 88*00b67f09SDavid van Moolenbroek 89*00b67f09SDavid van MoolenbroekAC_DEFUN([ATF_ATTRIBUTE_UNUSED], [ 90*00b67f09SDavid van Moolenbroek AC_MSG_CHECKING(whether __attribute__((__unused__)) is supported) 91*00b67f09SDavid van Moolenbroek AC_COMPILE_IFELSE( 92*00b67f09SDavid van Moolenbroek [AC_LANG_PROGRAM([ 93*00b67f09SDavid van Moolenbroekstatic void 94*00b67f09SDavid van Moolenbroekfunction(int a __attribute__((__unused__))) 95*00b67f09SDavid van Moolenbroek{ 96*00b67f09SDavid van Moolenbroek}], [ 97*00b67f09SDavid van Moolenbroek function(3); 98*00b67f09SDavid van Moolenbroek return 0; 99*00b67f09SDavid van Moolenbroek])], 100*00b67f09SDavid van Moolenbroek [AC_MSG_RESULT(yes) 101*00b67f09SDavid van Moolenbroek value="__attribute__((__unused__))"], 102*00b67f09SDavid van Moolenbroek [AC_MSG_RESULT(no) 103*00b67f09SDavid van Moolenbroek value=""] 104*00b67f09SDavid van Moolenbroek ) 105*00b67f09SDavid van Moolenbroek AC_SUBST([ATTRIBUTE_UNUSED], [${value}]) 106*00b67f09SDavid van Moolenbroek]) 107*00b67f09SDavid van Moolenbroek 108*00b67f09SDavid van MoolenbroekAC_DEFUN([ATF_MODULE_DEFS], [ 109*00b67f09SDavid van Moolenbroek ATF_ATTRIBUTE_FORMAT_PRINTF 110*00b67f09SDavid van Moolenbroek ATF_ATTRIBUTE_NORETURN 111*00b67f09SDavid van Moolenbroek ATF_ATTRIBUTE_UNUSED 112*00b67f09SDavid van Moolenbroek]) 113