Target.h revision ff33d833225d392600626f8f7bdfdf5a29482e75
1/*===-- llvm-c/Target.h - Target Lib C Iface --------------------*- 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 libLLVMTarget.a, which *| 11|* implements target information. *| 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_TARGET_H 20#define LLVM_C_TARGET_H 21 22#include "llvm-c/Core.h" 23#include "llvm/Config/config.h" 24 25#ifdef __cplusplus 26extern "C" { 27#endif 28 29enum LLVMByteOrdering { LLVMBigEndian, LLVMLittleEndian }; 30 31typedef struct LLVMOpaqueTargetData *LLVMTargetDataRef; 32typedef struct LLVMStructLayout *LLVMStructLayoutRef; 33 34/* Declare all of the target-initialization functions that are available. */ 35#define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##TargetInfo(void); 36#include "llvm/Config/Targets.def" 37#undef LLVM_TARGET /* Explicit undef to make SWIG happier */ 38 39#define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##Target(void); 40#include "llvm/Config/Targets.def" 41#undef LLVM_TARGET /* Explicit undef to make SWIG happier */ 42 43/** LLVMInitializeAllTargetInfos - The main program should call this function if 44 it wants access to all available targets that LLVM is configured to 45 support. */ 46static inline void LLVMInitializeAllTargetInfos() { 47#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetInfo(); 48#include "llvm/Config/Targets.def" 49#undef LLVM_TARGET /* Explicit undef to make SWIG happier */ 50} 51 52/** LLVMInitializeAllTargets - The main program should call this function if it 53 wants to link in all available targets that LLVM is configured to 54 support. */ 55static inline void LLVMInitializeAllTargets() { 56#define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##Target(); 57#include "llvm/Config/Targets.def" 58#undef LLVM_TARGET /* Explicit undef to make SWIG happier */ 59} 60 61/** LLVMInitializeNativeTarget - The main program should call this function to 62 initialize the native target corresponding to the host. This is useful 63 for JIT applications to ensure that the target gets linked in correctly. */ 64static inline LLVMBool LLVMInitializeNativeTarget() { 65 /* If we have a native target, initialize it to ensure it is linked in. */ 66#ifdef LLVM_NATIVE_ARCH 67#define DoInit2(TARG) \ 68 LLVMInitialize ## TARG ## Info (); \ 69 LLVMInitialize ## TARG () 70#define DoInit(T) DoInit2(T) 71 DoInit(LLVM_NATIVE_ARCH); 72 return 0; 73#undef DoInit 74#undef DoInit2 75#else 76 return 1; 77#endif 78} 79 80/*===-- Target Data -------------------------------------------------------===*/ 81 82/** Creates target data from a target layout string. 83 See the constructor llvm::TargetData::TargetData. */ 84LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep); 85 86/** Adds target data information to a pass manager. This does not take ownership 87 of the target data. 88 See the method llvm::PassManagerBase::add. */ 89void LLVMAddTargetData(LLVMTargetDataRef, LLVMPassManagerRef); 90 91/** Converts target data to a target layout string. The string must be disposed 92 with LLVMDisposeMessage. 93 See the constructor llvm::TargetData::TargetData. */ 94char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef); 95 96/** Returns the byte order of a target, either LLVMBigEndian or 97 LLVMLittleEndian. 98 See the method llvm::TargetData::isLittleEndian. */ 99enum LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef); 100 101/** Returns the pointer size in bytes for a target. 102 See the method llvm::TargetData::getPointerSize. */ 103unsigned LLVMPointerSize(LLVMTargetDataRef); 104 105/** Returns the integer type that is the same size as a pointer on a target. 106 See the method llvm::TargetData::getIntPtrType. */ 107LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef); 108 109/** Computes the size of a type in bytes for a target. 110 See the method llvm::TargetData::getTypeSizeInBits. */ 111unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef, LLVMTypeRef); 112 113/** Computes the storage size of a type in bytes for a target. 114 See the method llvm::TargetData::getTypeStoreSize. */ 115unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef, LLVMTypeRef); 116 117/** Computes the ABI size of a type in bytes for a target. 118 See the method llvm::TargetData::getTypeAllocSize. */ 119unsigned long long LLVMABISizeOfType(LLVMTargetDataRef, LLVMTypeRef); 120 121/** Computes the ABI alignment of a type in bytes for a target. 122 See the method llvm::TargetData::getTypeABISize. */ 123unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef); 124 125/** Computes the call frame alignment of a type in bytes for a target. 126 See the method llvm::TargetData::getTypeABISize. */ 127unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef); 128 129/** Computes the preferred alignment of a type in bytes for a target. 130 See the method llvm::TargetData::getTypeABISize. */ 131unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef); 132 133/** Computes the preferred alignment of a global variable in bytes for a target. 134 See the method llvm::TargetData::getPreferredAlignment. */ 135unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef, 136 LLVMValueRef GlobalVar); 137 138/** Computes the structure element that contains the byte offset for a target. 139 See the method llvm::StructLayout::getElementContainingOffset. */ 140unsigned LLVMElementAtOffset(LLVMTargetDataRef, LLVMTypeRef StructTy, 141 unsigned long long Offset); 142 143/** Computes the byte offset of the indexed struct element for a target. 144 See the method llvm::StructLayout::getElementContainingOffset. */ 145unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef, LLVMTypeRef StructTy, 146 unsigned Element); 147 148/** Struct layouts are speculatively cached. If a TargetDataRef is alive when 149 types are being refined and removed, this method must be called whenever a 150 struct type is removed to avoid a dangling pointer in this cache. 151 See the method llvm::TargetData::InvalidateStructLayoutInfo. */ 152void LLVMInvalidateStructLayout(LLVMTargetDataRef, LLVMTypeRef StructTy); 153 154/** Deallocates a TargetData. 155 See the destructor llvm::TargetData::~TargetData. */ 156void LLVMDisposeTargetData(LLVMTargetDataRef); 157 158 159#ifdef __cplusplus 160} 161 162namespace llvm { 163 class TargetData; 164 165 inline TargetData *unwrap(LLVMTargetDataRef P) { 166 return reinterpret_cast<TargetData*>(P); 167 } 168 169 inline LLVMTargetDataRef wrap(const TargetData *P) { 170 return reinterpret_cast<LLVMTargetDataRef>(const_cast<TargetData*>(P)); 171 } 172} 173 174#endif /* defined(__cplusplus) */ 175 176#endif 177