1/*===-- llvm-c/TargetMachine.h - Target Machine Library C Interface - 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 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_H 20#define LLVM_C_TARGETMACHINE_H 21 22#include "llvm-c/Core.h" 23#include "llvm-c/Target.h" 24 25#ifdef __cplusplus 26extern "C" { 27#endif 28typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef; 29typedef struct LLVMTarget *LLVMTargetRef; 30 31typedef enum { 32 LLVMCodeGenLevelNone, 33 LLVMCodeGenLevelLess, 34 LLVMCodeGenLevelDefault, 35 LLVMCodeGenLevelAggressive 36} LLVMCodeGenOptLevel; 37 38typedef enum { 39 LLVMRelocDefault, 40 LLVMRelocStatic, 41 LLVMRelocPIC, 42 LLVMRelocDynamicNoPic 43} LLVMRelocMode; 44 45typedef enum { 46 LLVMCodeModelDefault, 47 LLVMCodeModelJITDefault, 48 LLVMCodeModelSmall, 49 LLVMCodeModelKernel, 50 LLVMCodeModelMedium, 51 LLVMCodeModelLarge 52} LLVMCodeModel; 53 54typedef enum { 55 LLVMAssemblyFile, 56 LLVMObjectFile 57} LLVMCodeGenFileType; 58 59/** Returns the first llvm::Target in the registered targets list. */ 60LLVMTargetRef LLVMGetFirstTarget(void); 61/** Returns the next llvm::Target given a previous one (or null if there's none) */ 62LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T); 63 64/*===-- Target ------------------------------------------------------------===*/ 65/** Finds the target corresponding to the given name and stores it in \p T. 66 Returns 0 on success. */ 67LLVMTargetRef LLVMGetTargetFromName(const char *Name); 68 69/** Finds the target corresponding to the given triple and stores it in \p T. 70 Returns 0 on success. Optionally returns any error in ErrorMessage. 71 Use LLVMDisposeMessage to dispose the message. */ 72LLVMBool LLVMGetTargetFromTriple(const char* Triple, LLVMTargetRef *T, 73 char **ErrorMessage); 74 75/** Returns the name of a target. See llvm::Target::getName */ 76const char *LLVMGetTargetName(LLVMTargetRef T); 77 78/** Returns the description of a target. See llvm::Target::getDescription */ 79const char *LLVMGetTargetDescription(LLVMTargetRef T); 80 81/** Returns if the target has a JIT */ 82LLVMBool LLVMTargetHasJIT(LLVMTargetRef T); 83 84/** Returns if the target has a TargetMachine associated */ 85LLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T); 86 87/** Returns if the target as an ASM backend (required for emitting output) */ 88LLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T); 89 90/*===-- Target Machine ----------------------------------------------------===*/ 91/** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */ 92LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, 93 const char *Triple, const char *CPU, const char *Features, 94 LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, LLVMCodeModel CodeModel); 95 96/** Dispose the LLVMTargetMachineRef instance generated by 97 LLVMCreateTargetMachine. */ 98void LLVMDisposeTargetMachine(LLVMTargetMachineRef T); 99 100/** Returns the Target used in a TargetMachine */ 101LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T); 102 103/** Returns the triple used creating this target machine. See 104 llvm::TargetMachine::getTriple. The result needs to be disposed with 105 LLVMDisposeMessage. */ 106char *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T); 107 108/** Returns the cpu used creating this target machine. See 109 llvm::TargetMachine::getCPU. The result needs to be disposed with 110 LLVMDisposeMessage. */ 111char *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T); 112 113/** Returns the feature string used creating this target machine. See 114 llvm::TargetMachine::getFeatureString. The result needs to be disposed with 115 LLVMDisposeMessage. */ 116char *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T); 117 118/** Returns the llvm::DataLayout used for this llvm:TargetMachine. */ 119LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T); 120 121/** Set the target machine's ASM verbosity. */ 122void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T, 123 LLVMBool VerboseAsm); 124 125/** Emits an asm or object file for the given module to the filename. This 126 wraps several c++ only classes (among them a file stream). Returns any 127 error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 128LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 129 char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 130 131/** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 132LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 133 LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf); 134 135/*===-- Triple ------------------------------------------------------------===*/ 136/** Get a triple for the host machine as a string. The result needs to be 137 disposed with LLVMDisposeMessage. */ 138char* LLVMGetDefaultTargetTriple(void); 139 140/** Adds the target-specific analysis passes to the pass manager. */ 141void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM); 142 143#ifdef __cplusplus 144} 145#endif 146 147#endif 148