Pulling line number/file/path information from DbgStopPointInst instructions

Hi folks,

I had some code that used to work fine in earlier versions of LLVM, but is now failing. I have some code that expands DbgStopPointInst instructions to my own entry points in an opt pass, but it's currently failing to get the file name and path back, though it is still correctly getting line numbers. If you happen to have a code fragment that is known to work, it would be much appreciated.

What it used to work was calling getFileName()->getNameStr() on the DbgStopPointInst, which returned a std::string, but in LLVM 2.5 the code compiles, but that string is empty. Any clues?

[s]

Hi folks,

I had some code that used to work fine in earlier versions of LLVM,
but is now failing. I have some code that expands DbgStopPointInst
instructions to my own entry points in an opt pass, but it's currently
failing to get the file name and path back, though it is still
correctly getting line numbers. If you happen to have a code fragment
that is known to work, it would be much appreciated.

Hi Sarah,

I'm not sure if this will help you out, but take a look at how
DwarfWriter::getOrCreateSourceID is used. Unfortunately, I don't see
how to get the file name from a DbgStopPointInstr right offhand.
Things in the CodeGen/AsmPrinter/DwarfWriter.cpp file have changed
quite a bit in recent months...

-bw

Hmm... if I do a print() on the result of getFileName(), I get

  i8 * getelementptr ([9 x i8]* @.str, i32 0, i32 0)

back, but if I try to dyn_cast this to GetElementPtrInst it fails (returning null), so presumably I'm seeing a GetElementPtrConstantExpr... so how can I get at that constant i8 array without casting to a GetElementPtrInst, and with GetElementPtrConstantExpr being inaccessible to user code?

[s]

Use something like:

if (ConstantExpr *CE = dyn_cast< ConstantExpr>(V))
   if (CE->getOpcode() == Instruction::GetElementPtr)
     ... play with CE->getOperand(0) etc ...

-Chris

Look at lib/Analysis/DbgInfoPrinter.cpp in trunk:

void PrintDbgInfo::printStopPoint(const DbgStopPointInst *DSI)
{
  if (PrintDirectory) {
    std::string dir;
        GetConstantStringInfo(DSI->getDirectory(), dir);
    Out << dir << "/";
  }
  std::string file;
  GetConstantStringInfo(DSI->getFileName(), file);
  Out << file << ":" << DSI->getLine();
  if (unsigned Col = DSI->getColumn()) {
    Out << ":" << Col;
  }
}

There are also some helpers for finding the stoppoints in the same class.

Best regards,
---Edwin