change split.py to output extern vars/functions into generate CPP (#98)

* change split.py to output extern vars/functions into generate CPP
also change demangling to use short type names

* don't take files for extern funcs/vars anymore

Co-authored-by: Pheenoh <pheenoh@gmail.com>
This commit is contained in:
lepelog 2021-01-25 20:09:55 +01:00 committed by GitHub
parent ec9b03241d
commit d301beca77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 52 deletions

View File

@ -10,14 +10,21 @@ types = {
'l': 'long',
's': 'short',
'c': 'char',
'f': 'float',
'd': 'double',
'f': 'f32',
'd': 'f64',
'v': 'void',
'x': 'long long',
'b': 'bool',
'e': 'varargs...',
}
short_type_names = {
'char': '8',
'short': '16',
'long' : '32',
'long long': '64',
}
# {'defctor', 'ops',}
special_funcs = {
@ -55,9 +62,13 @@ class Param:
ret = ''
if self.is_const:
ret += 'const '
if self.is_unsigned:
ret += 'unsigned '
ret += self.name
if self.name in short_type_names:
ret += 'u' if self.is_unsigned else 's'
ret += short_type_names[self.name]
else:
if self.is_unsigned:
ret += 'unsigned '
ret += self.name
for _ in range(self.pointer_lvl):
ret += '*'
if self.is_ref:

View File

@ -20,7 +20,7 @@ import IPython
SDA_BASE = 0x80458580
SDA2_BASE = 0x80459A00
__version__ = 'v0.3'
__version__ = 'v0.4'
def function_global_search(lines: List[Line]) -> Iterable[Line]:
@ -164,16 +164,6 @@ def emit_cxx_extern_vars(tu_file: str, labels: Iterable[str]) -> str:
default='include/funcs',
)
@click.option('--s-include-base', type=str, default='funcs')
@click.option(
'--extern-functions-file',
type=PathPath(file_okay=True, dir_okay=False),
default='include/functions.h',
)
@click.option(
'--extern-variables-file',
type=PathPath(file_okay=True, dir_okay=False),
default='include/variables.h',
)
@click.option(
'--framework-map-file',
type=PathPath(file_okay=True, dir_okay=False),
@ -194,8 +184,6 @@ def split(
cxx_out,
funcs_out,
s_include_base,
extern_functions_file,
extern_variables_file,
framework_map_file,
ldscript_file,
from_line,
@ -216,15 +204,6 @@ def split(
(from_line - 1 if from_line else 0) : (to_line - 1 if to_line else -1)
]
logger.info('reading extern func/vars files')
extern_funcs_src = extern_functions_file.read_text()
extern_vars_src = extern_variables_file.read_text()
include_re = re.compile(r'#include "(.*)"')
for include in include_re.findall(extern_funcs_src):
extern_funcs_src += (Path('include') / include).read_text()
logger.info('parsing map file')
framework_map = parse_framework_map(framework_map_file)
logger.debug(f'loaded {len(framework_map)} symbols from map')
@ -262,19 +241,6 @@ def split(
if line.body.opcode[0] in {'l', 's'}: # load and store instructions, ish
loaded_labels |= set(find_labels_in_operands(line.body.operands))
# -- dump new variable labels to variables.h
logger.info('dumping variable labels to extern vars header')
vars_new = set()
for label in loaded_labels:
if label not in extern_vars_src:
logger.debug(f'adding extern var {label} to {extern_variables_file}')
vars_new.add(label)
if len(vars_new) > 0:
with open(extern_variables_file, 'a') as f:
f.write('\n\n')
f.write(emit_cxx_extern_vars(cxx_out.name, vars_new))
# -- find all defined functions and split them
functions = list(find_functions(lines, framework_map))
logger.info('splitting functions')
@ -324,18 +290,6 @@ def split(
for func in functions:
func_labels.add(func.name)
# get rid of stuff already in functions.h. extremely hacky
funcs_new_labels = set()
for label in func_labels:
if label not in extern_funcs_src:
logger.info(f'adding extern func {label} to {extern_functions_file}')
funcs_new_labels.add(label)
if len(funcs_new_labels) > 0:
with open(extern_functions_file, 'a') as f:
f.write('\n\n')
f.write(emit_cxx_extern_fns(cxx_out.name, funcs_new_labels))
# -- write asm stubs to cxx_out (could've done this as part of previous loop but imo this is cleaner)
logger.info(f'emitting c++ asm stubs to {cxx_out}')
with open(cxx_out, 'w') as f:
@ -344,6 +298,14 @@ def split(
)
f.write('#include "global.h"\n\n')
# extern functions
f.write(emit_cxx_extern_fns(cxx_out.name, func_labels))
f.write('\n\n')
# extern variables
f.write(emit_cxx_extern_vars(cxx_out.name, loaded_labels))
f.write('\n\n')
f.write('extern "C" {\n')
for func in functions:
logger.debug(f'emitting asm stub for {func.name}')