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