tests: debug: symtab: add test

Add test for symtab.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
This commit is contained in:
Yong Cong Sin 2024-05-27 17:58:06 +08:00 committed by David Leach
commit 0f6272e5bc
4 changed files with 183 additions and 0 deletions

View 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)

View file

@ -0,0 +1,3 @@
CONFIG_ZTEST=y
CONFIG_SYMTAB=y

View 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);
}

View 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: {}