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@3fe22b6ae7d566cf movsd qword ptr [esp+8], xmm0 ; loc_1 push 3 ; c push 2 ; b push 1 ; a call j_?bar@@YAXDFH@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! Repository: rLLDB LLDB https://reviews.llvm.org/D53086 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits