Target.cpp revision 894018228b0e0bdbd7aa7e8f47d4a9458789ca82
1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===-- Target.cpp --------------------------------------------------------===// 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// The LLVM Compiler Infrastructure 4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details. 7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file implements the C bindings for libLLVMTarget.a, which implements 11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// target information. 12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm-c/Target.h" 16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/PassManager.h" 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetData.h" 18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/LLVMContext.h" 19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <cstring> 20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm; 22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { 24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return wrap(new TargetData(StringRep)); 25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) { 28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unwrap(PM)->add(new TargetData(*unwrap(TD))); 29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) { 32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman std::string StringRep = unwrap(TD)->getStringRepresentation(); 33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return strdup(StringRep.c_str()); 34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) { 37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian; 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPointerSize(LLVMTargetDataRef TD) { 41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPointerSize(); 42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) { 45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return wrap(unwrap(TD)->getIntPtrType(getGlobalContext())); 46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeSizeInBits(unwrap(Ty)); 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeStoreSize(unwrap(Ty)); 54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeAllocSize(unwrap(Ty)); 58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); 62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty)); 66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); 70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD, 73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LLVMValueRef GlobalVar) { 74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar)); 75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned long long Offset) { 79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman const StructType *STy = unwrap<StructType>(StructTy); 80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset); 81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Element) { 85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman const StructType *STy = unwrap<StructType>(StructTy); 86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element); 87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMInvalidateStructLayout(LLVMTargetDataRef TD, LLVMTypeRef StructTy) { 90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unwrap(TD)->InvalidateStructLayoutInfo(unwrap<StructType>(StructTy)); 91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) { 94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman delete unwrap(TD); 95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 96