13e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen//===-- Target.cpp --------------------------------------------------------===// 23e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// 33e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// The LLVM Compiler Infrastructure 43e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// 53e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// This file is distributed under the University of Illinois Open Source 63e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// License. See LICENSE.TXT for details. 73e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// 83e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen//===----------------------------------------------------------------------===// 93e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// 10154c5c46fc3ec230793c58e691b6d278d474f729Owen Anderson// This file implements the common infrastructure (including C bindings) for 119966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson// libLLVMTarget.a, which implements target information. 123e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen// 133e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen//===----------------------------------------------------------------------===// 143e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 153e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen#include "llvm-c/Target.h" 169966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson#include "llvm-c/Initialization.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h" 1940be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/IR/Value.h" 209966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson#include "llvm/InitializePasses.h" 213e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen#include "llvm/PassManager.h" 225160d381669f1367290b802c90074cdf896d5c49Rafael Espindola#include "llvm/Target/TargetLibraryInfo.h" 233e3dc57d3ff2aa010a5ac873933a6107221b4c13Torok Edwin#include <cstring> 243e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 253e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenusing namespace llvm; 263e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 273e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline DataLayout *unwrap(LLVMTargetDataRef P) { 283e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<DataLayout*>(P); 293e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 303e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 313e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetDataRef wrap(const DataLayout *P) { 323e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P)); 333e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 343e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 353e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) { 363e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<TargetLibraryInfo*>(P); 373e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 383e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 393e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) { 403e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P); 413e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetLibraryInfoRef>(X); 423e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 433e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 449966306aa7eab65d160df88b36ab13cd15dbecdbOwen Andersonvoid llvm::initializeTarget(PassRegistry &Registry) { 45bf07a512f2fd6bbcd0b217060656e9d12b9da5b0Micah Villmow initializeDataLayoutPass(Registry); 46ce99120084f549a523213064648662a704e8b789Chris Lattner initializeTargetLibraryInfoPass(Registry); 479966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson} 489966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson 499966306aa7eab65d160df88b36ab13cd15dbecdbOwen Andersonvoid LLVMInitializeTarget(LLVMPassRegistryRef R) { 509966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson initializeTarget(*unwrap(R)); 519966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson} 529966306aa7eab65d160df88b36ab13cd15dbecdbOwen Anderson 533e0c83559397c87e06ef29c41385e7adc34573c2Gordon HenriksenLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) { 543574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow return wrap(new DataLayout(StringRep)); 553e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 563e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 573e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) { 583574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow unwrap(PM)->add(new DataLayout(*unwrap(TD))); 593e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 603e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 615160d381669f1367290b802c90074cdf896d5c49Rafael Espindolavoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI, 625160d381669f1367290b802c90074cdf896d5c49Rafael Espindola LLVMPassManagerRef PM) { 635160d381669f1367290b802c90074cdf896d5c49Rafael Espindola unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI))); 645160d381669f1367290b802c90074cdf896d5c49Rafael Espindola} 655160d381669f1367290b802c90074cdf896d5c49Rafael Espindola 663e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) { 673e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen std::string StringRep = unwrap(TD)->getStringRepresentation(); 683e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return strdup(StringRep.c_str()); 693e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 703e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 713e0c83559397c87e06ef29c41385e7adc34573c2Gordon HenriksenLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) { 72d686c8e73f74e37ab5f647b65a12051ee6cbad16Chris Lattner return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian; 733e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 743e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 753e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMPointerSize(LLVMTargetDataRef TD) { 762c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow return unwrap(TD)->getPointerSize(0); 772c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow} 782c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow 792c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmowunsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) { 802c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow return unwrap(TD)->getPointerSize(AS); 813e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 823e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 833e0c83559397c87e06ef29c41385e7adc34573c2Gordon HenriksenLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) { 84ece6c6bb6329748b92403c06ac87f45c43485911Chandler Carruth return wrap(unwrap(TD)->getIntPtrType(getGlobalContext())); 853e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 863e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 872c39b15073db81d93bb629303915b7d7e5d088dcMicah VillmowLLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) { 882c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS)); 892c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow} 902c39b15073db81d93bb629303915b7d7e5d088dcMicah Villmow 913e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 923e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getTypeSizeInBits(unwrap(Ty)); 933e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 943e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 953e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 963e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getTypeStoreSize(unwrap(Ty)); 973e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 983e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 993e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 100777d2306b36816a53bc1ae1244c0dc7d998ae691Duncan Sands return unwrap(TD)->getTypeAllocSize(unwrap(Ty)); 1013e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1023e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1033e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 1043e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); 1053e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1063e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1073e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 1083e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty)); 1093e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1103e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1113e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { 1123e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty)); 1133e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1143e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1153e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD, 1163e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen LLVMValueRef GlobalVar) { 1173e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar)); 1183e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1193e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1203e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 1213e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen unsigned long long Offset) { 122db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner StructType *STy = unwrap<StructType>(StructTy); 1233e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset); 1243e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1253e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1263e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy, 1273e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen unsigned Element) { 128db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner StructType *STy = unwrap<StructType>(StructTy); 1293e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element); 1303e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 1313e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen 1323e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksenvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) { 1333e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen delete unwrap(TD); 1343e0c83559397c87e06ef29c41385e7adc34573c2Gordon Henriksen} 135