xref: /llvm-project/lldb/unittests/SymbolFile/DWARF/DWARFUnitTest.cpp (revision e0a79eeca27b894bca6aa3f5dfdd8f1ac6644381)
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