[clang] Revert "[clang][DebugInfo][NFC] Simplify CollectRecordLambdaFields" (PR #160932)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 26 12:19:51 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Petr Hosek (petrhosek)
<details>
<summary>Changes</summary>
Reverts llvm/llvm-project#<!-- -->160690
---
Full diff: https://github.com/llvm/llvm-project/pull/160932.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/CGDebugInfo.cpp (+24-38)
- (modified) clang/lib/CodeGen/CGDebugInfo.h (-1)
``````````diff
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 68080711c4ace..12c7d48e20d67 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -26,7 +26,6 @@
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
-#include "clang/AST/LambdaCapture.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/RecursiveASTVisitor.h"
#include "clang/AST/VTableBuilder.h"
@@ -1904,59 +1903,46 @@ CGDebugInfo::createInlinedSubprogram(StringRef FuncName,
return SP;
}
-llvm::StringRef
-CGDebugInfo::GetLambdaCaptureName(const LambdaCapture &Capture) {
- if (Capture.capturesThis())
- return CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this";
-
- assert(Capture.capturesVariable());
-
- const ValueDecl *CaptureDecl = Capture.getCapturedVar();
- assert(CaptureDecl && "Expected valid decl for captured variable.");
-
- return CaptureDecl->getName();
-}
-
void CGDebugInfo::CollectRecordLambdaFields(
const CXXRecordDecl *CXXDecl, SmallVectorImpl<llvm::Metadata *> &elements,
llvm::DIType *RecordTy) {
// For C++11 Lambdas a Field will be the same as a Capture, but the Capture
// has the name and the location of the variable so we should iterate over
// both concurrently.
+ const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(CXXDecl);
RecordDecl::field_iterator Field = CXXDecl->field_begin();
unsigned fieldno = 0;
for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(),
E = CXXDecl->captures_end();
I != E; ++I, ++Field, ++fieldno) {
- const LambdaCapture &Capture = *I;
- const uint64_t FieldOffset =
- CGM.getContext().getASTRecordLayout(CXXDecl).getFieldOffset(fieldno);
-
- assert(!Field->isBitField() && "lambdas don't have bitfield members!");
-
- SourceLocation Loc;
- uint32_t Align = 0;
-
- if (Capture.capturesThis()) {
+ const LambdaCapture &C = *I;
+ if (C.capturesVariable()) {
+ SourceLocation Loc = C.getLocation();
+ assert(!Field->isBitField() && "lambdas don't have bitfield members!");
+ ValueDecl *V = C.getCapturedVar();
+ StringRef VName = V->getName();
+ llvm::DIFile *VUnit = getOrCreateFile(Loc);
+ auto Align = getDeclAlignIfRequired(V, CGM.getContext());
+ llvm::DIType *FieldType = createFieldType(
+ VName, Field->getType(), Loc, Field->getAccess(),
+ layout.getFieldOffset(fieldno), Align, VUnit, RecordTy, CXXDecl);
+ elements.push_back(FieldType);
+ } else if (C.capturesThis()) {
// TODO: Need to handle 'this' in some way by probably renaming the
// this of the lambda class and having a field member of 'this' or
// by using AT_object_pointer for the function and having that be
// used as 'this' for semantic references.
- Loc = Field->getLocation();
- } else {
- Loc = Capture.getLocation();
-
- const ValueDecl *CaptureDecl = Capture.getCapturedVar();
- assert(CaptureDecl && "Expected valid decl for captured variable.");
-
- Align = getDeclAlignIfRequired(CaptureDecl, CGM.getContext());
+ FieldDecl *f = *Field;
+ llvm::DIFile *VUnit = getOrCreateFile(f->getLocation());
+ QualType type = f->getType();
+ StringRef ThisName =
+ CGM.getCodeGenOpts().EmitCodeView ? "__this" : "this";
+ llvm::DIType *fieldType = createFieldType(
+ ThisName, type, f->getLocation(), f->getAccess(),
+ layout.getFieldOffset(fieldno), VUnit, RecordTy, CXXDecl);
+
+ elements.push_back(fieldType);
}
-
- llvm::DIFile *VUnit = getOrCreateFile(Loc);
-
- elements.push_back(createFieldType(
- GetLambdaCaptureName(Capture), Field->getType(), Loc,
- Field->getAccess(), FieldOffset, Align, VUnit, RecordTy, CXXDecl));
}
}
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h
index 78c3eb9c5792e..f86077369a42a 100644
--- a/clang/lib/CodeGen/CGDebugInfo.h
+++ b/clang/lib/CodeGen/CGDebugInfo.h
@@ -397,7 +397,6 @@ class CGDebugInfo {
void CollectRecordFields(const RecordDecl *Decl, llvm::DIFile *F,
SmallVectorImpl<llvm::Metadata *> &E,
llvm::DICompositeType *RecordTy);
- llvm::StringRef GetLambdaCaptureName(const LambdaCapture &Capture);
/// If the C++ class has vtable info then insert appropriate debug
/// info entry in EltTys vector.
``````````
</details>
https://github.com/llvm/llvm-project/pull/160932
More information about the cfe-commits
mailing list