Compiler.h revision 9c02a276049cbd1d1511a88ebc7a22bb33658237
10c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//===-- llvm/Support/Compiler.h - Compiler abstraction support --*- C++ -*-===//
20c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//
30c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//                     The LLVM Compiler Infrastructure
40c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
70c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//
80c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//===----------------------------------------------------------------------===//
90c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//
100c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// This file defines several macros, based on the current compiler.  This allows
110c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// use of compiler-specific features in a way that remains portable.
120c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//
130c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//===----------------------------------------------------------------------===//
140c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
150c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#ifndef LLVM_SUPPORT_COMPILER_H
160c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define LLVM_SUPPORT_COMPILER_H
170c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
189c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov#include "llvm/Config/llvm-config.h"
19ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov
20965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#ifndef __has_feature
21965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer# define __has_feature(x) 0
22965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#endif
23965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer
244334dd96a9e622fdcf2825a8f73a2d941d67be72Chandler Carruth/// \brief Does the compiler support r-value references?
2538dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall/// This implies that <utility> provides the one-argument std::move;  it
2638dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall/// does not imply the existence of any other C++ library features.
2738dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#if (__has_feature(cxx_rvalue_references)   \
2838dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall     || defined(__GXX_EXPERIMENTAL_CXX0X__) \
29e20cf3d14997c3511e264748c59687a801caa6edBob Wilson     || (defined(_MSC_VER) && _MSC_VER >= 1600))
304334dd96a9e622fdcf2825a8f73a2d941d67be72Chandler Carruth#define LLVM_HAS_RVALUE_REFERENCES 1
3138dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#else
324334dd96a9e622fdcf2825a8f73a2d941d67be72Chandler Carruth#define LLVM_HAS_RVALUE_REFERENCES 0
3338dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#endif
3438dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall
35a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// \brief Does the compiler support r-value reference *this?
36a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth///
37a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// Sadly, this is separate from just r-value reference support because GCC
38a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// implemented everything but this thus far. No release of GCC yet has support
39a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// for this feature so it is enabled with Clang only.
40a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// FIXME: This should change to a version check when GCC grows support for it.
41a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#if __has_feature(cxx_rvalue_references)
42a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#define LLVM_HAS_RVALUE_REFERENCE_THIS 1
43a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#else
44a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#define LLVM_HAS_RVALUE_REFERENCE_THIS 0
45a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#endif
46a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth
4701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// \macro LLVM_HAS_CXX11_TYPETRAITS
4801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// \brief Does the compiler have the C++11 type traits.
4901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer///
5001812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// #include <type_traits>
5101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer///
5201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// * enable_if
5301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// * {true,false}_type
5401812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// * is_constructible
5501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// * etc...
5601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#if defined(__GXX_EXPERIMENTAL_CXX0X__) \
57f3c437b167a98cbe47cace318989f1807b523cd5NAKAMURA Takumi    || (defined(_MSC_VER) && _MSC_VER >= 1700)
5801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#define LLVM_HAS_CXX11_TYPETRAITS 1
5901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#else
6001812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#define LLVM_HAS_CXX11_TYPETRAITS 0
6101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#endif
6201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer
6301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// \macro LLVM_HAS_CXX11_STDLIB
6401812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// \brief Does the compiler have the C++11 standard library.
6501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer///
6601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer/// Implies LLVM_HAS_RVALUE_REFERENCES, LLVM_HAS_CXX11_TYPETRAITS
6701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#if defined(__GXX_EXPERIMENTAL_CXX0X__) \
68f3c437b167a98cbe47cace318989f1807b523cd5NAKAMURA Takumi    || (defined(_MSC_VER) && _MSC_VER >= 1700)
6901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#define LLVM_HAS_CXX11_STDLIB 1
7001812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#else
7101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#define LLVM_HAS_CXX11_STDLIB 0
7201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#endif
7301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer
7438dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall/// llvm_move - Expands to ::std::move if the compiler supports
7538dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall/// r-value references; otherwise, expands to the argument.
764334dd96a9e622fdcf2825a8f73a2d941d67be72Chandler Carruth#if LLVM_HAS_RVALUE_REFERENCES
7786062e6782798cb52a79fce22c1e4371148f120dJohn McCall#define llvm_move(value) (::std::move(value))
7838dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#else
7938dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#define llvm_move(value) (value)
8038dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall#endif
8138dbb606755232e229f11994fc2bbf10e8c5788bJohn McCall
82adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose/// Expands to '&' if r-value references are supported.
83adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose///
84adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose/// This can be used to provide l-value/r-value overrides of member functions.
85a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth/// The r-value override should be guarded by LLVM_HAS_RVALUE_REFERENCE_THIS
86a5bf44b0b396e8b9ae0db5c62c05ac6618aab5d3Chandler Carruth#if LLVM_HAS_RVALUE_REFERENCE_THIS
87adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose#define LLVM_LVALUE_FUNCTION &
88adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose#else
89adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose#define LLVM_LVALUE_FUNCTION
90adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose#endif
91adf0c3d82dbff1480c63f1ebe68c7c1e6bb5828cJordan Rose
92b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// LLVM_DELETED_FUNCTION - Expands to = delete if the compiler supports it.
93b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// Use to mark functions as uncallable. Member functions with this should
94cee033188f7b1a4f1b28b8edce0c1358f19f8158Craig Topper/// be declared private so that some behavior is kept in C++03 mode.
95b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer///
96b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// class DontCopy {
97b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// private:
98b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer///   DontCopy(const DontCopy&) LLVM_DELETED_FUNCTION;
99b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer///   DontCopy &operator =(const DontCopy&) LLVM_DELETED_FUNCTION;
100b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// public:
101b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer///   ...
102b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer/// };
103b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer#if (__has_feature(cxx_deleted_functions) \
104b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer     || defined(__GXX_EXPERIMENTAL_CXX0X__))
105b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer     // No version of MSVC currently supports this.
106b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer#define LLVM_DELETED_FUNCTION = delete
107b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer#else
108b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer#define LLVM_DELETED_FUNCTION
109b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer#endif
110b9d565ac998fc857b20786bae08bb30719eb966bMichael J. Spencer
111fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper/// LLVM_FINAL - Expands to 'final' if the compiler supports it.
112fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper/// Use to mark classes or virtual methods as final.
113235c022296c2dc225bf3b4dfd5c8f8631222e570Michael J. Spencer#if __has_feature(cxx_override_control) \
114235c022296c2dc225bf3b4dfd5c8f8631222e570Michael J. Spencer    || (defined(_MSC_VER) && _MSC_VER >= 1700)
115fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#define LLVM_FINAL final
116fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#else
117fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#define LLVM_FINAL
118fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#endif
119fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper
120fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper/// LLVM_OVERRIDE - Expands to 'override' if the compiler supports it.
121fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper/// Use to mark virtual methods as overriding a base class method.
122235c022296c2dc225bf3b4dfd5c8f8631222e570Michael J. Spencer#if __has_feature(cxx_override_control) \
123235c022296c2dc225bf3b4dfd5c8f8631222e570Michael J. Spencer    || (defined(_MSC_VER) && _MSC_VER >= 1700)
124fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#define LLVM_OVERRIDE override
125fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#else
126fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#define LLVM_OVERRIDE
127fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper#endif
128fbb13471ed99ab8fdc3dbadb091ee5e2295b7b26Craig Topper
129b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer#if __has_feature(cxx_constexpr) || defined(__GXX_EXPERIMENTAL_CXX0X__)
130b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer# define LLVM_CONSTEXPR constexpr
131b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer#else
132b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer# define LLVM_CONSTEXPR
133b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer#endif
134b5f8cd5bb04df52c05cbd1eddf081e6d9cf9cd64Michael J. Spencer
13516d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands/// LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked
13616d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands/// into a shared library, then the class should be private to the library and
13716d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands/// not accessible from outside it.  Can also be used to mark variables and
13816d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands/// functions, making them private to any shared library they are linked into.
13997816e1badb4bf781d646986301e41ddea6f721cDuncan Sands#if (__GNUC__ >= 4) && !defined(__MINGW32__) && !defined(__CYGWIN__)
14016d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands#define LLVM_LIBRARY_VISIBILITY __attribute__ ((visibility("hidden")))
1410c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#else
14216d8f8bd919b72866e687d99f3aa94a140137c59Duncan Sands#define LLVM_LIBRARY_VISIBILITY
1430c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
1440c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
145cb89f6cc10d63e61115a6acc4e2703fbd0823253Julien Lerouge#if (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
146100c267249d1d03c4f96eede9877a4f9f54f2247Chandler Carruth#define LLVM_ATTRIBUTE_USED __attribute__((__used__))
1470d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#else
148100c267249d1d03c4f96eede9877a4f9f54f2247Chandler Carruth#define LLVM_ATTRIBUTE_USED
1490d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#endif
1500c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
1517283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// Some compilers warn about unused functions. When a function is sometimes
1527283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// used or not depending on build settings (e.g. a function only called from
1537283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// within "assert"), this attribute can be used to suppress such warnings.
1547283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth//
1557283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// However, it shouldn't be used for unused *variables*, as those have a much
1567283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// more portable solution:
1577283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth//   (void)unused_var_name;
1587283da51b8860ca9af4cb5ca082f7bcca3894d99Chandler Carruth// Prefer cast-to-void wherever it is sufficient.
159079b6f5ee5c3516b773a3ad71874c14e8ea7479cBill Wendling#if (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
160100c267249d1d03c4f96eede9877a4f9f54f2247Chandler Carruth#define LLVM_ATTRIBUTE_UNUSED __attribute__((__unused__))
161079b6f5ee5c3516b773a3ad71874c14e8ea7479cBill Wendling#else
162100c267249d1d03c4f96eede9877a4f9f54f2247Chandler Carruth#define LLVM_ATTRIBUTE_UNUSED
163079b6f5ee5c3516b773a3ad71874c14e8ea7479cBill Wendling#endif
164079b6f5ee5c3516b773a3ad71874c14e8ea7479cBill Wendling
16575c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#if (__GNUC__ >= 4) && !defined(__MINGW32__) && !defined(__CYGWIN__)
16675c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_ATTRIBUTE_WEAK __attribute__((__weak__))
1676f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner#else
16875c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_ATTRIBUTE_WEAK
1696f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner#endif
1706f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner
17175c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#ifdef __GNUC__ // aka 'CONST' but following LLVM Conventions.
17275c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_READNONE __attribute__((__const__))
1736f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner#else
17475c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_READNONE
1756f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner#endif
1766f0c67d4ffbc9c47153cab94985a22699b699729Chris Lattner
17775c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#ifdef __GNUC__  // aka 'PURE' but following LLVM Conventions.
17875c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_READONLY __attribute__((__pure__))
179ec381a4183f70122305f810c6b11b8f0e3bf83c0Nick Lewycky#else
18075c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar#define LLVM_READONLY
181ec381a4183f70122305f810c6b11b8f0e3bf83c0Nick Lewycky#endif
182ec381a4183f70122305f810c6b11b8f0e3bf83c0Nick Lewycky
183ec381a4183f70122305f810c6b11b8f0e3bf83c0Nick Lewycky#if (__GNUC__ >= 4)
1844d69a8c8b2133e441503ac9583c4a6056f52e0f3Benjamin Kramer#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
1854d69a8c8b2133e441503ac9583c4a6056f52e0f3Benjamin Kramer#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
186b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#else
18755907d1274ce715b92d584e305e0708e333a33c0Benjamin Kramer#define LLVM_LIKELY(EXPR) (EXPR)
18855907d1274ce715b92d584e305e0708e333a33c0Benjamin Kramer#define LLVM_UNLIKELY(EXPR) (EXPR)
189b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#endif
190b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar
1910c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// C++ doesn't support 'extern template' of template specializations.  GCC does,
1920c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// but requires __extension__ before it.  In the header, use this:
1930c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//   EXTERN_TEMPLATE_INSTANTIATION(class foo<bar>);
1940c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// in the .cpp file, use this:
1950c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//   TEMPLATE_INSTANTIATION(class foo<bar>);
1960c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#ifdef __GNUC__
1970c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define EXTERN_TEMPLATE_INSTANTIATION(X) __extension__ extern template X
1980c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define TEMPLATE_INSTANTIATION(X) template X
1990c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#else
2000c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define EXTERN_TEMPLATE_INSTANTIATION(X)
2010c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define TEMPLATE_INSTANTIATION(X)
2020c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
2030c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
2047279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// LLVM_ATTRIBUTE_NOINLINE - On compilers where we have a directive to do so,
2057279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// mark a method "not for inlining".
2066f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
20719e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NOINLINE __attribute__((noinline))
208f2a39bd24fe72481fa8fa612f3494efd41a8e001Benjamin Kramer#elif defined(_MSC_VER)
20919e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NOINLINE __declspec(noinline)
2106f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#else
21119e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NOINLINE
2126f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#endif
2136f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner
2147279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// LLVM_ATTRIBUTE_ALWAYS_INLINE - On compilers where we have a directive to do
2157279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// so, mark a method "always inline" because it is performance sensitive. GCC
2167279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// 3.4 supported this but is buggy in various cases and produces unimplemented
2177279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// errors, just use it in GCC 4.0 and later.
21814c85cbf541ec8940127474c20d8f1b5d5706bfeChris Lattner#if __GNUC__ > 3
219428ff6a6445ac1a0d263776cb0301f77f1454286Galina Kistanova#define LLVM_ATTRIBUTE_ALWAYS_INLINE inline __attribute__((always_inline))
220a0b991be3f2a15a8358d94c6b9773568ec74e8f0Michael J. Spencer#elif defined(_MSC_VER)
22119e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_ALWAYS_INLINE __forceinline
22296c7ae5e978750380360fcb3f6e47876be337c31Chris Lattner#else
22319e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_ALWAYS_INLINE
22496c7ae5e978750380360fcb3f6e47876be337c31Chris Lattner#endif
22596c7ae5e978750380360fcb3f6e47876be337c31Chris Lattner
22631e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#ifdef __GNUC__
22719e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NORETURN __attribute__((noreturn))
2287b068610eb68ae02c1c92a98d4a3749c7cb6456cBenjamin Kramer#elif defined(_MSC_VER)
22919e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NORETURN __declspec(noreturn)
23031e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#else
23119e57025d458d3cb50804fd821fd89b868a819bdChandler Carruth#define LLVM_ATTRIBUTE_NORETURN
23231e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#endif
23331e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin
2347279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// LLVM_EXTENSION - Support compilers where we have a keyword to suppress
2357279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// pedantic diagnostics.
2368f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar#ifdef __GNUC__
2378f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar#define LLVM_EXTENSION __extension__
2388f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar#else
2398f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar#define LLVM_EXTENSION
2408f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar#endif
2418f4a17214c75e8ce3f2f88a2e3cd3300faba5fc6Daniel Dunbar
242965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer// LLVM_ATTRIBUTE_DEPRECATED(decl, "message")
243965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#if __has_feature(attribute_deprecated_with_message)
244965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \
245965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  decl __attribute__((deprecated(message)))
246965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#elif defined(__GNUC__)
247965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \
248965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  decl __attribute__((deprecated))
249965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#elif defined(_MSC_VER)
250965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \
251965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  __declspec(deprecated(message)) decl
252965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#else
253965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer# define LLVM_ATTRIBUTE_DEPRECATED(decl, message) \
254965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer  decl
255965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer#endif
256965841cfe4de695fc56cab4821fd7e032ff85b83Michael J. Spencer
2577279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// LLVM_BUILTIN_UNREACHABLE - On compilers which support it, expands
2587279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// to an expression which states that it is undefined behavior for the
2597279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// compiler to reach this point.  Otherwise is not defined.
2602f9a9ed785416a7350f30141fcc405b69a1b9d5dJohn McCall#if defined(__clang__) || (__GNUC__ > 4) \
2612f9a9ed785416a7350f30141fcc405b69a1b9d5dJohn McCall || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
2622f9a9ed785416a7350f30141fcc405b69a1b9d5dJohn McCall# define LLVM_BUILTIN_UNREACHABLE __builtin_unreachable()
263c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer#elif defined(_MSC_VER)
264c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer# define LLVM_BUILTIN_UNREACHABLE __assume(false)
2652f9a9ed785416a7350f30141fcc405b69a1b9d5dJohn McCall#endif
2662f9a9ed785416a7350f30141fcc405b69a1b9d5dJohn McCall
2677279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// LLVM_BUILTIN_TRAP - On compilers which support it, expands to an expression
2687279809d97a7094f6b7c6eb83203dd6b56b00eccCraig Topper/// which causes the program to exit abnormally.
26974169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie#if defined(__clang__) || (__GNUC__ > 4) \
27074169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
27174169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie# define LLVM_BUILTIN_TRAP __builtin_trap()
27274169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie#else
27374169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie# define LLVM_BUILTIN_TRAP *(volatile int*)0x11 = 0
27474169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie#endif
27574169b293f2fc8767db3c659fde6b001b7d5075fDavid Blaikie
276c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer/// \macro LLVM_ASSUME_ALIGNED
277c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer/// \brief Returns a pointer with an assumed alignment.
27839227578242d96bc67e4ee1a408bfc0d83c6aa24Michael J. Spencer#if !defined(__clang__) && ((__GNUC__ > 4) \
27939227578242d96bc67e4ee1a408bfc0d83c6aa24Michael J. Spencer || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
280c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer// FIXME: Enable on clang when it supports it.
281c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
2821eae141f195b7edd060c2c872ea3eac4ce937262NAKAMURA Takumi#elif defined(LLVM_BUILTIN_UNREACHABLE)
283c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer# define LLVM_ASSUME_ALIGNED(p, a) \
284c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer           (((uintptr_t(p) % (a)) == 0) ? (p) : (LLVM_BUILTIN_UNREACHABLE, (p)))
2851eae141f195b7edd060c2c872ea3eac4ce937262NAKAMURA Takumi#else
2861eae141f195b7edd060c2c872ea3eac4ce937262NAKAMURA Takumi# define LLVM_ASSUME_ALIGNED(p, a) (p)
287c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer#endif
288c8b18df9a79ddb759d6a563dd7ebd90b85ae4918Michael J. Spencer
289caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko/// \macro LLVM_FUNCTION_NAME
290caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko/// \brief Expands to __func__ on compilers which support it.  Otherwise,
291caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko/// expands to a compiler-dependent replacement.
292caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko#if defined(_MSC_VER)
293caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko# define LLVM_FUNCTION_NAME __FUNCTION__
294caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko#else
295caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko# define LLVM_FUNCTION_NAME __func__
296caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko#endif
297caa91f8b8562a18eb9b66916660f950be027fd9fDmitri Gribenko
2989c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov#if defined(LLVM_HAVE_MSAN_ANNOTATIONS)
299ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov# include <sanitizer/msan_interface.h>
300ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov#else
301ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov# define __msan_allocated_memory(p, size)
3029c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov# define __msan_unpoison(p, size)
303ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov#endif
304ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov
305ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov/// \macro LLVM_MEMORY_SANITIZER_BUILD
306ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov/// \brief Whether LLVM itself is built with MemorySanitizer instrumentation.
307ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov#if __has_feature(memory_sanitizer)
308ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov# define LLVM_MEMORY_SANITIZER_BUILD 1
309ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov#else
310ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov# define LLVM_MEMORY_SANITIZER_BUILD 0
311ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov#endif
312ea2d8780e9c78628fe5e3312ca4c17c054156c83Evgeniy Stepanov
3139c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov/// \macro LLVM_ADDRESS_SANITIZER_BUILD
3149c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov/// \brief Whether LLVM itself is built with AddressSanitizer instrumentation.
3159c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov#if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)
3169c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov# define LLVM_ADDRESS_SANITIZER_BUILD 1
3179c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov#else
3189c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov# define LLVM_ADDRESS_SANITIZER_BUILD 0
3199c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov#endif
3209c02a276049cbd1d1511a88ebc7a22bb33658237Evgeniy Stepanov
321d9d2f187759d0154574657c195068d367c338473Michael J. Spencer/// \macro LLVM_IS_UNALIGNED_ACCESS_FAST
322d9d2f187759d0154574657c195068d367c338473Michael J. Spencer/// \brief Is unaligned memory access fast on the host machine.
323d9d2f187759d0154574657c195068d367c338473Michael J. Spencer///
324d9d2f187759d0154574657c195068d367c338473Michael J. Spencer/// Don't specialize on alignment for platforms where unaligned memory accesses
325d9d2f187759d0154574657c195068d367c338473Michael J. Spencer/// generates the same code as aligned memory accesses for common types.
326d9d2f187759d0154574657c195068d367c338473Michael J. Spencer#if defined(_M_AMD64) || defined(_M_IX86) || defined(__amd64) || \
327d9d2f187759d0154574657c195068d367c338473Michael J. Spencer    defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || \
328d9d2f187759d0154574657c195068d367c338473Michael J. Spencer    defined(_X86_) || defined(__i386) || defined(__i386__)
329d9d2f187759d0154574657c195068d367c338473Michael J. Spencer# define LLVM_IS_UNALIGNED_ACCESS_FAST 1
330d9d2f187759d0154574657c195068d367c338473Michael J. Spencer#else
331d9d2f187759d0154574657c195068d367c338473Michael J. Spencer# define LLVM_IS_UNALIGNED_ACCESS_FAST 0
332d9d2f187759d0154574657c195068d367c338473Michael J. Spencer#endif
333d9d2f187759d0154574657c195068d367c338473Michael J. Spencer
3340c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
335