Target.cpp revision 249423
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"
19218893Sdim#include "llvm/InitializePasses.h"
20193323Sed#include "llvm/PassManager.h"
21226633Sdim#include "llvm/Target/TargetLibraryInfo.h"
22193323Sed#include <cstring>
23193323Sed
24193323Sedusing namespace llvm;
25193323Sed
26218893Sdimvoid llvm::initializeTarget(PassRegistry &Registry) {
27243830Sdim  initializeDataLayoutPass(Registry);
28218893Sdim  initializeTargetLibraryInfoPass(Registry);
29218893Sdim}
30218893Sdim
31218893Sdimvoid LLVMInitializeTarget(LLVMPassRegistryRef R) {
32218893Sdim  initializeTarget(*unwrap(R));
33218893Sdim}
34218893Sdim
35193323SedLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
36243830Sdim  return wrap(new DataLayout(StringRep));
37193323Sed}
38193323Sed
39193323Sedvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) {
40243830Sdim  unwrap(PM)->add(new DataLayout(*unwrap(TD)));
41193323Sed}
42193323Sed
43226633Sdimvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
44226633Sdim                              LLVMPassManagerRef PM) {
45226633Sdim  unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI)));
46226633Sdim}
47226633Sdim
48193323Sedchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
49193323Sed  std::string StringRep = unwrap(TD)->getStringRepresentation();
50193323Sed  return strdup(StringRep.c_str());
51193323Sed}
52193323Sed
53193323SedLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
54202375Srdivacky  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
55193323Sed}
56193323Sed
57193323Sedunsigned LLVMPointerSize(LLVMTargetDataRef TD) {
58243830Sdim  return unwrap(TD)->getPointerSize(0);
59193323Sed}
60193323Sed
61243830Sdimunsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
62243830Sdim  return unwrap(TD)->getPointerSize(AS);
63243830Sdim}
64243830Sdim
65193323SedLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
66198090Srdivacky  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
67193323Sed}
68193323Sed
69243830SdimLLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
70243830Sdim  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext(), AS));
71243830Sdim}
72243830Sdim
73193323Sedunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
74193323Sed  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
75193323Sed}
76193323Sed
77193323Sedunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
78193323Sed  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
79193323Sed}
80193323Sed
81193323Sedunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
82193323Sed  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
83193323Sed}
84193323Sed
85193323Sedunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
86193323Sed  return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
87193323Sed}
88193323Sed
89193323Sedunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
90193323Sed  return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty));
91193323Sed}
92193323Sed
93193323Sedunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
94193323Sed  return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
95193323Sed}
96193323Sed
97193323Sedunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
98193323Sed                                        LLVMValueRef GlobalVar) {
99193323Sed  return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
100193323Sed}
101193323Sed
102193323Sedunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
103193323Sed                             unsigned long long Offset) {
104226633Sdim  StructType *STy = unwrap<StructType>(StructTy);
105193323Sed  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
106193323Sed}
107193323Sed
108193323Sedunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
109193323Sed                                       unsigned Element) {
110226633Sdim  StructType *STy = unwrap<StructType>(StructTy);
111193323Sed  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
112193323Sed}
113193323Sed
114193323Sedvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) {
115193323Sed  delete unwrap(TD);
116193323Sed}
117