Target.cpp revision 894018228b0e0bdbd7aa7e8f47d4a9458789ca82
1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===-- Target.cpp --------------------------------------------------------===//
2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//                     The LLVM Compiler Infrastructure
4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file is distributed under the University of Illinois Open Source
6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// License. See LICENSE.TXT for details.
7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
9894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
10894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// This file implements the C bindings for libLLVMTarget.a, which implements
11894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// target information.
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm-c/Target.h"
16894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/PassManager.h"
17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetData.h"
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/LLVMContext.h"
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <cstring>
20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm;
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return wrap(new TargetData(StringRep));
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
27894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) {
28894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  unwrap(PM)->add(new TargetData(*unwrap(TD)));
29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
30894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
31894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  std::string StringRep = unwrap(TD)->getStringRepresentation();
33894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return strdup(StringRep.c_str());
34894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPointerSize(LLVMTargetDataRef TD) {
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPointerSize();
42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
43894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
45894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
46894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty));
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                                        LLVMValueRef GlobalVar) {
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                             unsigned long long Offset) {
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const StructType *STy = unwrap<StructType>(StructTy);
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                                       unsigned Element) {
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  const StructType *STy = unwrap<StructType>(StructTy);
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMInvalidateStructLayout(LLVMTargetDataRef TD, LLVMTypeRef StructTy) {
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  unwrap(TD)->InvalidateStructLayoutInfo(unwrap<StructType>(StructTy));
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) {
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  delete unwrap(TD);
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
96