diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2026,6 +2026,7 @@ CompilerType clang_type; uint64_t uval64 = 0; bool uval64_valid = false; + bool is_default_template_arg = false; if (num_attributes > 0) { DWARFFormValue form_value; for (size_t i = 0; i < num_attributes; ++i) { @@ -2056,6 +2057,11 @@ uval64 = form_value.Unsigned(); } break; + case DW_AT_default_value: + if (attributes.ExtractFormValueAtIndex(i, form_value)) { + is_default_template_arg = form_value.Boolean(); + } + break; default: break; } @@ -2078,19 +2084,21 @@ if (!size) return false; llvm::APInt apint(*size, uval64, is_signed); - template_param_infos.InsertArg( - name, + auto TA = clang::TemplateArgument(ast, llvm::APSInt(apint, !is_signed), - ClangUtil::GetQualType(clang_type))); + ClangUtil::GetQualType(clang_type)); + TA.setIsDefaulted(is_default_template_arg); + template_param_infos.InsertArg(name, std::move(TA)); } else { - template_param_infos.InsertArg( - name, - clang::TemplateArgument(ClangUtil::GetQualType(clang_type))); + auto TA = clang::TemplateArgument(ClangUtil::GetQualType(clang_type)); + TA.setIsDefaulted(is_default_template_arg); + template_param_infos.InsertArg(name, std::move(TA)); } } else { auto *tplt_type = m_ast.CreateTemplateTemplateParmDecl(template_name); - template_param_infos.InsertArg( - name, clang::TemplateArgument(clang::TemplateName(tplt_type))); + auto TA = clang::TemplateArgument(clang::TemplateName(tplt_type)); + TA.setIsDefaulted(is_default_template_arg); + template_param_infos.InsertArg(name, std::move(TA)); } } } diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/shared_ptr/TestDataFormatterLibcxxSharedPtr.py @@ -60,7 +60,7 @@ valobj = self.expect_var_path( "sp_str", - type="std::shared_ptr, std::allocator > >", + type="std::shared_ptr >", children=[ValueCheck(name="__ptr_", summary='"hello"')], ) self.assertRegex(valobj.summary, r'^"hello"( strong=1)? weak=1$') diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string/TestDataFormatterLibcxxString.py @@ -70,8 +70,7 @@ '(%s::u32string) u32_string = U"🍄🍅🍆🍌"'%ns, # FIXME: This should have a 'U' prefix. '(%s::u32string) u32_empty = ""'%ns, - '(%s::basic_string, ' - '%s::allocator >) uchar = "aaaaa"'%(ns,ns,ns), + '(%s::basic_string) uchar = "aaaaa"'%(ns), '(%s::string *) null_str = nullptr'%ns, ]) @@ -108,8 +107,7 @@ '(%s::u16string) u16_string = u"ß水氶"'%ns, '(%s::u32string) u32_string = U"🍄🍅🍆🍌"'%ns, '(%s::u32string) u32_empty = ""'%ns, - '(%s::basic_string, ' - '%s::allocator >) uchar = "aaaaa"'%(ns,ns,ns), + '(%s::basic_string) uchar = "aaaaa"'%(ns), '(%s::string *) null_str = nullptr'%ns, ]) diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string_view/TestDataFormatterLibcxxStringView.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string_view/TestDataFormatterLibcxxStringView.py --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string_view/TestDataFormatterLibcxxStringView.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/string_view/TestDataFormatterLibcxxStringView.py @@ -96,10 +96,10 @@ type='std::u32string_view', summary='""') self.expect_var_path('uchar_source', - type='std::basic_string, std::allocator >', + type='std::basic_string', summary='"aaaaaaaaaa"') self.expect_var_path('uchar', - type='std::basic_string_view >', + type='std::basic_string_view', summary='"aaaaa"') self.expect_var_path('oops', type='std::string_view', @@ -172,10 +172,10 @@ type='std::u32string_view', summary='""') self.expect_var_path('uchar_source', - type='std::basic_string, std::allocator >', + type='std::basic_string', summary='"aaaaaaaaaa"') self.expect_var_path('uchar', - type='std::basic_string_view >', + type='std::basic_string_view', summary='"aaaaa"') self.runCmd('cont') diff --git a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/unique_ptr/TestDataFormatterLibcxxUniquePtr.py b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/unique_ptr/TestDataFormatterLibcxxUniquePtr.py --- a/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/unique_ptr/TestDataFormatterLibcxxUniquePtr.py +++ b/lldb/test/API/functionalities/data-formatter/data-formatter-stl/libcxx/unique_ptr/TestDataFormatterLibcxxUniquePtr.py @@ -22,7 +22,7 @@ valobj = self.expect_var_path( "up_empty", - type="std::unique_ptr >", + type="std::unique_ptr", summary="nullptr", children=[ValueCheck(name="__value_")], ) @@ -36,7 +36,7 @@ valobj = self.expect_var_path( "up_int", - type="std::unique_ptr >", + type="std::unique_ptr", summary="10", children=[ValueCheck(name="__value_")], ) @@ -44,7 +44,7 @@ valobj = self.expect_var_path( "up_int_ref", - type="std::unique_ptr > &", + type="std::unique_ptr &", summary="10", children=[ValueCheck(name="__value_")], ) @@ -52,7 +52,7 @@ valobj = self.expect_var_path( "up_int_ref_ref", - type="std::unique_ptr > &&", + type="std::unique_ptr &&", summary="10", children=[ValueCheck(name="__value_")], ) @@ -60,13 +60,13 @@ valobj = self.expect_var_path( "up_str", - type="std::unique_ptr, std::allocator >, std::default_delete, std::allocator > > >", + type="std::unique_ptr >", summary='"hello"', children=[ValueCheck(name="__value_", summary='"hello"')], ) valobj = self.expect_var_path( - "up_user", type="std::unique_ptr >" + "up_user", type="std::unique_ptr" ) self.assertRegex(valobj.summary, "^User @ 0x0*[1-9a-f][0-9a-f]+$") self.assertNotEqual(valobj.child[0].unsigned, 0) diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp --- a/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp +++ b/lldb/unittests/SymbolFile/DWARF/DWARFASTParserClangTests.cpp @@ -6,11 +6,14 @@ // //===----------------------------------------------------------------------===// +#include "Plugins/Platform/MacOSX/PlatformMacOSX.h" +#include "Plugins/Platform/MacOSX/PlatformRemoteMacOSX.h" #include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h" #include "Plugins/SymbolFile/DWARF/DWARFCompileUnit.h" #include "Plugins/SymbolFile/DWARF/DWARFDIE.h" #include "TestingSupport/Symbol/ClangTestUtils.h" #include "TestingSupport/Symbol/YAMLModuleTester.h" +#include "lldb/Core/Debugger.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -19,7 +22,23 @@ using namespace lldb_private::dwarf; namespace { -class DWARFASTParserClangTests : public testing::Test {}; +static std::once_flag debugger_initialize_flag; + +class DWARFASTParserClangTests : public testing::Test { + void SetUp() override { + HostInfo::Initialize(); + PlatformMacOSX::Initialize(); + std::call_once(debugger_initialize_flag, + []() { Debugger::Initialize(nullptr); }); + ArchSpec arch("x86_64-apple-macosx-"); + Platform::SetHostPlatform( + PlatformRemoteMacOSX::CreateInstance(true, &arch, nullptr, nullptr)); + } + void TearDown() override { + PlatformMacOSX::Terminate(); + HostInfo::Terminate(); + } +}; class DWARFASTParserClangStub : public DWARFASTParserClang { public: @@ -404,3 +423,367 @@ EXPECT_THAT_EXPECTED(Extract(ast.UnsignedIntTy, uint_max + 2), llvm::Failed()); } + +TEST_F(DWARFASTParserClangTests, TestDefaultTemplateParamParsing) { + // Tests parsing DW_AT_default_value for template parameters. + + // template + // class foo {}; + // + // template