Skip to content

Commit 14aa3f3

Browse files
committed
Use llvm::VersionTuple to store DWARF producer info (NFC)
This has the nice side-effect that it can actually store the quadruple version numbers that Apple's tools are using nowadays. rdar://82982162 Differential Revision: https://reviews.llvm.org/D111200
1 parent 58b68e7 commit 14aa3f3

File tree

3 files changed

+58
-49
lines changed

3 files changed

+58
-49
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -654,50 +654,38 @@ bool DWARFUnit::DW_AT_decl_file_attributes_are_invalid() {
654654
}
655655

656656
bool DWARFUnit::Supports_unnamed_objc_bitfields() {
657-
if (GetProducer() == eProducerClang) {
658-
const uint32_t major_version = GetProducerVersionMajor();
659-
return major_version > 425 ||
660-
(major_version == 425 && GetProducerVersionUpdate() >= 13);
661-
}
662-
return true; // Assume all other compilers didn't have incorrect ObjC bitfield
663-
// info
657+
if (GetProducer() == eProducerClang)
658+
return GetProducerVersion() >= llvm::VersionTuple(425, 0, 13);
659+
// Assume all other compilers didn't have incorrect ObjC bitfield info.
660+
return true;
664661
}
665662

666663
void DWARFUnit::ParseProducerInfo() {
667-
m_producer_version_major = UINT32_MAX;
668-
m_producer_version_minor = UINT32_MAX;
669-
m_producer_version_update = UINT32_MAX;
670-
671664
const DWARFDebugInfoEntry *die = GetUnitDIEPtrOnly();
672665
if (die) {
673-
674666
const char *producer_cstr =
675667
die->GetAttributeValueAsString(this, DW_AT_producer, nullptr);
676-
if (producer_cstr) {
668+
llvm::StringRef producer(producer_cstr);
669+
if (!producer.empty()) {
677670
RegularExpression llvm_gcc_regex(
678671
llvm::StringRef("^4\\.[012]\\.[01] \\(Based on Apple "
679672
"Inc\\. build [0-9]+\\) \\(LLVM build "
680673
"[\\.0-9]+\\)$"));
681-
if (llvm_gcc_regex.Execute(llvm::StringRef(producer_cstr))) {
674+
if (llvm_gcc_regex.Execute(producer)) {
682675
m_producer = eProducerLLVMGCC;
683-
} else if (strstr(producer_cstr, "clang")) {
676+
} else if (producer.contains("clang")) {
684677
static RegularExpression g_clang_version_regex(
685-
llvm::StringRef("clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)"));
678+
llvm::StringRef(R"(clang-([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?))"));
686679
llvm::SmallVector<llvm::StringRef, 4> matches;
687-
if (g_clang_version_regex.Execute(llvm::StringRef(producer_cstr),
688-
&matches)) {
689-
// FIXME: improve error handling
690-
llvm::to_integer(matches[1], m_producer_version_major);
691-
llvm::to_integer(matches[2], m_producer_version_minor);
692-
llvm::to_integer(matches[3], m_producer_version_update);
693-
}
680+
if (g_clang_version_regex.Execute(producer, &matches))
681+
m_producer_version.tryParse(matches[1]);
694682
m_producer = eProducerClang;
695-
} else if (strstr(producer_cstr, "GNU"))
683+
} else if (producer.contains("GNU"))
696684
m_producer = eProducerGCC;
697685
}
698686
}
699687
if (m_producer == eProducerInvalid)
700-
m_producer = eProcucerOther;
688+
m_producer = eProducerOther;
701689
}
702690

