embox

Форк
0
/
coverage.c 
68 строк · 1.6 Кб
1
/**
2
 * @file
3
 * @brief
4
 *
5
 * @author  Anton Kozlov
6
 * @date    05.02.2014
7
 */
8

9
#include <stdbool.h>
10
#include <errno.h>
11
#include <debug/symbol.h>
12
#include <lib/libds/bitmap.h>
13
#include <kernel/printk.h>
14
#include <embox/unit.h>
15
#include "cyg_profile.h"
16

17
extern const struct symbol __symbol_table[];
18
extern const size_t __symbol_table_size;
19

20
EMBOX_UNIT_INIT(coverage_init);
21

22
#define COVERAGE_TABLE_SIZE OPTION_GET(NUMBER,coverage_table_size)
23
static BITMAP_DECL(coverage_table_bitmap, COVERAGE_TABLE_SIZE);
24

25
void __coverage_func_enter(void *func, void *caller) {
26
	const struct symbol *sym;
27
	int sym_pos;
28

29
	sym = symbol_lookup(func);
30
	if (!sym)
31
		return;
32

33
	sym_pos = sym - __symbol_table;
34
	if (!(0 <= sym_pos && sym_pos < __symbol_table_size))
35
		return;
36

37
	bitmap_set_bit(coverage_table_bitmap, sym_pos);
38
}
39

40
void __coverage_func_exit(void *func, void *caller) {
41

42
}
43

44
int coverage_getstat(const struct symbol **sym_table, const unsigned long **cov_bitmap) {
45

46
	*sym_table = __symbol_table;
47
	*cov_bitmap = coverage_table_bitmap;
48

49
	return __symbol_table_size;
50
}
51

52
static int coverage_init(void) {
53

54
	if (COVERAGE_TABLE_SIZE < __symbol_table_size) {
55
		printk("\n[%s]: coverage_table_size too small, "
56
				"try to increase it [%zu; required at least %zu]\n",
57
				__func__, (size_t)COVERAGE_TABLE_SIZE, __symbol_table_size);
58
		return -ENOMEM;
59
	}
60

61

62
	ARRAY_SPREAD_DECLARE(cyg_func, __cyg_handler_enter_array);
63
	ARRAY_SPREAD_DECLARE(cyg_func, __cyg_handler_exit_array);
64
	ARRAY_SPREAD_ADD(__cyg_handler_enter_array, &__coverage_func_enter);
65
	ARRAY_SPREAD_ADD(__cyg_handler_exit_array, &__coverage_func_exit);
66

67
	return 0;
68
}
69

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.