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//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements the common infrastructure (including C bindings) for
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// libLLVMTarget.a, which implements target information.
12894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//
13894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===//
14894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
15894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm-c/Target.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm-c/Initialization.h"
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/InitializePasses.h"
18894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/PassManager.h"
19894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/Target/TargetData.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Target/TargetLibraryInfo.h"
21894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include "llvm/LLVMContext.h"
22894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman#include <cstring>
23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
24894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanusing namespace llvm;
25894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid llvm::initializeTarget(PassRegistry &Registry) {
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeTargetDataPass(Registry);
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeTargetLibraryInfoPass(Registry);
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMInitializeTarget(LLVMPassRegistryRef R) {
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  initializeTarget(*unwrap(R));
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
35894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
36894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return wrap(new TargetData(StringRep));
37894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
39894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMAddTargetData(LLVMTargetDataRef TD, LLVMPassManagerRef PM) {
40894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  unwrap(PM)->add(new TargetData(*unwrap(TD)));
41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
42894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                              LLVMPassManagerRef PM) {
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unwrap(PM)->add(new TargetLibraryInfo(*unwrap(TLI)));
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
48894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanchar *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
49894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  std::string StringRep = unwrap(TD)->getStringRepresentation();
50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return strdup(StringRep.c_str());
51894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
52894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
54894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
55894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
57894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPointerSize(LLVMTargetDataRef TD) {
58894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPointerSize();
59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
60894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
61894018228b0e0bdbd7aa7e8f47d4a9458789ca82John BaumanLLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return wrap(unwrap(TD)->getIntPtrType(getGlobalContext()));
63894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
64894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
66894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeSizeInBits(unwrap(Ty));
67894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeStoreSize(unwrap(Ty));
71894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
72894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
73894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
74894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getTypeAllocSize(unwrap(Ty));
75894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
76894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
77894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
78894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getABITypeAlignment(unwrap(Ty));
79894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
80894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
81894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
82894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getCallFrameTypeAlignment(unwrap(Ty));
83894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
84894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
85894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
86894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPrefTypeAlignment(unwrap(Ty));
87894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
88894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
89894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
90894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                                        LLVMValueRef GlobalVar) {
91894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getPreferredAlignment(unwrap<GlobalVariable>(GlobalVar));
92894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
93894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
94894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
95894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                             unsigned long long Offset) {
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StructType *STy = unwrap<StructType>(StructTy);
97894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getStructLayout(STy)->getElementContainingOffset(Offset);
98894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
99894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
100894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanunsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
101894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman                                       unsigned Element) {
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  StructType *STy = unwrap<StructType>(StructTy);
103894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  return unwrap(TD)->getStructLayout(STy)->getElementOffset(Element);
104894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
105894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman
106894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Baumanvoid LLVMDisposeTargetData(LLVMTargetDataRef TD) {
107894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman  delete unwrap(TD);
108894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman}
109