Index: lldb/include/lldb/Symbol/Block.h =================================================================== --- lldb/include/lldb/Symbol/Block.h +++ lldb/include/lldb/Symbol/Block.h @@ -314,6 +314,7 @@ /// Optional calling location declaration information that /// describes from where this inlined function was called. void SetInlinedFunctionInfo(const char *name, const char *mangled, + const char *lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr); Index: lldb/include/lldb/Symbol/Function.h =================================================================== --- lldb/include/lldb/Symbol/Function.h +++ lldb/include/lldb/Symbol/Function.h @@ -143,6 +143,7 @@ /// Optional calling location declaration information that /// describes from where this inlined function was called. InlineFunctionInfo(const char *name, llvm::StringRef mangled, + const char *lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr); @@ -165,6 +166,7 @@ /// Optional calling location declaration information that /// describes from where this inlined function was called. InlineFunctionInfo(ConstString name, const Mangled &mangled, + ConstString lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr); @@ -205,6 +207,8 @@ ConstString GetDisplayName() const; + bool isLambda() const; + /// Get accessor for the call site declaration information. /// /// \return @@ -243,6 +247,7 @@ // Member variables. Mangled m_mangled; ///< Mangled inlined function name (can be empty if there ///is no mangled information). + ConstString m_lambda; ///< Empty if it's not a lambda. Declaration m_call_decl; }; Index: lldb/source/Core/FormatEntity.cpp =================================================================== --- lldb/source/Core/FormatEntity.cpp +++ lldb/source/Core/FormatEntity.cpp @@ -1553,6 +1553,8 @@ sc->block->GetInlinedFunctionInfo(); if (inline_info) { s.PutCString(" [inlined] "); + if (inline_info->isLambda()) + s.PutCString("[lambda] "); inline_info->GetName().Dump(&s); } } @@ -1637,6 +1639,8 @@ if (inline_info) { s.PutCString(cstr); s.PutCString(" [inlined] "); + if (inline_info->isLambda()) + s.PutCString("[lambda] "); cstr = inline_info->GetName().GetCString(); } Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.h @@ -234,6 +234,7 @@ bool is_objc_direct_call = false; bool exports_symbols = false; clang::StorageClass storage = clang::SC_None; + const char *lambda_name = nullptr; const char *mangled_name = nullptr; lldb_private::ConstString name; lldb_private::Declaration decl; Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -331,6 +331,10 @@ is_inline = form_value.Boolean(); break; + case DW_AT_LLVM_lambda_name: + lambda_name = form_value.AsCString(); + break; + case DW_AT_linkage_name: case DW_AT_MIPS_linkage_name: mangled_name = form_value.AsCString(); @@ -2281,6 +2285,7 @@ DWARFRangeList func_ranges; const char *name = nullptr; const char *mangled = nullptr; + const char *lambda_name = nullptr; int decl_file = 0; int decl_line = 0; int decl_column = 0; @@ -2294,10 +2299,9 @@ if (tag != DW_TAG_subprogram) return nullptr; - if (die.GetDIENamesAndRanges(name, mangled, func_ranges, decl_file, decl_line, + if (die.GetDIENamesAndRanges(name, mangled, lambda_name, func_ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column, &frame_base)) { - // Union of all ranges in the function DIE (if the function is // discontiguous) AddressRange func_range; @@ -2314,7 +2318,9 @@ if (func_range.GetBaseAddress().IsValid()) { Mangled func_name; - if (mangled) + if (lambda_name) + func_name.SetValue(ConstString(lambda_name, false)); + else if (mangled) func_name.SetValue(ConstString(mangled), true); else if ((die.GetParent().Tag() == DW_TAG_compile_unit || die.GetParent().Tag() == DW_TAG_partial_unit) && Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h @@ -83,7 +83,7 @@ DWARFDIE GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const; - bool GetDIENamesAndRanges(const char *&name, const char *&mangled, + bool GetDIENamesAndRanges(const char *&name, const char *&mangled, const char *&lamda_name, DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column, int &call_file, int &call_line, int &call_column, Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -437,13 +437,13 @@ } bool DWARFDIE::GetDIENamesAndRanges( - const char *&name, const char *&mangled, DWARFRangeList &ranges, + const char *&name, const char *&mangled, const char *&lamda_name, DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column, int &call_file, int &call_line, int &call_column, lldb_private::DWARFExpression *frame_base) const { if (IsValid()) { return m_die->GetDIENamesAndRanges( - GetCU(), name, mangled, ranges, decl_file, decl_line, decl_column, + GetCU(), name, mangled, lamda_name, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column, frame_base); } else return false; Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h @@ -112,7 +112,7 @@ dw_attr_t attr, DWARFFormValue &form_value); bool GetDIENamesAndRanges( - DWARFUnit *cu, const char *&name, const char *&mangled, + DWARFUnit *cu, const char *&name, const char *&mangled, const char *&lambda_name, DWARFRangeList &rangeList, int &decl_file, int &decl_line, int &decl_column, int &call_file, int &call_line, int &call_column, lldb_private::DWARFExpression *frame_base = nullptr) const; Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp @@ -224,7 +224,7 @@ // Gets the valid address ranges for a given DIE by looking for a // DW_AT_low_pc/DW_AT_high_pc pair, DW_AT_entry_pc, or DW_AT_ranges attributes. bool DWARFDebugInfoEntry::GetDIENamesAndRanges( - DWARFUnit *cu, const char *&name, const char *&mangled, + DWARFUnit *cu, const char *&name, const char *&mangled, const char *&lambda_name, DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column, int &call_file, int &call_line, int &call_column, DWARFExpression *frame_base) const { @@ -286,6 +286,11 @@ ranges = GetRangesOrReportError(*cu, *this, form_value); break; + case DW_AT_LLVM_lambda_name: + if (lambda_name == nullptr) + lambda_name = form_value.AsCString(); + break; + case DW_AT_name: if (name == nullptr) name = form_value.AsCString(); @@ -386,7 +391,7 @@ if (ranges.IsEmpty() || name == nullptr || mangled == nullptr) { for (const DWARFDIE &die : dies) { if (die) { - die.GetDIE()->GetDIENamesAndRanges(die.GetCU(), name, mangled, ranges, + die.GetDIE()->GetDIENamesAndRanges(die.GetCU(), name, mangled, lambda_name, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column); } Index: lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1070,6 +1070,7 @@ DWARFRangeList ranges; const char *name = nullptr; const char *mangled_name = nullptr; + const char *lambda_name = nullptr; int decl_file = 0; int decl_line = 0; @@ -1077,7 +1078,7 @@ int call_file = 0; int call_line = 0; int call_column = 0; - if (die.GetDIENamesAndRanges(name, mangled_name, ranges, decl_file, + if (die.GetDIENamesAndRanges(name, mangled_name, lambda_name, ranges, decl_file, decl_line, decl_column, call_file, call_line, call_column, nullptr)) { if (tag == DW_TAG_subprogram) { @@ -1117,7 +1118,8 @@ block->FinalizeRanges(); if (tag != DW_TAG_subprogram && - (name != nullptr || mangled_name != nullptr)) { + (name != nullptr || mangled_name != nullptr || + lambda_name != nullptr)) { std::unique_ptr decl_up; if (decl_file != 0 || decl_line != 0 || decl_column != 0) decl_up.reset(new Declaration( @@ -1130,8 +1132,8 @@ comp_unit.GetSupportFiles().GetFileSpecAtIndex(call_file), call_line, call_column)); - block->SetInlinedFunctionInfo(name, mangled_name, decl_up.get(), - call_up.get()); + block->SetInlinedFunctionInfo(name, mangled_name, lambda_name, + decl_up.get(), call_up.get()); } ++blocks_added; Index: lldb/source/Symbol/Block.cpp =================================================================== --- lldb/source/Symbol/Block.cpp +++ lldb/source/Symbol/Block.cpp @@ -379,10 +379,11 @@ } void Block::SetInlinedFunctionInfo(const char *name, const char *mangled, + const char *lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr) { - m_inlineInfoSP = std::make_shared(name, mangled, decl_ptr, - call_decl_ptr); + m_inlineInfoSP = std::make_shared(name, mangled, lambda_name, + decl_ptr, call_decl_ptr); } VariableListSP Block::GetBlockVariableList(bool can_create) { Index: lldb/source/Symbol/Function.cpp =================================================================== --- lldb/source/Symbol/Function.cpp +++ lldb/source/Symbol/Function.cpp @@ -62,47 +62,61 @@ InlineFunctionInfo::InlineFunctionInfo(const char *name, llvm::StringRef mangled, + const char *lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr) - : FunctionInfo(name, decl_ptr), m_mangled(mangled), + : FunctionInfo(name, decl_ptr), m_mangled(mangled), m_lambda(lambda_name), m_call_decl(call_decl_ptr) {} InlineFunctionInfo::InlineFunctionInfo(ConstString name, const Mangled &mangled, + ConstString lambda_name, const Declaration *decl_ptr, const Declaration *call_decl_ptr) - : FunctionInfo(name, decl_ptr), m_mangled(mangled), + : FunctionInfo(name, decl_ptr), m_mangled(mangled), m_lambda(lambda_name), m_call_decl(call_decl_ptr) {} InlineFunctionInfo::~InlineFunctionInfo() {} void InlineFunctionInfo::Dump(Stream *s, bool show_fullpaths) const { FunctionInfo::Dump(s, show_fullpaths); - if (m_mangled) + if (m_lambda) + *s << ", name = \"" << m_lambda << "\""; + else if (m_mangled) m_mangled.Dump(s); } void InlineFunctionInfo::DumpStopContext(Stream *s) const { // s->Indent("[inlined] "); s->Indent(); - if (m_mangled) + if (m_lambda) + s->PutCString(m_lambda.AsCString()); + else if (m_mangled) s->PutCString(m_mangled.GetName().AsCString()); else s->PutCString(m_name.AsCString()); } ConstString InlineFunctionInfo::GetName() const { - if (m_mangled) + if (m_lambda) + return m_lambda; + else if (m_mangled) return m_mangled.GetName(); return m_name; } ConstString InlineFunctionInfo::GetDisplayName() const { - if (m_mangled) + if (m_lambda) + return m_lambda; + else if (m_mangled) return m_mangled.GetDisplayDemangledName(); return m_name; } +bool InlineFunctionInfo::isLambda() const { + return m_lambda ? true : false; +} + Declaration &InlineFunctionInfo::GetCallSite() { return m_call_decl; } const Declaration &InlineFunctionInfo::GetCallSite() const {