24from typing
import Dict, List, TextIO
30TRIGGER = re.compile(
r"^struct target_ops$")
32ENDER = re.compile(
r"^\s*};$")
35SYMBOL =
"[a-zA-Z_][a-zA-Z0-9_]*"
37NAME_PART =
r"(?P<name>" + SYMBOL +
r")\s"
39ARGS_PART =
r"(?P<args>\(.*\))"
43POINTER_PART =
r"\s*(\*|\&)?\s*"
47CP_SYMBOL =
r"[a-zA-Z_][a-zA-Z0-9_<>:]*"
49SIMPLE_RETURN_PART =
r"((struct|class|enum|union)\s+)?" + CP_SYMBOL
52RETURN_PART =
r"((const|volatile)\s+)?(" + SIMPLE_RETURN_PART +
")" + POINTER_PART
55VIRTUAL_PART =
r"virtual\s"
58TARGET_DEFAULT_PART =
r"TARGET_DEFAULT_(?P<style>[A-Z_]+)\s*\((?P<default_arg>.*)\)"
62METHOD_TRAILER =
r"\s*" + TARGET_DEFAULT_PART +
"$"
84 +
r"|(?P<T>.*(enum\s+)?"
93TARGET_DEBUG_PRINTER =
r"\s*TARGET_DEBUG_PRINTER\s*\((?P<arg>[^)]*)\)\s*"
98 self, argtypes: List[str], return_type: str, style: str, default_arg: str
107 found_trigger =
False
109 with open(
"target.h",
"r")
as target_h:
110 for line
in target_h:
112 if not found_trigger:
113 if TRIGGER.match(line):
118 elif ENDER.match(line):
122 line = re.split(
"//", line)[0]
123 all_the_text = all_the_text +
" " + line
124 if not found_trigger:
125 raise RuntimeError(
"Could not find trigger line")
127 all_the_text = re.sub(
r"/\*(.*?)\*/",
"", all_the_text)
141 all_the_text = re.sub(
r"\s+",
" ", all_the_text)
142 return all_the_text.split(
";")
148 typestr = re.sub(
r"^\((.*)\)$",
r"\1", typestr)
149 result: list[str] = []
150 for item
in re.split(
r",\s*", typestr):
151 if item ==
"void" or item ==
"":
153 m = ARGTYPES.match(item)
156 onetype = m.group(
"E")
158 onetype = m.group(
"T")
161 result.append(onetype.strip())
168 f: TextIO, decl: bool, name: str, return_type: str, argtypes: List[str]
170 print(return_type, file=f, end=
"")
172 if not return_type.endswith(
"*"):
173 print(
" ", file=f, end=
"")
176 print(name +
" (", file=f, end=
"")
177 argdecls: list[str] = []
178 actuals: list[str] = []
179 for i
in range(len(argtypes)):
180 val = re.sub(TARGET_DEBUG_PRINTER,
"", argtypes[i])
181 if not val.endswith(
"*")
and not val.endswith(
"&"):
183 vname =
"arg" + str(i)
186 actuals.append(vname)
187 print(
", ".join(argdecls) +
")", file=f, end=
"")
189 print(
" override;", file=f)
204 f,
False,
"target_ops::" + name, return_type, argtypes
206 print(
" ", file=f, end=
"")
207 if return_type !=
"void":
208 print(
"return ", file=f, end=
"")
209 print(
"this->beneath ()->" + name +
" (", file=f, end=
"")
210 print(
", ".join(names), file=f, end=
"")
225 name =
"dummy_target::" + name
228 print(
" ", file=f, end=
"")
229 if return_type !=
"void":
230 print(
"return ", file=f, end=
"")
231 print(content +
" (", file=f, end=
"")
232 names.insert(0,
"this")
233 print(
", ".join(names) +
");", file=f)
234 elif style ==
"RETURN":
235 print(
" return " + content +
";", file=f)
236 elif style ==
"NORETURN":
237 print(
" " + content +
";", file=f)
238 elif style ==
"IGNORE":
242 raise RuntimeError(
"unrecognized style: " + style)
247 m = re.search(TARGET_DEBUG_PRINTER, typename)
249 return m.group(
"arg")
250 typename = typename.rstrip()
253 typename = re.sub(
"\\b(struct|enum|class|union) ",
"", typename)
254 typename = re.sub(
"[ ()<>:]",
"_", typename)
255 typename = re.sub(
"[*]",
"p", typename)
256 typename = re.sub(
"&",
"r", typename)
259 typename = re.sub(
"_+",
"_", typename)
263 typename = re.sub(
"_+$",
"", typename)
264 return "target_debug_print_" + typename
269 f: TextIO, content: str, name: str, return_type: str, argtypes: List[str]
272 debugname =
"debug_target::" + name
275 ' gdb_printf (gdb_stdlog, "-> %s->'
277 +
' (...)\\n", this->beneath ()->shortname ());',
282 if return_type !=
"void":
283 print(
" " + return_type +
" result", file=f)
284 print(
" = ", file=f, end=
"")
286 print(
" ", file=f, end=
"")
287 print(
"this->beneath ()->" + name +
" (", file=f, end=
"")
288 print(
", ".join(names), file=f, end=
"")
293 ' gdb_printf (gdb_stdlog, "<- %s->'
295 +
' (", this->beneath ()->shortname ());',
298 for i
in range(len(argtypes)):
300 print(
' gdb_puts (", ", gdb_stdlog);', file=f)
302 print(
" " + printer +
" (" + names[i] +
");", file=f)
303 if return_type !=
"void":
304 print(
' gdb_puts (") = ", gdb_stdlog);', file=f)
306 print(
" " + printer +
" (result);", file=f)
307 print(
' gdb_puts ("\\n", gdb_stdlog);', file=f)
309 print(
' gdb_puts (")\\n", gdb_stdlog);', file=f)
311 if return_type !=
"void":
312 print(
" return result;", file=f)
320 delegators: List[str],
321 entries: Dict[str, Entry],
324 print(
"struct " + class_name +
" : public target_ops", file=f)
326 print(
" const target_info &info () const override;", file=f)
328 print(
" strata stratum () const override;", file=f)
331 for name
in delegators:
332 print(
" ", file=f, end=
"")
333 entry = entries[name]
339delegators: List[str] = []
340entries: Dict[str, Entry] = {}
345 current_line = current_line.strip()
346 m = METHOD.match(current_line)
352 return_type = data[
"return_type"].strip()
353 style = data[
"style"]
354 default_arg = data[
"default_arg"]
355 entries[name] =
Entry(argtypes, return_type, style, default_arg)
357 delegators.append(name)
359with open(
"target-delegates.c",
"w")
as f:
362 "make-target-delegates.py",
"Boilerplate target methods for GDB"
366 print_class(f,
"dummy_target", delegators, entries)
367 print_class(f,
"debug_target", delegators, entries)
369 for name
in delegators:
370 entry = entries[name]
__init__(self, List[str] argtypes, str return_type, str style, str default_arg)
copyright(str tool, str description)
print_class(TextIO f, str class_name, List[str] delegators, Dict[str, Entry] entries)
write_delegator(TextIO f, str name, str return_type, List[str] argtypes)
write_debugmethod(TextIO f, str content, str name, str return_type, List[str] argtypes)
write_function_header(TextIO f, bool decl, str name, str return_type, List[str] argtypes)
write_tdefault(TextIO f, str content, str style, str name, str return_type, List[str] argtypes)
parse_argtypes(str typestr)
write_declaration(TextIO f, str name, str return_type, List[str] argtypes)