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.