Currently using DW_OP_implicit_value in fragments produces invalid DWARF expressions. (Such a case can occur in complex floats, for example.) This problem manifests itself as a missing DW_OP_piece operation after the last fragment. This happens because the function for printing constant float value skips printing the accompanying DWARF expression, as that would also print DW_OP_stack_value (which is not desirable in this case). However, this also results in DW_OP_piece being skipped. The reason that DW_OP_piece is missing only for the last piece is that the act of printing the next fragment corrects this. However, it does that for the wrong reason -- the code emitting this DW_OP_piece thinks that the previous fragment was missing, and so it thinks that it needs to skip over it in order to be able to print itself. In a simple scenario this works out, but it's likely that in a more complex setup (where some pieces are in fact missing), this logic would go badly wrong. In a simple setup gdb also seems to not mind the fact that the DW_OP_piece is missing, but it would also likely not handle more complex use cases. For this reason, this patch disables the usage of DW_OP_implicit_value in the frament scenario (we will use DW_OP_const*** instead), until we figure out the right way to deal with this. This guarantees that we produce valid expressions, and gdb can handle both kinds of inputs anyway. Differential Revision: https://reviews.llvm.org/D92013
3.9 KiB
3.9 KiB