Compiler.h revision f2a39bd24fe72481fa8fa612f3494efd41a8e001
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
180c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// The VISIBILITY_HIDDEN macro, used for marking classes with the GCC-specific
190c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// visibility("hidden") attribute.
20476527a19daada771579d7099eb53125d814edc1Anton Korobeynikov#if (__GNUC__ >= 4) && !defined(__MINGW32__) && !defined(__CYGWIN__)
210c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define VISIBILITY_HIDDEN __attribute__ ((visibility("hidden")))
220c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#else
230c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define VISIBILITY_HIDDEN
240c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
250c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
26cb89f6cc10d63e61115a6acc4e2703fbd0823253Julien Lerouge#if (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
270d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#define ATTRIBUTE_USED __attribute__((__used__))
280d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#else
290d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#define ATTRIBUTE_USED
300d885d1661f87bd2dc25bfdacb29413f0be81bd4Devang Patel#endif
310c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
32b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#if (__GNUC__ >= 4)
33b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#define BUILTIN_EXPECT(EXPR, VALUE) __builtin_expect((EXPR), (VALUE))
34b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#else
35b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#define BUILTIN_EXPECT(EXPR, VALUE) (EXPR)
36b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar#endif
37b372c1114c1eeffbd1a3f6ddc5d33e77564bfee2Daniel Dunbar
380c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// C++ doesn't support 'extern template' of template specializations.  GCC does,
390c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// but requires __extension__ before it.  In the header, use this:
400c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//   EXTERN_TEMPLATE_INSTANTIATION(class foo<bar>);
410c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner// in the .cpp file, use this:
420c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner//   TEMPLATE_INSTANTIATION(class foo<bar>);
430c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#ifdef __GNUC__
440c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define EXTERN_TEMPLATE_INSTANTIATION(X) __extension__ extern template X
450c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define TEMPLATE_INSTANTIATION(X) template X
460c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#else
470c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define EXTERN_TEMPLATE_INSTANTIATION(X)
480c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#define TEMPLATE_INSTANTIATION(X)
490c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
500c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner
516f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner// DISABLE_INLINE - On compilers where we have a directive to do so, mark a
526f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner// method "not for inlining".
536f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
546f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#define DISABLE_INLINE __attribute__((noinline))
55f2a39bd24fe72481fa8fa612f3494efd41a8e001Benjamin Kramer#elif defined(_MSC_VER)
56f2a39bd24fe72481fa8fa612f3494efd41a8e001Benjamin Kramer#define DISABLE_INLINE __declspec(noinline)
576f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#else
586f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#define DISABLE_INLINE
596f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner#endif
606f3241dbbf6926a1ad1d0e2f1e50e6228a55b258Chris Lattner
6131e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#ifdef __GNUC__
6231e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#define NORETURN __attribute__((noreturn))
637b068610eb68ae02c1c92a98d4a3749c7cb6456cBenjamin Kramer#elif defined(_MSC_VER)
647b068610eb68ae02c1c92a98d4a3749c7cb6456cBenjamin Kramer#define NORETURN __declspec(noreturn)
6531e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#else
6631e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#define NORETURN
6731e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin#endif
6831e2466f159a887fed9139067a676f65adf2a8c3Torok Edwin
690c0cc92762bdf34f26762eeaf66f6f8791428db5Chris Lattner#endif
70