https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/212952
Similar to findField(). >From 4521884fde0d14b7a003311745cc76d35842d172 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timm=20B=C3=A4der?= <[email protected]> Date: Thu, 30 Jul 2026 10:24:53 +0200 Subject: [PATCH] [clang][bytecode] Add Record::findBase() Similar to findField(). --- clang/lib/AST/ByteCode/Pointer.cpp | 12 ++++-------- clang/lib/AST/ByteCode/Record.cpp | 9 +++++++++ clang/lib/AST/ByteCode/Record.h | 1 + 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index 972dbfbbbd15d..b987b350f9537 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -1177,18 +1177,14 @@ IntPointer IntPointer::baseCast(const interp::Context &Ctx, return *this; const Record *R = Ctx.getRecord(CurType->getAsRecordDecl()); - const Descriptor *BaseDesc = nullptr; // This iterates over bases and checks for the proper offset. That's // potentially slow but this case really shouldn't happen a lot. - for (const Record::Base &B : R->bases()) { - if (B.Offset == BaseOffset) { - BaseDesc = B.Desc; - break; - } - } - assert(BaseDesc); + const Record::Base *B = R->findBase(BaseOffset); + if (!B) + return *this; + const Descriptor *BaseDesc = B->Desc; // Adjust the offset value based on the information from the record layout. const ASTContext &ASTCtx = Ctx.getASTContext(); const ASTRecordLayout &Layout = ASTCtx.getASTRecordLayout(R->getDecl()); diff --git a/clang/lib/AST/ByteCode/Record.cpp b/clang/lib/AST/ByteCode/Record.cpp index 47f7dea656f32..790061baaa560 100644 --- a/clang/lib/AST/ByteCode/Record.cpp +++ b/clang/lib/AST/ByteCode/Record.cpp @@ -74,6 +74,15 @@ const Record::Base *Record::getBase(QualType T) const { return nullptr; } +const Record::Base *Record::findBase(unsigned Offset) const { + if (auto It = llvm::find_if( + Bases, + [=](const Record::Base &B) -> bool { return B.Offset == Offset; }); + It != Bases.end()) + return &*It; + return nullptr; +} + const Record::Base *Record::getVirtualBase(const RecordDecl *FD) const { auto It = VirtualBaseMap.find(FD); if (It == VirtualBaseMap.end()) diff --git a/clang/lib/AST/ByteCode/Record.h b/clang/lib/AST/ByteCode/Record.h index 955f816e52c1e..e49f31a1d6a52 100644 --- a/clang/lib/AST/ByteCode/Record.h +++ b/clang/lib/AST/ByteCode/Record.h @@ -116,6 +116,7 @@ class Record final { /// Returns a base descriptor. const Base *getBase(const RecordDecl *RD) const; const Base *getBaseOrNull(const RecordDecl *RD) const; + const Base *findBase(unsigned Offset) const; using const_virtual_iter = VirtualBaseList::const_iterator; llvm::iterator_range<const_virtual_iter> virtual_bases() const { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
