gdbstub: Add num_regs member to GDBFeature

Currently the number of registers exposed to GDB is written as magic
numbers in code. Derive the number of registers GDB actually see from
XML files to replace the magic numbers in code later.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231025093128.33116-2-akihiko.odaki@daynix.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231106185112.2755262-9-alex.bennee@linaro.org>
master
Akihiko Odaki 2023-11-06 18:50:58 +00:00 committed by Alex Bennée
parent 119599965e
commit 6c2313e83d
2 changed files with 45 additions and 2 deletions

View File

@ -13,6 +13,7 @@
typedef struct GDBFeature {
const char *xmlname;
const char *xml;
int num_regs;
} GDBFeature;

View File

@ -1,7 +1,7 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0-or-later
import os, sys
import os, sys, xml.etree.ElementTree
def writeliteral(indent, bytes):
sys.stdout.write(' ' * indent)
@ -39,10 +39,52 @@ for input in sys.argv[1:]:
with open(input, 'rb') as file:
read = file.read()
parser = xml.etree.ElementTree.XMLPullParser(['start', 'end'])
parser.feed(read)
events = parser.read_events()
event, element = next(events)
if event != 'start':
sys.stderr.write(f'unexpected event: {event}\n')
exit(1)
if element.tag != 'feature':
sys.stderr.write(f'unexpected start tag: {element.tag}\n')
exit(1)
regnum = 0
regnums = []
tags = ['feature']
for event, element in events:
if event == 'end':
if element.tag != tags[len(tags) - 1]:
sys.stderr.write(f'unexpected end tag: {element.tag}\n')
exit(1)
tags.pop()
if element.tag == 'feature':
break
elif event == 'start':
if len(tags) < 2 and element.tag == 'reg':
if 'regnum' in element.attrib:
regnum = int(element.attrib['regnum'])
regnums.append(regnum)
regnum += 1
tags.append(element.tag)
else:
raise Exception(f'unexpected event: {event}\n')
if len(tags):
sys.stderr.write('unterminated feature tag\n')
exit(1)
base_reg = min(regnums)
num_regs = max(regnums) - base_reg + 1 if len(regnums) else 0
sys.stdout.write(' {\n')
writeliteral(8, bytes(os.path.basename(input), 'utf-8'))
sys.stdout.write(',\n')
writeliteral(8, read)
sys.stdout.write('\n },\n')
sys.stdout.write(f',\n {num_regs},\n }},\n')
sys.stdout.write(' { NULL }\n};\n')