[Lldb-commits] [PATCH] D53086: [PDB] Fix flaky `variables-locations.test` after PR38857

Aleksandr Urakov via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Oct 11 03:19:05 PDT 2018

aleksandr.urakov added a comment.

Thanks a lot for so detailed answer, it helps!

So we need to parse a FPO program and to convert it in a DWARF expression too. The problem here (in the DIA case) is that I don't know how to retrieve the required FPO range (we have a symbol context when creating a variable, but it seems that it doesn't contain enough information). As for the raw PDB case, can the same `S_LOCAL` have several `S_DEFRANGE_FRAMEPOINTER_REL` records for several ranges? If so, then the problem exists for the raw PDB case too, but there's a solution: we can combine processing of all `S_DEFRANGE_FRAMEPOINTER_REL` records in the single DWARF expression (and call the required FPO program depending on current `eip`).

The interesting moment here is that MSVC doesn't emit correct information for locals. For the program `aaa.cpp`:

  void bar(char a, short b, int c) { }
  void __fastcall foo(short arg_0, float arg_1) {
    char loc_0 = 'x';
    double __declspec(align(8)) loc_1 = 0.5678;
    bar(1, 2, 3);
  int main(int argc, char *argv[]) {
    foo(1111, 0.1234);
    return 0;

compiled with `cl /Zi /Oy aaa.cpp` we have the next disassembly of `foo`:

  push    ebp
  mov     ebp, esp
  and     esp, 0FFFFFFF8h
  sub     esp, 10h
  mov     [esp+4], cx     ; arg_0
  mov     byte ptr [esp+3], 'x' ; loc_0
  movsd   xmm0, ds:__real at 3fe22b6ae7d566cf
  movsd   qword ptr [esp+8], xmm0 ; loc_1
  push    3               ; c
  push    2               ; b
  push    1               ; a
  call    j_?bar@@YAXDFH at Z ; bar(char,short,int)
  add     esp, 0Ch
  mov     esp, ebp
  pop     ebp
  retn    4

but MSVC emits the next info about locals:

  296 | S_GPROC32 [size = 44] `foo`
        parent = 0, end = 452, addr = 0001:23616, code size = 53
        type = `0x1003 (void (short, float))`, debug start = 14, debug end = 47, flags = has fp
  340 | S_FRAMEPROC [size = 32]
        size = 16, padding size = 0, offset to padding = 0
        bytes of callee saved registers = 0, exception handler addr = 0000:0000
        local fp reg = VFRAME, param fp reg = EBP
        flags = has async eh | opt speed
  372 | S_REGREL32 [size = 20] `arg_0`
        type = 0x0011 (short), register = ESP, offset = 4294967284
  392 | S_REGREL32 [size = 20] `arg_1`
        type = 0x0040 (float), register = EBP, offset = 8
  412 | S_REGREL32 [size = 20] `loc_1`
        type = 0x0041 (double), register = ESP, offset = 4294967288
  432 | S_REGREL32 [size = 20] `loc_0`
        type = 0x0070 (char), register = ESP, offset = 4294967283
  452 | S_END [size = 4]

so neither LLDB nor Visual Studio show valid values (except for `arg_1`).

In https://reviews.llvm.org/D53086#1260787, @zturner wrote:

> You didn't include it here, but I notice the test file just writes `clang-cl /Zi`.  Should we be passing `-m32` or `-m64`?  Currently, the test just runs with whatever architecture happens to be set via the VS command prompt.  The behavior here is different on x86 and x64 so perhaps it requires separate tests.

The problem is that x64 LLDB can't debug x86 applications on Windows (and vice versa), so I rely here on the fact that tests are run in the same VS command prompt as LLVM was built. But yes, it's still possible to run tests for x86 LLVM under the x64 VS command prompt, so this one will fail. I think we can somehow guard this when I'll implement `compiler_config` you have mentioned in https://reviews.llvm.org/D52618.

In https://reviews.llvm.org/D53086#1260685, @stella.stamenova wrote:

> Could you document that in the test?

Sure, thanks!



More information about the lldb-commits mailing list