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