ldgen: add test app for placement sanity check

pull/6634/head
Renz Bagaporo 2021-01-28 12:33:12 +08:00
rodzic 7f18c948dc
commit 23590374b5
9 zmienionych plików z 130 dodań i 0 usunięć

Wyświetl plik

@ -0,0 +1,15 @@
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(ldgen_test)
idf_build_get_property(python PYTHON)
idf_build_get_property(elf EXECUTABLE)
add_custom_command(
TARGET ${elf}
POST_BUILD
COMMAND ${python} ${CMAKE_CURRENT_LIST_DIR}/check_placements.py ${CMAKE_OBJDUMP} $<TARGET_FILE:${elf}>
)

Wyświetl plik

@ -0,0 +1,5 @@
Runs a build test to check ldgen places libraries, objects and symbols
correctly as specified in the linker fragments. Specifically, this app
tests the placement for the main component, as specified in `main/linker.lf`
The Python script that performs the checks, `check_placements.py`, automatically
runs after the app is built.

Wyświetl plik

@ -0,0 +1,64 @@
#!/usr/bin/env python
#
# Copyright 2020 Espressif Systems (Shanghai) PTE LTD
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Check placements in this test app for main
# specified in main/linker.lf
import argparse
import subprocess
from pyparsing import LineEnd, Literal, ParseException, SkipTo, Word, alphanums, hexnums
argparser = argparse.ArgumentParser()
argparser.add_argument('objdump')
argparser.add_argument('elf')
args = argparser.parse_args()
contents = subprocess.check_output([args.objdump, '-t', args.elf]).decode()
def check_location(symbol, expected):
pattern = Word(alphanums + '._').setResultsName('actual') + Word(hexnums) + Literal(symbol) + LineEnd()
pattern = SkipTo(pattern) + pattern
try:
results = pattern.parseString(contents)
except ParseException:
print("check placement fail: '%s' was not found" % (symbol))
exit(1)
if results.actual != expected:
print("check placement fail: '%s' was placed in '%s', not in '%s'" % (symbol, results.actual, expected))
exit(1)
print("check placement pass: '%s' was successfully placed in '%s'" % (symbol, results.actual))
# src1:func1 (noflash) - explicit mapping for func2 using 'rtc' scheme
check_location('func1', '.iram0.text')
# src1:func2 (rtc) - explicit mapping for func2 using 'rtc' scheme
check_location('func2', '.rtc.text')
# src1 (default) - only func3 in src1 remains that has not been
# mapped using a different scheme
check_location('func3', '.flash.text')
# * (noflash) - no explicit mapping for src2
check_location('func4', '.iram0.text')

Wyświetl plik

@ -0,0 +1,3 @@
idf_component_register(SRCS "src1.c" "src2.c" "test_main.c"
INCLUDE_DIRS "."
LDFRAGMENTS "linker.lf")

Wyświetl plik

@ -0,0 +1,7 @@
[mapping:main]
archive: libmain.a
entries:
* (noflash)
src1 (default)
src1:func1 (noflash)
src1:func2 (rtc)

Wyświetl plik

@ -0,0 +1,16 @@
#include <stdio.h>
void func1(void)
{
printf("Hello from func1!\n");
}
void func2(void)
{
printf("Hello from func2!\n");
}
void func3(void)
{
printf("Hello from func3!\n");
}

Wyświetl plik

@ -0,0 +1,6 @@
#include <stdio.h>
void func4(void)
{
printf("Hello from func4!\n");
}

Wyświetl plik

@ -0,0 +1,14 @@
extern void func1(void);
extern void func2(void);
extern void func3(void);
extern void func4(void);
void app_main(void)
{
func1();
func2();
func3();
func4();
}