Home | History | Annotate | Line # | Download | only in Support
      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 
     20 extern "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 
     46 namespace 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