1d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- llvm-c/TargetMachine.h - Target Machine Library C Interface - C++ -*-=*\ 2d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 3d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* The LLVM Compiler Infrastructure *| 4d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 5d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* This file is distributed under the University of Illinois Open Source *| 6d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* License. See LICENSE.TXT for details. *| 7d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 8d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|*===----------------------------------------------------------------------===*| 9d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 10d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* This header declares the C interface to the Target and TargetMachine *| 11d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* classes, which can be used to generate assembly or object files. *| 12d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 13d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* Many exotic languages can interoperate with C code but have a harder time *| 14d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* with C++ due to name mangling. So in addition to C, this interface enables *| 15d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* tools written in such languages. *| 16d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands|* *| 17d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands\*===----------------------------------------------------------------------===*/ 18d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 19d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifndef LLVM_C_TARGETMACHINE_H 20d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#define LLVM_C_TARGETMACHINE_H 21d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 22d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include "llvm-c/Core.h" 23d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 24d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus 25d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsextern "C" { 26d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif 27d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef struct LLVMTargetMachine *LLVMTargetMachineRef; 28d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef struct LLVMTarget *LLVMTargetRef; 29d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 30d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum { 31d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeGenLevelNone, 32d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeGenLevelLess, 33d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeGenLevelDefault, 34d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeGenLevelAggressive 35d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenOptLevel; 36d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 37d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum { 38d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMRelocDefault, 39d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMRelocStatic, 40d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMRelocPIC, 41d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMRelocDynamicNoPic 42d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMRelocMode; 43d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 44d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum { 45d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelDefault, 46d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelJITDefault, 47d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelSmall, 48d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelKernel, 49d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelMedium, 50d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModelLarge 51d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeModel; 52d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 53d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandstypedef enum { 54d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMAssemblyFile, 55d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMObjectFile 56d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} LLVMCodeGenFileType; 57d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 58d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the first llvm::Target in the registered targets list. */ 59d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetFirstTarget(); 60d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the next llvm::Target given a previous one (or null if there's none) */ 61d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T); 62d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 63d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target ------------------------------------------------------------===*/ 64d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the name of a target. See llvm::Target::getName */ 65d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetName(LLVMTargetRef T); 66d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 67d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the description of a target. See llvm::Target::getDescription */ 68d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char *LLVMGetTargetDescription(LLVMTargetRef T); 69d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 70d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a JIT */ 71d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasJIT(LLVMTargetRef T); 72d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 73d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target has a TargetMachine associated */ 74d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T); 75d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 76d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns if the target as an ASM backend (required for emitting output) */ 77d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T); 78d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 79d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/*===-- Target Machine ----------------------------------------------------===*/ 80d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Creates a new llvm::TargetMachine. See llvm::Target::createTargetMachine */ 81d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, char *Triple, 82d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands char *CPU, char *Features, LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, 83d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCodeModel CodeModel); 84d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 85d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Dispose the LLVMTargetMachineRef instance generated by 86d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMCreateTargetMachine. */ 87d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsvoid LLVMDisposeTargetMachine(LLVMTargetMachineRef T); 88d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 89d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the Target used in a TargetMachine */ 90d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T); 91d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 92d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the triple used creating this target machine. See 93d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands llvm::TargetMachine::getTriple. The result needs to be disposed with 94d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMDisposeMessage. */ 95d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineTriple(LLVMTargetMachineRef T); 96d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 97d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the cpu used creating this target machine. See 98d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands llvm::TargetMachine::getCPU. The result needs to be disposed with 99d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMDisposeMessage. */ 100d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineCPU(LLVMTargetMachineRef T); 101d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 102d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the feature string used creating this target machine. See 103d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands llvm::TargetMachine::getFeatureString. The result needs to be disposed with 104d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands LLVMDisposeMessage. */ 105d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar *LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T); 106d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 107d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Returns the llvm::TargetData used for this llvm:TargetMachine. */ 108d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T); 109d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 110d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands/** Emits an asm or object file for the given module to the filename. This 111d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands wraps several c++ only classes (among them a file stream). Returns any 112d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands error in ErrorMessage. Use LLVMDisposeMessage to dispose the message. */ 113d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 114d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands char *Filename, LLVMCodeGenFileType codegen, char **ErrorMessage); 115d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 116d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 117d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 118d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 119d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#ifdef __cplusplus 120d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 121d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 122d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsnamespace llvm { 123d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands class TargetMachine; 124d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands class Target; 125d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 126d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands inline TargetMachine *unwrap(LLVMTargetMachineRef P) { 127d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return reinterpret_cast<TargetMachine*>(P); 128d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 129d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands inline Target *unwrap(LLVMTargetRef P) { 130d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return reinterpret_cast<Target*>(P); 131d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 132d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands inline LLVMTargetMachineRef wrap(const TargetMachine *P) { 133d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return reinterpret_cast<LLVMTargetMachineRef>( 134d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands const_cast<TargetMachine*>(P)); 135d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 136d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands inline LLVMTargetRef wrap(const Target * P) { 137d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P)); 138d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 139d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 140d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif 141d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 142d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#endif 143