[PATCH] IR: Make MDNode::dump() useful by adding addresses
David Blaikie
dblaikie at gmail.com
Fri Dec 12 15:47:43 PST 2014
On Fri, Dec 12, 2014 at 2:37 PM, Duncan P. N. Exon Smith <
dexonsmith at apple.com> wrote:
>
> It's horrible to inspect `MDNode`s in a debugger. All of their operands
> that are `MDNode`s get dumped as `<badref>`, since we can't assign
> metadata slots in the context of a `Metadata::dump()`. (Why not? Why
> not assign numbers lazily? Because then each time you called `dump()`,
> a given `MDNode` could have a different lazily assigned number.)
>
> Fortunately, the C memory model gives us perfectly good identifiers for
> `MDNode`. Add pointer addresses to the dumps, transforming this:
>
> (lldb) e N->dump()
> metadata !{i32 662302, i32 26, metadata <badref>, null}
>
> (lldb) e ((MDNode*)N->getOperand(2))->dump()
> metadata !{i32 4, metadata !"foo"}
>
> into:
>
> (lldb) e N->dump()
> metadata !{i32 662302, i32 26, metadata <badref:0x100706ee0>, null}
>
> (lldb) e ((MDNode*)0x100706ee0)->dump()
> metadata !{i32 4, metadata !"foo"}
>
> and this:
>
> (lldb) e N->dump()
> metadata !{metadata <badref>, metadata <badref>, metadata <badref>,
> metadata <badref>, metadata <badref>}
>
> (lldb) e N->getOperand(0)
> (const llvm::MDOperand) $0 = {
> MD = 0x00000001012004e0
> }
> (lldb) e N->getOperand(1)
> (const llvm::MDOperand) $1 = {
> MD = 0x00000001012004e0
> }
> (lldb) e N->getOperand(2)
> (const llvm::MDOperand) $2 = {
> MD = 0x0000000101200058
> }
> (lldb) e N->getOperand(3)
> (const llvm::MDOperand) $3 = {
> MD = 0x00000001012004e0
> }
> (lldb) e N->getOperand(4)
> (const llvm::MDOperand) $4 = {
> MD = 0x0000000101200058
> }
> (lldb) e ((MDNode*)0x00000001012004e0)->dump()
> metadata !{}
>
> (lldb) e ((MDNode*)0x0000000101200058)->dump()
> metadata !{null}
>
> into:
>
> (lldb) e N->dump()
> metadata !{metadata <badref:0x1012004e0>, metadata
> <badref:0x1012004e0>, metadata <badref:0x101200058>, metadata
> <badref:0x1012004e0>, metadata <badref:0x101200058>}
>
> (lldb) e ((MDNode*)0x1012004e0)->dump()
> metadata !{}
>
> (lldb) e ((MDNode*)0x101200058)->dump()
> metadata !{null}
>
> I've left `badref` in the operand to keep it `FileCheck`-able, via:
>
> CHECK-NOT: badref
>
badref seems like a pretty weird anachronism & I don't see any instances of
"CHECK.*badref" in 'test' (but it could be under other prefixes)
>
> Another option would be:
>
> (lldb) e N->dump()
> metadata !{metadata !0x1012004e0, metadata !0x1012004e0, metadata
> !0x101200058, metadata !0x1012004e0, metadata !0x101200058}
>
> which would allow:
>
> CHECK-NOT: !0x
>
I'd just imagine you'd check for "{.*metadata!" - which will be harder in
your changes, but still possible I would imagine?
>
> but IMO that's too subtle...
>
Not sure - seems almost less confusing than having 'badref' around.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141212/c4026017/attachment.html>
More information about the llvm-commits
mailing list