[Lldb-commits] [lldb] [lldb] Use Python script to generate SBLanguages.h (PR #90753)

Jonas Devlieghere via lldb-commits lldb-commits at lists.llvm.org
Wed May 1 11:32:29 PDT 2024


https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/90753

>From 5f66f7b0bf2add28eebdfefd2ae9459f8548a1b4 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Wed, 1 May 2024 10:36:51 -0700
Subject: [PATCH 1/3] [lldb] Use Python script to generate SBLanguages.h

Use a Python script to generate SBLanguages.h instead of piggybacking on
LLDB TableGen. This addresses Nico Weber's post-commit feedback.
---
 lldb/scripts/generate-sbapi-dwarf-enum.py  | 65 +++++++++++++++++++++
 lldb/source/API/CMakeLists.txt             | 18 ++++--
 lldb/utils/TableGen/CMakeLists.txt         |  1 -
 lldb/utils/TableGen/LLDBSBAPIDWARFEnum.cpp | 67 ----------------------
 lldb/utils/TableGen/LLDBTableGen.cpp       |  8 ---
 5 files changed, 79 insertions(+), 80 deletions(-)
 create mode 100755 lldb/scripts/generate-sbapi-dwarf-enum.py
 delete mode 100644 lldb/utils/TableGen/LLDBSBAPIDWARFEnum.cpp

diff --git a/lldb/scripts/generate-sbapi-dwarf-enum.py b/lldb/scripts/generate-sbapi-dwarf-enum.py
new file mode 100755
index 00000000000000..c4252223430ed6
--- /dev/null
+++ b/lldb/scripts/generate-sbapi-dwarf-enum.py
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+
+import argparse
+import re
+
+HEADER = """\
+//===-- SBLanguages.h -----------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_API_SBLANGUAGE_H
+#define LLDB_API_SBLANGUAGE_H
+/// Used by \\ref SBExpressionOptions.
+/// These enumerations use the same language enumerations as the DWARF
+/// specification for ease of use and consistency.
+enum SBSourceLanguageName : uint16_t {
+"""
+
+FOOTER = """\
+};
+
+#endif
+"""
+
+REGEX = re.compile(r'(^ *HANDLE_DW_LNAME *\( *([^,]+), ([^,]+), )"(.*)",.*\).*')
+
+
+def emit_enum(input, output):
+    # Read the input and break it up by lines.
+    lines = []
+    with open(input, "r") as f:
+        lines = f.readlines()
+
+    # Write the output.
+    with open(output, "w") as f:
+        # Emit the header.
+        f.write(HEADER)
+
+        # Emit the enum values.
+        for line in lines:
+            match = REGEX.search(line)
+            if not match:
+                continue
+            f.write(f"  /// {match.group(4)}.\n")
+            f.write(f"  eLanguageName{match.group(3)} = {match.group(2)},\n")
+
+        # Emit the footer
+        f.write(FOOTER)
+
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument("--output", "-o")
+    parser.add_argument("input")
+    args = parser.parse_args()
+
+    emit_enum(args.input, args.output)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/lldb/source/API/CMakeLists.txt b/lldb/source/API/CMakeLists.txt
index ad960403ae70bf..a64c0d4a333425 100644
--- a/lldb/source/API/CMakeLists.txt
+++ b/lldb/source/API/CMakeLists.txt
@@ -20,9 +20,19 @@ if(LLDB_ENABLE_LUA)
   set(lldb_lua_wrapper ${lua_bindings_dir}/LLDBWrapLua.cpp)
 endif()
 
-lldb_tablegen(../../include/lldb/API/SBLanguages.h -gen-lldb-sbapi-dwarf-enum
-  SOURCE ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat/Dwarf.def
-  TARGET lldb-sbapi-dwarf-enums)
+# Target to generate SBLanguages.h from Dwarf.def.
+set(sb_languages_file
+  ${CMAKE_CURRENT_BINARY_DIR}/../../include/lldb/API/SBLanguages.h)
+add_custom_target(
+  lldb-sbapi-dwarf-enums
+  "${Python3_EXECUTABLE}"
+      ${LLDB_SOURCE_DIR}/scripts/generate-sbapi-dwarf-enum.py
+      ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat/Dwarf.def
+      -o ${sb_languages_file}
+  BYPRODUCTS ${sb_languages_file}
+  DEPENDS ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat/Dwarf.def
+  WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}
+)
 
 add_lldb_library(liblldb SHARED ${option_framework}
   SBAddress.cpp
@@ -106,7 +116,7 @@ add_lldb_library(liblldb SHARED ${option_framework}
 
   DEPENDS
     lldb-sbapi-dwarf-enums
-  
+
   LINK_LIBS
     lldbBreakpoint
     lldbCore
diff --git a/lldb/utils/TableGen/CMakeLists.txt b/lldb/utils/TableGen/CMakeLists.txt
index 68547fe13e1aeb..47a6400b4287e2 100644
--- a/lldb/utils/TableGen/CMakeLists.txt
+++ b/lldb/utils/TableGen/CMakeLists.txt
@@ -10,7 +10,6 @@ if (NOT DEFINED LLDB_TABLEGEN_EXE)
     add_tablegen(lldb-tblgen LLDB
       LLDBOptionDefEmitter.cpp
       LLDBPropertyDefEmitter.cpp
-      LLDBSBAPIDWARFEnum.cpp
       LLDBTableGen.cpp
       LLDBTableGenUtils.cpp
       )
diff --git a/lldb/utils/TableGen/LLDBSBAPIDWARFEnum.cpp b/lldb/utils/TableGen/LLDBSBAPIDWARFEnum.cpp
deleted file mode 100644
index 084284ed6aa82a..00000000000000
--- a/lldb/utils/TableGen/LLDBSBAPIDWARFEnum.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-//===- LLDBPropertyDefEmitter.cpp -----------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Produce the list of source languages header file fragment for the SBAPI.
-//
-//===----------------------------------------------------------------------===//
-
-#include <fstream>
-#include <llvm/ADT/StringRef.h>
-#include <regex>
-
-namespace lldb_private {
-int EmitSBAPIDWARFEnum(int argc, char **argv) {
-  std::string InputFilename;
-  std::string OutputFilename;
-  std::string DepFilename;
-  // This command line option parser is as robust as the worst shell script.
-  for (int i = 0; i < argc; ++i) {
-    if (llvm::StringRef(argv[i]).ends_with("Dwarf.def"))
-      InputFilename = std::string(argv[i]);
-    if (llvm::StringRef(argv[i]) == "-o" && i + 1 < argc)
-      OutputFilename = std::string(argv[i + 1]);
-    if (llvm::StringRef(argv[i]) == "-d" && i + 1 < argc)
-      DepFilename = std::string(argv[i + 1]);
-  }
-  std::ifstream input(InputFilename);
-  std::ofstream output(OutputFilename);
-  output
-      << R"(//===-- SBLanguages.h -----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLDB_API_SBLANGUAGE_H
-#define LLDB_API_SBLANGUAGE_H
-/// Used by \ref SBExpressionOptions.
-/// These enumerations use the same language enumerations as the DWARF
-/// specification for ease of use and consistency.
-enum SBSourceLanguageName : uint16_t {
-)";
-  std::string line;
-  std::regex macro_regex(R"(^ *HANDLE_DW_LNAME *\( *([^,]+), ([^,]+), )"
-                         "\"(.*)\",.*\\).*",
-                         std::regex::extended);
-  while (std::getline(input, line)) {
-    std::smatch match;
-    if (!std::regex_match(line, match, macro_regex))
-      continue;
-
-    output << "  /// " << match[3] << ".\n";
-    output << "  eLanguageName" << match[2] << " = " << match[1] << ",\n";
-  }
-  output << "};\n\n";
-  output << "#endif\n";
-  // Emit the dependencies file.
-  std::ofstream(DepFilename) << OutputFilename << ": " << InputFilename << '\n';
-  return 0;
-}
-} // namespace lldb_private
diff --git a/lldb/utils/TableGen/LLDBTableGen.cpp b/lldb/utils/TableGen/LLDBTableGen.cpp
index 75d16755604758..c63ca76c0d48f1 100644
--- a/lldb/utils/TableGen/LLDBTableGen.cpp
+++ b/lldb/utils/TableGen/LLDBTableGen.cpp
@@ -27,7 +27,6 @@ enum ActionType {
   GenOptionDefs,
   GenPropertyDefs,
   GenPropertyEnumDefs,
-  GenSBAPIDWARFEnum
 };
 
 static cl::opt<ActionType> Action(
@@ -41,8 +40,6 @@ static cl::opt<ActionType> Action(
                clEnumValN(GenPropertyDefs, "gen-lldb-property-defs",
                           "Generate lldb property definitions"),
                clEnumValN(GenPropertyEnumDefs, "gen-lldb-property-enum-defs",
-                          "Generate lldb property enum definitions"),
-               clEnumValN(GenSBAPIDWARFEnum, "gen-lldb-sbapi-dwarf-enum",
                           "Generate lldb property enum definitions")));
 
 static bool LLDBTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
@@ -62,8 +59,6 @@ static bool LLDBTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
   case GenPropertyEnumDefs:
     EmitPropertyEnumDefs(Records, OS);
     break;
-  case GenSBAPIDWARFEnum:
-    llvm_unreachable("already handled");
   }
   return false;
 }
