[lldb] Use Python script to generate SBLanguages.h (#90753)

Use a Python script to generate SBLanguages.h instead of piggybacking on
LLDB TableGen. This addresses Nico Weber's post-commit feedback.
This commit is contained in:
Jonas Devlieghere
2024-05-01 13:02:47 -07:00
committed by GitHub
parent c4e8e2c67b
commit dcbf0fcd0d
5 changed files with 81 additions and 80 deletions

View File

@@ -0,0 +1,67 @@
#!/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 *\( *(?P<value>[^,]+), (?P<comment>[^"]+), "(?P<name>.*)",.*\)'
)
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.match(line)
if not match:
continue
f.write(f" /// {match.group('comment')}.\n")
f.write(f" eLanguageName{match.group('name')} = {match.group('value')},\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()

View File

@@ -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

View File

@@ -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
)

View File

@@ -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

View File

@@ -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);
}