Target.cpp revision 249423
131492Swollman//===-- Target.cpp --------------------------------------------------------===// 231492Swollman// 331492Swollman// The LLVM Compiler Infrastructure 431492Swollman// 531492Swollman// This file is distributed under the University of Illinois Open Source 631492Swollman// License. See LICENSE.TXT for details. 731492Swollman// 831492Swollman//===----------------------------------------------------------------------===// 931492Swollman// 1031492Swollman// This file implements the common infrastructure (including C bindings) for 1131492Swollman// libLLVMTarget.a, which implements target information. 1231492Swollman// 1331492Swollman//===----------------------------------------------------------------------===// 1431492Swollman 1531492Swollman#include "llvm-c/Target.h" 1631492Swollman#include "llvm-c/Initialization.h" 1731492Swollman#include "llvm/IR/DataLayout.h" 1831492Swollman#include "llvm/IR/LLVMContext.h" 1931492Swollman#include "llvm/InitializePasses.h" 2031492Swollman#include "llvm/PassManager.h" 2131492Swollman#include "llvm/Target/TargetLibraryInfo.h" 2231492Swollman#include <cstring> 2331492Swollman 2431492Swollmanusing namespace llvm; 2531492Swollman 2631492Swollmanvoid llvm::initializeTarget(PassRegistry &Registry) { 2731492Swollman initializeDataLayoutPass(Registry); 2831492Swollman initializeTargetLibraryInfoPass(Registry); 2931492Swollman} 3031492Swollman 3131492Swollmanvoid LLVMInitializeTarget(LLVMPassRegistryRef R) { 3231492Swollman initializeTarget(*unwrap(R)); 3331492Swollman} 3431492Swollman 3531492SwollmanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { 3631492Swollman return wrap(new DataLayout(StringRep)); 3731492Swollman} 3831492Swollman 39117590Sgadvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) { 40117590Sgad unwrap(PM)->add(new DataLayout(*unwrap(TD))); 41117590Sgad} 42117590Sgad 43117590Sgadvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI, 44117590Sgad LLVMPassManagerRef PM) { 45117541Sgad unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI))); 46117541Sgad} 4731492Swollman 4831492Swollmanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) { 4931492Swollman std::string StringRep = unwrap(TD)->getStringRepresentation(); 5031492Swollman return strdup(StringRep.c_str()); 5131492Swollman} 5231492Swollman 5331492SwollmanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) { 5431492Swollman return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian; 5531492Swollman} 5631492Swollman 5731492Swollmanunsigned LLVMPointerSize(LLVMTargetDataRef TD) { 5831492Swollman return unwrap(TD)->getPointerSize(0); 5931492Swollman} 6031492Swollman 6131492Swollmanunsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) { 6231492Swollman return unwrap(TD)->getPointerSize(AS); 6378146Sgad} 6431492Swollman 6578146SgadLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) { 6678146Sgad return wrap(unwrap(TD)->getIntPtrType(getGlobalContext())); 6778146Sgad} 6878146Sgad 6978146SgadLLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) { 7078146Sgad return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS)); 7178146Sgad} 7278146Sgad 7331492Swollmanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 7431492Swollman return unwrap(TD)->getTypeSizeInBits(unwrap(Ty)); 7531492Swollman} 7631492Swollman 7731492Swollmanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 7831492Swollman return unwrap(TD)->getTypeStoreSize(unwrap(Ty)); 7931492Swollman} 8031492Swollman 8131492Swollmanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 8231492Swollman return unwrap(TD)->getTypeAllocSize(unwrap(Ty)); 8331492Swollman} 8431492Swollman 8531492Swollmanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 8631492Swollman return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); 8731492Swollman} 8831492Swollman 8931492Swollmanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 9031492Swollman return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty)); 9131492Swollman} 9231492Swollman 9331492Swollmanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 9431492Swollman return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); 9531492Swollman} 9631492Swollman 9731492Swollmanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD, 9831492Swollman LLVMValueRef GlobalVar) { 9931492Swollman return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar)); 10031492Swollman} 10131492Swollman 10231492Swollmanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 10331492Swollman unsigned long long Offset) { 10431492Swollman StructType *STy = unwrap<StructType>(StructTy); 10531492Swollman return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset); 10631492Swollman} 10731492Swollman 10831492Swollmanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 10931492Swollman unsigned Element) { 11031492Swollman StructType *STy = unwrap<StructType>(StructTy); 11131492Swollman return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element); 11231492Swollman} 11331492Swollman 11431492Swollmanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) { 11531492Swollman delete unwrap(TD); 11631492Swollman} 11731492Swollman