[llvm-dev] [RFC] Generate Debug Information for Labels in Function

陳韋任 via llvm-dev llvm-dev at lists.llvm.org
Wed Mar 28 06:12:40 PDT 2018


LGTM. I think you can sent patch and let the ball rolling! I would
like to review it. ;)

2018-03-28 10:41 GMT+08:00 Hsiangkai Wang via llvm-dev
<llvm-dev at lists.llvm.org>:
> Hello all,
>
> I would like to enhance LLVM debug info that supports setting
> breakpoint on labels in function.
>
> Generally, if users use GDB as their debugger, they could set
> breakpoints on labels in function. Following is an example.
>
> // C program
> static int
> myfunction (int arg)
> {
>   int i, j, r;
>
>   j = 0; /* myfunction location */
>   r = arg;
>
>  top:
>   ++j;  /* top location */
>
>   if (j == 10)
>     goto done;
>
>   for (i = 0; i < 10; ++i)
>     {
>       r += i;
>       if (j % 2)
>         goto top;
>     }
>
>  done:
>   return r;
> }
>
> int
> main (void)
> {
>   int i, j;
>
>   for (i = 0, j = 0; i < 1000; ++i)
>     j += myfunction (0);
>
>   return 0;
> }
>
> Following is the GDB commands to illustrate how to set breakpoints on labels.
>
> (gdb) b main
> Breakpoint 1 at 0x10298: file explicit.c, line 50.
> (gdb) r
> Starting program: /home/users/kai/sandbox/gdbtest/explicit-gcc
>
> Breakpoint 1, main () at explicit.c:50
> 50  for (i = 0, j = 0; i < 1000; ++i)
> (gdb) b myfunction:top
> Breakpoint 2 at 0x10214: file explicit.c, line 26.
> (gdb) c
> Continuing.
>
> Breakpoint 2, myfunction (arg=0) at explicit.c:27
> 27  ++j;  /\* top location */
> (gdb)
>
> However, LLVM does not generate debug information for labels. So, the
> feature could not work for binaries generated by clang. I also found
> that the problem is reported in PR35526 and PR36420. I propose an
> implementation plan to support debug information for labels.
>
> Following are the steps I propose to implement the feature.
>
> 1. Define debug metadata and intrinsic functions for labels.
>
> First of all, we need to record debug information in LLVM IR. In LLVM
> IR, LLVM uses metadata and intrinsic function to keep debug
> information. So, I need to define new kind of metadata, DILabel, and
> new intrinsic function, llvm.dbg.label, to associate DILabel with
> label statement.
>
> DILabel will contain name of the label, file metadata, line number,
> and scope metadata.
>
> Intrinsic function llvm.dbg.label uses DILabel metadata as its parameter.
>
> 2. Create MI instruction DBG_LABEL.
>
> I create new MI instruction DBG_LABEL to keep debug information after
> LLVM IR converted to MI.
>
> DBG_LABEL uses DILabel metadata as its parameter.
>
> 3. Create data structure, SDDbgLabel, to store debug information of
> labels in SelectionDAG.
>
> In SelectionDAG, we need a data structure to keep debug information of
> label. It will keep DILabel metadata.
>
> 4. Convert SDDbgLabel to DBG_LABEL in SelectionDAG.
>
> After EmitSchedule(), SelectionDAG will be converted to a list of MI
> instructions. In the function, we will generate DBG_LABEL MachineInstr
> from SDDbgLabel.
>
> For FastISel and GlobalISel, we could convert llvm.dbg.label to
> DBG_LABEL directly.
>
> 5. Collect debug information of labels from MI listing to DebugHandlerBase.
>
> Before generating actual debug information in assembly format or
> object format, we need to keep debug format-independent data in
> DebugHandlerBase. Afterwards, we could convert these data to CodeView
> format or DWARF format.
>
> 6. Create DWARF DIE specific data structure in DwarfDebug.
>
> In class DwarfDebug, we keep DWARF specific data structure for DILabel.
>
> 7. Generate DW_TAG_label and fill details of DW_TAG_label.
>
> Finally, generating DW_TAG_label DIE and its attributes into DIE structure.
>
> I am looking forward to any thoughts & feedback!
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



-- 
Wei-Ren Chen (陳韋任)
Homepage: https://people.cs.nctu.edu.tw/~chenwj


More information about the llvm-dev mailing list