[LLVMdev] How to read v3.3 dbg metadata using v3.4 LLVM

Eric Christopher echristo at gmail.com
Fri Jan 24 18:48:11 PST 2014


On Thu, Jan 23, 2014 at 10:35 PM, James Stark <mrjamesstark at gmail.com> wrote:
> Thanks Eric, but could you give me a little bit more hints or pointers
> please? I looked into DebugInfo.h, but I'm still not sure how to start. It
> sounds like I'd have to somehow manually extract metadata nodes from an
> instruction.
>

You will, yes.

Something like:

LLVMContext Ctx = Module.getContext();
for each Function f in Module::functions():
  for each BasicBlock BB in f:
    for each Instruction I in BB:
       DebugLoc DL = I.getDebugLoc();
       DILocation DIL = cast<DILocation>(DL.getAsMDNode(Ctx));
       unsigned Line = DIL.getLine();
       unsigned Col = DIL.getCol();
       StringRef Filename = DIL.getFilename();

Or something like that.

-eric

> Thanks,
> JS
>
>
> On Wed, Jan 22, 2014 at 10:14 PM, Eric Christopher <echristo at gmail.com>
> wrote:
>>
>> This is likely going to be difficult if possible. I wouldn't bet on it
>> working that way. We've not been trying to keep compatibility between
>> versions for debug information metadata because the format has been in such
>> flux and upgrading/multiple versions is a significant overhead.
>>
>> You might be able to walk the instructions and grab the scope +
>> line/column that way for each instruction. You can see the format of each
>> metadata node by looking at DebugInfo.h. Hope this helps, feel free to send
>> mail if you have any more questions.
>>
>> -eric
>>
>> On Wed Jan 22 2014 at 8:59:36 PM, James Stark <mrjamesstark at gmail.com>
>> wrote:
>>>
>>> Hi,
>>>
>>> I have bitcode files built by LLVM v3.3 and need to process them using
>>> v3.4 tools. While I don't expect a lot of backward compatibility in LLVM,
>>> luckily it seems everything's working fine, except for reading source line
>>> information attached to instructions. I use this piece of code [0] to get
>>> source line information. For v3.4, instruction.getMetadata returns NULL.
>>>
>>> I used llvm-dis to see what's going on. For a sample program [1],
>>> llvm-dis v3.3, of course, didn't have problems and dumped [2], showing dbg
>>> info. However, llvm-dis v3.4 seemed to have problems grabbing the dbg info
>>> [3].
>>>
>>> Any idea how I can modify the code [0] to solve the problem? Attached is
>>> the bitcode file used as an example in this mail. It was complied with clang
>>> v3.3 -g -O0.
>>>
>>> Thanks,
>>> James
>>>
>>> [0]
>>>
>>> llvm::LLVMContext llvmContext;
>>>
>>> unsigned dbgKind = llvmContext.getMDKindID("dbg");
>>>
>>> if (MDNode *N = instruction.getMetadata(dbgKind)){
>>>
>>>     DILocation location(N);
>>>
>>>     fileDirectoryName = location.getDirectory();
>>>
>>>     fileName = location.getFilename();
>>>
>>>     lineNumber = location.getLineNumber();
>>>
>>>     columnNumber = location.getColumnNumber();
>>>
>>> }
>>>
>>> [1]
>>>
>>> int main(int argc, char **argv){
>>>
>>>    return 0;
>>>
>>> }
>>>
>>> [2]
>>>
>>> define i32 @main(i32 %argc, i8** %argv) #0 {
>>>
>>> entry:
>>>
>>>   %retval = alloca i32, align 4
>>>
>>>   %argc.addr = alloca i32, align 4
>>>
>>>   %argv.addr = alloca i8**, align 8
>>>
>>>   store i32 0, i32* %retval
>>>
>>>   store i32 %argc, i32* %argc.addr, align 4
>>>
>>>   call void @llvm.dbg.declare(metadata !{i32* %argc.addr}, metadata !12),
>>> !dbg !13
>>>
>>>   store i8** %argv, i8*** %argv.addr, align 8
>>>
>>>   call void @llvm.dbg.declare(metadata !{i8*** %argv.addr}, metadata
>>> !14), !dbg !13
>>>
>>>   ret i32 0, !dbg !15
>>>
>>> }
>>>
>>> [3]
>>>
>>> define i32 @main(i32 %argc, i8** %argv) #0 {
>>>
>>> entry:
>>>
>>>   %retval = alloca i32, align 4
>>>
>>>   %argc.addr = alloca i32, align 4
>>>
>>>   %argv.addr = alloca i8**, align 8
>>>
>>>   store i32 0, i32* %retval
>>>
>>>   store i32 %argc, i32* %argc.addr, align 4
>>>
>>>   store i8** %argv, i8*** %argv.addr, align 8
>>>
>>>   ret i32 0
>>>
>>> }
>
>



More information about the llvm-dev mailing list