1 | //===- TargetSelect.h - Target Selection & Registration ---------*- 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 provides utilities to make sure that certain classes of targets are |
11 | // linked into the main application executable, and initialize them as |
12 | // appropriate. |
13 | // |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | #ifndef LLVM_SUPPORT_TARGETSELECT_H |
17 | #define LLVM_SUPPORT_TARGETSELECT_H |
18 | |
19 | #include "llvm/Config/llvm-config.h" |
20 | |
21 | extern "C" { |
22 | // Declare all of the target-initialization functions that are available. |
23 | #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##TargetInfo(); |
24 | #include "llvm/Config/Targets.def" |
25 | |
26 | #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##Target(); |
27 | #include "llvm/Config/Targets.def" |
28 | |
29 | // Declare all of the target-MC-initialization functions that are available. |
30 | #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##TargetMC(); |
31 | #include "llvm/Config/Targets.def" |
32 | |
33 | // Declare all of the available assembly printer initialization functions. |
34 | #define LLVM_ASM_PRINTER(TargetName) void LLVMInitialize##TargetName##AsmPrinter(); |
35 | #include "llvm/Config/AsmPrinters.def" |
36 | |
37 | // Declare all of the available assembly parser initialization functions. |
38 | #define LLVM_ASM_PARSER(TargetName) void LLVMInitialize##TargetName##AsmParser(); |
39 | #include "llvm/Config/AsmParsers.def" |
40 | |
41 | // Declare all of the available disassembler initialization functions. |
42 | #define LLVM_DISASSEMBLER(TargetName) \ |
43 | void LLVMInitialize##TargetName##Disassembler(); |
44 | #include "llvm/Config/Disassemblers.def" |
45 | } |
46 | |
47 | namespace llvm { |
48 | /// InitializeAllTargetInfos - The main program should call this function if |
49 | /// it wants access to all available targets that LLVM is configured to |
50 | /// support, to make them available via the TargetRegistry. |
51 | /// |
52 | /// It is legal for a client to make multiple calls to this function. |
53 | inline void InitializeAllTargetInfos() { |
54 | #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetInfo(); |
55 | #include "llvm/Config/Targets.def" |
56 | } |
57 | |
58 | /// InitializeAllTargets - The main program should call this function if it |
59 | /// wants access to all available target machines that LLVM is configured to |
60 | /// support, to make them available via the TargetRegistry. |
61 | /// |
62 | /// It is legal for a client to make multiple calls to this function. |
63 | inline void InitializeAllTargets() { |
64 | // FIXME: Remove this, clients should do it. |
65 | InitializeAllTargetInfos(); |
66 | |
67 | #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##Target(); |
68 | #include "llvm/Config/Targets.def" |
69 | } |
70 | |
71 | /// InitializeAllTargetMCs - The main program should call this function if it |
72 | /// wants access to all available target MC that LLVM is configured to |
73 | /// support, to make them available via the TargetRegistry. |
74 | /// |
75 | /// It is legal for a client to make multiple calls to this function. |
76 | inline void InitializeAllTargetMCs() { |
77 | #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetMC(); |
78 | #include "llvm/Config/Targets.def" |
79 | } |
80 | |
81 | /// InitializeAllAsmPrinters - The main program should call this function if |
82 | /// it wants all asm printers that LLVM is configured to support, to make them |
83 | /// available via the TargetRegistry. |
84 | /// |
85 | /// It is legal for a client to make multiple calls to this function. |
86 | inline void InitializeAllAsmPrinters() { |
87 | #define LLVM_ASM_PRINTER(TargetName) LLVMInitialize##TargetName##AsmPrinter(); |
88 | #include "llvm/Config/AsmPrinters.def" |
89 | } |
90 | |
91 | /// InitializeAllAsmParsers - The main program should call this function if it |
92 | /// wants all asm parsers that LLVM is configured to support, to make them |
93 | /// available via the TargetRegistry. |
94 | /// |
95 | /// It is legal for a client to make multiple calls to this function. |
96 | inline void InitializeAllAsmParsers() { |
97 | #define LLVM_ASM_PARSER(TargetName) LLVMInitialize##TargetName##AsmParser(); |
98 | #include "llvm/Config/AsmParsers.def" |
99 | } |
100 | |
101 | /// InitializeAllDisassemblers - The main program should call this function if |
102 | /// it wants all disassemblers that LLVM is configured to support, to make |
103 | /// them available via the TargetRegistry. |
104 | /// |
105 | /// It is legal for a client to make multiple calls to this function. |
106 | inline void InitializeAllDisassemblers() { |
107 | #define LLVM_DISASSEMBLER(TargetName) LLVMInitialize##TargetName##Disassembler(); |
108 | #include "llvm/Config/Disassemblers.def" |
109 | } |
110 | |
111 | /// InitializeNativeTarget - The main program should call this function to |
112 | /// initialize the native target corresponding to the host. This is useful |
113 | /// for JIT applications to ensure that the target gets linked in correctly. |
114 | /// |
115 | /// It is legal for a client to make multiple calls to this function. |
116 | inline bool InitializeNativeTarget() { |
117 | // If we have a native target, initialize it to ensure it is linked in. |
118 | #ifdef LLVM_NATIVE_TARGET |
119 | LLVM_NATIVE_TARGETINFO(); |
120 | LLVM_NATIVE_TARGET(); |
121 | LLVM_NATIVE_TARGETMC(); |
122 | return false; |
123 | #else |
124 | return true; |
125 | #endif |
126 | } |
127 | |
128 | /// InitializeNativeTargetAsmPrinter - The main program should call |
129 | /// this function to initialize the native target asm printer. |
130 | inline bool InitializeNativeTargetAsmPrinter() { |
131 | // If we have a native target, initialize the corresponding asm printer. |
132 | #ifdef LLVM_NATIVE_ASMPRINTER |
133 | LLVM_NATIVE_ASMPRINTER(); |
134 | return false; |
135 | #else |
136 | return true; |
137 | #endif |
138 | } |
139 | |
140 | /// InitializeNativeTargetAsmParser - The main program should call |
141 | /// this function to initialize the native target asm parser. |
142 | inline bool InitializeNativeTargetAsmParser() { |
143 | // If we have a native target, initialize the corresponding asm parser. |
144 | #ifdef LLVM_NATIVE_ASMPARSER |
145 | LLVM_NATIVE_ASMPARSER(); |
146 | return false; |
147 | #else |
148 | return true; |
149 | #endif |
150 | } |
151 | |
152 | /// InitializeNativeTargetDisassembler - The main program should call |
153 | /// this function to initialize the native target disassembler. |
154 | inline bool InitializeNativeTargetDisassembler() { |
155 | // If we have a native target, initialize the corresponding disassembler. |
156 | #ifdef LLVM_NATIVE_DISASSEMBLER |
157 | LLVM_NATIVE_DISASSEMBLER(); |
158 | return false; |
159 | #else |
160 | return true; |
161 | #endif |
162 | } |
163 | } |
164 | |
165 | #endif |
166 | |