funcattrs.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */
  2. /*
  3. * Copyright (c) 1993, 1994, 1995, 1996, 1997
  4. * The Regents of the University of California. All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. * 1. Redistributions of source code must retain the above copyright
  10. * notice, this list of conditions and the following disclaimer.
  11. * 2. Redistributions in binary form must reproduce the above copyright
  12. * notice, this list of conditions and the following disclaimer in the
  13. * documentation and/or other materials provided with the distribution.
  14. * 3. All advertising materials mentioning features or use of this software
  15. * must display the following acknowledgement:
  16. * This product includes software developed by the Computer Systems
  17. * Engineering Group at Lawrence Berkeley Laboratory.
  18. * 4. Neither the name of the University nor of the Laboratory may be used
  19. * to endorse or promote products derived from this software without
  20. * specific prior written permission.
  21. *
  22. * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32. * SUCH DAMAGE.
  33. */
  34. #ifndef lib_funcattrs_h
  35. #define lib_funcattrs_h
  36. /*
  37. * Attributes to apply to functions and their arguments, using various
  38. * compiler-specific extensions.
  39. */
  40. /*
  41. * This was introduced by Clang:
  42. *
  43. * http://clang.llvm.org/docs/LanguageExtensions.html#has-attribute
  44. *
  45. * in some version (which version?); it has been picked up by GCC 5.0.
  46. */
  47. #ifndef __has_attribute
  48. /*
  49. * It's a macro, so you can check whether it's defined to check
  50. * whether it's supported.
  51. *
  52. * If it's not, define it to always return 0, so that we move on to
  53. * the fallback checks.
  54. */
  55. #define __has_attribute(x) 0
  56. #endif
  57. /*
  58. * NORETURN, before a function declaration, means "this function
  59. * never returns". (It must go before the function declaration, e.g.
  60. * "extern NORETURN func(...)" rather than after the function
  61. * declaration, as the MSVC version has to go before the declaration.)
  62. */
  63. #if __has_attribute(noreturn) \
  64. || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \
  65. || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) \
  66. || (defined(__xlC__) && __xlC__ >= 0x0A01) \
  67. || (defined(__HP_aCC) && __HP_aCC >= 61000)
  68. /*
  69. * Compiler with support for __attribute((noreturn)), or GCC 2.5 and
  70. * later, or Solaris Studio 12 (Sun C 5.9) and later, or IBM XL C 10.1
  71. * and later (do any earlier versions of XL C support this?), or
  72. * HP aCC A.06.10 and later.
  73. */
  74. #define NORETURN __attribute((noreturn))
  75. #elif defined(_MSC_VER)
  76. /*
  77. * MSVC.
  78. */
  79. #define NORETURN __declspec(noreturn)
  80. #else
  81. #define NORETURN
  82. #endif
  83. /*
  84. * PRINTFLIKE(x,y), after a function declaration, means "this function
  85. * does printf-style formatting, with the xth argument being the format
  86. * string and the yth argument being the first argument for the format
  87. * string".
  88. */
  89. #if __has_attribute(__format__) \
  90. || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203)) \
  91. || (defined(__xlC__) && __xlC__ >= 0x0A01) \
  92. || (defined(__HP_aCC) && __HP_aCC >= 61000)
  93. /*
  94. * Compiler with support for it, or GCC 2.3 and later, or IBM XL C 10.1
  95. * and later (do any earlier versions of XL C support this?),
  96. * or HP aCC A.06.10 and later.
  97. */
  98. #define PRINTFLIKE(x,y) __attribute__((__format__(__printf__,x,y)))
  99. #else
  100. #define PRINTFLIKE(x,y)
  101. #endif
  102. /*
  103. * For flagging arguments as format strings in MSVC.
  104. */
  105. #if _MSC_VER >= 1400
  106. #include <sal.h>
  107. #if _MSC_VER > 1400
  108. #define FORMAT_STRING(p) _Printf_format_string_ p
  109. #else
  110. #define FORMAT_STRING(p) __format_string p
  111. #endif
  112. #else
  113. #define FORMAT_STRING(p) p
  114. #endif
  115. #endif /* lib_funcattrs_h */