1f22ef01cSRoman Divacky //===-- Target.cpp --------------------------------------------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
102754fe60SDimitry Andric // This file implements the common infrastructure (including C bindings) for
112754fe60SDimitry Andric // libLLVMTarget.a, which implements target information.
12f22ef01cSRoman Divacky //
13f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
14f22ef01cSRoman Divacky 
15f22ef01cSRoman Divacky #include "llvm-c/Target.h"
162754fe60SDimitry Andric #include "llvm-c/Initialization.h"
17db17bf38SDimitry Andric #include "llvm/Analysis/TargetLibraryInfo.h"
18139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h"
19139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h"
20db17bf38SDimitry Andric #include "llvm/IR/LegacyPassManager.h"
21284c1978SDimitry Andric #include "llvm/IR/Value.h"
222754fe60SDimitry Andric #include "llvm/InitializePasses.h"
23f22ef01cSRoman Divacky #include <cstring>
24f22ef01cSRoman Divacky 
25f22ef01cSRoman Divacky using namespace llvm;
26f22ef01cSRoman Divacky 
273ca95b02SDimitry Andric // Avoid including "llvm-c/Core.h" for compile time, fwd-declare this instead.
283ca95b02SDimitry Andric extern "C" LLVMContextRef LLVMGetGlobalContext(void);
293ca95b02SDimitry Andric 
unwrap(LLVMTargetLibraryInfoRef P)30ff0cc061SDimitry Andric inline TargetLibraryInfoImpl *unwrap(LLVMTargetLibraryInfoRef P) {
31ff0cc061SDimitry Andric   return reinterpret_cast<TargetLibraryInfoImpl*>(P);
32284c1978SDimitry Andric }
33284c1978SDimitry Andric 
wrap(const TargetLibraryInfoImpl * P)34ff0cc061SDimitry Andric inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfoImpl *P) {
35ff0cc061SDimitry Andric   TargetLibraryInfoImpl *X = const_cast<TargetLibraryInfoImpl*>(P);
36284c1978SDimitry Andric   return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
37284c1978SDimitry Andric }
38284c1978SDimitry Andric 
initializeTarget(PassRegistry & Registry)392754fe60SDimitry Andric void llvm::initializeTarget(PassRegistry &Registry) {
40ff0cc061SDimitry Andric   initializeTargetLibraryInfoWrapperPassPass(Registry);
41ff0cc061SDimitry Andric   initializeTargetTransformInfoWrapperPassPass(Registry);
422754fe60SDimitry Andric }
432754fe60SDimitry Andric 
LLVMInitializeTarget(LLVMPassRegistryRef R)442754fe60SDimitry Andric void LLVMInitializeTarget(LLVMPassRegistryRef R) {
452754fe60SDimitry Andric   initializeTarget(*unwrap(R));
462754fe60SDimitry Andric }
472754fe60SDimitry Andric 
LLVMGetModuleDataLayout(LLVMModuleRef M)483ca95b02SDimitry Andric LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M) {
493ca95b02SDimitry Andric   return wrap(&unwrap(M)->getDataLayout());
503ca95b02SDimitry Andric }
513ca95b02SDimitry Andric 
LLVMSetModuleDataLayout(LLVMModuleRef M,LLVMTargetDataRef DL)523ca95b02SDimitry Andric void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL) {
533ca95b02SDimitry Andric   unwrap(M)->setDataLayout(*unwrap(DL));
543ca95b02SDimitry Andric }
553ca95b02SDimitry Andric 
LLVMCreateTargetData(const char * StringRep)56f22ef01cSRoman Divacky LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
573861d79fSDimitry Andric   return wrap(new DataLayout(StringRep));
58f22ef01cSRoman Divacky }
59f22ef01cSRoman Divacky 
LLVMDisposeTargetData(LLVMTargetDataRef TD)603ca95b02SDimitry Andric void LLVMDisposeTargetData(LLVMTargetDataRef TD) {
613ca95b02SDimitry Andric   delete unwrap(TD);
62f22ef01cSRoman Divacky }
63f22ef01cSRoman Divacky 
LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,LLVMPassManagerRef PM)646122f3e6SDimitry Andric void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
656122f3e6SDimitry Andric                               LLVMPassManagerRef PM) {
66ff0cc061SDimitry Andric   unwrap(PM)->add(new TargetLibraryInfoWrapperPass(*unwrap(TLI)));
676122f3e6SDimitry Andric }
686122f3e6SDimitry Andric 
LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD)69f22ef01cSRoman Divacky char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
70f22ef01cSRoman Divacky   std::string StringRep = unwrap(TD)->getStringRepresentation();
71f22ef01cSRoman Divacky   return strdup(StringRep.c_str());
72f22ef01cSRoman Divacky }
73f22ef01cSRoman Divacky 
LLVMByteOrder(LLVMTargetDataRef TD)74f22ef01cSRoman Divacky LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
75f22ef01cSRoman Divacky   return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
76f22ef01cSRoman Divacky }
77f22ef01cSRoman Divacky 
LLVMPointerSize(LLVMTargetDataRef TD)78f22ef01cSRoman Divacky unsigned LLVMPointerSize(LLVMTargetDataRef TD) {
793861d79fSDimitry Andric   return unwrap(TD)->getPointerSize(0);
803861d79fSDimitry Andric }
813861d79fSDimitry Andric 
LLVMPointerSizeForAS(LLVMTargetDataRef TD,unsigned AS)823861d79fSDimitry Andric unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
833861d79fSDimitry Andric   return unwrap(TD)->getPointerSize(AS);
84f22ef01cSRoman Divacky }
85f22ef01cSRoman Divacky 
LLVMIntPtrType(LLVMTargetDataRef TD)86f22ef01cSRoman Divacky LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
873ca95b02SDimitry Andric   return wrap(unwrap(TD)->getIntPtrType(*unwrap(LLVMGetGlobalContext())));
88f22ef01cSRoman Divacky }
89f22ef01cSRoman Divacky 
LLVMIntPtrTypeForAS(LLVMTargetDataRef TD,unsigned AS)903861d79fSDimitry Andric LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
913ca95b02SDimitry Andric   return wrap(unwrap(TD)->getIntPtrType(*unwrap(LLVMGetGlobalContext()), AS));
923861d79fSDimitry Andric }
933861d79fSDimitry Andric 
LLVMIntPtrTypeInContext(LLVMContextRef C,LLVMTargetDataRef TD)94f785676fSDimitry Andric LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) {
95f785676fSDimitry Andric   return wrap(unwrap(TD)->getIntPtrType(*unwrap(C)));
96f785676fSDimitry Andric }
97f785676fSDimitry Andric 
LLVMIntPtrTypeForASInContext(LLVMContextRef C,LLVMTargetDataRef TD,unsigned AS)98f785676fSDimitry Andric LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD, unsigned AS) {
99f785676fSDimitry Andric   return wrap(unwrap(TD)->getIntPtrType(*unwrap(C), AS));
100f785676fSDimitry Andric }
101f785676fSDimitry Andric 
LLVMSizeOfTypeInBits(LLVMTargetDataRef TD,LLVMTypeRef Ty)102f22ef01cSRoman Divacky unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
103f22ef01cSRoman Divacky   return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
104f22ef01cSRoman Divacky }
105f22ef01cSRoman Divacky 
LLVMStoreSizeOfType(LLVMTargetDataRef TD,LLVMTypeRef Ty)106f22ef01cSRoman Divacky unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
107f22ef01cSRoman Divacky   return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
108f22ef01cSRoman Divacky }
109f22ef01cSRoman Divacky 
LLVMABISizeOfType(LLVMTargetDataRef TD,LLVMTypeRef Ty)110f22ef01cSRoman Divacky unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
111f22ef01cSRoman Divacky   return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
112f22ef01cSRoman Divacky }
113f22ef01cSRoman Divacky 
LLVMABIAlignmentOfType(LLVMTargetDataRef TD,LLVMTypeRef Ty)114f22ef01cSRoman Divacky unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
115f22ef01cSRoman Divacky   return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
116f22ef01cSRoman Divacky }
117f22ef01cSRoman Divacky 
LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD,LLVMTypeRef Ty)118f22ef01cSRoman Divacky unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
11991bc56edSDimitry Andric   return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
120f22ef01cSRoman Divacky }
121f22ef01cSRoman Divacky 
LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD,LLVMTypeRef Ty)122f22ef01cSRoman Divacky unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
123f22ef01cSRoman Divacky   return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
124f22ef01cSRoman Divacky }
125f22ef01cSRoman Divacky 
LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,LLVMValueRef GlobalVar)126f22ef01cSRoman Divacky unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
127f22ef01cSRoman Divacky                                         LLVMValueRef GlobalVar) {
128f22ef01cSRoman Divacky   return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
129f22ef01cSRoman Divacky }
130f22ef01cSRoman Divacky 
LLVMElementAtOffset(LLVMTargetDataRef TD,LLVMTypeRef StructTy,unsigned long long Offset)131f22ef01cSRoman Divacky unsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
132f22ef01cSRoman Divacky                              unsigned long long Offset) {
1336122f3e6SDimitry Andric   StructType *STy = unwrap<StructType>(StructTy);
134f22ef01cSRoman Divacky   return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
135f22ef01cSRoman Divacky }
136f22ef01cSRoman Divacky 
LLVMOffsetOfElement(LLVMTargetDataRef TD,LLVMTypeRef StructTy,unsigned Element)137f22ef01cSRoman Divacky unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
138f22ef01cSRoman Divacky                                        unsigned Element) {
1396122f3e6SDimitry Andric   StructType *STy = unwrap<StructType>(StructTy);
140f22ef01cSRoman Divacky   return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
141f22ef01cSRoman Divacky }
142