1// Copyright 2014 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_BASE_COMPILER_SPECIFIC_H_
6#define V8_BASE_COMPILER_SPECIFIC_H_
7
8#include "include/v8config.h"
9
10// Annotate a typedef or function indicating it's ok if it's not used.
11// Use like:
12//   typedef Foo Bar ALLOW_UNUSED_TYPE;
13#if V8_HAS_ATTRIBUTE_UNUSED
14#define ALLOW_UNUSED_TYPE __attribute__((unused))
15#else
16#define ALLOW_UNUSED_TYPE
17#endif
18
19
20// Annotate a function indicating the caller must examine the return value.
21// Use like:
22//   int foo() WARN_UNUSED_RESULT;
23#if V8_HAS_ATTRIBUTE_WARN_UNUSED_RESULT
24#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
25#else
26#define WARN_UNUSED_RESULT /* NOT SUPPORTED */
27#endif
28
29// Tell the compiler a function is using a printf-style format string.
30// |format_param| is the one-based index of the format string parameter;
31// |dots_param| is the one-based index of the "..." parameter.
32// For v*printf functions (which take a va_list), pass 0 for dots_param.
33// (This is undocumented but matches what the system C headers do.)
34#if defined(__GNUC__)
35#define PRINTF_FORMAT(format_param, dots_param) \
36  __attribute__((format(printf, format_param, dots_param)))
37#else
38#define PRINTF_FORMAT(format_param, dots_param)
39#endif
40
41// The C++ standard requires that static const members have an out-of-class
42// definition (in a single compilation unit), but MSVC chokes on this (when
43// language extensions, which are required, are enabled). (You're only likely to
44// notice the need for a definition if you take the address of the member or,
45// more commonly, pass it to a function that takes it as a reference argument --
46// probably an STL function.) This macro makes MSVC do the right thing. See
47// http://msdn.microsoft.com/en-us/library/34h23df8(v=vs.100).aspx for more
48// information. Use like:
49//
50// In .h file:
51//   struct Foo {
52//     static const int kBar = 5;
53//   };
54//
55// In .cc file:
56//   STATIC_CONST_MEMBER_DEFINITION const int Foo::kBar;
57#if V8_HAS_DECLSPEC_SELECTANY
58#define STATIC_CONST_MEMBER_DEFINITION __declspec(selectany)
59#else
60#define STATIC_CONST_MEMBER_DEFINITION
61#endif
62
63#if V8_CC_MSVC
64
65#include <sal.h>
66
67// Macros for suppressing and disabling warnings on MSVC.
68//
69// Warning numbers are enumerated at:
70// http://msdn.microsoft.com/en-us/library/8x5x43k7(VS.80).aspx
71//
72// The warning pragma:
73// http://msdn.microsoft.com/en-us/library/2c8f766e(VS.80).aspx
74//
75// Using __pragma instead of #pragma inside macros:
76// http://msdn.microsoft.com/en-us/library/d9x1s805.aspx
77
78// MSVC_SUPPRESS_WARNING disables warning |n| for the remainder of the line and
79// for the next line of the source file.
80#define MSVC_SUPPRESS_WARNING(n) __pragma(warning(suppress : n))
81
82// Allows exporting a class that inherits from a non-exported base class.
83// This uses suppress instead of push/pop because the delimiter after the
84// declaration (either "," or "{") has to be placed before the pop macro.
85//
86// Example usage:
87// class EXPORT_API Foo : NON_EXPORTED_BASE(public Bar) {
88//
89// MSVC Compiler warning C4275:
90// non dll-interface class 'Bar' used as base for dll-interface class 'Foo'.
91// Note that this is intended to be used only when no access to the base class'
92// static data is done through derived classes or inline methods. For more info,
93// see http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx
94#define NON_EXPORTED_BASE(code) \
95  MSVC_SUPPRESS_WARNING(4275)   \
96  code
97
98#else  // Not MSVC
99
100#define MSVC_SUPPRESS_WARNING(n)
101#define NON_EXPORTED_BASE(code) code
102
103#endif  // V8_CC_MSVC
104
105#endif  // V8_BASE_COMPILER_SPECIFIC_H_
106