|
| 1 | +//==---- QualtypeMapper.cpp - Maps Clang Qualtype to LLVMABI Types ---------==// |
| 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 | +/// \file |
| 10 | +/// Maps Clang QualType instances to corresponding LLVM ABI type |
| 11 | +/// representations. This mapper translates high-level type information from the |
| 12 | +/// AST into low-level ABI-specific types that encode size, alignment, and |
| 13 | +/// layout details required for code generation and cross-language |
| 14 | +/// interoperability. |
| 15 | +/// |
| 16 | +//===----------------------------------------------------------------------===// |
| 17 | +#include "clang/CodeGen/QualtypeMapper.h" |
| 18 | +#include "clang/AST/Decl.h" |
1 | 19 | #include "clang/AST/RecordLayout.h"
|
2 | 20 | #include "clang/AST/Type.h"
|
3 |
| -#include "clang/Analysis/Analyses/ThreadSafetyTIL.h" |
4 | 21 | #include "clang/Basic/LLVM.h"
|
5 | 22 | #include "clang/Basic/TargetInfo.h"
|
6 | 23 | #include "llvm/ABI/Types.h"
|
7 | 24 | #include "llvm/Support/Alignment.h"
|
8 |
| -#include "llvm/Support/Casting.h" |
9 |
| -#include <clang/ABI/QualTypeMapper.h> |
| 25 | +#include "llvm/Support/TypeSize.h" |
10 | 26 |
|
11 | 27 | namespace clang {
|
12 | 28 | namespace mapper {
|
@@ -40,87 +56,44 @@ const llvm::abi::Type *QualTypeMapper::convertType(QualType QT) {
|
40 | 56 |
|
41 | 57 | const llvm::abi::Type *
|
42 | 58 | QualTypeMapper::convertBuiltinType(const BuiltinType *BT) {
|
| 59 | + QualType QT(BT, 0); |
| 60 | + |
43 | 61 | switch (BT->getKind()) {
|
44 | 62 | case BuiltinType::Void:
|
45 | 63 | return Builder.getVoidType();
|
46 | 64 |
|
47 | 65 | case BuiltinType::Bool:
|
48 |
| - case BuiltinType::UChar: |
49 |
| - case BuiltinType::Char_U: |
50 |
| - case BuiltinType::UShort: |
51 |
| - return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), |
52 |
| - getTypeAlign(QualType(BT, 0)), false); |
53 |
| - |
54 | 66 | case BuiltinType::Char_S:
|
| 67 | + case BuiltinType::Char_U: |
55 | 68 | case BuiltinType::SChar:
|
56 |
| - case BuiltinType::Short: |
57 |
| - return Builder.getIntegerType(ASTCtx.getCharWidth(), |
58 |
| - getTypeAlign(QualType(BT, 0)), true); |
59 |
| - |
60 |
| - case BuiltinType::WChar_U: |
61 |
| - return Builder.getIntegerType(ASTCtx.getCharWidth(), |
62 |
| - getTypeAlign(QualType(BT, 0)), false); |
63 |
| - |
| 69 | + case BuiltinType::UChar: |
64 | 70 | case BuiltinType::WChar_S:
|
65 |
| - return Builder.getIntegerType(ASTCtx.getCharWidth(), |
66 |
| - getTypeAlign(QualType(BT, 0)), true); |
67 |
| - |
| 71 | + case BuiltinType::WChar_U: |
68 | 72 | case BuiltinType::Char8:
|
69 |
| - return Builder.getIntegerType(8, getTypeAlign(QualType(BT, 0)), false); |
70 |
| - |
71 | 73 | case BuiltinType::Char16:
|
72 |
| - return Builder.getIntegerType(16, getTypeAlign(QualType(BT, 0)), false); |
73 |
| - |
74 | 74 | case BuiltinType::Char32:
|
75 |
| - return Builder.getIntegerType(32, getTypeAlign(QualType(BT, 0)), false); |
76 |
| - |
| 75 | + case BuiltinType::Short: |
| 76 | + case BuiltinType::UShort: |
77 | 77 | case BuiltinType::Int:
|
78 | 78 | case BuiltinType::UInt:
|
79 |
| - return Builder.getIntegerType(ASTCtx.getIntWidth(QualType(BT, 0)), |
80 |
| - getTypeAlign(QualType(BT, 0)), |
81 |
| - BT->getKind() == BuiltinType::Int); |
82 |
| - |
83 | 79 | case BuiltinType::Long:
|
84 | 80 | case BuiltinType::ULong:
|
85 |
| - return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), |
86 |
| - getTypeAlign(QualType(BT, 0)), |
87 |
| - BT->getKind() == BuiltinType::Long); |
88 |
| - |
89 | 81 | case BuiltinType::LongLong:
|
90 | 82 | case BuiltinType::ULongLong:
|
91 |
| - return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), |
92 |
| - getTypeAlign(QualType(BT, 0)), |
93 |
| - BT->getKind() == BuiltinType::LongLong); |
94 |
| - |
95 | 83 | case BuiltinType::Int128:
|
96 | 84 | case BuiltinType::UInt128:
|
97 |
| - return Builder.getIntegerType(128, getTypeAlign(QualType(BT, 0)), |
98 |
| - BT->getKind() == BuiltinType::Int128); |
| 85 | + return Builder.getIntegerType(ASTCtx.getTypeSize(QT), getTypeAlign(QT), |
| 86 | + BT->isSignedInteger()); |
99 | 87 |
|
100 | 88 | case BuiltinType::Half:
|
101 | 89 | case BuiltinType::Float16:
|
102 |
| - return Builder.getFloatType(llvm::APFloat::IEEEhalf(), |
103 |
| - getTypeAlign(QualType(BT, 0))); |
104 |
| - |
| 90 | + case BuiltinType::BFloat16: |
105 | 91 | case BuiltinType::Float:
|
106 |
| - return Builder.getFloatType(llvm::APFloat::IEEEsingle(), |
107 |
| - getTypeAlign(QualType(BT, 0))); |
108 |
| - |
109 | 92 | case BuiltinType::Double:
|
110 |
| - return Builder.getFloatType(llvm::APFloat::IEEEdouble(), |
111 |
| - getTypeAlign(QualType(BT, 0))); |
112 |
| - |
113 | 93 | case BuiltinType::LongDouble:
|
114 |
| - return Builder.getFloatType(ASTCtx.getFloatTypeSemantics(QualType(BT, 0)), |
115 |
| - getTypeAlign(QualType(BT, 0))); |
116 |
| - |
117 |
| - case BuiltinType::BFloat16: |
118 |
| - return Builder.getFloatType(llvm::APFloat::BFloat(), |
119 |
| - getTypeAlign(QualType(BT, 0))); |
120 |
| - |
121 | 94 | case BuiltinType::Float128:
|
122 |
| - return Builder.getFloatType(llvm::APFloat::IEEEquad(), |
123 |
| - getTypeAlign(QualType(BT, 0))); |
| 95 | + return Builder.getFloatType(ASTCtx.getFloatTypeSemantics(QT), |
| 96 | + getTypeAlign(QT)); |
124 | 97 |
|
125 | 98 | default:
|
126 | 99 | return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)),
|
@@ -171,6 +144,45 @@ QualTypeMapper::convertPointerType(const clang::PointerType *PT) {
|
171 | 144 | return createPointerTypeForPointee(PT->getPointeeType());
|
172 | 145 | }
|
173 | 146 |
|
| 147 | +const llvm::abi::Type * |
| 148 | +QualTypeMapper::convertEnumType(const clang::EnumType *ET) { |
| 149 | + const EnumDecl *ED = ET->getDecl(); |
| 150 | + QualType UnderlyingType = ED->getIntegerType(); |
| 151 | + |
| 152 | + if (UnderlyingType.isNull()) |
| 153 | + UnderlyingType = ASTCtx.IntTy; |
| 154 | + |
| 155 | + return convertType(UnderlyingType); |
| 156 | +} |
| 157 | + |
| 158 | +const llvm::abi::StructType * |
| 159 | +QualTypeMapper::convertStructType(const clang::RecordDecl *RD) { |
| 160 | + const ASTRecordLayout &Layout = ASTCtx.getASTRecordLayout(RD); |
| 161 | + |
| 162 | + SmallVector<llvm::abi::FieldInfo, 16> Fields; |
| 163 | + computeFieldInfo(RD, Fields, Layout); |
| 164 | + |
| 165 | + llvm::TypeSize Size = |
| 166 | + llvm::TypeSize::getFixed(Layout.getSize().getQuantity() * 8); |
| 167 | + llvm::Align Alignment = llvm::Align(Layout.getAlignment().getQuantity()); |
| 168 | + |
| 169 | + return Builder.getStructType(Fields, Size, Alignment); |
| 170 | +} |
| 171 | + |
| 172 | +const llvm::abi::UnionType * |
| 173 | +QualTypeMapper::convertUnionType(const clang::RecordDecl *RD) { |
| 174 | + const ASTRecordLayout &Layout = ASTCtx.getASTRecordLayout(RD); |
| 175 | + |
| 176 | + SmallVector<llvm::abi::FieldInfo, 16> Fields; |
| 177 | + computeFieldInfo(RD, Fields, Layout); |
| 178 | + |
| 179 | + llvm::TypeSize Size = |
| 180 | + llvm::TypeSize::getFixed(Layout.getSize().getQuantity() * 8); |
| 181 | + llvm::Align Alignment = llvm::Align(Layout.getAlignment().getQuantity()); |
| 182 | + |
| 183 | + return Builder.getUnionType(Fields, Size, Alignment); |
| 184 | +} |
| 185 | + |
174 | 186 | llvm::Align QualTypeMapper::getTypeAlign(QualType QT) const {
|
175 | 187 | return llvm::Align(ASTCtx.getTypeAlign(QT));
|
176 | 188 | }
|
|
0 commit comments