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:
Alexandre Chartre
2025-11-21 10:53:12 +01:00
committed by Peter Zijlstra
parent 55d2a473f3
commit 1013f2e37b
4 changed files with 49 additions and 5 deletions

View File

@@ -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())

View File

@@ -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);

View 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 */

View File

@@ -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 */