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 module llvm.c.targetMachine; 20 21 public import llvm.c.types; 22 import llvm.c.target; 23 24 extern(C) nothrow: 25 26 struct __LLVMOpaqueTargetMachine {}; 27 alias LLVMTargetMachineRef = __LLVMOpaqueTargetMachine*; 28 struct __LLVMTarget {}; 29 alias LLVMTargetRef = __LLVMTarget*; 30 31 enum LLVMCodeGenOptLevel { 32 None, 33 Less, 34 Default, 35 Aggressive, 36 } 37 38 enum LLVMRelocMode { 39 Default, 40 Static, 41 PIC, 42 DynamicNoPic, 43 } 44 45 enum LLVMCodeModel { 46 Default, 47 JITDefault, 48 Small, 49 Kernel, 50 Medium, 51 Large, 52 } 53 54 enum LLVMCodeGenFileType { 55 Assembly, 56 Object, 57 } 58 59 /** Returns the first llvm::Target in the registered targets list. */ 60 LLVMTargetRef LLVMGetFirstTarget(); 61 /** Returns the next llvm::Target given a previous one (or null if there's none) */ 62 LLVMTargetRef 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. */ 67 LLVMTargetRef 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. */ 72 LLVMBool LLVMGetTargetFromTriple(const(char)* Triple, LLVMTargetRef* T, 73 char** ErrorMessage); 74 75 /** Returns the name of a target. See llvm::Target::getName */ 76 const(char)* LLVMGetTargetName(LLVMTargetRef T); 77 78 /** Returns the description of a target. See llvm::Target::getDescription */ 79 const(char)* LLVMGetTargetDescription(LLVMTargetRef T); 80 81 /** Returns if the target has a JIT */ 82 LLVMBool LLVMTargetHasJIT(LLVMTargetRef T); 83 84 /** Returns if the target has a TargetMachine associated */ 85 LLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T); 86 87 /** Returns if the target as an ASM backend (required for emitting output) */ 88 LLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T); 89 90 /*===-- Target Machine ----------------------------------------------------===*/ 91 /** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */ 92 LLVMTargetMachineRef 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. */ 98 void LLVMDisposeTargetMachine(LLVMTargetMachineRef T); 99 100 /** Returns the Target used in a TargetMachine */ 101 LLVMTargetRef 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. */ 106 char *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. */ 111 char *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. */ 116 char *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T); 117 118 /** Create a DataLayout based on the targetMachine. */ 119 LLVMTargetDataRef LLVMCreateTargetDataLayout(LLVMTargetMachineRef T); 120 121 /** Set the target machine's ASM verbosity. */ 122 void 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. */ 128 LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 129 const(char)* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage); 130 131 /** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 132 LLVMBool 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. */ 138 char* LLVMGetDefaultTargetTriple(); 139 140 /** Adds the target-specific analysis passes to the pass manager. */ 141 void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM);