2 ** Client for the GDB JIT API.
3 ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
18 #include "lj_strfmt.h"
20 #include "lj_dispatch.h"
22 /* This is not compiled in by default.
23 ** Enable with -DLUAJIT_USE_GDBJIT in the Makefile and recompile everything.
25 #ifdef LUAJIT_USE_GDBJIT
27 /* The GDB JIT API allows JIT compilers to pass debug information about
28 ** JIT-compiled code back to GDB. You need at least GDB 7.0 or higher
29 ** to see it in action.
31 ** This is a passive API, so it works even when not running under GDB
32 ** or when attaching to an already running process. Alas, this implies
33 ** enabling it always has a non-negligible overhead -- do not use in
36 ** The LuaJIT GDB JIT client is rather minimal at the moment. It gives
37 ** each trace a symbol name and adds a source location and frame unwind
38 ** information. Obviously LuaJIT itself and any embedding C application
39 ** should be compiled with debug symbols, too (see the Makefile).
41 ** Traces are named TRACE_1, TRACE_2, ... these correspond to the trace
42 ** numbers from -jv or -jdump. Use "break TRACE_1" or "tbreak TRACE_1" etc.
43 ** to set breakpoints on specific traces (even ahead of their creation).
45 ** The source location for each trace allows listing the corresponding
46 ** source lines with the GDB command "list" (but only if the Lua source
47 ** has been loaded from a file). Currently this is always set to the
48 ** location where the trace has been started.
50 ** Frame unwind information can be inspected with the GDB command
51 ** "info frame". This also allows proper backtraces across JIT-compiled
52 ** code with the GDB command "bt".
54 ** You probably want to add the following settings to a .gdbinit file
55 ** (or add them to ~/.gdbinit):
56 ** set disassembly-flavor intel
57 ** set breakpoint pending on
59 ** Here's a sample GDB session:
60 ** ------------------------------------------------------------------------
64 for inner=1,100 do end
70 [TRACE 2 (1/3) x.lua:1 -> 1]
72 $ gdb --quiet --args luajit x.lua
74 Function "TRACE_1" not defined.
75 Temporary breakpoint 1 (TRACE_1) pending.
77 Starting program: luajit x.lua
79 Temporary breakpoint 1, TRACE_1 () at x.lua:2
80 2 for inner=1,100 do end
83 2 for inner=1,100 do end
86 #0 TRACE_1 () at x.lua:2
87 #1 0x08053690 in lua_pcall [...]
89 #7 0x0806ff90 in main [...]
91 Dump of assembler code for function TRACE_1:
92 0xf7fd9fba <TRACE_1+0>: mov DWORD PTR ds:0xf7e0e2a0,0x1
93 0xf7fd9fc4 <TRACE_1+10>: movsd xmm7,QWORD PTR [edx+0x20]
95 0xf7fd9ff8 <TRACE_1+62>: jmp 0xf7fd2014
96 End of assembler dump.
98 Function "TRACE_2" not defined.
99 Temporary breakpoint 2 (TRACE_2) pending.
103 Temporary breakpoint 2, TRACE_2 () at x.lua:1
106 Stack level 0, frame at 0xffffd7c0:
107 eip = 0xf7fd9f60 in TRACE_2 (x.lua:1); saved eip 0x8053690
108 called by frame at 0xffffd7e0
109 source language unknown.
110 Arglist at 0xffffd78c, args:
111 Locals at 0xffffd78c, Previous frame's sp is 0xffffd7c0
113 ebx at 0xffffd7ac, ebp at 0xffffd7b8, esi at 0xffffd7b0, edi at 0xffffd7b4,
117 ** ------------------------------------------------------------------------
120 /* -- GDB JIT API --------------------------------------------------------- */
122 /* GDB JIT actions. */
130 typedef struct GDBJITentry
{
131 struct GDBJITentry
*next_entry
;
132 struct GDBJITentry
*prev_entry
;
133 const char *symfile_addr
;
134 uint64_t symfile_size
;
137 /* GDB JIT descriptor. */
138 typedef struct GDBJITdesc
{
140 uint32_t action_flag
;
141 GDBJITentry
*relevant_entry
;
142 GDBJITentry
*first_entry
;
145 GDBJITdesc __jit_debug_descriptor
= {
146 1, GDBJIT_NOACTION
, NULL
, NULL
149 /* GDB sets a breakpoint at this function. */
150 void LJ_NOINLINE
__jit_debug_register_code()
152 __asm__
__volatile__("");
155 /* -- In-memory ELF object definitions ------------------------------------ */
157 /* ELF definitions. */
158 typedef struct ELFheader
{
181 typedef struct ELFsectheader
{
194 #define ELFSECT_IDX_ABS 0xfff1
197 ELFSECT_TYPE_PROGBITS
= 1,
198 ELFSECT_TYPE_SYMTAB
= 2,
199 ELFSECT_TYPE_STRTAB
= 3,
200 ELFSECT_TYPE_NOBITS
= 8
203 #define ELFSECT_FLAGS_WRITE 1
204 #define ELFSECT_FLAGS_ALLOC 2
205 #define ELFSECT_FLAGS_EXEC 4
207 typedef struct ELFsymbol
{
226 ELFSYM_TYPE_FUNC
= 2,
227 ELFSYM_TYPE_FILE
= 4,
228 ELFSYM_BIND_LOCAL
= 0 << 4,
229 ELFSYM_BIND_GLOBAL
= 1 << 4,
232 /* DWARF definitions. */
233 #define DW_CIE_VERSION 1
237 DW_CFA_offset_extended
= 0x5,
238 DW_CFA_def_cfa
= 0xc,
239 DW_CFA_def_cfa_offset
= 0xe,
240 DW_CFA_offset_extended_sf
= 0x11,
241 DW_CFA_advance_loc
= 0x40,
247 DW_EH_PE_textrel
= 0x20
251 DW_TAG_compile_unit
= 0x11
261 DW_AT_stmt_list
= 0x10,
268 DW_FORM_data4
= 0x06,
269 DW_FORM_string
= 0x08
273 DW_LNS_extended_op
= 0,
275 DW_LNS_advance_pc
= 2,
276 DW_LNS_advance_line
= 3
280 DW_LNE_end_sequence
= 1,
281 DW_LNE_set_address
= 2
286 DW_REG_AX
, DW_REG_CX
, DW_REG_DX
, DW_REG_BX
,
287 DW_REG_SP
, DW_REG_BP
, DW_REG_SI
, DW_REG_DI
,
290 /* Yes, the order is strange, but correct. */
291 DW_REG_AX
, DW_REG_DX
, DW_REG_CX
, DW_REG_BX
,
292 DW_REG_SI
, DW_REG_DI
, DW_REG_BP
, DW_REG_SP
,
293 DW_REG_8
, DW_REG_9
, DW_REG_10
, DW_REG_11
,
294 DW_REG_12
, DW_REG_13
, DW_REG_14
, DW_REG_15
,
299 #elif LJ_TARGET_ARM64
310 #error "Unsupported target architecture"
314 /* Minimal list of sections for the in-memory ELF object. */
318 GDBJIT_SECT_eh_frame
,
319 GDBJIT_SECT_shstrtab
,
322 GDBJIT_SECT_debug_info
,
323 GDBJIT_SECT_debug_abbrev
,
324 GDBJIT_SECT_debug_line
,
335 /* In-memory ELF object. */
336 typedef struct GDBJITobj
{
337 ELFheader hdr
; /* ELF header. */
338 ELFsectheader sect
[GDBJIT_SECT__MAX
]; /* ELF sections. */
339 ELFsymbol sym
[GDBJIT_SYM__MAX
]; /* ELF symbol table. */
340 uint8_t space
[4096]; /* Space for various section data. */
343 /* Combined structure for GDB JIT entry and ELF object. */
344 typedef struct GDBJITentryobj
{
350 /* Template for in-memory ELF header. */
351 static const ELFheader elfhdr_template
= {
352 .emagic
= { 0x7f, 'E', 'L', 'F' },
353 .eclass
= LJ_64
? 2 : 1,
354 .eendian
= LJ_ENDIAN_SELECT(1, 2),
357 .eosabi
= 0, /* Nope, it's not 3. */
358 #elif defined(__FreeBSD__)
360 #elif defined(__NetBSD__)
362 #elif defined(__OpenBSD__)
364 #elif defined(__DragonFly__)
366 #elif LJ_TARGET_SOLARIS
372 .epad
= { 0, 0, 0, 0, 0, 0, 0 },
380 #elif LJ_TARGET_ARM64
387 #error "Unsupported target architecture"
392 .shofs
= offsetof(GDBJITobj
, sect
),
394 .ehsize
= sizeof(ELFheader
),
397 .shentsize
= sizeof(ELFsectheader
),
398 .shnum
= GDBJIT_SECT__MAX
,
399 .shstridx
= GDBJIT_SECT_shstrtab
402 /* -- In-memory ELF object generation ------------------------------------- */
404 /* Context for generating the ELF object for the GDB JIT API. */
405 typedef struct GDBJITctx
{
406 uint8_t *p
; /* Pointer to next address in obj.space. */
407 uint8_t *startp
; /* Pointer to start address in obj.space. */
408 GCtrace
*T
; /* Generate symbols for this trace. */
409 uintptr_t mcaddr
; /* Machine code address. */
410 MSize szmcode
; /* Size of machine code. */
411 MSize spadjp
; /* Stack adjustment for parent trace or interpreter. */
412 MSize spadj
; /* Stack adjustment for trace itself. */
413 BCLine lineno
; /* Starting line number. */
414 const char *filename
; /* Starting file name. */
415 size_t objsize
; /* Final size of ELF object. */
416 GDBJITobj obj
; /* In-memory ELF object. */
419 /* Add a zero-terminated string. */
420 static uint32_t gdbjit_strz(GDBJITctx
*ctx
, const char *str
)
423 uint32_t ofs
= (uint32_t)(p
- ctx
->startp
);
425 *p
++ = (uint8_t)*str
;
431 /* Append a decimal number. */
432 static void gdbjit_catnum(GDBJITctx
*ctx
, uint32_t n
)
434 if (n
>= 10) { uint32_t m
= n
/ 10; n
= n
% 10; gdbjit_catnum(ctx
, m
); }
438 /* Add a SLEB128 value. */
439 static void gdbjit_sleb128(GDBJITctx
*ctx
, int32_t v
)
442 for (; (uint32_t)(v
+0x40) >= 0x80; v
>>= 7)
443 *p
++ = (uint8_t)((v
& 0x7f) | 0x80);
444 *p
++ = (uint8_t)(v
& 0x7f);
448 /* Shortcuts to generate DWARF structures. */
449 #define DB(x) (*p++ = (x))
450 #define DI8(x) (*(int8_t *)p = (x), p++)
451 #define DU16(x) (*(uint16_t *)p = (x), p += 2)
452 #define DU32(x) (*(uint32_t *)p = (x), p += 4)
453 #define DADDR(x) (*(uintptr_t *)p = (x), p += sizeof(uintptr_t))
454 #define DUV(x) (p = (uint8_t *)lj_strfmt_wuleb128((char *)p, (x)))
455 #define DSV(x) (ctx->p = p, gdbjit_sleb128(ctx, (x)), p = ctx->p)
456 #define DSTR(str) (ctx->p = p, gdbjit_strz(ctx, (str)), p = ctx->p)
457 #define DALIGNNOP(s) while ((uintptr_t)p & ((s)-1)) *p++ = DW_CFA_nop
458 #define DSECT(name, stmt) \
459 { uint32_t *szp_##name = (uint32_t *)p; p += 4; stmt \
460 *szp_##name = (uint32_t)((p-(uint8_t *)szp_##name)-4); } \
462 /* Initialize ELF section headers. */
463 static void LJ_FASTCALL
gdbjit_secthdr(GDBJITctx
*ctx
)
467 *ctx
->p
++ = '\0'; /* Empty string at start of string table. */
469 #define SECTDEF(id, tp, al) \
470 sect = &ctx->obj.sect[GDBJIT_SECT_##id]; \
471 sect->name = gdbjit_strz(ctx, "." #id); \
472 sect->type = ELFSECT_TYPE_##tp; \
475 SECTDEF(text
, NOBITS
, 16);
476 sect
->flags
= ELFSECT_FLAGS_ALLOC
|ELFSECT_FLAGS_EXEC
;
477 sect
->addr
= ctx
->mcaddr
;
479 sect
->size
= ctx
->szmcode
;
481 SECTDEF(eh_frame
, PROGBITS
, sizeof(uintptr_t));
482 sect
->flags
= ELFSECT_FLAGS_ALLOC
;
484 SECTDEF(shstrtab
, STRTAB
, 1);
485 SECTDEF(strtab
, STRTAB
, 1);
487 SECTDEF(symtab
, SYMTAB
, sizeof(uintptr_t));
488 sect
->ofs
= offsetof(GDBJITobj
, sym
);
489 sect
->size
= sizeof(ctx
->obj
.sym
);
490 sect
->link
= GDBJIT_SECT_strtab
;
491 sect
->entsize
= sizeof(ELFsymbol
);
492 sect
->info
= GDBJIT_SYM_FUNC
;
494 SECTDEF(debug_info
, PROGBITS
, 1);
495 SECTDEF(debug_abbrev
, PROGBITS
, 1);
496 SECTDEF(debug_line
, PROGBITS
, 1);
501 /* Initialize symbol table. */
502 static void LJ_FASTCALL
gdbjit_symtab(GDBJITctx
*ctx
)
506 *ctx
->p
++ = '\0'; /* Empty string at start of string table. */
508 sym
= &ctx
->obj
.sym
[GDBJIT_SYM_FILE
];
509 sym
->name
= gdbjit_strz(ctx
, "JIT mcode");
510 sym
->sectidx
= ELFSECT_IDX_ABS
;
511 sym
->info
= ELFSYM_TYPE_FILE
|ELFSYM_BIND_LOCAL
;
513 sym
= &ctx
->obj
.sym
[GDBJIT_SYM_FUNC
];
514 sym
->name
= gdbjit_strz(ctx
, "TRACE_"); ctx
->p
--;
515 gdbjit_catnum(ctx
, ctx
->T
->traceno
); *ctx
->p
++ = '\0';
516 sym
->sectidx
= GDBJIT_SECT_text
;
518 sym
->size
= ctx
->szmcode
;
519 sym
->info
= ELFSYM_TYPE_FUNC
|ELFSYM_BIND_GLOBAL
;
522 /* Initialize .eh_frame section. */
523 static void LJ_FASTCALL
gdbjit_ehframe(GDBJITctx
*ctx
)
528 /* Emit DWARF EH CIE. */
530 DU32(0); /* Offset to CIE itself. */
532 DSTR("zR"); /* Augmentation. */
533 DUV(1); /* Code alignment factor. */
534 DSV(-(int32_t)sizeof(uintptr_t)); /* Data alignment factor. */
535 DB(DW_REG_RA
); /* Return address register. */
536 DB(1); DB(DW_EH_PE_textrel
|DW_EH_PE_udata4
); /* Augmentation data. */
537 DB(DW_CFA_def_cfa
); DUV(DW_REG_SP
); DUV(sizeof(uintptr_t));
539 DB(DW_CFA_offset_extended_sf
); DB(DW_REG_RA
); DSV(-1);
541 DB(DW_CFA_offset
|DW_REG_RA
); DUV(1);
543 DALIGNNOP(sizeof(uintptr_t));
546 /* Emit DWARF EH FDE. */
548 DU32((uint32_t)(p
-framep
)); /* Offset to CIE. */
549 DU32(0); /* Machine code offset relative to .text. */
550 DU32(ctx
->szmcode
); /* Machine code length. */
551 DB(0); /* Augmentation data. */
552 /* Registers saved in CFRAME. */
554 DB(DW_CFA_offset
|DW_REG_BP
); DUV(2);
555 DB(DW_CFA_offset
|DW_REG_DI
); DUV(3);
556 DB(DW_CFA_offset
|DW_REG_SI
); DUV(4);
557 DB(DW_CFA_offset
|DW_REG_BX
); DUV(5);
559 DB(DW_CFA_offset
|DW_REG_BP
); DUV(2);
560 DB(DW_CFA_offset
|DW_REG_BX
); DUV(3);
561 DB(DW_CFA_offset
|DW_REG_15
); DUV(4);
562 DB(DW_CFA_offset
|DW_REG_14
); DUV(5);
563 /* Extra registers saved for JIT-compiled code. */
564 DB(DW_CFA_offset
|DW_REG_13
); DUV(LJ_GC64
? 10 : 9);
565 DB(DW_CFA_offset
|DW_REG_12
); DUV(LJ_GC64
? 11 : 10);
569 for (i
= 11; i
>= 4; i
--) { DB(DW_CFA_offset
|i
); DUV(2+(11-i
)); }
571 #elif LJ_TARGET_ARM64
574 DB(DW_CFA_offset
|31); DUV(2);
575 for (i
= 28; i
>= 19; i
--) { DB(DW_CFA_offset
|i
); DUV(3+(28-i
)); }
576 for (i
= 15; i
>= 8; i
--) { DB(DW_CFA_offset
|32|i
); DUV(28-i
); }
581 DB(DW_CFA_offset_extended
); DB(DW_REG_CR
); DUV(55);
582 for (i
= 14; i
<= 31; i
++) {
583 DB(DW_CFA_offset
|i
); DUV(37+(31-i
));
584 DB(DW_CFA_offset
|32|i
); DUV(2+2*(31-i
));
590 DB(DW_CFA_offset
|30); DUV(2);
591 for (i
= 23; i
>= 16; i
--) { DB(DW_CFA_offset
|i
); DUV(26-i
); }
592 for (i
= 30; i
>= 20; i
-= 2) { DB(DW_CFA_offset
|32|i
); DUV(42-i
); }
595 #error "Unsupported target architecture"
597 if (ctx
->spadjp
!= ctx
->spadj
) { /* Parent/interpreter stack frame size. */
598 DB(DW_CFA_def_cfa_offset
); DUV(ctx
->spadjp
);
599 DB(DW_CFA_advance_loc
|1); /* Only an approximation. */
601 DB(DW_CFA_def_cfa_offset
); DUV(ctx
->spadj
); /* Trace stack frame size. */
602 DALIGNNOP(sizeof(uintptr_t));
608 /* Initialize .debug_info section. */
609 static void LJ_FASTCALL
gdbjit_debuginfo(GDBJITctx
*ctx
)
614 DU16(2); /* DWARF version. */
615 DU32(0); /* Abbrev offset. */
616 DB(sizeof(uintptr_t)); /* Pointer size. */
618 DUV(1); /* Abbrev #1: DW_TAG_compile_unit. */
619 DSTR(ctx
->filename
); /* DW_AT_name. */
620 DADDR(ctx
->mcaddr
); /* DW_AT_low_pc. */
621 DADDR(ctx
->mcaddr
+ ctx
->szmcode
); /* DW_AT_high_pc. */
622 DU32(0); /* DW_AT_stmt_list. */
628 /* Initialize .debug_abbrev section. */
629 static void LJ_FASTCALL
gdbjit_debugabbrev(GDBJITctx
*ctx
)
633 /* Abbrev #1: DW_TAG_compile_unit. */
634 DUV(1); DUV(DW_TAG_compile_unit
);
636 DUV(DW_AT_name
); DUV(DW_FORM_string
);
637 DUV(DW_AT_low_pc
); DUV(DW_FORM_addr
);
638 DUV(DW_AT_high_pc
); DUV(DW_FORM_addr
);
639 DUV(DW_AT_stmt_list
); DUV(DW_FORM_data4
);
645 #define DLNE(op, s) (DB(DW_LNS_extended_op), DUV(1+(s)), DB((op)))
647 /* Initialize .debug_line section. */
648 static void LJ_FASTCALL
gdbjit_debugline(GDBJITctx
*ctx
)
653 DU16(2); /* DWARF version. */
655 DB(1); /* Minimum instruction length. */
656 DB(1); /* is_stmt. */
657 DI8(0); /* Line base for special opcodes. */
658 DB(2); /* Line range for special opcodes. */
659 DB(3+1); /* Opcode base at DW_LNS_advance_line+1. */
660 DB(0); DB(1); DB(1); /* Standard opcode lengths. */
661 /* Directory table. */
663 /* File name table. */
664 DSTR(ctx
->filename
); DUV(0); DUV(0); DUV(0);
668 DLNE(DW_LNE_set_address
, sizeof(uintptr_t)); DADDR(ctx
->mcaddr
);
670 DB(DW_LNS_advance_line
); DSV(ctx
->lineno
-1);
673 DB(DW_LNS_advance_pc
); DUV(ctx
->szmcode
);
674 DLNE(DW_LNE_end_sequence
, 0);
682 /* Undef shortcuts. */
694 /* Type of a section initializer callback. */
695 typedef void (LJ_FASTCALL
*GDBJITinitf
)(GDBJITctx
*ctx
);
697 /* Call section initializer and set the section offset and size. */
698 static void gdbjit_initsect(GDBJITctx
*ctx
, int sect
, GDBJITinitf initf
)
700 ctx
->startp
= ctx
->p
;
701 ctx
->obj
.sect
[sect
].ofs
= (uintptr_t)((char *)ctx
->p
- (char *)&ctx
->obj
);
703 ctx
->obj
.sect
[sect
].size
= (uintptr_t)(ctx
->p
- ctx
->startp
);
706 #define SECTALIGN(p, a) \
707 ((p) = (uint8_t *)(((uintptr_t)(p) + ((a)-1)) & ~(uintptr_t)((a)-1)))
709 /* Build in-memory ELF object. */
710 static void gdbjit_buildobj(GDBJITctx
*ctx
)
712 GDBJITobj
*obj
= &ctx
->obj
;
713 /* Fill in ELF header and clear structures. */
714 memcpy(&obj
->hdr
, &elfhdr_template
, sizeof(ELFheader
));
715 memset(&obj
->sect
, 0, sizeof(ELFsectheader
)*GDBJIT_SECT__MAX
);
716 memset(&obj
->sym
, 0, sizeof(ELFsymbol
)*GDBJIT_SYM__MAX
);
717 /* Initialize sections. */
719 gdbjit_initsect(ctx
, GDBJIT_SECT_shstrtab
, gdbjit_secthdr
);
720 gdbjit_initsect(ctx
, GDBJIT_SECT_strtab
, gdbjit_symtab
);
721 gdbjit_initsect(ctx
, GDBJIT_SECT_debug_info
, gdbjit_debuginfo
);
722 gdbjit_initsect(ctx
, GDBJIT_SECT_debug_abbrev
, gdbjit_debugabbrev
);
723 gdbjit_initsect(ctx
, GDBJIT_SECT_debug_line
, gdbjit_debugline
);
724 SECTALIGN(ctx
->p
, sizeof(uintptr_t));
725 gdbjit_initsect(ctx
, GDBJIT_SECT_eh_frame
, gdbjit_ehframe
);
726 ctx
->objsize
= (size_t)((char *)ctx
->p
- (char *)obj
);
727 lj_assertX(ctx
->objsize
< sizeof(GDBJITobj
), "GDBJITobj overflow");
732 /* -- Interface to GDB JIT API -------------------------------------------- */
734 static int gdbjit_lock
;
736 static void gdbjit_lock_acquire()
738 while (__sync_lock_test_and_set(&gdbjit_lock
, 1)) {
739 /* Just spin; futexes or pthreads aren't worth the portability cost. */
743 static void gdbjit_lock_release()
745 __sync_lock_release(&gdbjit_lock
);
748 /* Add new entry to GDB JIT symbol chain. */
749 static void gdbjit_newentry(lua_State
*L
, GDBJITctx
*ctx
)
751 /* Allocate memory for GDB JIT entry and ELF object. */
752 MSize sz
= (MSize
)(sizeof(GDBJITentryobj
) - sizeof(GDBJITobj
) + ctx
->objsize
);
753 GDBJITentryobj
*eo
= lj_mem_newt(L
, sz
, GDBJITentryobj
);
754 memcpy(&eo
->obj
, &ctx
->obj
, ctx
->objsize
); /* Copy ELF object. */
756 ctx
->T
->gdbjit_entry
= (void *)eo
;
757 /* Link new entry to chain and register it. */
758 eo
->entry
.prev_entry
= NULL
;
759 gdbjit_lock_acquire();
760 eo
->entry
.next_entry
= __jit_debug_descriptor
.first_entry
;
761 if (eo
->entry
.next_entry
)
762 eo
->entry
.next_entry
->prev_entry
= &eo
->entry
;
763 eo
->entry
.symfile_addr
= (const char *)&eo
->obj
;
764 eo
->entry
.symfile_size
= ctx
->objsize
;
765 __jit_debug_descriptor
.first_entry
= &eo
->entry
;
766 __jit_debug_descriptor
.relevant_entry
= &eo
->entry
;
767 __jit_debug_descriptor
.action_flag
= GDBJIT_REGISTER
;
768 __jit_debug_register_code();
769 gdbjit_lock_release();
772 /* Add debug info for newly compiled trace and notify GDB. */
773 void lj_gdbjit_addtrace(jit_State
*J
, GCtrace
*T
)
776 GCproto
*pt
= &gcref(T
->startpt
)->pt
;
777 TraceNo parent
= T
->ir
[REF_BASE
].op1
;
778 const BCIns
*startpc
= mref(T
->startpc
, const BCIns
);
780 ctx
.mcaddr
= (uintptr_t)T
->mcode
;
781 ctx
.szmcode
= T
->szmcode
;
782 ctx
.spadjp
= CFRAME_SIZE_JIT
+
783 (MSize
)(parent
? traceref(J
, parent
)->spadjust
: 0);
784 ctx
.spadj
= CFRAME_SIZE_JIT
+ T
->spadjust
;
785 lj_assertJ(startpc
>= proto_bc(pt
) && startpc
< proto_bc(pt
) + pt
->sizebc
,
786 "start PC out of range");
787 ctx
.lineno
= lj_debug_line(pt
, proto_bcpos(pt
, startpc
));
788 ctx
.filename
= proto_chunknamestr(pt
);
789 if (*ctx
.filename
== '@' || *ctx
.filename
== '=')
792 ctx
.filename
= "(string)";
793 gdbjit_buildobj(&ctx
);
794 gdbjit_newentry(J
->L
, &ctx
);
797 /* Delete debug info for trace and notify GDB. */
798 void lj_gdbjit_deltrace(jit_State
*J
, GCtrace
*T
)
800 GDBJITentryobj
*eo
= (GDBJITentryobj
*)T
->gdbjit_entry
;
802 gdbjit_lock_acquire();
803 if (eo
->entry
.prev_entry
)
804 eo
->entry
.prev_entry
->next_entry
= eo
->entry
.next_entry
;
806 __jit_debug_descriptor
.first_entry
= eo
->entry
.next_entry
;
807 if (eo
->entry
.next_entry
)
808 eo
->entry
.next_entry
->prev_entry
= eo
->entry
.prev_entry
;
809 __jit_debug_descriptor
.relevant_entry
= &eo
->entry
;
810 __jit_debug_descriptor
.action_flag
= GDBJIT_UNREGISTER
;
811 __jit_debug_register_code();
812 gdbjit_lock_release();
813 lj_mem_free(J2G(J
), eo
, eo
->sz
);