blob: c7b2fe36970d0dd2fb9d5e180aaff5bf731d2355 [file] [log] [blame]
#-------------------------------------------------------------------------------
# Copyright (c) 2020, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
"""Script for scanning the source after breakpoints
This script scans a source code, and finds patterns that sign a location to be
used as a breakpoint.
TODO: Describe format
"""
import os
import sys
import json
import re
import argparse
MACRO_PATTERN = re.compile(r'^\s*IRQ_TEST_TOOL_([0-9a-zA-Z_]*)\s*\(([^\)]*)\)\s*')
def process_line(filename, line, line_num, breakpoints):
m = MACRO_PATTERN.match(line)
if m:
macro_type = m.group(1)
parameters = m.group(2).split(',')
print ("Macro " + macro_type + ", parameters: " + str(parameters))
if (macro_type == 'SYMBOL'):
if (len(parameters) != 2):
print ("Invalid macro at " + filename + ":" + str(line_num))
print ("Expected number of parameters for *SYMBOL is 2")
exit(1)
bp = {}
bp["symbol"] = parameters[1].strip()
breakpoints[parameters[0].strip()] = bp
return
if (macro_type == 'CODE_LOCATION'):
if (len(parameters) != 1):
print ("Invalid macro at " + filename + ":" + str(line_num))
print ("Expected number of parameters for *CODE_LOCATION is 1")
exit(1)
bp = {}
bp["file"] = filename
bp["line"] = line_num
breakpoints[parameters[0].strip()] = bp
return
if (macro_type == 'SYMBOL_OFFSET'):
if (len(parameters) != 3):
print ("Invalid macro at " + filename + ":" + str(line_num))
print ("Expected number of parameters for *SYMBOL_OFFSET is 3")
exit(1)
bp = {}
bp["symbol"] = parameters[1].strip()
bp["offset"] = parameters[2].strip()
breakpoints[parameters[0].strip()] = bp
return
print ("invalid macro *" + macro_type + "at " + filename + ":" + str(line_num))
exit(1)
def process_file(file_path, filename, breakpoints):
with open(file_path, 'r', encoding='latin_1') as f:
content = f.readlines()
for num, line in enumerate(content):
line_num = num+1
process_line(filename, line, line_num, breakpoints)
def main():
parser = argparse.ArgumentParser()
parser.add_argument("tfm_source", help="path to the TF-M source code")
parser.add_argument("outfile", help="The output json file with the breakpoints")
args = parser.parse_args()
tfm_source_dir = args.tfm_source
breakpoints = {}
for root, subdirs, files in os.walk(tfm_source_dir):
for filename in files:
# Scan other files as well?
if not filename.endswith('.c'):
continue
file_path = os.path.join(root, filename)
process_file(file_path, filename, breakpoints)
breakpoints = {"breakpoints":breakpoints}
with open(args.outfile, 'w') as outfile:
json.dump(breakpoints, outfile,
sort_keys=True, indent=4, separators=(',', ': '))
if __name__ == "__main__":
main()