================ @@ -0,0 +1,209 @@ +#include "clang/AST/RecordLayout.h" +#include "clang/AST/Type.h" +#include "clang/Analysis/Analyses/ThreadSafetyTIL.h" +#include "clang/Basic/LLVM.h" +#include "clang/Basic/TargetInfo.h" +#include "llvm/ABI/Types.h" +#include "llvm/Support/Alignment.h" +#include "llvm/Support/Casting.h" +#include <clang/ABI/QualTypeMapper.h> + +namespace clang { +namespace mapper { + +const llvm::abi::Type *QualTypeMapper::convertType(QualType QT) { + QT = QT.getCanonicalType().getUnqualifiedType(); + + auto It = TypeCache.find(QT); + if (It != TypeCache.end()) + return It->second; + + const llvm::abi::Type *Result = nullptr; + if (const auto *BT = dyn_cast<BuiltinType>(QT.getTypePtr())) { + Result = convertBuiltinType(BT); + } else if (const auto *PT = dyn_cast<PointerType>(QT.getTypePtr())) { + Result = convertPointerType(PT); + } else if (const auto *AT = dyn_cast<ArrayType>(QT.getTypePtr())) { + Result = convertArrayType(AT); + } else if (const auto *VT = dyn_cast<VectorType>(QT.getTypePtr())) { + Result = convertVectorType(VT); + } else if (const auto *RT = dyn_cast<RecordType>(QT.getTypePtr())) { + Result = convertRecordType(RT); + } else if (const auto *ET = dyn_cast<EnumType>(QT.getTypePtr())) { + Result = convertEnumType(ET); + } else { + // TODO: Write Fallback logic for unsupported types. + } + TypeCache[QT] = Result; + return Result; +} + +const llvm::abi::Type * +QualTypeMapper::convertBuiltinType(const BuiltinType *BT) { + switch (BT->getKind()) { + case BuiltinType::Void: + return Builder.getVoidType(); + + case BuiltinType::Bool: + case BuiltinType::UChar: + case BuiltinType::Char_U: + case BuiltinType::UShort: + return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), + getTypeAlign(QualType(BT, 0)), false); + + case BuiltinType::Char_S: + case BuiltinType::SChar: + case BuiltinType::Short: + return Builder.getIntegerType(ASTCtx.getCharWidth(), + getTypeAlign(QualType(BT, 0)), true); + + case BuiltinType::WChar_U: + return Builder.getIntegerType(ASTCtx.getCharWidth(), + getTypeAlign(QualType(BT, 0)), false); + + case BuiltinType::WChar_S: + return Builder.getIntegerType(ASTCtx.getCharWidth(), + getTypeAlign(QualType(BT, 0)), true); + + case BuiltinType::Char8: + return Builder.getIntegerType(8, getTypeAlign(QualType(BT, 0)), false); + + case BuiltinType::Char16: + return Builder.getIntegerType(16, getTypeAlign(QualType(BT, 0)), false); + + case BuiltinType::Char32: + return Builder.getIntegerType(32, getTypeAlign(QualType(BT, 0)), false); + + case BuiltinType::Int: + case BuiltinType::UInt: + return Builder.getIntegerType(ASTCtx.getIntWidth(QualType(BT, 0)), + getTypeAlign(QualType(BT, 0)), + BT->getKind() == BuiltinType::Int); + + case BuiltinType::Long: + case BuiltinType::ULong: + return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), + getTypeAlign(QualType(BT, 0)), + BT->getKind() == BuiltinType::Long); + + case BuiltinType::LongLong: + case BuiltinType::ULongLong: + return Builder.getIntegerType(ASTCtx.getTypeSize(QualType(BT, 0)), + getTypeAlign(QualType(BT, 0)), + BT->getKind() == BuiltinType::LongLong); + + case BuiltinType::Int128: + case BuiltinType::UInt128: + return Builder.getIntegerType(128, getTypeAlign(QualType(BT, 0)), + BT->getKind() == BuiltinType::Int128); ---------------- nikic wrote:
Can we cover all of these in one implementation (using just getTypeSize and something like isSignedInteger)? https://github.com/llvm/llvm-project/pull/140112 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits