PATCH to dwarf2read.c:decode_locdesc

Jason Merrill
2002-01-10T12:26:51Z

[-- Attachment #1: Type: text/plain, Size: 924 bytes --]

I noticed that even with Daniel's recent C++ improvements (thanks!), vbase
handling was still broken with dwarf2 because dwarf2read.c still didn't
grok the complex location expression gcc now emits. As it happens, by a
fluke simply adding support for the missing opcodes causes decode_locdesc
to produce the answer gdb wants. The dwarf2 output expects the stack to
start with the address of the object and produce the address of the base,
whereas in the current gdb the stack starts with 0 and produces the
negation of whatever constant is provided, which matches the stabs output.

Of course, gdb tries to complain about the derefs twice in the process, but
is currently muffled.

So, it's not a complete solution, but it's entirely correct and fixes
gdb.c++/inherit.exp.

OK to commit?

2002-01-10 Jason Merrill <jason@redhat.com>

* dwarf2read.c (decode_locdesc): Implement DW_OP_litn, DW_OP_dup.
Fix DW_OP_minus.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 1634 bytes --]

*** dwarf2read.c.~1~ Tue Jan 8 14:17:30 2002
--- dwarf2read.c Thu Jan 10 11:54:45 2002
*************** decode_locdesc (struct dwarf_block *blk,
*** 5807,5812 ****
--- 5807,5847 ----
op = data[i++];
switch (op)
{
+ case DW_OP_lit0:
+ case DW_OP_lit1:
+ case DW_OP_lit2:
+ case DW_OP_lit3:
+ case DW_OP_lit4:
+ case DW_OP_lit5:
+ case DW_OP_lit6:
+ case DW_OP_lit7:
+ case DW_OP_lit8:
+ case DW_OP_lit9:
+ case DW_OP_lit10:
+ case DW_OP_lit11:
+ case DW_OP_lit12:
+ case DW_OP_lit13:
+ case DW_OP_lit14:
+ case DW_OP_lit15:
+ case DW_OP_lit16:
+ case DW_OP_lit17:
+ case DW_OP_lit18:
+ case DW_OP_lit19:
+ case DW_OP_lit20:
+ case DW_OP_lit21:
+ case DW_OP_lit22:
+ case DW_OP_lit23:
+ case DW_OP_lit24:
+ case DW_OP_lit25:
+ case DW_OP_lit26:
+ case DW_OP_lit27:
+ case DW_OP_lit28:
+ case DW_OP_lit29:
+ case DW_OP_lit30:
+ case DW_OP_lit31:
+ stack[++stacki] = op - DW_OP_lit0;
+ break;
+
case DW_OP_reg0:
case DW_OP_reg1:
case DW_OP_reg2:
*************** decode_locdesc (struct dwarf_block *blk,
*** 5965,5970 ****
--- 6000,6010 ----
i += bytes_read;
break;

+ case DW_OP_dup:
+ stack[stacki + 1] = stack[stacki];
+ stacki++;
+ break;
+
case DW_OP_plus:
stack[stacki - 1] += stack[stacki];
stacki--;
*************** decode_locdesc (struct dwarf_block *blk,
*** 5976,5982 ****
break;

case DW_OP_minus:
! stack[stacki - 1] = stack[stacki] - stack[stacki - 1];
stacki--;
break;

--- 6016,6022 ----
break;

case DW_OP_minus:
! stack[stacki - 1] -= stack[stacki];
stacki--;
break;