15978912dSPavel Labath //===-- DWARFUnitTest.cpp -------------------------------------------------===// 25978912dSPavel Labath // 35978912dSPavel Labath // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45978912dSPavel Labath // See https://llvm.org/LICENSE.txt for license information. 55978912dSPavel Labath // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65978912dSPavel Labath // 75978912dSPavel Labath //===----------------------------------------------------------------------===// 85978912dSPavel Labath 95978912dSPavel Labath #include "Plugins/SymbolFile/DWARF/DWARFUnit.h" 105978912dSPavel Labath #include "TestingSupport/Symbol/YAMLModuleTester.h" 115978912dSPavel Labath #include "gmock/gmock.h" 125978912dSPavel Labath #include "gtest/gtest.h" 135978912dSPavel Labath 145978912dSPavel Labath using namespace lldb; 155978912dSPavel Labath using namespace lldb_private; 16*a669a237Swalter erquinigo using namespace lldb_private::plugin::dwarf; 175978912dSPavel Labath 185978912dSPavel Labath TEST(DWARFUnitTest, NullUnitDie) { 195978912dSPavel Labath // Make sure we don't crash parsing a null unit DIE. 205978912dSPavel Labath const char *yamldata = R"( 215978912dSPavel Labath --- !ELF 225978912dSPavel Labath FileHeader: 235978912dSPavel Labath Class: ELFCLASS64 245978912dSPavel Labath Data: ELFDATA2LSB 255978912dSPavel Labath Type: ET_EXEC 265978912dSPavel Labath Machine: EM_386 275978912dSPavel Labath DWARF: 285978912dSPavel Labath debug_abbrev: 295978912dSPavel Labath - Table: 305978912dSPavel Labath - Code: 0x00000001 315978912dSPavel Labath Tag: DW_TAG_compile_unit 325978912dSPavel Labath Children: DW_CHILDREN_yes 335978912dSPavel Labath Attributes: 345978912dSPavel Labath - Attribute: DW_AT_language 355978912dSPavel Labath Form: DW_FORM_data2 365978912dSPavel Labath debug_info: 375978912dSPavel Labath - Version: 4 385978912dSPavel Labath AddrSize: 8 395978912dSPavel Labath Entries: 405978912dSPavel Labath - AbbrCode: 0x00000000 415978912dSPavel Labath )"; 425978912dSPavel Labath 435978912dSPavel Labath YAMLModuleTester t(yamldata); 445978912dSPavel Labath ASSERT_TRUE((bool)t.GetDwarfUnit()); 455978912dSPavel Labath 465978912dSPavel Labath DWARFUnit *unit = t.GetDwarfUnit(); 475978912dSPavel Labath const DWARFDebugInfoEntry *die_first = unit->DIE().GetDIE(); 485978912dSPavel Labath ASSERT_NE(die_first, nullptr); 495978912dSPavel Labath EXPECT_TRUE(die_first->IsNULL()); 505978912dSPavel Labath } 512ecf9281SPavel Labath 522ecf9281SPavel Labath TEST(DWARFUnitTest, MissingSentinel) { 532ecf9281SPavel Labath // Make sure we don't crash if the debug info is missing a null DIE sentinel. 542ecf9281SPavel Labath const char *yamldata = R"( 552ecf9281SPavel Labath --- !ELF 562ecf9281SPavel Labath FileHeader: 572ecf9281SPavel Labath Class: ELFCLASS64 582ecf9281SPavel Labath Data: ELFDATA2LSB 592ecf9281SPavel Labath Type: ET_EXEC 602ecf9281SPavel Labath Machine: EM_386 612ecf9281SPavel Labath DWARF: 622ecf9281SPavel Labath debug_abbrev: 632ecf9281SPavel Labath - Table: 642ecf9281SPavel Labath - Code: 0x00000001 652ecf9281SPavel Labath Tag: DW_TAG_compile_unit 662ecf9281SPavel Labath Children: DW_CHILDREN_yes 672ecf9281SPavel Labath Attributes: 682ecf9281SPavel Labath - Attribute: DW_AT_language 692ecf9281SPavel Labath Form: DW_FORM_data2 702ecf9281SPavel Labath debug_info: 712ecf9281SPavel Labath - Version: 4 722ecf9281SPavel Labath AddrSize: 8 732ecf9281SPavel Labath Entries: 742ecf9281SPavel Labath - AbbrCode: 0x00000001 752ecf9281SPavel Labath Values: 762ecf9281SPavel Labath - Value: 0x000000000000000C 772ecf9281SPavel Labath )"; 782ecf9281SPavel Labath 792ecf9281SPavel Labath YAMLModuleTester t(yamldata); 802ecf9281SPavel Labath ASSERT_TRUE((bool)t.GetDwarfUnit()); 812ecf9281SPavel Labath 822ecf9281SPavel Labath DWARFUnit *unit = t.GetDwarfUnit(); 832ecf9281SPavel Labath const DWARFDebugInfoEntry *die_first = unit->DIE().GetDIE(); 842ecf9281SPavel Labath ASSERT_NE(die_first, nullptr); 852ecf9281SPavel Labath EXPECT_EQ(die_first->GetFirstChild(), nullptr); 862ecf9281SPavel Labath EXPECT_EQ(die_first->GetSibling(), nullptr); 872ecf9281SPavel Labath } 8814aa3f37SAdrian Prantl 898c5f3348SAdrian Prantl TEST(DWARFUnitTest, ClangProducer) { 9014aa3f37SAdrian Prantl const char *yamldata = R"( 9114aa3f37SAdrian Prantl --- !ELF 9214aa3f37SAdrian Prantl FileHeader: 9314aa3f37SAdrian Prantl Class: ELFCLASS64 9414aa3f37SAdrian Prantl Data: ELFDATA2LSB 9514aa3f37SAdrian Prantl Type: ET_EXEC 9614aa3f37SAdrian Prantl Machine: EM_386 9714aa3f37SAdrian Prantl DWARF: 9814aa3f37SAdrian Prantl debug_str: 9914aa3f37SAdrian Prantl - 'Apple clang version 13.0.0 (clang-1300.0.29.3)' 10014aa3f37SAdrian Prantl debug_abbrev: 10114aa3f37SAdrian Prantl - Table: 10214aa3f37SAdrian Prantl - Code: 0x00000001 10314aa3f37SAdrian Prantl Tag: DW_TAG_compile_unit 10414aa3f37SAdrian Prantl Children: DW_CHILDREN_yes 10514aa3f37SAdrian Prantl Attributes: 10614aa3f37SAdrian Prantl - Attribute: DW_AT_producer 10714aa3f37SAdrian Prantl Form: DW_FORM_strp 10814aa3f37SAdrian Prantl debug_info: 10914aa3f37SAdrian Prantl - Version: 4 11014aa3f37SAdrian Prantl AddrSize: 8 11114aa3f37SAdrian Prantl Entries: 11214aa3f37SAdrian Prantl - AbbrCode: 0x1 11314aa3f37SAdrian Prantl Values: 11414aa3f37SAdrian Prantl - Value: 0x0 11514aa3f37SAdrian Prantl - AbbrCode: 0x0 11614aa3f37SAdrian Prantl )"; 11714aa3f37SAdrian Prantl 11814aa3f37SAdrian Prantl YAMLModuleTester t(yamldata); 11914aa3f37SAdrian Prantl DWARFUnit *unit = t.GetDwarfUnit(); 12014aa3f37SAdrian Prantl ASSERT_TRUE((bool)unit); 12114aa3f37SAdrian Prantl EXPECT_EQ(unit->GetProducer(), eProducerClang); 12214aa3f37SAdrian Prantl EXPECT_EQ(unit->GetProducerVersion(), llvm::VersionTuple(1300, 0, 29, 3)); 12314aa3f37SAdrian Prantl } 1248c5f3348SAdrian Prantl 1254651576eSAdrian Prantl TEST(DWARFUnitTest, SwiftProducer) { 1264651576eSAdrian Prantl const char *yamldata = R"( 1274651576eSAdrian Prantl --- !ELF 1284651576eSAdrian Prantl FileHeader: 1294651576eSAdrian Prantl Class: ELFCLASS64 1304651576eSAdrian Prantl Data: ELFDATA2LSB 1314651576eSAdrian Prantl Type: ET_EXEC 1324651576eSAdrian Prantl Machine: EM_386 1334651576eSAdrian Prantl DWARF: 1344651576eSAdrian Prantl debug_str: 1354651576eSAdrian Prantl - 'Apple Swift version 5.5 (swiftlang-1300.0.31.1 clang-1300.0.29.1)' 1364651576eSAdrian Prantl debug_abbrev: 1374651576eSAdrian Prantl - Table: 1384651576eSAdrian Prantl - Code: 0x00000001 1394651576eSAdrian Prantl Tag: DW_TAG_compile_unit 1404651576eSAdrian Prantl Children: DW_CHILDREN_yes 1414651576eSAdrian Prantl Attributes: 1424651576eSAdrian Prantl - Attribute: DW_AT_producer 1434651576eSAdrian Prantl Form: DW_FORM_strp 1444651576eSAdrian Prantl debug_info: 1454651576eSAdrian Prantl - Version: 4 1464651576eSAdrian Prantl AddrSize: 8 1474651576eSAdrian Prantl Entries: 1484651576eSAdrian Prantl - AbbrCode: 0x1 1494651576eSAdrian Prantl Values: 1504651576eSAdrian Prantl - Value: 0x0 1514651576eSAdrian Prantl - AbbrCode: 0x0 1524651576eSAdrian Prantl )"; 1534651576eSAdrian Prantl 1544651576eSAdrian Prantl YAMLModuleTester t(yamldata); 1554651576eSAdrian Prantl DWARFUnit *unit = t.GetDwarfUnit(); 1564651576eSAdrian Prantl ASSERT_TRUE((bool)unit); 1574651576eSAdrian Prantl EXPECT_EQ(unit->GetProducer(), eProducerSwift); 1584651576eSAdrian Prantl EXPECT_EQ(unit->GetProducerVersion(), llvm::VersionTuple(1300, 0, 31, 1)); 1594651576eSAdrian Prantl } 160