Rework how the non-sse2 memory barrier is lowered so that the
[oota-llvm.git] / include / llvm / CompilerDriver / ForceLinkage.h
1 //===--- ForceLinkage.h - The LLVM Compiler Driver --------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open
6 // Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  A bit of preprocessor magic to force references to static libraries. Needed
11 //  because plugin initialization is done via static variables.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H
16 #define LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H
17
18 #include "llvm/CompilerDriver/ForceLinkageMacros.h"
19
20 namespace llvmc {
21
22 // Declare all ForceLinkage$(PluginName) functions.
23
24 #ifdef LLVMC_BUILTIN_PLUGIN_1
25       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_1);
26 #endif
27
28 #ifdef LLVMC_BUILTIN_PLUGIN_2
29       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_2);
30 #endif
31
32 #ifdef LLVMC_BUILTIN_PLUGIN_3
33       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_3);
34 #endif
35
36 #ifdef LLVMC_BUILTIN_PLUGIN_4
37       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_4);
38 #endif
39
40 #ifdef LLVMC_BUILTIN_PLUGIN_5
41       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_5);
42 #endif
43
44 #ifdef LLVMC_BUILTIN_PLUGIN_6
45       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_6);
46 #endif
47
48 #ifdef LLVMC_BUILTIN_PLUGIN_7
49       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_7);
50 #endif
51
52 #ifdef LLVMC_BUILTIN_PLUGIN_8
53       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_8);
54 #endif
55
56 #ifdef LLVMC_BUILTIN_PLUGIN_9
57       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_9);
58 #endif
59
60 #ifdef LLVMC_BUILTIN_PLUGIN_10
61       LLVMC_FORCE_LINKAGE_DECL(LLVMC_BUILTIN_PLUGIN_10);
62 #endif
63
64 namespace force_linkage {
65
66   struct LinkageForcer {
67
68     LinkageForcer() {
69
70 // Call all ForceLinkage$(PluginName) functions.
71 #ifdef LLVMC_BUILTIN_PLUGIN_1
72       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_1);
73 #endif
74
75 #ifdef LLVMC_BUILTIN_PLUGIN_2
76       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_2);
77 #endif
78
79 #ifdef LLVMC_BUILTIN_PLUGIN_3
80       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_3);
81 #endif
82
83 #ifdef LLVMC_BUILTIN_PLUGIN_4
84       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_4);
85 #endif
86
87 #ifdef LLVMC_BUILTIN_PLUGIN_5
88       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_5);
89 #endif
90
91 #ifdef LLVMC_BUILTIN_PLUGIN_6
92       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_6);
93 #endif
94
95 #ifdef LLVMC_BUILTIN_PLUGIN_7
96       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_7);
97 #endif
98
99 #ifdef LLVMC_BUILTIN_PLUGIN_8
100       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_8);
101 #endif
102
103 #ifdef LLVMC_BUILTIN_PLUGIN_9
104       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_9);
105 #endif
106
107 #ifdef LLVMC_BUILTIN_PLUGIN_10
108       LLVMC_FORCE_LINKAGE_CALL(LLVMC_BUILTIN_PLUGIN_10);
109 #endif
110
111     }
112   };
113 } // End namespace force_linkage.
114
115 // The only externally used bit.
116 void ForceLinkage() {
117   force_linkage::LinkageForcer dummy;
118 }
119
120 } // End namespace llvmc.
121
122 #endif // LLVM_INCLUDE_COMPILER_DRIVER_FORCE_LINKAGE_H