[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:
committed by
GitHub
parent
c4e8e2c67b
commit
dcbf0fcd0d
67
lldb/scripts/generate-sbapi-dwarf-enum.py
Executable file
67
lldb/scripts/generate-sbapi-dwarf-enum.py
Executable 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()
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user