Define LLVM_GLOBAL_VISIBILITY to be __declspec(dllexport) on
[oota-llvm.git] / include / llvm / Support / Compiler.h
1 //===-- llvm/Support/Compiler.h - Compiler abstraction support --*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines several macros, based on the current compiler.  This allows
11 // use of compiler-specific features in a way that remains portable.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_SUPPORT_COMPILER_H
16 #define LLVM_SUPPORT_COMPILER_H
17
18 /// LLVM_LIBRARY_VISIBILITY - If a class marked with this attribute is linked
19 /// into a shared library, then the class should be private to the library and
20 /// not accessible from outside it.  Can also be used to mark variables and
21 /// functions, making them private to any shared library they are linked into.
22
23 /// LLVM_GLOBAL_VISIBILITY - If a class marked with this attribute is linked
24 /// into a shared library, then the class will be accessible from outside the
25 /// the library.  Can also be used to mark variables and functions, making them
26 /// accessible from outside any shared library they are linked into.
27 #if defined(__MINGW32__) || defined(__CYGWIN__)
28 #define LLVM_LIBRARY_VISIBILITY
29 #define LLVM_GLOBAL_VISIBILITY __declspec(dllexport)
30 #elif (__GNUC__ >= 4)
31 #define LLVM_LIBRARY_VISIBILITY __attribute__ ((visibility("hidden")))
32 #define LLVM_GLOBAL_VISIBILITY __attribute__ ((visibility("default")))
33 #else
34 #define LLVM_LIBRARY_VISIBILITY
35 #define LLVM_GLOBAL_VISIBILITY
36 #endif
37
38 #if (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
39 #define ATTRIBUTE_USED __attribute__((__used__))
40 #else
41 #define ATTRIBUTE_USED
42 #endif
43
44 #if (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
45 #define ATTRIBUTE_UNUSED __attribute__((__unused__))
46 #else
47 #define ATTRIBUTE_UNUSED
48 #endif
49
50 #ifdef __GNUC__ // aka 'ATTRIBUTE_CONST' but following LLVM Conventions.
51 #define ATTRIBUTE_READNONE __attribute__((__const__))
52 #else
53 #define ATTRIBUTE_READNONE
54 #endif
55
56 #ifdef __GNUC__  // aka 'ATTRIBUTE_PURE' but following LLVM Conventions.
57 #define ATTRIBUTE_READONLY __attribute__((__pure__))
58 #else
59 #define ATTRIBUTE_READONLY
60 #endif
61
62 #if (__GNUC__ >= 4)
63 #define BUILTIN_EXPECT(EXPR, VALUE) __builtin_expect((EXPR), (VALUE))
64 #else
65 #define BUILTIN_EXPECT(EXPR, VALUE) (EXPR)
66 #endif
67
68 // C++ doesn't support 'extern template' of template specializations.  GCC does,
69 // but requires __extension__ before it.  In the header, use this:
70 //   EXTERN_TEMPLATE_INSTANTIATION(class foo<bar>);
71 // in the .cpp file, use this:
72 //   TEMPLATE_INSTANTIATION(class foo<bar>);
73 #ifdef __GNUC__
74 #define EXTERN_TEMPLATE_INSTANTIATION(X) __extension__ extern template X
75 #define TEMPLATE_INSTANTIATION(X) template X
76 #else
77 #define EXTERN_TEMPLATE_INSTANTIATION(X)
78 #define TEMPLATE_INSTANTIATION(X)
79 #endif
80
81 // DISABLE_INLINE - On compilers where we have a directive to do so, mark a
82 // method "not for inlining".
83 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
84 #define DISABLE_INLINE __attribute__((noinline))
85 #elif defined(_MSC_VER)
86 #define DISABLE_INLINE __declspec(noinline)
87 #else
88 #define DISABLE_INLINE
89 #endif
90
91 // ALWAYS_INLINE - On compilers where we have a directive to do so, mark a
92 // method "always inline" because it is performance sensitive.
93 // GCC 3.4 supported this but is buggy in various cases and produces
94 // unimplemented errors, just use it in GCC 4.0 and later.
95 #if __GNUC__ > 3
96 #define ALWAYS_INLINE __attribute__((always_inline))
97 #else
98 // TODO: No idea how to do this with MSVC.
99 #define ALWAYS_INLINE
100 #endif
101
102
103 #ifdef __GNUC__
104 #define NORETURN __attribute__((noreturn))
105 #elif defined(_MSC_VER)
106 #define NORETURN __declspec(noreturn)
107 #else
108 #define NORETURN
109 #endif
110
111 #endif