File Index
Files and directories
Sign in
FILE

trace.h

File preview with syntax highlighting.

linux-6.19.14/tools/objtool/include/objtool/trace.h C
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * Copyright (c) 2025, Oracle and/or its affiliates.
  4 */
  5
  6#ifndef _TRACE_H
  7#define _TRACE_H
  8
  9#include <objtool/check.h>
 10#include <objtool/disas.h>
 11
 12#ifdef DISAS
 13
 14extern bool trace;
 15extern int trace_depth;
 16
 17#define TRACE(fmt, ...)						\
 18({	if (trace)						\
 19		fprintf(stderr, fmt, ##__VA_ARGS__);		\
 20})
 21
 22/*
 23 * Print the instruction address and a message. The instruction
 24 * itself is not printed.
 25 */
 26#define TRACE_ADDR(insn, fmt, ...)				\
 27({								\
 28	if (trace) {						\
 29		disas_print_info(stderr, insn, trace_depth - 1, \
 30				 fmt "\n", ##__VA_ARGS__);	\
 31	}							\
 32})
 33
 34/*
 35 * Print the instruction address, the instruction and a message.
 36 */
 37#define TRACE_INSN(insn, fmt, ...)				\
 38({								\
 39	if (trace) {						\
 40		disas_print_insn(stderr, objtool_disas_ctx,	\
 41				 insn, trace_depth - 1,		\
 42				 fmt, ##__VA_ARGS__);		\
 43		fprintf(stderr, "\n");				\
 44		insn->trace = 1;				\
 45	}							\
 46})
 47
 48#define TRACE_INSN_STATE(insn, sprev, snext)			\
 49({								\
 50	if (trace)						\
 51		trace_insn_state(insn, sprev, snext);		\
 52})
 53
 54#define TRACE_ALT_FMT(pfx, fmt) pfx "<%s.%lx> " fmt
 55#define TRACE_ALT_ARG(insn) disas_alt_type_name(insn), (insn)->offset
 56
 57#define TRACE_ALT(insn, fmt, ...)				\
 58	TRACE_INSN(insn, TRACE_ALT_FMT("", fmt),		\
 59		   TRACE_ALT_ARG(insn), ##__VA_ARGS__)
 60
 61#define TRACE_ALT_INFO(insn, pfx, fmt, ...)			\
 62	TRACE_ADDR(insn, TRACE_ALT_FMT(pfx, fmt),		\
 63		   TRACE_ALT_ARG(insn), ##__VA_ARGS__)
 64
 65#define TRACE_ALT_INFO_NOADDR(insn, pfx, fmt, ...)		\
 66	TRACE_ADDR(NULL, TRACE_ALT_FMT(pfx, fmt),		\
 67		   TRACE_ALT_ARG(insn), ##__VA_ARGS__)
 68
 69#define TRACE_ALT_BEGIN(insn, alt, alt_name)			\
 70({								\
 71	if (trace) {						\
 72		alt_name = disas_alt_name(alt);			\
 73		trace_alt_begin(insn, alt, alt_name);		\
 74	}							\
 75})
 76
 77#define TRACE_ALT_END(insn, alt, alt_name)			\
 78({								\
 79	if (trace) {						\
 80		trace_alt_end(insn, alt, alt_name);		\
 81		free(alt_name);					\
 82	}							\
 83})
 84
 85static inline void trace_enable(void)
 86{
 87	trace = true;
 88	trace_depth = 0;
 89}
 90
 91static inline void trace_disable(void)
 92{
 93	trace = false;
 94}
 95
 96static inline void trace_depth_inc(void)
 97{
 98	if (trace)
 99		trace_depth++;
100}
101
102static inline void trace_depth_dec(void)
103{
104	if (trace)
105		trace_depth--;
106}
107
108void trace_insn_state(struct instruction *insn, struct insn_state *sprev,
109		      struct insn_state *snext);
110void trace_alt_begin(struct instruction *orig_insn, struct alternative *alt,
111		     char *alt_name);
112void trace_alt_end(struct instruction *orig_insn, struct alternative *alt,
113		   char *alt_name);
114
115#else /* DISAS */
116
117#define TRACE(fmt, ...) ({})
118#define TRACE_ADDR(insn, fmt, ...) ({})
119#define TRACE_INSN(insn, fmt, ...) ({})
120#define TRACE_INSN_STATE(insn, sprev, snext) ({})
121#define TRACE_ALT(insn, fmt, ...) ({})
122#define TRACE_ALT_INFO(insn, fmt, ...) ({})
123#define TRACE_ALT_INFO_NOADDR(insn, fmt, ...) ({})
124#define TRACE_ALT_BEGIN(insn, alt, alt_name) ({})
125#define TRACE_ALT_END(insn, alt, alt_name) ({})
126
127
128static inline void trace_enable(void) {}
129static inline void trace_disable(void) {}
130static inline void trace_depth_inc(void) {}
131static inline void trace_depth_dec(void) {}
132static inline void trace_alt_begin(struct instruction *orig_insn,
133				   struct alternative *alt,
134				   char *alt_name) {};
135static inline void trace_alt_end(struct instruction *orig_insn,
136				 struct alternative *alt,
137				 char *alt_name) {};
138
139#endif
140
141#endif /* _TRACE_H */
~/ Read-only file preview.