MacroCollector: default to not including intermediate macros

By default, exclude macros whose numerical value is not a valid member
of the semantic type (e.g. PSA_ALG_xxx_BASE is not itself an
algorithm, only an intermediate value used to construct others). But
do include them with include_intermediate=True, which
generate_psa_constants.py does.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
This commit is contained in:
Gilles Peskine 2021-01-25 22:42:14 +01:00
parent f8deb759ba
commit 13d60eb4fc
2 changed files with 17 additions and 1 deletions

View file

@ -213,6 +213,9 @@ class CaseBuilder(macro_collector.PSAMacroCollector):
2. Call `write_file` to write ``psa_constant_names_generated.c``. 2. Call `write_file` to write ``psa_constant_names_generated.c``.
""" """
def __init__(self):
super().__init__(include_intermediate=True)
@staticmethod @staticmethod
def _make_return_case(name): def _make_return_case(name):
return 'case %(name)s: return "%(name)s";' % {'name': name} return 'case %(name)s: return "%(name)s";' % {'name': name}

View file

@ -22,7 +22,15 @@ class PSAMacroCollector:
"""Collect PSA crypto macro definitions from C header files. """Collect PSA crypto macro definitions from C header files.
""" """
def __init__(self): def __init__(self, include_intermediate=False):
"""Set up an object to collect PSA macro definitions.
Call the read_file method of the constructed object on each header file.
* include_intermediate: if true, include intermediate macros such as
PSA_XXX_BASE that do not designate semantic values.
"""
self.include_intermediate = include_intermediate
self.statuses = set() self.statuses = set()
self.key_types = set() self.key_types = set()
self.key_types_from_curve = {} self.key_types_from_curve = {}
@ -37,6 +45,11 @@ class PSAMacroCollector:
def is_internal_name(self, name): def is_internal_name(self, name):
"""Whether this is an internal macro. Internal macros will be skipped.""" """Whether this is an internal macro. Internal macros will be skipped."""
if not self.include_intermediate:
if name.endswith('_BASE') or name.endswith('_NONE'):
return True
if '_CATEGORY_' in name:
return True
return name.endswith('_FLAG') or name.endswith('MASK') return name.endswith('_FLAG') or name.endswith('MASK')
# "#define" followed by a macro name with either no parameters # "#define" followed by a macro name with either no parameters