[PATCH] Debug info: Support fragmented variables.
Adrian Prantl
aprantl at apple.com
Mon Feb 3 15:41:02 PST 2014
Hi David,
Here’s the MDNodes for the two variable pieces:
!20 = metadata !{i32 786689, metadata !4, metadata !"s", metadata !5, i32 16777219, metadata !9, i32 0, i32 0, i32 3, i32 0, i32 8} ; [ DW_TAG_arg_variable ] [s] [line 3]
!21 = metadata !{i32 786689, metadata !4, metadata !"s", metadata !5, i32 16777219, metadata !9, i32 0, i32 0, i32 3, i32 8, i32 4} ; [ DW_TAG_arg_variable ] [s] [line 3]
All the way through ISel and the MC layer those two MDNodes behave like regular DIVariables with complex addresses. In DwarfDebug, we need to treat the pieces as one entity when calculating the Ranges/History. getEntireVariable() simply chops off the last two elements so it can be used as a shared index into DbgVariables while still indicating that this is a fragmented location. The extra code in the range calculation makes sure that a piece of a variable is not clobbered by a non-overlapping piece.
FYI: In a previous design I experimented with introducing a new type MDnode
!Piece = metadata !{i32 PIECE, metadata !<ref to DIVariable>, metadata !<Offset>, metadata !<Size>}
but this meant adding an extra case to all the ISel/MC code handling DBG_VALUEs, which is why I ended up with the current design.
— adrian
http://llvm-reviews.chandlerc.com/D2680
More information about the llvm-commits
mailing list