lldb support for D programming language

Hi (apologies if this is not the right place to ask)

Is there any plan to support the D programming language in lldb?

gdb already supports it (but only on linux, not OSX), but it would be nice to have support in lldb.
The D patch for gdb is actually pretty small, just a few minor edits scattered throughout.

Currently, if I compile a main.d file with dmd (dmd -g main.d), lldb will not see any variables with fr v.
It works better with ldc2 though: ldc2 -g main.d followed by lldb main does show variable with frv, however it (obviously) doesn’t understand D name mangling.

(lldb) fr select 5
frame #5: 0x0000000100000d3f main`_Dmain + 79 at main.d:39
36
37 int main(string[]args){
38 int x=std.conv.to!int(args[1]);
→ 39 return fun1(x);
40 }

(lldb) fr v
() args = {
length = 2
ptr = 0x0000000100200990
}
(int) x = 11

(lldb) bt

  • thread #1: tid = 0x1f03, 0x0000000100000c11 maincfun1 + 33 at main.d:15, stop reason = EXC_BAD_ACCESS (code=1, address=0x0) frame #0: 0x0000000100000c11 maincfun1 + 33 at main.d:15
    frame #1: 0x0000000100000c99 main_D4main4fun4FiZi + 25 at main.d:27 frame #2: 0x0000000100000c70 main_D4main4fun3FiZi + 16 at main.d:24
    frame #3: 0x0000000100000c50 main_D4main4fun2FiZi + 16 at main.d:21 frame #4: 0x0000000100000c30 main_D4main4fun1FiZi + 16 at main.d:18
    frame #5: 0x0000000100000d3f main_Dmain + 79 at main.d:39 frame #6: 0x000000010004cf0f main_D2rt6dmain24mainUiPPaZi7runMainMFZv + 31 at dmain2.d:530
    frame #7: 0x000000010004ce9a main_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42 at dmain2.d:505 frame #8: 0x000000010004cf64 main_D2rt6dmain24mainUiPPaZi6runAllMFZv + 68 at dmain2.d:540
    frame #9: 0x000000010004ce9a main_D2rt6dmain24mainUiPPaZi7tryExecMFMDFZvZv + 42 at dmain2.d:505 frame #10: 0x000000010004ce06 mainmain + 406 at .:550
    frame #11: 0x0000000100000b94 main`start + 52

What needs to be changed to allow for the following (in order of priority):

  1. detect language (command-line option? from mangled name signature?)
  2. display correctly demangled D symbols (we can use dmd’s std.core.demangle as a library function)
  3. write expressions in unmangled form, eg:
    expr (void)_D4main4dispFiZi(100) //currently works

expr (int) main.disp(100) // desired (or even expr disp(100))

  1. D-aware command completion
  2. support for printing basic D types: arrays, associative arrays, structs etc.

The mangling seems to be in lldb/llvm/tools/clang/include/clang/AST/Mangle.h but that’s not very helpful…