1193323Sed//===-- Target.cpp --------------------------------------------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10218893Sdim// This file implements the common infrastructure (including C bindings) for
11218893Sdim// libLLVMTarget.a, which implements target information.
12193323Sed//
13193323Sed//===----------------------------------------------------------------------===//
14193323Sed
15193323Sed#include "llvm-c/Target.h"
16218893Sdim#include "llvm-c/Initialization.h"
17249423Sdim#include "llvm/IR/DataLayout.h"
18249423Sdim#include "llvm/IR/LLVMContext.h"
19251662Sdim#include "llvm/IR/Value.h"
20218893Sdim#include "llvm/InitializePasses.h"
21193323Sed#include "llvm/PassManager.h"
22226633Sdim#include "llvm/Target/TargetLibraryInfo.h"
23193323Sed#include <cstring>
24193323Sed
25193323Sedusing namespace llvm;
26193323Sed
27251662Sdiminline DataLayout *unwrap(LLVMTargetDataRef P) {
28251662Sdim  return reinterpret_cast<DataLayout*>(P);
29251662Sdim}
30251662Sdim
31251662Sdiminline LLVMTargetDataRef wrap(const DataLayout *P) {
32251662Sdim  return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P));
33251662Sdim}
34251662Sdim
35251662Sdiminline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) {
36251662Sdim  return reinterpret_cast<TargetLibraryInfo*>(P);
37251662Sdim}
38251662Sdim
39251662Sdiminline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) {
40251662Sdim  TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P);
41251662Sdim  return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
42251662Sdim}
43251662Sdim
44218893Sdimvoid llvm::initializeTarget(PassRegistry &Registry) {
45243830Sdim  initializeDataLayoutPass(Registry);
46218893Sdim  initializeTargetLibraryInfoPass(Registry);
47218893Sdim}
48218893Sdim
49218893Sdimvoid LLVMInitializeTarget(LLVMPassRegistryRef R) {
50218893Sdim  initializeTarget(*unwrap(R));
51218893Sdim}
52218893Sdim
53193323SedLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
54243830Sdim  return wrap(new DataLayout(StringRep));
55193323Sed}
56193323Sed
57193323Sedvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) {
58243830Sdim  unwrap(PM)->add(new DataLayout(*unwrap(TD)));
59193323Sed}
60193323Sed
61226633Sdimvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
62226633Sdim                              LLVMPassManagerRef PM) {
63226633Sdim  unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI)));
64226633Sdim}
65226633Sdim
66193323Sedchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
67193323Sed  std::string StringRep = unwrap(TD)->getStringRepresentation();
68193323Sed  return strdup(StringRep.c_str());
69193323Sed}
70193323Sed
71193323SedLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
72202375Srdivacky  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
73193323Sed}
74193323Sed
75193323Sedunsigned LLVMPointerSize(LLVMTargetDataRef TD) {
76243830Sdim  return unwrap(TD)->getPointerSize(0);
77193323Sed}
78193323Sed
79243830Sdimunsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
80243830Sdim  return unwrap(TD)->getPointerSize(AS);
81243830Sdim}
82243830Sdim
83193323SedLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
84198090Srdivacky  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
85193323Sed}
86193323Sed
87243830SdimLLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
88243830Sdim  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS));
89243830Sdim}
90243830Sdim
91263508SdimLLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) {
92263508Sdim  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C)));
93263508Sdim}
94263508Sdim
95263508SdimLLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD, unsigned AS) {
96263508Sdim  return wrap(unwrap(TD)->getIntPtrType(*unwrap(C), AS));
97263508Sdim}
98263508Sdim
99193323Sedunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
100193323Sed  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
101193323Sed}
102193323Sed
103193323Sedunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
104193323Sed  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
105193323Sed}
106193323Sed
107193323Sedunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
108193323Sed  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
109193323Sed}
110193323Sed
111193323Sedunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
112193323Sed  return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
113193323Sed}
114193323Sed
115193323Sedunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
116193323Sed  return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty));
117193323Sed}
118193323Sed
119193323Sedunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
120193323Sed  return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
121193323Sed}
122193323Sed
123193323Sedunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
124193323Sed                                        LLVMValueRef GlobalVar) {
125193323Sed  return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
126193323Sed}
127193323Sed
128193323Sedunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
129193323Sed                             unsigned long long Offset) {
130226633Sdim  StructType *STy = unwrap<StructType>(StructTy);
131193323Sed  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
132193323Sed}
133193323Sed
134193323Sedunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
135193323Sed                                       unsigned Element) {
136226633Sdim  StructType *STy = unwrap<StructType>(StructTy);
137193323Sed  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
138193323Sed}
139193323Sed
140193323Sedvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) {
141193323Sed  delete unwrap(TD);
142193323Sed}
143