shafik added a comment.

In D85376#2209638 <https://reviews.llvm.org/D85376#2209638>, @labath wrote:

> This manifested itself for variables in registers because those end up being 
> described as `eValueTypeScalar`, is that so?
>
> If that's the case, then I think this would also manifest for variables 
> described via `DW_OP_constu 0xdead, DW_OP_stack_value`. And if *that* is 
> true, then this could be tested a lot simpler by having a global variable 
> described by DW_OP_stack_value and "target variable"-ing it -- no makefiles, 
> no python, just a simple .s file. And it would run on all platforms, not just 
> darwin.
>
> `test/Shell/SymbolFile/DWARF/DW_OP_piece-struct.s` tests a very similar thing 
> in precisely this way. I suspect you could just take that test as a template 
> and replace the struct definition with one that contains bitfieds.

This sounds like a great approach, I have unfortunately been struggling to get 
a test case that works. It looks like I am hitting another bug, I am not 
surprised b/c using slight variations on this code I have found other three 
other bugs with how we deal with `DW_OP_piece`, `DW_OP_bit_piece` and I think 
`DW_AT_const_value` respectively.

I have been working w/ this:

  #include <stdio.h>
  
  typedef union
  {
    unsigned raw;
    struct 
    {
      unsigned a : 8;
      unsigned b : 8;
      unsigned c : 6;
      unsigned d : 2;
      unsigned e : 6;
      unsigned f : 2;
    } ; 
  } U;
  
  static U ug= (U)(unsigned)0x0;
  
  void f(U u) {
    printf( "%d\n", u.raw);
    return;
  }
  
  int main() {
    ug.raw = 0x64A40101;
  
    f(ug);
    printf( "%d\n", ug.raw);
  }

and compiling as using `clang -O1 -gdwarf-4` but we obtain bad values:

  (lldb) target variable ug
  (U) ug = {
    raw = 3395301392
     = (a = 16, b = 48, c = 32, d = 1, e = 10, f = 3)
  }

I tried generating assembly and manually adjusting the debug info but I was not 
able to get very far there.

FYI this was the DWARF expression it was generating:

  DW_AT_location        (DW_OP_addr 0x100002010, DW_OP_deref_size 0x1, 
DW_OP_constu 0x64a40101, DW_OP_mul, DW_OP_lit0, DW_OP_plus, DW_OP_stack_value)

If you can come up w/ a way to generate a test that produces correct values I 
am happy to use it!


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D85376/new/

https://reviews.llvm.org/D85376

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to