Commit 1013f2e3 authored by Alexandre Chartre's avatar Alexandre Chartre Committed by Peter Zijlstra
Browse files

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: default avatarAlexandre Chartre <alexandre.chartre@oracle.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Link: https://patch.msgid.link/20251121095340.464045-3-alexandre.chartre@oracle.com
parent 55d2a473
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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 @@ int check(struct objtool_file *file)
	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())
+30 −2
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
/* 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 */
+0 −2
Original line number Diff line number Diff line
@@ -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 */