Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h @@ -195,11 +195,7 @@ DWARFProducer GetProducer(); - uint32_t GetProducerVersionMajor(); - - uint32_t GetProducerVersionMinor(); - - uint32_t GetProducerVersionUpdate(); + llvm::VersionTuple GetProducerVersion(); uint64_t GetDWARFLanguageType(); @@ -311,9 +307,7 @@ std::unique_ptr m_func_aranges_up; dw_addr_t m_base_addr = 0; DWARFProducer m_producer = eProducerInvalid; - uint32_t m_producer_version_major = 0; - uint32_t m_producer_version_minor = 0; - uint32_t m_producer_version_update = 0; + llvm::VersionTuple m_producer_version; llvm::Optional m_language_type; lldb_private::LazyBool m_is_optimized = lldb_private::eLazyBoolCalculate; llvm::Optional m_comp_dir; Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp @@ -654,20 +654,13 @@ } bool DWARFUnit::Supports_unnamed_objc_bitfields() { - if (GetProducer() == eProducerClang) { - const uint32_t major_version = GetProducerVersionMajor(); - return major_version > 425 || - (major_version == 425 && GetProducerVersionUpdate() >= 13); - } - return true; // Assume all other compilers didn't have incorrect ObjC bitfield - // info + if (GetProducer() == eProducerClang) + return GetProducerVersion() > llvm::VersionTuple(425, 0, 13); + // Assume all other compilers didn't have incorrect ObjC bitfield info. + return true; } void DWARFUnit::ParseProducerInfo() { - m_producer_version_major = UINT32_MAX; - m_producer_version_minor = UINT32_MAX; - m_producer_version_update = UINT32_MAX; - const DWARFDebugInfoEntry *die = GetUnitDIEPtrOnly(); if (die) { @@ -682,14 +675,11 @@ m_producer = eProducerLLVMGCC; } else if (strstr(producer_cstr, "clang")) { static RegularExpression g_clang_version_regex( - llvm::StringRef("clang-([0-9]+)\\.([0-9]+)\\.([0-9]+)")); + llvm::StringRef(R"(clang-([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?)")); llvm::SmallVector matches; if (g_clang_version_regex.Execute(llvm::StringRef(producer_cstr), &matches)) { - // FIXME: improve error handling - llvm::to_integer(matches[1], m_producer_version_major); - llvm::to_integer(matches[2], m_producer_version_minor); - llvm::to_integer(matches[3], m_producer_version_update); + m_producer_version.tryParse(matches[1]); } m_producer = eProducerClang; } else if (strstr(producer_cstr, "GNU")) @@ -706,22 +696,10 @@ return m_producer; } -uint32_t DWARFUnit::GetProducerVersionMajor() { - if (m_producer_version_major == 0) - ParseProducerInfo(); - return m_producer_version_major; -} - -uint32_t DWARFUnit::GetProducerVersionMinor() { - if (m_producer_version_minor == 0) - ParseProducerInfo(); - return m_producer_version_minor; -} - -uint32_t DWARFUnit::GetProducerVersionUpdate() { - if (m_producer_version_update == 0) +llvm::VersionTuple DWARFUnit::GetProducerVersion() { + if (m_producer_version.empty()) ParseProducerInfo(); - return m_producer_version_update; + return m_producer_version; } uint64_t DWARFUnit::GetDWARFLanguageType() {