diff options
Diffstat (limited to 'gdb/syscalls/riscv-canonicalize-syscall-gen.py')
-rwxr-xr-x | gdb/syscalls/riscv-canonicalize-syscall-gen.py | 136 |
1 files changed, 72 insertions, 64 deletions
diff --git a/gdb/syscalls/riscv-canonicalize-syscall-gen.py b/gdb/syscalls/riscv-canonicalize-syscall-gen.py index 30e52b7..c7dda93 100755 --- a/gdb/syscalls/riscv-canonicalize-syscall-gen.py +++ b/gdb/syscalls/riscv-canonicalize-syscall-gen.py @@ -82,51 +82,59 @@ tail = """\ class Generator: - def _get_gdb_syscalls(self, gdb_syscalls_path: _Path) -> list[str]: - gdb_syscalls: list[str] = [] - with open(gdb_syscalls_path, "r", encoding="UTF-8") as file: - lines = file.readlines() - for line in lines: - match = re.search(r"\s*(?P<name>gdb_sys_[^S]+)\S*=", line) - if match: - gdb_syscalls.append(match.group("name").strip()) - return gdb_syscalls - - def _get_canon_syscalls_lines(self, syscalls_path: _Path, gdb_syscalls: list[str]) -> list[str]: - canon_syscalls: dict[int, str] = {} - with open(syscalls_path, "r", encoding="UTF-8") as file: - lines = file.readlines() - for line in lines: - match = re.match(r"#define\s+__NR_(?P<name>[^\s]+)\s+(?P<number>\d+)", line) - if match: - syscall_name = match.group("name") - syscall_num = int(match.group("number")) - gdb_syscall_name = f"gdb_sys_{syscall_name}" - if gdb_syscall_name in gdb_syscalls: - value = f" case {syscall_num}: return {gdb_syscall_name};\n" - canon_syscalls[syscall_num] = value - # this is a place for corner cases - elif syscall_name == "mmap": - gdb_old_syscall_name = "gdb_old_mmap" - value = f" case {syscall_num}: return {gdb_old_syscall_name};\n" - canon_syscalls[syscall_num] = value - else: - value = f" /* case {syscall_num}: return {gdb_syscall_name}; */\n" - canon_syscalls[syscall_num] = value - return [canon_syscalls[syscall_num] for syscall_num in sorted(canon_syscalls)] - - def generate(self, syscalls_path: _Path) -> None: - repo_path = _Path(__file__).parent.parent.parent - gdb_syscalls_path = repo_path / "gdb" / "linux-record.h" - canon_syscalls_path = repo_path / "gdb" / "riscv-canonicalize-syscall-gen.c" - - gdb_syscalls = self._get_gdb_syscalls(gdb_syscalls_path) - canon_syscalls_lines = self._get_canon_syscalls_lines(syscalls_path, gdb_syscalls) - - with open(canon_syscalls_path, "w", encoding="UTF-8") as file: - file.writelines(head) - file.writelines(canon_syscalls_lines) - file.writelines(tail) + def _get_gdb_syscalls(self, gdb_syscalls_path: _Path) -> list[str]: + gdb_syscalls: list[str] = [] + with open(gdb_syscalls_path, "r", encoding="UTF-8") as file: + lines = file.readlines() + for line in lines: + match = re.search(r"\s*(?P<name>gdb_sys_[^S]+)\S*=", line) + if match: + gdb_syscalls.append(match.group("name").strip()) + return gdb_syscalls + + def _get_canon_syscalls_lines( + self, syscalls_path: _Path, gdb_syscalls: list[str] + ) -> list[str]: + canon_syscalls: dict[int, str] = {} + with open(syscalls_path, "r", encoding="UTF-8") as file: + lines = file.readlines() + for line in lines: + match = re.match( + r"#define\s+__NR_(?P<name>[^\s]+)\s+(?P<number>\d+)", line + ) + if match: + syscall_name = match.group("name") + syscall_num = int(match.group("number")) + gdb_syscall_name = f"gdb_sys_{syscall_name}" + if gdb_syscall_name in gdb_syscalls: + value = f" case {syscall_num}: return {gdb_syscall_name};\n" + canon_syscalls[syscall_num] = value + # this is a place for corner cases + elif syscall_name == "mmap": + gdb_old_syscall_name = "gdb_old_mmap" + value = ( + f" case {syscall_num}: return {gdb_old_syscall_name};\n" + ) + canon_syscalls[syscall_num] = value + else: + value = f" /* case {syscall_num}: return {gdb_syscall_name}; */\n" + canon_syscalls[syscall_num] = value + return [canon_syscalls[syscall_num] for syscall_num in sorted(canon_syscalls)] + + def generate(self, syscalls_path: _Path) -> None: + repo_path = _Path(__file__).parent.parent.parent + gdb_syscalls_path = repo_path / "gdb" / "linux-record.h" + canon_syscalls_path = repo_path / "gdb" / "riscv-canonicalize-syscall-gen.c" + + gdb_syscalls = self._get_gdb_syscalls(gdb_syscalls_path) + canon_syscalls_lines = self._get_canon_syscalls_lines( + syscalls_path, gdb_syscalls + ) + + with open(canon_syscalls_path, "w", encoding="UTF-8") as file: + file.writelines(head) + file.writelines(canon_syscalls_lines) + file.writelines(tail) help_message = """\ @@ -136,28 +144,28 @@ from path to riscv linux syscalls. def setup_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser(description=help_message) - parser.add_argument( - "-i", - "--input", - type=_Path, - required=True, - help="path to riscv linux syscalls (glibc/sysdeps/unix/sysv/linux/riscv/rv64/arch-syscall.h)", - ) - return parser + parser = argparse.ArgumentParser(description=help_message) + parser.add_argument( + "-i", + "--input", + type=_Path, + required=True, + help="path to riscv linux syscalls (glibc/sysdeps/unix/sysv/linux/riscv/rv64/arch-syscall.h)", + ) + return parser def main(argv: list[str]) -> int: - try: - parser = setup_parser() - args = parser.parse_args(argv) - generator = Generator() - generator.generate(args.input) - return 0 - except RuntimeError as e: - print(str(e)) - return -1 + try: + parser = setup_parser() + args = parser.parse_args(argv) + generator = Generator() + generator.generate(args.input) + return 0 + except RuntimeError as e: + print(str(e)) + return -1 if __name__ == "__main__": - sys.exit(main(sys.argv[1:])) + sys.exit(main(sys.argv[1:])) |