[LLVMdev] debug info for llvm::IntrinsicInst ???

David Blaikie dblaikie at gmail.com
Fri Jan 30 21:12:57 PST 2015


(I'm assuming you're building LLVM with clang, in this case?)

Looks like IntrinsicInst is one of those "lies" in LLVM that works via type
punning that's undefined behavior in C++, so it's code that should be fixed
anyway.

In any case, the reason this produces the debugging experience you're
seeing is that LLVM (& GCC, for that matter) assumes that if your class has
virtual functions, such as IntrinsicInst, here - then to use the type one
must've emitted the vtable for the type somewhere (the C++ standard
requires this - if you odr use the type, all the virtual functions must be
defined somewhere in the program). The debug info emission attempts to
reduce the number of times the debug info for the type is emitted by
piggybacking on this fact - producing the type definition only where the
vtable is produced.

As it turns out, with this class, the vtable is never emitted. This is
because the type has no key function (no non-inline virtual function) and
the ctor itself is never emitted, so the vtable is never needed... and thus
no debug info.

The right way to fix this is to stop relying on undefined type punning -
though I don't know enough about the APIs here to say just how to achieve
that goal.

On Fri, Jan 30, 2015 at 8:55 PM, reed kotler <rkotler at mips.com> wrote:

> When trying to display and do anything with a variable of type
> IntrinsicInst, gdb thinks that it's an incomplete
> type and kind find any member functions or even display the class.
>
>
>
>
> (gdb) list 1337
> 1332
> 1333      // Finish off the call including any return values.
> 1334      return finishCall(CLI, RetVT, NumBytes);
> 1335    }
> 1336
> 1337    bool MipsFastISel::fastLowerIntrinsicCall(const IntrinsicInst
> *II) {
> 1338      switch (II->getIntrinsicID()) {
> 1339      default:
> 1340        return false;
> 1341      case Intrinsic::bswap: {
> (gdb) print II
> $10 = (const llvm::IntrinsicInst *) 0x61b8ec8
> (gdb) print *II
> $11 = <incomplete type>
> (gdb) call II->getIntrinsicID()
> Couldn't find method llvm::IntrinsicInst::getIntrinsicID
> (gdb)
>
>
> However, up the call tree:
>
> (gdb) frame 3
> #3  0x000000000368db6d in llvm::FastISel::selectOperator (this=0x6235290,
>     I=0x61b8ec8, Opcode=49)
>     at /home/rkotler/workspace/llvm/lib/CodeGen/SelectionDAG/
> FastISel.cpp:1535
> 1535        return selectCall(I);
> (gdb) list 1535
> 1530
> 1531        // Dynamic-sized alloca is not handled yet.
> 1532        return false;
> 1533
> 1534      case Instruction::Call:
> 1535        return selectCall(I);
> 1536
> 1537      case Instruction::BitCast:
> 1538        return selectBitCast(I);
> 1539
> (gdb) call I->dump()
>   %2 = call float @llvm.powi.f32(float %0, i32 %1)
> (gdb)
> (gdb) print *I
> $12 = {<llvm::Value> = {
>     _vptr$Value = 0x60c67f0 <vtable for llvm::CallInst+16>, VTy =
> 0x61035c0,
>     UseList = 0x61d3310, NameAndIsUsedByMD = {Value = 0}, SubclassID = 68
> 'D',
>     HasValueHandle = 0 '\000', SubclassOptionalData = 0 '\000',
>     SubclassData = 0, NumOperands = 3, static MaximumAlignment =
> 536870912},
>   OperandList = 0x61b8e80}
> (gdb)
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150130/59212037/attachment.html>


More information about the llvm-dev mailing list