10b57cec5SDimitry Andric /*===-- llvm-c/TargetMachine.h - Target Machine Library C Interface - C++ -*-=*\ 20b57cec5SDimitry Andric |* *| 30b57cec5SDimitry Andric |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| 40b57cec5SDimitry Andric |* Exceptions. *| 50b57cec5SDimitry Andric |* See https://llvm.org/LICENSE.txt for license information. *| 60b57cec5SDimitry Andric |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| 70b57cec5SDimitry Andric |* *| 80b57cec5SDimitry Andric |*===----------------------------------------------------------------------===*| 90b57cec5SDimitry Andric |* *| 100b57cec5SDimitry Andric |* This header declares the C interface to the Target and TargetMachine *| 110b57cec5SDimitry Andric |* classes, which can be used to generate assembly or object files. *| 120b57cec5SDimitry Andric |* *| 130b57cec5SDimitry Andric |* Many exotic languages can interoperate with C code but have a harder time *| 140b57cec5SDimitry Andric |* with C++ due to name mangling. So in addition to C, this interface enables *| 150b57cec5SDimitry Andric |* tools written in such languages. *| 160b57cec5SDimitry Andric |* *| 170b57cec5SDimitry Andric \*===----------------------------------------------------------------------===*/ 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #ifndef LLVM_C_TARGETMACHINE_H 200b57cec5SDimitry Andric #define LLVM_C_TARGETMACHINE_H 210b57cec5SDimitry Andric 22480093f4SDimitry Andric #include "llvm-c/ExternC.h" 230b57cec5SDimitry Andric #include "llvm-c/Target.h" 240b57cec5SDimitry Andric #include "llvm-c/Types.h" 250b57cec5SDimitry Andric 26480093f4SDimitry Andric LLVM_C_EXTERN_C_BEGIN 27480093f4SDimitry Andric 28349cc55cSDimitry Andric /** 29349cc55cSDimitry Andric * @addtogroup LLVMCTarget 30349cc55cSDimitry Andric * 31349cc55cSDimitry Andric * @{ 32349cc55cSDimitry Andric */ 33349cc55cSDimitry Andric 34*5f757f3fSDimitry Andric typedef struct LLVMOpaqueTargetMachineOptions *LLVMTargetMachineOptionsRef; 350b57cec5SDimitry Andric typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef; 360b57cec5SDimitry Andric typedef struct LLVMTarget *LLVMTargetRef; 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric typedef enum { 390b57cec5SDimitry Andric LLVMCodeGenLevelNone, 400b57cec5SDimitry Andric LLVMCodeGenLevelLess, 410b57cec5SDimitry Andric LLVMCodeGenLevelDefault, 420b57cec5SDimitry Andric LLVMCodeGenLevelAggressive 430b57cec5SDimitry Andric } LLVMCodeGenOptLevel; 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric typedef enum { 460b57cec5SDimitry Andric LLVMRelocDefault, 470b57cec5SDimitry Andric LLVMRelocStatic, 480b57cec5SDimitry Andric LLVMRelocPIC, 490b57cec5SDimitry Andric LLVMRelocDynamicNoPic, 500b57cec5SDimitry Andric LLVMRelocROPI, 510b57cec5SDimitry Andric LLVMRelocRWPI, 520b57cec5SDimitry Andric LLVMRelocROPI_RWPI 530b57cec5SDimitry Andric } LLVMRelocMode; 540b57cec5SDimitry Andric 550b57cec5SDimitry Andric typedef enum { 560b57cec5SDimitry Andric LLVMCodeModelDefault, 570b57cec5SDimitry Andric LLVMCodeModelJITDefault, 580b57cec5SDimitry Andric LLVMCodeModelTiny, 590b57cec5SDimitry Andric LLVMCodeModelSmall, 600b57cec5SDimitry Andric LLVMCodeModelKernel, 610b57cec5SDimitry Andric LLVMCodeModelMedium, 620b57cec5SDimitry Andric LLVMCodeModelLarge 630b57cec5SDimitry Andric } LLVMCodeModel; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric typedef enum { 660b57cec5SDimitry Andric LLVMAssemblyFile, 670b57cec5SDimitry Andric LLVMObjectFile 680b57cec5SDimitry Andric } LLVMCodeGenFileType; 690b57cec5SDimitry Andric 70*5f757f3fSDimitry Andric typedef enum { 71*5f757f3fSDimitry Andric LLVMGlobalISelAbortEnable, 72*5f757f3fSDimitry Andric LLVMGlobalISelAbortDisable, 73*5f757f3fSDimitry Andric LLVMGlobalISelAbortDisableWithDiag, 74*5f757f3fSDimitry Andric } LLVMGlobalISelAbortMode; 75*5f757f3fSDimitry Andric 760b57cec5SDimitry Andric /** Returns the first llvm::Target in the registered targets list. */ 770b57cec5SDimitry Andric LLVMTargetRef LLVMGetFirstTarget(void); 780b57cec5SDimitry Andric /** Returns the next llvm::Target given a previous one (or null if there's none) */ 790b57cec5SDimitry Andric LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric /*===-- Target ------------------------------------------------------------===*/ 820b57cec5SDimitry Andric /** Finds the target corresponding to the given name and stores it in \p T. 830b57cec5SDimitry Andric Returns 0 on success. */ 840b57cec5SDimitry Andric LLVMTargetRef LLVMGetTargetFromName(const char *Name); 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric /** Finds the target corresponding to the given triple and stores it in \p T. 870b57cec5SDimitry Andric Returns 0 on success. Optionally returns any error in ErrorMessage. 880b57cec5SDimitry Andric Use LLVMDisposeMessage to dispose the message. */ 890b57cec5SDimitry Andric LLVMBool LLVMGetTargetFromTriple(const char* Triple, LLVMTargetRef *T, 900b57cec5SDimitry Andric char **ErrorMessage); 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric /** Returns the name of a target. See llvm::Target::getName */ 930b57cec5SDimitry Andric const char *LLVMGetTargetName(LLVMTargetRef T); 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric /** Returns the description of a target. See llvm::Target::getDescription */ 960b57cec5SDimitry Andric const char *LLVMGetTargetDescription(LLVMTargetRef T); 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric /** Returns if the target has a JIT */ 990b57cec5SDimitry Andric LLVMBool LLVMTargetHasJIT(LLVMTargetRef T); 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric /** Returns if the target has a TargetMachine associated */ 1020b57cec5SDimitry Andric LLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T); 1030b57cec5SDimitry Andric 1040b57cec5SDimitry Andric /** Returns if the target as an ASM backend (required for emitting output) */ 1050b57cec5SDimitry Andric LLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T); 1060b57cec5SDimitry Andric 1070b57cec5SDimitry Andric /*===-- Target Machine ----------------------------------------------------===*/ 108*5f757f3fSDimitry Andric /** 109*5f757f3fSDimitry Andric * Create a new set of options for an llvm::TargetMachine. 110*5f757f3fSDimitry Andric * 111*5f757f3fSDimitry Andric * The returned option structure must be released with 112*5f757f3fSDimitry Andric * LLVMDisposeTargetMachineOptions() after the call to 113*5f757f3fSDimitry Andric * LLVMCreateTargetMachineWithOptions(). 114*5f757f3fSDimitry Andric */ 115*5f757f3fSDimitry Andric LLVMTargetMachineOptionsRef LLVMCreateTargetMachineOptions(void); 116*5f757f3fSDimitry Andric 117*5f757f3fSDimitry Andric /** 118*5f757f3fSDimitry Andric * Dispose of an LLVMTargetMachineOptionsRef instance. 119*5f757f3fSDimitry Andric */ 120*5f757f3fSDimitry Andric void LLVMDisposeTargetMachineOptions(LLVMTargetMachineOptionsRef Options); 121*5f757f3fSDimitry Andric 122*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetCPU(LLVMTargetMachineOptionsRef Options, 123*5f757f3fSDimitry Andric const char *CPU); 124*5f757f3fSDimitry Andric 125*5f757f3fSDimitry Andric /** 126*5f757f3fSDimitry Andric * Set the list of features for the target machine. 127*5f757f3fSDimitry Andric * 128*5f757f3fSDimitry Andric * \param Features a comma-separated list of features. 129*5f757f3fSDimitry Andric */ 130*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetFeatures(LLVMTargetMachineOptionsRef Options, 131*5f757f3fSDimitry Andric const char *Features); 132*5f757f3fSDimitry Andric 133*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetABI(LLVMTargetMachineOptionsRef Options, 134*5f757f3fSDimitry Andric const char *ABI); 135*5f757f3fSDimitry Andric 136*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetCodeGenOptLevel( 137*5f757f3fSDimitry Andric LLVMTargetMachineOptionsRef Options, LLVMCodeGenOptLevel Level); 138*5f757f3fSDimitry Andric 139*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetRelocMode(LLVMTargetMachineOptionsRef Options, 140*5f757f3fSDimitry Andric LLVMRelocMode Reloc); 141*5f757f3fSDimitry Andric 142*5f757f3fSDimitry Andric void LLVMTargetMachineOptionsSetCodeModel(LLVMTargetMachineOptionsRef Options, 143*5f757f3fSDimitry Andric LLVMCodeModel CodeModel); 144*5f757f3fSDimitry Andric 145*5f757f3fSDimitry Andric /** 146*5f757f3fSDimitry Andric * Create a new llvm::TargetMachine. 147*5f757f3fSDimitry Andric * 148*5f757f3fSDimitry Andric * \param T the target to create a machine for. 149*5f757f3fSDimitry Andric * \param Triple a triple describing the target machine. 150*5f757f3fSDimitry Andric * \param Options additional configuration (see 151*5f757f3fSDimitry Andric * LLVMCreateTargetMachineOptions()). 152*5f757f3fSDimitry Andric */ 153*5f757f3fSDimitry Andric LLVMTargetMachineRef 154*5f757f3fSDimitry Andric LLVMCreateTargetMachineWithOptions(LLVMTargetRef T, const char *Triple, 155*5f757f3fSDimitry Andric LLVMTargetMachineOptionsRef Options); 156*5f757f3fSDimitry Andric 1570b57cec5SDimitry Andric /** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */ 1580b57cec5SDimitry Andric LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, 1590b57cec5SDimitry Andric const char *Triple, const char *CPU, const char *Features, 1600b57cec5SDimitry Andric LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, LLVMCodeModel CodeModel); 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric /** Dispose the LLVMTargetMachineRef instance generated by 1630b57cec5SDimitry Andric LLVMCreateTargetMachine. */ 1640b57cec5SDimitry Andric void LLVMDisposeTargetMachine(LLVMTargetMachineRef T); 1650b57cec5SDimitry Andric 1660b57cec5SDimitry Andric /** Returns the Target used in a TargetMachine */ 1670b57cec5SDimitry Andric LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T); 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric /** Returns the triple used creating this target machine. See 1700b57cec5SDimitry Andric llvm::TargetMachine::getTriple. The result needs to be disposed with 1710b57cec5SDimitry Andric LLVMDisposeMessage. */ 1720b57cec5SDimitry Andric char *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T); 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric /** Returns the cpu used creating this target machine. See 1750b57cec5SDimitry Andric llvm::TargetMachine::getCPU. The result needs to be disposed with 1760b57cec5SDimitry Andric LLVMDisposeMessage. */ 1770b57cec5SDimitry Andric char *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T); 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric /** Returns the feature string used creating this target machine. See 1800b57cec5SDimitry Andric llvm::TargetMachine::getFeatureString. The result needs to be disposed with 1810b57cec5SDimitry Andric LLVMDisposeMessage. */ 1820b57cec5SDimitry Andric char *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T); 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric /** Create a DataLayout based on the targetMachine. */ 1850b57cec5SDimitry Andric LLVMTargetDataRef LLVMCreateTargetDataLayout(LLVMTargetMachineRef T); 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric /** Set the target machine's ASM verbosity. */ 1880b57cec5SDimitry Andric void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T, 1890b57cec5SDimitry Andric LLVMBool VerboseAsm); 1900b57cec5SDimitry Andric 191*5f757f3fSDimitry Andric /** Enable fast-path instruction selection. */ 192*5f757f3fSDimitry Andric void LLVMSetTargetMachineFastISel(LLVMTargetMachineRef T, LLVMBool Enable); 193*5f757f3fSDimitry Andric 194*5f757f3fSDimitry Andric /** Enable global instruction selection. */ 195*5f757f3fSDimitry Andric void LLVMSetTargetMachineGlobalISel(LLVMTargetMachineRef T, LLVMBool Enable); 196*5f757f3fSDimitry Andric 197*5f757f3fSDimitry Andric /** Set abort behaviour when global instruction selection fails to lower/select 198*5f757f3fSDimitry Andric * an instruction. */ 199*5f757f3fSDimitry Andric void LLVMSetTargetMachineGlobalISelAbort(LLVMTargetMachineRef T, 200*5f757f3fSDimitry Andric LLVMGlobalISelAbortMode Mode); 201*5f757f3fSDimitry Andric 202*5f757f3fSDimitry Andric /** Enable the MachineOutliner pass. */ 203*5f757f3fSDimitry Andric void LLVMSetTargetMachineMachineOutliner(LLVMTargetMachineRef T, 204*5f757f3fSDimitry Andric LLVMBool Enable); 205*5f757f3fSDimitry Andric 2060b57cec5SDimitry Andric /** Emits an asm or object file for the given module to the filename. This 2070b57cec5SDimitry Andric wraps several c++ only classes (among them a file stream). Returns any 2080b57cec5SDimitry Andric error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 2090b57cec5SDimitry Andric LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 21081ad6265SDimitry Andric const char *Filename, 21181ad6265SDimitry Andric LLVMCodeGenFileType codegen, 21281ad6265SDimitry Andric char **ErrorMessage); 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric /** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 2150b57cec5SDimitry Andric LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 2160b57cec5SDimitry Andric LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf); 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andric /*===-- Triple ------------------------------------------------------------===*/ 2190b57cec5SDimitry Andric /** Get a triple for the host machine as a string. The result needs to be 2200b57cec5SDimitry Andric disposed with LLVMDisposeMessage. */ 2210b57cec5SDimitry Andric char* LLVMGetDefaultTargetTriple(void); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric /** Normalize a target triple. The result needs to be disposed with 2240b57cec5SDimitry Andric LLVMDisposeMessage. */ 2250b57cec5SDimitry Andric char* LLVMNormalizeTargetTriple(const char* triple); 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric /** Get the host CPU as a string. The result needs to be disposed with 2280b57cec5SDimitry Andric LLVMDisposeMessage. */ 2290b57cec5SDimitry Andric char* LLVMGetHostCPUName(void); 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric /** Get the host CPU's features as a string. The result needs to be disposed 2320b57cec5SDimitry Andric with LLVMDisposeMessage. */ 2330b57cec5SDimitry Andric char* LLVMGetHostCPUFeatures(void); 2340b57cec5SDimitry Andric 2350b57cec5SDimitry Andric /** Adds the target-specific analysis passes to the pass manager. */ 2360b57cec5SDimitry Andric void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM); 2370b57cec5SDimitry Andric 238349cc55cSDimitry Andric /** 239349cc55cSDimitry Andric * @} 240349cc55cSDimitry Andric */ 241349cc55cSDimitry Andric 242480093f4SDimitry Andric LLVM_C_EXTERN_C_END 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric #endif 245