703691
DWARFProducer DWARFUnit::GetProducer() {
@@ -706,22 +694,10 @@ DWARFProducer DWARFUnit::GetProducer() {
706694
return m_producer;
707695
}
708696

709-
uint32_t DWARFUnit::GetProducerVersionMajor() {
710-
if (m_producer_version_major == 0)
711-
ParseProducerInfo();
712-
return m_producer_version_major;
713-
}
714-
715-
uint32_t DWARFUnit::GetProducerVersionMinor() {
716-
if (m_producer_version_minor == 0)
717-
ParseProducerInfo();
718-
return m_producer_version_minor;
719-
}
720-
721-
uint32_t DWARFUnit::GetProducerVersionUpdate() {
722-
if (m_producer_version_update == 0)
697+
llvm::VersionTuple DWARFUnit::GetProducerVersion() {
698+
if (m_producer_version.empty())
723699
ParseProducerInfo();
724-
return m_producer_version_update;
700+
return m_producer_version;
725701
}
726702

727703
uint64_t DWARFUnit::GetDWARFLanguageType() {

lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ enum DWARFProducer {
2929
eProducerClang,
3030
eProducerGCC,
3131
eProducerLLVMGCC,
32-
eProcucerOther
32+
eProducerOther
3333
};
3434

3535
/// Base class describing the header of any kind of "unit." Some information
@@ -195,11 +195,7 @@ class DWARFUnit : public lldb_private::UserID {
195195

196196
DWARFProducer GetProducer();
197197

198-
uint32_t GetProducerVersionMajor();
199-
200-
uint32_t GetProducerVersionMinor();
201-
202-
uint32_t GetProducerVersionUpdate();
198+
llvm::VersionTuple GetProducerVersion();
203199

204200
uint64_t GetDWARFLanguageType();
205201

@@ -311,9 +307,7 @@ class DWARFUnit : public lldb_private::UserID {
311307
std::unique_ptr<DWARFDebugAranges> m_func_aranges_up;
312308
dw_addr_t m_base_addr = 0;
313309
DWARFProducer m_producer = eProducerInvalid;
314-
uint32_t m_producer_version_major = 0;
315-
uint32_t m_producer_version_minor = 0;
316-
uint32_t m_producer_version_update = 0;
310+
llvm::VersionTuple m_producer_version;
317311
llvm::Optional<uint64_t> m_language_type;
318312
lldb_private::LazyBool m_is_optimized = lldb_private::eLazyBoolCalculate;
319313
llvm::Optional<lldb_private::FileSpec> m_comp_dir;

lldb/unittests/SymbolFile/DWARF/DWARFUnitTest.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,42 @@ TEST(DWARFUnitTest, MissingSentinel) {
8484
EXPECT_EQ(die_first->GetFirstChild(), nullptr);
8585
EXPECT_EQ(die_first->GetSibling(), nullptr);
8686
}
87+
88+
TEST(DWARFUnitTest, Producer) {
89+
const char *yamldata = R"(
90+
--- !ELF
91+
FileHeader:
92+
Class: ELFCLASS64
93+
Data: ELFDATA2LSB
94+
Type: ET_EXEC
95+
Machine: EM_386
96+
DWARF:
97+
debug_str:
98+
- 'Apple clang version 13.0.0 (clang-1300.0.29.3)'
99+
debug_abbrev:
100+
- Table:
101+
- Code: 0x00000001
102+
Tag: DW_TAG_compile_unit
103+
Children: DW_CHILDREN_yes
104+
Attributes:
105+
- Attribute: DW_AT_producer
106+
Form: DW_FORM_strp
107+
- Attribute: DW_AT_language
108+
Form: DW_FORM_data2
109+
debug_info:
110+
- Version: 4
111+
AddrSize: 8
112+
Entries:
113+
- AbbrCode: 0x1
114+
Values:
115+
- Value: 0x0
116+
- Value: 0xC
117+
- AbbrCode: 0x0
118+
)";
119+
120+
YAMLModuleTester t(yamldata);
121+
DWARFUnit *unit = t.GetDwarfUnit();
122+
ASSERT_TRUE((bool)unit);
123+
EXPECT_EQ(unit->GetProducer(), eProducerClang);
124+
EXPECT_EQ(unit->GetProducerVersion(), llvm::VersionTuple(1300, 0, 29, 3));
125+
}

0 commit comments

Comments
 (0)