mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
2916bf9b6c
There are multiple changes in this commit: 1. Unify the RISC-V and ULP-FSM code paths in esp32ulp_mapgen.py. It seems that these were originally introduced because `nm` output for the RISC-V case contained symbol sizes, while for the ULP-FSM no symbol sizes were reported. This makes sense, because the ULP-FSM object files are produced from assembly source, symbol sizes have to be added manually using the .size directive. In the case of RISC-V, the object files are built from C sources and the sizes are automatically added by the compiler. Now 'posix' output format is used for both RISC-V and ULP-FSM. 2. Move BASE_ADDR out of esp32ulp_mapgen.py. This now has to be passed from CMake, which should make it easier to modify if a new chip with a different RTC RAM base address is added. 3. Add C++ guards to the generated header file. 4. Switch from optparse to argparse for similarity with other IDF tools. 5. Add type annotations.
74 lines
2.4 KiB
Python
Executable File
74 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# esp32ulp_mapgen utility converts a symbol list provided by nm into an export script
|
|
# for the linker and a header file.
|
|
#
|
|
# SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
from __future__ import print_function
|
|
|
|
import argparse
|
|
import os
|
|
import textwrap
|
|
import typing
|
|
|
|
UTIL = os.path.basename(__file__)
|
|
|
|
|
|
def gen_ld_h_from_sym(f_sym: typing.TextIO, f_ld: typing.TextIO, f_h: typing.TextIO, base_addr: int) -> None:
|
|
f_ld.write(textwrap.dedent(
|
|
f"""
|
|
/* ULP variable definitions for the linker.
|
|
* This file is generated automatically by {UTIL} utility.
|
|
*/
|
|
"""
|
|
))
|
|
f_h.write(textwrap.dedent(
|
|
f"""
|
|
/* ULP variable definitions for the compiler.
|
|
* This file is generated automatically by {UTIL} utility.
|
|
*/
|
|
#pragma once
|
|
#ifdef __cplusplus
|
|
extern "C" {{
|
|
#endif
|
|
"""
|
|
))
|
|
|
|
for line in f_sym:
|
|
# NM "posix" format output has the following structure:
|
|
# symbol_name symbol_type addr_hex [size_hex]
|
|
parts = line.split()
|
|
name = parts[0]
|
|
addr = int(parts[2], 16) + base_addr
|
|
f_h.write('extern uint32_t ulp_{0};\n'.format(name))
|
|
f_ld.write('PROVIDE ( ulp_{0} = 0x{1:08x} );\n'.format(name, addr))
|
|
|
|
f_h.write(textwrap.dedent(
|
|
"""
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
"""
|
|
))
|
|
|
|
|
|
def main() -> None:
|
|
description = ('This application generates .h and .ld files for symbols defined in input file. '
|
|
'The input symbols file can be generated using nm utility like this: '
|
|
'<PREFIX>nm -g -f posix <elf_file> > <symbols_file>')
|
|
|
|
parser = argparse.ArgumentParser(description=description)
|
|
parser.add_argument('-s', '--symfile', required=True, help='symbols file name', metavar='SYMFILE', type=argparse.FileType('r'))
|
|
parser.add_argument('-o', '--outputfile', required=True, help='destination .h and .ld files name prefix', metavar='OUTFILE')
|
|
parser.add_argument('--base-addr', required=True, help='base address of the ULP memory, to be added to each symbol')
|
|
|
|
args = parser.parse_args()
|
|
|
|
with open(args.outputfile + '.h', 'w') as f_h, open(args.outputfile + '.ld', 'w') as f_ld:
|
|
gen_ld_h_from_sym(args.symfile, f_ld, f_h, int(args.base_addr, 0))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|