On Sun, Aug 10, 2014 at 1:43 PM, Filip Pizlo <fpi...@apple.com> wrote:
> I think this ignores the real problem with the MCJIT debugging interface: it 
> doesn't give MCJIT clients any way of directly accessing and parsing the 
> debug metadata.
>

Parsing the existing debug metadata isn't necessarily a good idea
anyhow. It's not a stable format and is quite large.


> WebKit, and likely other non-C/C++ clients of MCJIT, will not want the MCJIT 
> to register anything with the system debugger. Non-C languages usually have a 
> different set of debugging interfaces and it's up to the client of LLVM to 
> arrange to glue the debugging information that the MCJIT knows about to the 
> debugging interface that the LLVM client knows about. The mcjit's current 
> architecture makes this extremely awkward.
>
> This is part of a bigger problem in the MCJIT API: it is designed to work 
> like an execution engine for C programs despite the fact that the most 
> compelling use of MCJIT is a higher-tier JIT that is part of a mixed-mode or 
> tiered runtime for non-C languages. Is there some client of the MCJIT that 
> actually benefits from the MCJIT pretending to be an execution engine for C 
> programs?  Is there a reason why this client should get more attention than 
> the seemingly more compelling non-C use cases?

The debug metadata is largely based around dwarf debug information,
but it isn't a C language based format. I think this is a misleading
assertion you make.

Also, it's your most compelling use case, not the most compelling.

-eric

>
> -Filip
>
>> On Aug 1, 2014, at 6:10 PM, Lang Hames <lha...@gmail.com> wrote:
>>
>> Hi All,
>>
>> I'd like to revisit the MCJIT debugger-registration system, as the existing 
>> system has a few flaws, some of which are seriously problematic.
>>
>> The 20,000 foot overview of the existing scheme (implemented in 
>> llvm/lib/ExecutionEngine/RuntimeDyld/GDBRegistrar.cpp and friends), as I 
>> understand it, is as follows:
>>
>> We have two symbols in MCJIT that act as fixed points for the debugger to 
>> latch on to:
>>
>> __jit_debug_register_code is a no-op function that the debugger can set a 
>> breakpoint on.  MCJIT will call this function to notify the debugger when an 
>> object file is loaded.
>>
>> __jit_debug_descriptor is the head of a C linked list data structure that 
>> contains pointers to in-memory object files. The ELF/MachO headers of the in 
>> memory object files will have had their vaddrs fixed up by the JIT to point 
>> to where each of the linked sections reside in memory.
>>
>> There are a couple of problems with this system: (1) Modifying object-file 
>> headers in-place violates some internal LLVM contracts. In particular, the 
>> object files may be backed by read-only memory. This has caused crashes in 
>> the JIT that have forced me to revert support for debugger registration on 
>> the MachO side (We really want to replace this on the ELF side soon too). 
>> (2) The JIT has no way of knowing whether a debugger is attached, which 
>> means keeping object files in memory even if they're not being used, just in 
>> case there an attached debugger that needs them.
>>
>> We'd really like to come up with a system that doesn't have these drawbacks. 
>> That is, a system where the object files remain unmodified, and the JIT 
>> knows if/when a debugger attaches so that it can generate the relevant 
>> information on the fly.
>>
>> It would be great if the debugger experts (and particularly anyone who has 
>> experience on both the debugger and the JIT side of things) could weigh in 
>> on these issues. In particular:
>>
>> (1) Is there a reason we bake the vmaddrs into the object file headers, or 
>> could they just as easily be passed in a side-table so as to keep the object 
>> untouched?
>>
>> (2) Is there a canonical way for the debugger to communicate to a JIT that 
>> it's interested in inspecting the JIT's output? If we're going to use 
>> breakpoints (or something like that) to signal to the debugger when objects 
>> have been linked, is it reasonable to have an API that the debugger can call 
>> in to to request the information it's looking for? If the JIT actually 
>> receives a call then it would give us a chance to lazily populate the 
>> necessary data structures.
>>
>> Regards,
>> Lang.
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm...@cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> _______________________________________________
> LLVM Developers mailing list
> llvm...@cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to