259 lines · c
1/*===-- llvm-c/TargetMachine.h - Target Machine Library C Interface - C++ -*-=*\2|* *|3|* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|4|* Exceptions. *|5|* See https://llvm.org/LICENSE.txt for license information. *|6|* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|7|* *|8|*===----------------------------------------------------------------------===*|9|* *|10|* This header declares the C interface to the Target and TargetMachine *|11|* classes, which can be used to generate assembly or object files. *|12|* *|13|* Many exotic languages can interoperate with C code but have a harder time *|14|* with C++ due to name mangling. So in addition to C, this interface enables *|15|* tools written in such languages. *|16|* *|17\*===----------------------------------------------------------------------===*/18 19#ifndef LLVM_C_TARGETMACHINE_H20#define LLVM_C_TARGETMACHINE_H21 22#include "llvm-c/ExternC.h"23#include "llvm-c/Target.h"24#include "llvm-c/Types.h"25#include "llvm-c/Visibility.h"26 27LLVM_C_EXTERN_C_BEGIN28 29/**30 * @addtogroup LLVMCTarget31 *32 * @{33 */34 35typedef struct LLVMOpaqueTargetMachineOptions *LLVMTargetMachineOptionsRef;36typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef;37typedef struct LLVMTarget *LLVMTargetRef;38 39typedef enum {40 LLVMCodeGenLevelNone,41 LLVMCodeGenLevelLess,42 LLVMCodeGenLevelDefault,43 LLVMCodeGenLevelAggressive44} LLVMCodeGenOptLevel;45 46typedef enum {47 LLVMRelocDefault,48 LLVMRelocStatic,49 LLVMRelocPIC,50 LLVMRelocDynamicNoPic,51 LLVMRelocROPI,52 LLVMRelocRWPI,53 LLVMRelocROPI_RWPI54} LLVMRelocMode;55 56typedef enum {57 LLVMCodeModelDefault,58 LLVMCodeModelJITDefault,59 LLVMCodeModelTiny,60 LLVMCodeModelSmall,61 LLVMCodeModelKernel,62 LLVMCodeModelMedium,63 LLVMCodeModelLarge64} LLVMCodeModel;65 66typedef enum {67 LLVMAssemblyFile,68 LLVMObjectFile69} LLVMCodeGenFileType;70 71typedef enum {72 LLVMGlobalISelAbortEnable,73 LLVMGlobalISelAbortDisable,74 LLVMGlobalISelAbortDisableWithDiag,75} LLVMGlobalISelAbortMode;76 77/** Returns the first llvm::Target in the registered targets list. */78LLVM_C_ABI LLVMTargetRef LLVMGetFirstTarget(void);79/** Returns the next llvm::Target given a previous one (or null if there's none) */80LLVM_C_ABI LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T);81 82/*===-- Target ------------------------------------------------------------===*/83/** Finds the target corresponding to the given name and stores it in \p T.84 Returns 0 on success. */85LLVM_C_ABI LLVMTargetRef LLVMGetTargetFromName(const char *Name);86 87/** Finds the target corresponding to the given triple and stores it in \p T.88 Returns 0 on success. Optionally returns any error in ErrorMessage.89 Use LLVMDisposeMessage to dispose the message. */90LLVM_C_ABI LLVMBool LLVMGetTargetFromTriple(const char *Triple,91 LLVMTargetRef *T,92 char **ErrorMessage);93 94/** Returns the name of a target. See llvm::Target::getName */95LLVM_C_ABI const char *LLVMGetTargetName(LLVMTargetRef T);96 97/** Returns the description of a target. See llvm::Target::getDescription */98LLVM_C_ABI const char *LLVMGetTargetDescription(LLVMTargetRef T);99 100/** Returns if the target has a JIT */101LLVM_C_ABI LLVMBool LLVMTargetHasJIT(LLVMTargetRef T);102 103/** Returns if the target has a TargetMachine associated */104LLVM_C_ABI LLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T);105 106/** Returns if the target as an ASM backend (required for emitting output) */107LLVM_C_ABI LLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T);108 109/*===-- Target Machine ----------------------------------------------------===*/110/**111 * Create a new set of options for an llvm::TargetMachine.112 *113 * The returned option structure must be released with114 * LLVMDisposeTargetMachineOptions() after the call to115 * LLVMCreateTargetMachineWithOptions().116 */117LLVM_C_ABI LLVMTargetMachineOptionsRef LLVMCreateTargetMachineOptions(void);118 119/**120 * Dispose of an LLVMTargetMachineOptionsRef instance.121 */122LLVM_C_ABI void123LLVMDisposeTargetMachineOptions(LLVMTargetMachineOptionsRef Options);124 125LLVM_C_ABI void126LLVMTargetMachineOptionsSetCPU(LLVMTargetMachineOptionsRef Options,127 const char *CPU);128 129/**130 * Set the list of features for the target machine.131 *132 * \param Features a comma-separated list of features.133 */134LLVM_C_ABI void135LLVMTargetMachineOptionsSetFeatures(LLVMTargetMachineOptionsRef Options,136 const char *Features);137 138LLVM_C_ABI void139LLVMTargetMachineOptionsSetABI(LLVMTargetMachineOptionsRef Options,140 const char *ABI);141 142LLVM_C_ABI void143LLVMTargetMachineOptionsSetCodeGenOptLevel(LLVMTargetMachineOptionsRef Options,144 LLVMCodeGenOptLevel Level);145 146LLVM_C_ABI void147LLVMTargetMachineOptionsSetRelocMode(LLVMTargetMachineOptionsRef Options,148 LLVMRelocMode Reloc);149 150LLVM_C_ABI void151LLVMTargetMachineOptionsSetCodeModel(LLVMTargetMachineOptionsRef Options,152 LLVMCodeModel CodeModel);153 154/**155 * Create a new llvm::TargetMachine.156 *157 * \param T the target to create a machine for.158 * \param Triple a triple describing the target machine.159 * \param Options additional configuration (see160 * LLVMCreateTargetMachineOptions()).161 */162LLVM_C_ABI LLVMTargetMachineRef LLVMCreateTargetMachineWithOptions(163 LLVMTargetRef T, const char *Triple, LLVMTargetMachineOptionsRef Options);164 165/** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */166LLVM_C_ABI LLVMTargetMachineRef LLVMCreateTargetMachine(167 LLVMTargetRef T, const char *Triple, const char *CPU, const char *Features,168 LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, LLVMCodeModel CodeModel);169 170/** Dispose the LLVMTargetMachineRef instance generated by171 LLVMCreateTargetMachine. */172LLVM_C_ABI void LLVMDisposeTargetMachine(LLVMTargetMachineRef T);173 174/** Returns the Target used in a TargetMachine */175LLVM_C_ABI LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T);176 177/** Returns the triple used creating this target machine. See178 llvm::TargetMachine::getTriple. The result needs to be disposed with179 LLVMDisposeMessage. */180LLVM_C_ABI char *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T);181 182/** Returns the cpu used creating this target machine. See183 llvm::TargetMachine::getCPU. The result needs to be disposed with184 LLVMDisposeMessage. */185LLVM_C_ABI char *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T);186 187/** Returns the feature string used creating this target machine. See188 llvm::TargetMachine::getFeatureString. The result needs to be disposed with189 LLVMDisposeMessage. */190LLVM_C_ABI char *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T);191 192/** Create a DataLayout based on the targetMachine. */193LLVM_C_ABI LLVMTargetDataRef LLVMCreateTargetDataLayout(LLVMTargetMachineRef T);194 195/** Set the target machine's ASM verbosity. */196LLVM_C_ABI void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T,197 LLVMBool VerboseAsm);198 199/** Enable fast-path instruction selection. */200LLVM_C_ABI void LLVMSetTargetMachineFastISel(LLVMTargetMachineRef T,201 LLVMBool Enable);202 203/** Enable global instruction selection. */204LLVM_C_ABI void LLVMSetTargetMachineGlobalISel(LLVMTargetMachineRef T,205 LLVMBool Enable);206 207/** Set abort behaviour when global instruction selection fails to lower/select208 * an instruction. */209LLVM_C_ABI void210LLVMSetTargetMachineGlobalISelAbort(LLVMTargetMachineRef T,211 LLVMGlobalISelAbortMode Mode);212 213/** Enable the MachineOutliner pass. */214LLVM_C_ABI void LLVMSetTargetMachineMachineOutliner(LLVMTargetMachineRef T,215 LLVMBool Enable);216 217/** Emits an asm or object file for the given module to the filename. This218 wraps several c++ only classes (among them a file stream). Returns any219 error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */220LLVM_C_ABI LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T,221 LLVMModuleRef M,222 const char *Filename,223 LLVMCodeGenFileType codegen,224 char **ErrorMessage);225 226/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */227LLVM_C_ABI LLVMBool LLVMTargetMachineEmitToMemoryBuffer(228 LLVMTargetMachineRef T, LLVMModuleRef M, LLVMCodeGenFileType codegen,229 char **ErrorMessage, LLVMMemoryBufferRef *OutMemBuf);230 231/*===-- Triple ------------------------------------------------------------===*/232/** Get a triple for the host machine as a string. The result needs to be233 disposed with LLVMDisposeMessage. */234LLVM_C_ABI char *LLVMGetDefaultTargetTriple(void);235 236/** Normalize a target triple. The result needs to be disposed with237 LLVMDisposeMessage. */238LLVM_C_ABI char *LLVMNormalizeTargetTriple(const char *triple);239 240/** Get the host CPU as a string. The result needs to be disposed with241 LLVMDisposeMessage. */242LLVM_C_ABI char *LLVMGetHostCPUName(void);243 244/** Get the host CPU's features as a string. The result needs to be disposed245 with LLVMDisposeMessage. */246LLVM_C_ABI char *LLVMGetHostCPUFeatures(void);247 248/** Adds the target-specific analysis passes to the pass manager. */249LLVM_C_ABI void LLVMAddAnalysisPasses(LLVMTargetMachineRef T,250 LLVMPassManagerRef PM);251 252/**253 * @}254 */255 256LLVM_C_EXTERN_C_END257 258#endif259