Messages in this thread Patch in this message | | | From | Tri Vo <> | Subject | [PATCH v2 3/4] gcov: clang: link/unlink profiling data set. | Date | Tue, 15 Jan 2019 10:36:42 -0800 |
| |
From: Nick Desaulniers <ndesaulniers@google.com>
gcov.h defines an interface to access gcov_info data.
Add Clang implementation of gcov_info_link/gcov_info_unlink interfaces.
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Tri Vo <trong@android.com> Tested-by: Trilok Soni <tsoni@quicinc.com> Tested-by: Prasad Sodagudi <psodagud@quicinc.com> Tested-by: Tri Vo <trong@android.com> --- kernel/gcov/clang.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-)
diff --git a/kernel/gcov/clang.c b/kernel/gcov/clang.c index b00795d28137..ea42deb852f7 100644 --- a/kernel/gcov/clang.c +++ b/kernel/gcov/clang.c @@ -77,6 +77,7 @@ struct gcov_fn_info { u32 num_counters; u64 *counters; + const char *function_name; }; static struct gcov_info *current_info; @@ -124,7 +125,7 @@ void llvm_gcda_emit_function(u32 ident, const char *function_name, if (!info) { pr_warn_ratelimited("failed to allocate gcov function info for %s\n", - function_name); + function_name ?: "UNKNOWN"); return; } @@ -133,6 +134,8 @@ void llvm_gcda_emit_function(u32 ident, const char *function_name, info->checksum = func_checksum; info->use_extra_checksum = use_extra_checksum; info->cfg_checksum = cfg_checksum; + if (function_name) + info->function_name = kstrdup(function_name, GFP_KERNEL); list_add_tail(&info->head, ¤t_info->functions); } @@ -193,6 +196,26 @@ struct gcov_info *gcov_info_next(struct gcov_info *info) return list_next_entry(info, head); } +/** + * gcov_info_link - link/add profiling data set to the list + * @info: profiling data set + */ +void gcov_info_link(struct gcov_info *info) +{ + list_add_tail(&info->head, &clang_gcov_list); +} + +/** + * gcov_info_unlink - unlink/remove profiling data set from the list + * @prev: previous profiling data set + * @info: profiling data set + */ +void gcov_info_unlink(struct gcov_info *prev, struct gcov_info *info) +{ + if (prev) + list_del(&prev->head); +} + /* Symbolic links to be created for each profiling data file. */ const struct gcov_link gcov_link[] = { { OBJ_TREE, "gcno" }, /* Link to .gcno file in $(objtree). */ @@ -256,8 +279,8 @@ static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn) return NULL; INIT_LIST_HEAD(&fn_dup->head); - fn_dup->name = kstrdup(fn->name, GFP_KERNEL); - if (!fn_dup->name) + fn_dup->function_name = kstrdup(fn->function_name, GFP_KERNEL); + if (!fn_dup->function_name) goto err_name; fn_dup->counters = kmemdup(fn->counters, @@ -269,7 +292,7 @@ static struct gcov_fn_info *gcov_fn_info_dup(struct gcov_fn_info *fn) return fn_dup; err_counters: - kfree(fn_dup->name); + kfree(fn_dup->function_name); err_name: kfree(fn_dup); return NULL; @@ -317,7 +340,7 @@ void gcov_info_free(struct gcov_info *info) struct gcov_fn_info *fn, *tmp; list_for_each_entry_safe(fn, tmp, &info->functions, head) { - kfree(fn->name); + kfree(fn->function_name); kfree(fn->counters); list_del(&fn->head); kfree(fn); -- 2.20.1.97.g81188d93c3-goog
| |