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 deimos.llvm.c.targetmachine; 20 21 import deimos.llvm.c.core; 22 import deimos.llvm.c.target : LLVMTargetDataRef; 23 24 extern(C) nothrow: 25 26 struct __LLVMTargetMachine {}; 27 alias __LLVMTargetMachine *LLVMTargetMachineRef; 28 struct __LLVMTarget {}; 29 alias __LLVMTarget *LLVMTargetRef; 30 31 alias int LLVMCodeGenOptLevel; 32 enum : LLVMCodeGenOptLevel { 33 LLVMCodeGenLevelNone, 34 LLVMCodeGenLevelLess, 35 LLVMCodeGenLevelDefault, 36 LLVMCodeGenLevelAggressive 37 } 38 39 alias int LLVMRelocMode; 40 enum : LLVMRelocMode { 41 LLVMRelocDefault, 42 LLVMRelocStatic, 43 LLVMRelocPIC, 44 LLVMRelocDynamicNoPic 45 } 46 47 alias int LLVMCodeModel; 48 enum : LLVMCodeModel { 49 LLVMCodeModelDefault, 50 LLVMCodeModelJITDefault, 51 LLVMCodeModelSmall, 52 LLVMCodeModelKernel, 53 LLVMCodeModelMedium, 54 LLVMCodeModelLarge 55 } 56 57 alias int LLVMCodeGenFileType; 58 enum : LLVMCodeGenFileType { 59 LLVMAssemblyFile, 60 LLVMObjectFile 61 } 62 63 /** Returns the first llvm::Target in the registered targets list. */ 64 LLVMTargetRef LLVMGetFirstTarget(); 65 /** Returns the next llvm::Target given a previous one (or null if there's none) */ 66 LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T); 67 68 /*===-- Target ------------------------------------------------------------===*/ 69 /** Returns the name of a target. See llvm::Target::getName */ 70 const(char) *LLVMGetTargetName(LLVMTargetRef T); 71 72 /** Returns the description of a target. See llvm::Target::getDescription */ 73 const(char) *LLVMGetTargetDescription(LLVMTargetRef T); 74 75 /** Returns if the target has a JIT */ 76 LLVMBool LLVMTargetHasJIT(LLVMTargetRef T); 77 78 /** Returns if the target has a TargetMachine associated */ 79 LLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T); 80 81 /** Returns if the target as an ASM backend (required for emitting output) */ 82 LLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T); 83 84 /*===-- Target Machine ----------------------------------------------------===*/ 85 /** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */ 86 LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, char *Triple, 87 char *CPU, char *Features, LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, 88 LLVMCodeModel CodeModel); 89 90 /** Dispose the LLVMTargetMachineRef instance generated by 91 LLVMCreateTargetMachine. */ 92 void LLVMDisposeTargetMachine(LLVMTargetMachineRef T); 93 94 /** Returns the Target used in a TargetMachine */ 95 LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T); 96 97 /** Returns the triple used creating this target machine. See 98 llvm::TargetMachine::getTriple. The result needs to be disposed with 99 LLVMDisposeMessage. */ 100 char *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T); 101 102 /** Returns the cpu used creating this target machine. See 103 llvm::TargetMachine::getCPU. The result needs to be disposed with 104 LLVMDisposeMessage. */ 105 char *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T); 106 107 /** Returns the feature string used creating this target machine. See 108 llvm::TargetMachine::getFeatureString. The result needs to be disposed with 109 LLVMDisposeMessage. */ 110 char *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T); 111 112 /** Returns the llvm::DataLayout used for this llvm:TargetMachine. */ 113 LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T); 114 115 /** Emits an asm or object file for the given module to the filename. This 116 wraps several c++ only classes (among them a file stream). Returns any 117 error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 118 LLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 119 char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 120 121 /** Compile the LLVM IR stored in \p M and store the result in \p OutMemBuf. */ 122 LLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, LLVMModuleRef M, 123 LLVMCodeGenFileType codegen, char** ErrorMessage, LLVMMemoryBufferRef *OutMemBuf);