@@ -74,9 +69,6 @@ int main(int argc, char **argv) {
   cl::ParseCommandLineOptions(argc, argv);
   llvm_shutdown_obj Y;
 
-  if (Action == GenSBAPIDWARFEnum)
-    return EmitSBAPIDWARFEnum(argc, argv);
-
   return TableGenMain(argv[0], &LLDBTableGenMain);
 }
 

>From 4d08783c52b83b9afbff78564d64bee34cfb5f7f Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Wed, 1 May 2024 11:12:09 -0700
Subject: [PATCH 2/3] Incorporate Dave's feedback

---
 lldb/scripts/generate-sbapi-dwarf-enum.py | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lldb/scripts/generate-sbapi-dwarf-enum.py b/lldb/scripts/generate-sbapi-dwarf-enum.py
index c4252223430ed6..d34af7315a3116 100755
--- a/lldb/scripts/generate-sbapi-dwarf-enum.py
+++ b/lldb/scripts/generate-sbapi-dwarf-enum.py
@@ -26,7 +26,9 @@
 #endif
 """
 
-REGEX = re.compile(r'(^ *HANDLE_DW_LNAME *\( *([^,]+), ([^,]+), )"(.*)",.*\).*')
+REGEX = re.compile(
+    r'^ *HANDLE_DW_LNAME *\( *(?P<value>[^,]+), (?P<comment>[^,]+), "(?P<name>.*)",.*\)'
+)
 
 
 def emit_enum(input, output):
@@ -42,11 +44,11 @@ def emit_enum(input, output):
 
         # Emit the enum values.
         for line in lines:
-            match = REGEX.search(line)
+            match = REGEX.match(line)
             if not match:
                 continue
-            f.write(f"  /// {match.group(4)}.\n")
-            f.write(f"  eLanguageName{match.group(3)} = {match.group(2)},\n")
+            f.write(f"  /// {match.group('comment')}.\n")
+            f.write(f"  eLanguageName{match.group('name')} = {match.group('value')},\n")
 
         # Emit the footer
         f.write(FOOTER)

>From 1b77b006003a4054978b5dc09fb98adc8ee02169 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Wed, 1 May 2024 11:32:04 -0700
Subject: [PATCH 3/3] Incorporate Adrian's feedback

---
 lldb/scripts/generate-sbapi-dwarf-enum.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lldb/scripts/generate-sbapi-dwarf-enum.py b/lldb/scripts/generate-sbapi-dwarf-enum.py
index d34af7315a3116..5eeb8264a768ee 100755
--- a/lldb/scripts/generate-sbapi-dwarf-enum.py
+++ b/lldb/scripts/generate-sbapi-dwarf-enum.py
@@ -27,7 +27,7 @@
 """
 
 REGEX = re.compile(
-    r'^ *HANDLE_DW_LNAME *\( *(?P<value>[^,]+), (?P<comment>[^,]+), "(?P<name>.*)",.*\)'
+    r'^ *HANDLE_DW_LNAME *\( *(?P<value>[^,]+), (?P<comment>[^"]+), "(?P<name>.*)",.*\)'
 )
 
 



More information about the lldb-commits mailing list