1//===-- Target.cpp --------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the common infrastructure (including C bindings) for
10// libLLVMTarget.a, which implements target information.
11//
12//===----------------------------------------------------------------------===//
13
14#include "llvm-c/Target.h"
15#include "llvm/Analysis/TargetLibraryInfo.h"
16#include "llvm/IR/DataLayout.h"
17#include "llvm/IR/LLVMContext.h"
18#include "llvm/IR/LegacyPassManager.h"
19#include "llvm/IR/Module.h"
20#include "llvm/IR/Value.h"
21#include "llvm/InitializePasses.h"
22
23using namespace llvm;
24
25inline TargetLibraryInfoImpl *unwrap(LLVMTargetLibraryInfoRef P) {
26 return reinterpret_cast<TargetLibraryInfoImpl*>(P);
27}
28
29inline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfoImpl *P) {
30 TargetLibraryInfoImpl *X = const_cast<TargetLibraryInfoImpl*>(P);
31 return reinterpret_cast<LLVMTargetLibraryInfoRef>(X);
32}
33
34void llvm::initializeTarget(PassRegistry &Registry) {
35 initializeTargetLibraryInfoWrapperPassPass(Registry);
36 initializeRuntimeLibraryInfoWrapperPass(Registry);
37 initializeTargetTransformInfoWrapperPassPass(Registry);
38}
39
40LLVMTargetDataRef LLVMGetModuleDataLayout(LLVMModuleRef M) {
41 return wrap(P: &unwrap(P: M)->getDataLayout());
42}
43
44void LLVMSetModuleDataLayout(LLVMModuleRef M, LLVMTargetDataRef DL) {
45 unwrap(P: M)->setDataLayout(*unwrap(P: DL));
46}
47
48LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep) {
49 return wrap(P: new DataLayout(StringRep));
50}
51
52void LLVMDisposeTargetData(LLVMTargetDataRef TD) {
53 delete unwrap(P: TD);
54}
55
56void LLVMAddTargetLibraryInfo(LLVMTargetLibraryInfoRef TLI,
57 LLVMPassManagerRef PM) {
58 unwrap(P: PM)->add(P: new TargetLibraryInfoWrapperPass(*unwrap(P: TLI)));
59}
60
61char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef TD) {
62 std::string StringRep = unwrap(P: TD)->getStringRepresentation();
63 return strdup(s: StringRep.c_str());
64}
65
66LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef TD) {
67 return unwrap(P: TD)->isLittleEndian() ? LLVMLittleEndian : LLVMBigEndian;
68}
69
70unsigned LLVMPointerSize(LLVMTargetDataRef TD) {
71 return unwrap(P: TD)->getPointerSize(AS: 0);
72}
73
74unsigned LLVMPointerSizeForAS(LLVMTargetDataRef TD, unsigned AS) {
75 return unwrap(P: TD)->getPointerSize(AS);
76}
77
78LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef TD) {
79 return wrap(P: unwrap(P: TD)->getIntPtrType(C&: *unwrap(P: getGlobalContextForCAPI())));
80}
81
82LLVMTypeRef LLVMIntPtrTypeForAS(LLVMTargetDataRef TD, unsigned AS) {
83 return wrap(
84 P: unwrap(P: TD)->getIntPtrType(C&: *unwrap(P: getGlobalContextForCAPI()), AddressSpace: AS));
85}
86
87LLVMTypeRef LLVMIntPtrTypeInContext(LLVMContextRef C, LLVMTargetDataRef TD) {
88 return wrap(P: unwrap(P: TD)->getIntPtrType(C&: *unwrap(P: C)));
89}
90
91LLVMTypeRef LLVMIntPtrTypeForASInContext(LLVMContextRef C, LLVMTargetDataRef TD, unsigned AS) {
92 return wrap(P: unwrap(P: TD)->getIntPtrType(C&: *unwrap(P: C), AddressSpace: AS));
93}
94
95unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
96 return unwrap(P: TD)->getTypeSizeInBits(Ty: unwrap(P: Ty));
97}
98
99unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
100 return unwrap(P: TD)->getTypeStoreSize(Ty: unwrap(P: Ty));
101}
102
103unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
104 return unwrap(P: TD)->getTypeAllocSize(Ty: unwrap(P: Ty));
105}
106
107unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
108 return unwrap(P: TD)->getABITypeAlign(Ty: unwrap(P: Ty)).value();
109}
110
111unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
112 return unwrap(P: TD)->getABITypeAlign(Ty: unwrap(P: Ty)).value();
113}
114
115unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) {
116 return unwrap(P: TD)->getPrefTypeAlign(Ty: unwrap(P: Ty)).value();
117}
118
119unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef TD,
120 LLVMValueRef GlobalVar) {
121 return unwrap(P: TD)
122 ->getPreferredAlign(GV: unwrap<GlobalVariable>(P: GlobalVar))
123 .value();
124}
125
126unsigned LLVMElementAtOffset(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
127 unsigned long long Offset) {
128 StructType *STy = unwrap<StructType>(P: StructTy);
129 return unwrap(P: TD)->getStructLayout(Ty: STy)->getElementContainingOffset(FixedOffset: Offset);
130}
131
132unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef TD, LLVMTypeRef StructTy,
133 unsigned Element) {
134 StructType *STy = unwrap<StructType>(P: StructTy);
135 return unwrap(P: TD)->getStructLayout(Ty: STy)->getElementOffset(Idx: Element);
136}
137