[clang] [llvm] [WIP] ABI Lowering Library (PR #140112)

Nikita Popov via cfe-commits cfe-commits at lists.llvm.org
Fri May 30 02:43:49 PDT 2025


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


More information about the cfe-commits mailing list