Skip to content

Commit 0b09c0c

Browse files
usstqazhai219
authored andcommitted
[FORK][FEATURE] Add jit debug trace log dump in GCC debug mode
ONEDNN 3.2 migration squashed commits: - enable jit debug_trace() only when ONEDNN_JIT_DUMP is properly exported ONEDNN 3.5 squash list: [FIX]Don't use backtrace under Android
1 parent a0dadc5 commit 0b09c0c

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/cpu/x64/jit_generator.hpp

+24
Original file line numberDiff line numberDiff line change
@@ -2791,7 +2791,31 @@ class jit_generator : public Xbyak::MmapAllocator,
27912791
virtual const char *name() const = 0;
27922792
virtual const char *source_file() const = 0;
27932793

2794+
void dump_debug_traces(const uint8_t *code, size_t code_size) const {
2795+
#if !defined(NDEBUG) && defined(__GNUC__)
2796+
if (code && get_jit_dump()) {
2797+
#define MAX_FNAME_LEN 256
2798+
static int counter = 0;
2799+
char fname[MAX_FNAME_LEN + 1];
2800+
snprintf(fname, MAX_FNAME_LEN, "dnnl_traces_cpu_%s.%d.txt", name(),
2801+
counter);
2802+
counter++;
2803+
2804+
std::cout << "[ oneDNN ] dump_debug_traces: " << fname << std::endl;
2805+
FILE *fp = fopen(fname, "wb+");
2806+
if (fp) {
2807+
for (const auto & p : get_debug_traces()) {
2808+
fprintf(fp, "%lx:\t%s\n", p.first, p.second.c_str());
2809+
}
2810+
fclose(fp);
2811+
}
2812+
#undef MAX_FNAME_LEN
2813+
}
2814+
#endif
2815+
}
2816+
27942817
void register_jit_code(const Xbyak::uint8 *code, size_t code_size) const {
2818+
dump_debug_traces(code, code_size);
27952819
jit_utils::register_jit_code(code, code_size, name(), source_file());
27962820
}
27972821

src/cpu/x64/xbyak/xbyak.h

+40
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@
6767
#include <iostream>
6868
#endif
6969

70+
// for debug trace in GCC
71+
#if !defined(NDEBUG) && defined(__GNUC__) && !(defined(__ANDROID__) || defined(ANDROID))
72+
#include <execinfo.h>
73+
#include <map>
74+
#include <sstream>
75+
#endif
76+
7077
// #define XBYAK_DISABLE_AVX512
7178

7279
#if !defined(XBYAK_USE_MMAP_ALLOCATOR) && !defined(XBYAK_DONT_USE_MMAP_ALLOCATOR)
@@ -2097,12 +2104,14 @@ class CodeGenerator : public CodeArray {
20972104
}
20982105
void opRR(const Reg& reg1, const Reg& reg2, uint64_t type, int code)
20992106
{
2107+
debug_trace();
21002108
bool rex2 = rex(reg2, reg1, type);
21012109
writeCode(type, reg1, code, rex2);
21022110
setModRM(3, reg1.getIdx(), reg2.getIdx());
21032111
}
21042112
void opMR(const Address& addr, const Reg& r, uint64_t type, int code, uint64_t type2 = 0, int code2 = NONE)
21052113
{
2114+
debug_trace();
21062115
if (code2 == NONE) code2 = code;
21072116
if (type2 && opROO(Reg(), addr, r, type2, code2)) return;
21082117
if (addr.is64bitDisp()) XBYAK_THROW(ERR_CANT_USE_64BIT_DISP)
@@ -2404,6 +2413,7 @@ class CodeGenerator : public CodeArray {
24042413
if (bit == 16 || bit == BIT) {
24052414
if (bit == 16) db(0x66);
24062415
if (op.isREG()) {
2416+
debug_trace();
24072417
if (op.getReg().getIdx() >= 8) db(0x41);
24082418
db(alt | (op.getIdx() & 7));
24092419
return;
@@ -2494,6 +2504,7 @@ class CodeGenerator : public CodeArray {
24942504
}
24952505
void opVex(const Reg& r, const Operand *p1, const Operand& op2, uint64_t type, int code, int imm8 = NONE)
24962506
{
2507+
debug_trace();
24972508
if (op2.isMEM()) {
24982509
Address addr = op2.getAddress();
24992510
const RegExp& regExp = addr.getRegExp();
@@ -3047,6 +3058,35 @@ class CodeGenerator : public CodeArray {
30473058
opRO(static_cast<const Reg&>(*p1), *p2, 0, 0x86 | (p1->isBit(8) ? 0 : 1), (p1->isREG() && (p1->getBit() == p2->getBit())));
30483059
}
30493060

3061+
#if !defined(NDEBUG) && defined(__GNUC__) && !(defined(__ANDROID__) || defined(ANDROID))
3062+
std::map<size_t, std::string> debug_traces;
3063+
void debug_trace() {
3064+
static bool enable_trace = std::getenv("ONEDNN_JIT_DUMP") && atoi(std::getenv("ONEDNN_JIT_DUMP")) != 0;
3065+
if (!enable_trace)
3066+
return;
3067+
3068+
void *array[8];
3069+
int size = backtrace(array, 8);
3070+
char **strings = backtrace_symbols(array, size);
3071+
std::stringstream ss;
3072+
// skip first 2 frame (backtrace,trace_code)
3073+
for(int i = 2; i < size; ++i) ss << "," << strings[i];
3074+
auto offset = getSize();
3075+
if (debug_traces.count(offset)) {
3076+
debug_traces[offset] += ss.str();
3077+
} else {
3078+
debug_traces[offset] = ss.str();
3079+
}
3080+
free(strings);
3081+
}
3082+
std::map<size_t, std::string> get_debug_traces() const {
3083+
return debug_traces;
3084+
}
3085+
#else
3086+
void debug_trace() {}
3087+
std::map<size_t, std::string> get_debug_traces() const { return {}; }
3088+
#endif
3089+
30503090
#ifndef XBYAK_DISABLE_SEGMENT
30513091
void push(const Segment& seg)
30523092
{

0 commit comments

Comments
 (0)