Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 24 additions & 38 deletions clang/lib/CodeGen/CGDebugInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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));
}
}

Expand Down
1 change: 0 additions & 1 deletion clang/lib/CodeGen/CGDebugInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down