Recognize the Swift compiler in DW_AT_producer
authorAdrian Prantl <aprantl@apple.com>
Wed, 6 Oct 2021 22:04:36 +0000 (15:04 -0700)
committerAdrian Prantl <aprantl@apple.com>
Thu, 7 Oct 2021 20:54:28 +0000 (13:54 -0700)
This patch adds support for Swift compiler producer strings to DWARFUnit.

Differential Revision: https://reviews.llvm.org/D111278

lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
lldb/unittests/SymbolFile/DWARF/DWARFUnitTest.cpp

index 39411b54e036e744353fceaffb5f5f0b36dc8de3..0eafd62eb9b9e7020958252dec7e6d3aa47207c0 100644 (file)
@@ -671,22 +671,28 @@ void DWARFUnit::ParseProducerInfo() {
   if (producer.empty())
     return;
 
-  static RegularExpression g_llvm_gcc_regex(
+  static const RegularExpression g_swiftlang_version_regex(
+      llvm::StringRef(R"(swiftlang-([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?))"));
+  static const RegularExpression g_clang_version_regex(
+      llvm::StringRef(R"(clang-([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?))"));
+  static const RegularExpression g_llvm_gcc_regex(
       llvm::StringRef(R"(4\.[012]\.[01] )"
                       R"(\(Based on Apple Inc\. build [0-9]+\) )"
                       R"(\(LLVM build [\.0-9]+\)$)"));
-  static RegularExpression g_clang_version_regex(
-      llvm::StringRef(R"(clang-([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?))"));
 
-  if (g_llvm_gcc_regex.Execute(producer)) {
-    m_producer = eProducerLLVMGCC;
+  llvm::SmallVector<llvm::StringRef, 3> matches;
+  if (g_swiftlang_version_regex.Execute(producer, &matches)) {
+      m_producer_version.tryParse(matches[1]);
+    m_producer = eProducerSwift;
   } else if (producer.contains("clang")) {
-    llvm::SmallVector<llvm::StringRef, 3> matches;
     if (g_clang_version_regex.Execute(producer, &matches))
       m_producer_version.tryParse(matches[1]);
     m_producer = eProducerClang;
-  } else if (producer.contains("GNU"))
+  } else if (producer.contains("GNU")) {
     m_producer = eProducerGCC;
+  } else if (g_llvm_gcc_regex.Execute(producer)) {
+    m_producer = eProducerLLVMGCC;
+  }
 }
 
 DWARFProducer DWARFUnit::GetProducer() {
index 0e02da97fdb3069eca7038143e5d11acb8d5ac5c..cece29dcf9ac8d5f7e0ed923edff6245218a39b4 100644 (file)
@@ -29,6 +29,7 @@ enum DWARFProducer {
   eProducerClang,
   eProducerGCC,
   eProducerLLVMGCC,
+  eProducerSwift,
   eProducerOther
 };
 
index 85e3ae3cd8a5f5472815cd9eacd2719f02f36e02..123acb6ea8e3f8afd51c6704b19cbb004a4a8efc 100644 (file)
@@ -155,3 +155,39 @@ DWARF:
   ASSERT_TRUE((bool)unit);
   EXPECT_EQ(unit->GetProducer(), eProducerLLVMGCC);
 }
+
+TEST(DWARFUnitTest, SwiftProducer) {
+  const char *yamldata = R"(
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_386
+DWARF:
+  debug_str:
+    - 'Apple Swift version 5.5 (swiftlang-1300.0.31.1 clang-1300.0.29.1)'
+  debug_abbrev:
+    - Table:
+        - Code:            0x00000001
+          Tag:             DW_TAG_compile_unit
+          Children:        DW_CHILDREN_yes
+          Attributes:
+            - Attribute:       DW_AT_producer
+              Form:            DW_FORM_strp
+  debug_info:
+    - Version:         4
+      AddrSize:        8
+      Entries:
+        - AbbrCode:        0x1
+          Values:
+            - Value:           0x0
+        - AbbrCode:        0x0
+)";
+
+  YAMLModuleTester t(yamldata);
+  DWARFUnit *unit = t.GetDwarfUnit();
+  ASSERT_TRUE((bool)unit);
+  EXPECT_EQ(unit->GetProducer(), eProducerSwift);
+  EXPECT_EQ(unit->GetProducerVersion(), llvm::VersionTuple(1300, 0, 31, 1));
+}