|
| 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