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// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements the common infrastructure (including C bindings) for 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// libLLVMTarget.a, which implements target information. 12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm-c/Target.h" 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm-c/Initialization.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/InitializePasses.h" 18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/PassManager.h" 19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetData.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetLibraryInfo.h" 21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/LLVMContext.h" 22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <cstring> 23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm; 25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid llvm::initializeTarget(PassRegistry &Registry) { 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeTargetDataPass(Registry); 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeTargetLibraryInfoPass(Registry); 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMInitializeTarget(LLVMPassRegistryRef R) { 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman initializeTarget(*unwrap(R)); 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { 36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return wrap(new TargetData(StringRep)); 37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) { 40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unwrap(PM)->add(new TargetData(*unwrap(TD))); 41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI, 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman LLVMPassManagerRef PM) { 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI))); 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) { 49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman std::string StringRep = unwrap(TD)->getStringRepresentation(); 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return strdup(StringRep.c_str()); 51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) { 54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian; 55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPointerSize(LLVMTargetDataRef TD) { 58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPointerSize(); 59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) { 62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return wrap(unwrap(TD)->getIntPtrType(getGlobalContext())); 63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeSizeInBits(unwrap(Ty)); 67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeStoreSize(unwrap(Ty)); 71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getTypeAllocSize(unwrap(Ty)); 75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); 79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty)); 83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); 87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD, 90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LLVMValueRef GlobalVar) { 91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar)); 92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned long long Offset) { 9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StructType *STy = unwrap<StructType>(StructTy); 97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset); 98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Element) { 10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman StructType *STy = unwrap<StructType>(StructTy); 103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element); 104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) { 107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman delete unwrap(TD); 108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 109