DW_OP_implict_value usage and motivation

Tomar, Sourabh Singh SourabhSingh.Tomar@amd.com
Sat Jul 4 16:23:58 GMT 2020


Hello Everyone,

Consider the following test case:
[..]
int main () {
        __int128 newVar = 8;
        newVar = ~newVar;
        return 0;
}
[..]
Compiled as: $gcc foo.c -g -O1
 produces DWARF for "newVar" as:
[..]
0x0000004f:     DW_TAG_variable
                  DW_AT_name    ("newVar")
                  DW_AT_decl_file       ("/home/foo.c")
                  DW_AT_decl_line       (2)
                  DW_AT_decl_column     (0x0b)
                  DW_AT_type    (0x00000070 "__int128")
                  DW_AT_location        (0x00000004:
                     [0x0000000000401149, 0x0000000000401149): DW_OP_implicit_value 0x10 0x08 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00
                     [0x0000000000401149, 0x000000000040114f): DW_OP_implicit_value 0x10 0xf7 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0xff 0xff 0xff)
[..]

I need to know, what's motivation here the for representing location with DW_OP_implicit_value form. Can't it be represented using DW_OP_consts ?? or some piece wise composition like this(works GDB is printing value correctly).
[..]
0x00000043:     DW_TAG_variable
                  DW_AT_location        (0x00000000:
                     [0x00000000002016a1, 0x00000000002016b4): DW_OP_constu 0x75bcd15, DW_OP_stack_value, DW_OP_piece 0x8, DW_OP_lit0, DW_OP_stack_value, DW_OP_bit_piece 0x40 0x40, DW_OP_stack_value
                     [0x00000000002016b4, 0x00000000002016cb): DW_OP_constu 0xeb79a2a, DW_OP_stack_value, DW_OP_piece 0x8, DW_OP_lit0, DW_OP_stack_value, DW_OP_bit_piece 0x40 0x40, DW_OP_stack_value)
                  DW_AT_name    ("newVar")
                  DW_AT_decl_file       ("/home/foo.c")
                  DW_AT_decl_line       (2)
                  DW_AT_type    (0x0000005a "__int128")
[..]

If possible can somebody clarify the overall motivation behind "DW_OP_implicit_value" design/usage in GCC ? It's confusing in a sense if we use "int newVar = 8"  in above program the GCC creates location expression using "DW_OP_stack_value":
DW_AT_location        (0x00000004:
                     [0x0000000000401149, 0x0000000000401149): DW_OP_lit8, DW_OP_stack_value
                     [0x0000000000401149, 0x000000000040114f): DW_OP_const1s -9, DW_OP_stack_value)

While digging in, I stumbled upon this snippet(comment) from dwarf2out.c:

/* Determine if DW_OP_stack_value or DW_OP_implicit_value
     is more compact.  For DW_OP_stack_value we need:
     litsize + 1 (DW_OP_stack_value)
     and for DW_OP_implicit_value:
     1 (DW_OP_implicit_value) + 1 (length) + size.  */

Can somebody engaged in this feature help/clarify, all the findings here.

Thanks in anticipation!
Sourabh.


More information about the Gcc mailing list