mirror of
https://github.com/torvalds/linux.git
synced 2026-01-25 07:47:50 +00:00
objtool: Create disassembly context
Create a structure to store information for disassembling functions. For now, it is just a wrapper around an objtool file. Signed-off-by: Alexandre Chartre <alexandre.chartre@oracle.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Acked-by: Josh Poimboeuf <jpoimboe@kernel.org> Link: https://patch.msgid.link/20251121095340.464045-3-alexandre.chartre@oracle.com
This commit is contained in:
committed by
Peter Zijlstra
parent
55d2a473f3
commit
1013f2e37b
@@ -12,6 +12,7 @@
|
||||
#include <objtool/builtin.h>
|
||||
#include <objtool/cfi.h>
|
||||
#include <objtool/arch.h>
|
||||
#include <objtool/disas.h>
|
||||
#include <objtool/check.h>
|
||||
#include <objtool/special.h>
|
||||
#include <objtool/warn.h>
|
||||
@@ -4802,6 +4803,7 @@ static void free_insns(struct objtool_file *file)
|
||||
|
||||
int check(struct objtool_file *file)
|
||||
{
|
||||
struct disas_context *disas_ctx;
|
||||
int ret = 0, warnings = 0;
|
||||
|
||||
arch_initial_func_cfi_state(&initial_func_cfi);
|
||||
@@ -4943,7 +4945,9 @@ out:
|
||||
if (opts.verbose) {
|
||||
if (opts.werror && warnings)
|
||||
WARN("%d warning(s) upgraded to errors", warnings);
|
||||
disas_warned_funcs(file);
|
||||
disas_ctx = disas_context_create(file);
|
||||
disas_warned_funcs(disas_ctx);
|
||||
disas_context_destroy(disas_ctx);
|
||||
}
|
||||
|
||||
if (opts.backup && make_backup())
|
||||
|
||||
@@ -4,10 +4,35 @@
|
||||
*/
|
||||
|
||||
#include <objtool/arch.h>
|
||||
#include <objtool/disas.h>
|
||||
#include <objtool/warn.h>
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
struct disas_context {
|
||||
struct objtool_file *file;
|
||||
};
|
||||
|
||||
struct disas_context *disas_context_create(struct objtool_file *file)
|
||||
{
|
||||
struct disas_context *dctx;
|
||||
|
||||
dctx = malloc(sizeof(*dctx));
|
||||
if (!dctx) {
|
||||
WARN("failed to allocate disassembly context");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dctx->file = file;
|
||||
|
||||
return dctx;
|
||||
}
|
||||
|
||||
void disas_context_destroy(struct disas_context *dctx)
|
||||
{
|
||||
free(dctx);
|
||||
}
|
||||
|
||||
/* 'funcs' is a space-separated list of function names */
|
||||
static void disas_funcs(const char *funcs)
|
||||
{
|
||||
@@ -58,12 +83,15 @@ static void disas_funcs(const char *funcs)
|
||||
}
|
||||
}
|
||||
|
||||
void disas_warned_funcs(struct objtool_file *file)
|
||||
void disas_warned_funcs(struct disas_context *dctx)
|
||||
{
|
||||
struct symbol *sym;
|
||||
char *funcs = NULL, *tmp;
|
||||
|
||||
for_each_sym(file->elf, sym) {
|
||||
if (!dctx)
|
||||
return;
|
||||
|
||||
for_each_sym(dctx->file->elf, sym) {
|
||||
if (sym->warned) {
|
||||
if (!funcs) {
|
||||
funcs = malloc(strlen(sym->name) + 1);
|
||||
|
||||
14
tools/objtool/include/objtool/disas.h
Normal file
14
tools/objtool/include/objtool/disas.h
Normal file
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (c) 2025, Oracle and/or its affiliates.
|
||||
*/
|
||||
|
||||
#ifndef _DISAS_H
|
||||
#define _DISAS_H
|
||||
|
||||
struct disas_context;
|
||||
struct disas_context *disas_context_create(struct objtool_file *file);
|
||||
void disas_context_destroy(struct disas_context *dctx);
|
||||
void disas_warned_funcs(struct disas_context *dctx);
|
||||
|
||||
#endif /* _DISAS_H */
|
||||
@@ -49,6 +49,4 @@ int check(struct objtool_file *file);
|
||||
int orc_dump(const char *objname);
|
||||
int orc_create(struct objtool_file *file);
|
||||
|
||||
void disas_warned_funcs(struct objtool_file *file);
|
||||
|
||||
#endif /* _OBJTOOL_H */
|
||||
|
||||
Reference in New Issue
Block a user