tests: debug: symtab: add test
Add test for symtab. Signed-off-by: Yong Cong Sin <ycsin@meta.com>
This commit is contained in:
parent
043f595279
commit
0f6272e5bc
4 changed files with 183 additions and 0 deletions
8
tests/subsys/debug/symtab/CMakeLists.txt
Normal file
8
tests/subsys/debug/symtab/CMakeLists.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
|
|
||||||
|
project(symtab)
|
||||||
|
|
||||||
|
target_sources(app PRIVATE src/main.c)
|
3
tests/subsys/debug/symtab/prj.conf
Normal file
3
tests/subsys/debug/symtab/prj.conf
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
CONFIG_ZTEST=y
|
||||||
|
|
||||||
|
CONFIG_SYMTAB=y
|
158
tests/subsys/debug/symtab/src/main.c
Normal file
158
tests/subsys/debug/symtab/src/main.c
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2024 Meta Platforms
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <zephyr/debug/symtab.h>
|
||||||
|
#include <zephyr/ztest.h>
|
||||||
|
|
||||||
|
const struct symtab_info *symtab;
|
||||||
|
|
||||||
|
static void *setup(void)
|
||||||
|
{
|
||||||
|
symtab = symtab_get();
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST_SUITE(test_symtab, NULL, setup, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_size)
|
||||||
|
{
|
||||||
|
zassert_true(symtab->length > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_symtab_find_symbol_name)
|
||||||
|
{
|
||||||
|
extern int main(void);
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const uintptr_t last_addr = first_addr + symtab->entries[symtab->length - 1].offset;
|
||||||
|
uint32_t offset;
|
||||||
|
const char *symbol_name;
|
||||||
|
|
||||||
|
zassert_between_inclusive((uintptr_t)main, first_addr, last_addr,
|
||||||
|
"No valid address found for `main()`");
|
||||||
|
|
||||||
|
/* Find the name of functions with `symtab_find_symbol_name()` */
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name((uintptr_t)main, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, "main"), 0);
|
||||||
|
zassert_equal(offset, 0);
|
||||||
|
|
||||||
|
/* Do a few more just for fun */
|
||||||
|
symbol_name = symtab_find_symbol_name((uintptr_t)strcmp, NULL);
|
||||||
|
zassert_equal(strcmp(symbol_name, "strcmp"), 0);
|
||||||
|
|
||||||
|
symbol_name = symtab_find_symbol_name((uintptr_t)symtab_find_symbol_name, NULL);
|
||||||
|
zassert_equal(strcmp(symbol_name, "symtab_find_symbol_name"), 0);
|
||||||
|
|
||||||
|
symbol_name = symtab_find_symbol_name((uintptr_t)test_main, NULL);
|
||||||
|
zassert_equal(strcmp(symbol_name, "test_main"), 0);
|
||||||
|
|
||||||
|
symbol_name = symtab_find_symbol_name((uintptr_t)setup, NULL);
|
||||||
|
zassert_equal(strcmp(symbol_name, "setup"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This testsuite tests the following position in the symbol table
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* [SYMBOL ADDR] | Name Offset
|
||||||
|
* before first--> . | "?" (not found) 0x0
|
||||||
|
* first--> 0x100 | <first> 0x0
|
||||||
|
* 0x101 | <first> 0x1
|
||||||
|
* . |
|
||||||
|
* . |
|
||||||
|
* . |
|
||||||
|
* last--> 0x300 | <last> 0x0
|
||||||
|
* after last--> 0x301 | <last> 0x1
|
||||||
|
* . |
|
||||||
|
* 0x310 (dummy) | "?" (not found) 0x0
|
||||||
|
* . |
|
||||||
|
* after dummy--> 0x342 | "?" (not found) 0x0
|
||||||
|
*/
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_before_first)
|
||||||
|
{
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const char *symbol_name;
|
||||||
|
uint32_t offset;
|
||||||
|
|
||||||
|
/* No symbol should appear before first_addr, but make sure that first_addr != 0 */
|
||||||
|
if (first_addr > 0) {
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(first_addr - 1, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, "?"), 0);
|
||||||
|
zassert_equal(offset, 0);
|
||||||
|
} else {
|
||||||
|
ztest_test_skip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_first)
|
||||||
|
{
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const char *symbol_name;
|
||||||
|
uint32_t offset;
|
||||||
|
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(first_addr, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, symtab->entries[0].name), 0);
|
||||||
|
zassert_equal(offset, 0);
|
||||||
|
|
||||||
|
if ((symtab->entries[0].offset + 1) != symtab->entries[1].offset) {
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(first_addr + 1, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, symtab->entries[0].name), 0);
|
||||||
|
zassert_equal(offset, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_last)
|
||||||
|
{
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const int last_idx = symtab->length - 1;
|
||||||
|
const uintptr_t last_addr = first_addr + symtab->entries[last_idx].offset;
|
||||||
|
const char *symbol_name;
|
||||||
|
uint32_t offset;
|
||||||
|
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(last_addr, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, symtab->entries[last_idx].name), 0);
|
||||||
|
zassert_equal(offset, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_after_last)
|
||||||
|
{
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const uintptr_t last_offset = symtab->entries[symtab->length - 1].offset;
|
||||||
|
const uintptr_t last_addr = first_addr + last_offset;
|
||||||
|
const char *symbol_name;
|
||||||
|
uint32_t offset;
|
||||||
|
|
||||||
|
/* Test `offset` output with last symbol */
|
||||||
|
if (last_offset + 0x1 != symtab->entries[symtab->length].offset) {
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(last_addr + 0x1, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, symtab->entries[symtab->length - 1].name), 0);
|
||||||
|
zassert_equal(offset, 0x1);
|
||||||
|
} else {
|
||||||
|
ztest_test_skip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ZTEST(test_symtab, test_after_dummy)
|
||||||
|
{
|
||||||
|
const uintptr_t first_addr = symtab->first_addr;
|
||||||
|
const uintptr_t last_dummy_offset = symtab->entries[symtab->length].offset;
|
||||||
|
const uintptr_t last_dummy_addr = first_addr + last_dummy_offset;
|
||||||
|
const char *symbol_name;
|
||||||
|
uint32_t offset;
|
||||||
|
|
||||||
|
/* Test `offset` output with dummy symbol (after last dymbol) */
|
||||||
|
offset = -1;
|
||||||
|
symbol_name = symtab_find_symbol_name(last_dummy_addr + 0x42, &offset);
|
||||||
|
zassert_equal(strcmp(symbol_name, "?"), 0);
|
||||||
|
zassert_equal(offset, 0);
|
||||||
|
}
|
14
tests/subsys/debug/symtab/testcase.yaml
Normal file
14
tests/subsys/debug/symtab/testcase.yaml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
common:
|
||||||
|
platform_allow:
|
||||||
|
- qemu_riscv32
|
||||||
|
- qemu_riscv64
|
||||||
|
- qemu_cortex_a53
|
||||||
|
- qemu_cortex_m3
|
||||||
|
- qemu_xtensa
|
||||||
|
tags:
|
||||||
|
- debug
|
||||||
|
- symtab
|
||||||
|
|
||||||
|
tests:
|
||||||
|
debug.symtab: {}
|
Loading…
Add table
Add a link
Reference in a new issue