[llvm-commits] JIT: Emitting a debug location after an instruction

Jeffrey Yasskin jyasskin at google.com
Mon Aug 23 19:08:32 PDT 2010


On Mon, Aug 23, 2010 at 9:37 PM, nicolas geoffray
<nicolas.geoffray at gmail.com> wrote:
>
>
> On Mon, Aug 23, 2010 at 8:57 PM, Jeffrey Yasskin <jyasskin at google.com>
> wrote:
>>
>> I'm not sure processDebugLoc does what you need it to, even with your
>> changes. It only records an address when the DebugLoc changes, and
>> that's not guaranteed to happen exactly on the call
>> MachineInstruction. (Unless you've done something to ensure it does?)
>
> Each call instruction and only call instructions have metadata associated to
> it. So I am sure emitting the debug location after emitting the call
> instructions work for my case.

A CallInst in the IR expands to several MachineInstructions, all of
which have the same DebugLoc (and which may be rearranged/interleaved
with other DebugLoc'ed MIs by the SelectionDAG (ScheduleDAG?)). For
example, the following IR:

@.str = private constant [12 x i8] c"Hello World\00" ; <[12 x i8]*> [#uses=1]

define i32 @main() nounwind {
entry:
  %call = tail call i32 @puts(i8* getelementptr inbounds ([12 x i8]*
@.str, i32 0, i32 0)) nounwind, !dbg !6 ; <i32> [#uses=0]
  ret i32 0, !dbg !8
}

declare i32 @puts(i8* nocapture) nounwind

!llvm.dbg.sp = !{!0}

!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"main",
metadata !"main", metadata !"main", metadata !1, i32 2, metadata !3,
i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, null} ; [
DW_TAG_subprogram ]
!1 = metadata !{i32 524329, metadata !"test.c", metadata
!"/Users/jyasskin/tmp", metadata !2} ; [ DW_TAG_file_type ]
!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"test.c",
metadata !"/Users/jyasskin/tmp", metadata !"clang 2.8", i1 true, i1
true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1,
i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [
DW_TAG_subroutine_type ]
!4 = metadata !{metadata !5}
!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1,
i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
!6 = metadata !{i32 3, i32 3, metadata !7, null}
!7 = metadata !{i32 524299, metadata !0, i32 2, i32 12} ; [
DW_TAG_lexical_block ]
!8 = metadata !{i32 4, i32 1, metadata !7, null}


Produces the following MachineFunction:

BB#0: derived from LLVM BB %entry
	%ESP<def> = SUB32ri8 %ESP, 12, %EFLAGS<imp-def,dead>; dbg:test.c:3:3
	MOV32mi %ESP, 1, %reg0, 0, %reg0, <ga:@.str>; mem:ST4[Stack] dbg:test.c:3:3
	CALLpcrel32 <ga:@puts>, %EAX<imp-def,dead>, %ESP<imp-use>, ...; dbg:test.c:3:3
	%EAX<def> = MOV32r0 %EFLAGS<imp-def,dead>
	%ESP<def> = ADD32ri8 %ESP, 12, %EFLAGS<imp-def,dead>; dbg:test.c:4:1
	RET %EAX<imp-use,kill>; dbg:test.c:4:1

and saves addresses in processDebugLoc at the following MachineInstructions:

  %ESP<def> = SUB32ri8 %ESP, 12, %EFLAGS<imp-def,dead>; dbg:test.c:3:3
  %ESP<def> = ADD32ri8 %ESP, 12, %EFLAGS<imp-def,dead>; dbg:test.c:4:1

That is, not the call instruction. So, I'm not sure why this is
working for you...

>> Do you have a unit test that shows this works in all cases?
>
> Not sure about the "all cases", but at least it is working as intended for
> me and these hooks (emitting before or after) were already present before my
> changes.
>
>>
>> Mapping return addresses to metadata seems like more of a job for the
>> GC system, but that's not implemented for the JIT, so I can't very
>> well say to use it instead. :-/
>
> Indeed, doing it in the GC system would also work, but the changes would be
> way less straightforward than this simple change in the JITemitter.
> Nicolas
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



More information about the llvm-commits mailing list