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