Martijn
2011-Apr-27 07:57 UTC
[LLVMdev] LLVM internal getDirectory() for LexicalBlock debug information returns filename?
Hi, For my project, I am using internal llvm class functions to print the filename and directory associated with an instruction from the debug information. With a recent checkout of llvm and clang (svn revision 129445), the following custom code (e.g. in a pass that prints directory info for all instructions) returns the filename iso. directory whenever Scope refers to a lexical block: if (const Instruction *Inst = dyn_cast<Instruction>(&I)) { const DebugLoc &Loc = Inst->getDebugLoc(); if (!Loc.isUnknown()) { LLVMContext &Ctx = Inst->getParent()->getParent()->getContext(); DIScope Scope(Loc.getScope(Ctx)); StringRef Dir = Scope.getDirectory(); // Wrong: contains filename iso. directory .... } } Here, if Scope refers to a Subprogram, this works correctly. However, if Scope is a LexicalBlock, getDirectory() returns the filename (conv.c) iso. the directory. The associated .ll does have a reference to the proper directory (/home1/martijn/hello) in !1 referred from !33: ... store i32 %0, i32* %px.addr.09, align 4, !dbg !33, !tbaa !36 ... !0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"init", metadata !"init", metadata !"", metadata !1, i32 9, metadata !3, i1 false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (i32*, i32*)* @init, null} ; [ DW_TAG_subprogram ] !1 = metadata !{i32 589865, metadata !"conv.c", metadata !"/home1/martijn/hello", metadata !2} ; [ DW_TAG_file_type ] !2 = metadata !{i32 589841, i32 0, i32 12, metadata !"conv.c", metadata !"/home1/martijn/hello", metadata !"clang version 3.0 (trunk)", i1 true, i1 true, metadata !"", i32 0} ; [ DW_TAG_compile_unit ] ... !14 = metadata !{i32 589835, metadata !0, i32 9, i32 1, metadata !1, i32 0} ; [ DW_TAG_lexical_block ] ... !33 = metadata !{i32 13, i32 5, metadata !34, null} !34 = metadata !{i32 589835, metadata !35, i32 12, i32 3, metadata !1, i32 2} ; [ DW_TAG_lexical_block ] !35 = metadata !{i32 589835, metadata !14, i32 11, i32 3, metadata !1, i32 1} ; [ DW_TAG_lexical_block ] ... In llvm/Analysis/DebugInfo.h, I see some exception code in DISubProgram for LLVMDebugVersion7: StringRef getDirectory() const { if (getVersion() == llvm::LLVMDebugVersion7) return getCompileUnit().getFilename(); return getFieldAs<DIFile>(6).getDirectory(); } The DILexicalBlock code does not include such exceptions, but even if I try to add such code, the result is still the filename iso directory. I am at a loss how to address this. Any help would be greatly appreciated! Regards, Martijn Rutten
Martijn
2011-Apr-27 09:29 UTC
[LLVMdev] LLVM internal getDirectory() for LexicalBlock debug information returns filename?
Fixed it, I was not looking. In the code below in DISubprogram it returns getFilename() iso getDirectory, DebugInfo.h line 495 should be:> return getCompileUnit().getDirectory();Cheers, Martijn On Wed, Apr 27, 2011 at 9:57 AM, Martijn <martijn at martijnrutten.com> wrote:> Hi, > > For my project, I am using internal llvm class functions to print the > filename and directory associated with an instruction from the debug > information. > With a recent checkout of llvm and clang (svn revision 129445), the > following custom code (e.g. in a pass that prints directory info for > all instructions) returns the filename iso. directory whenever Scope > refers to a lexical block: > > if (const Instruction *Inst = dyn_cast<Instruction>(&I)) { > const DebugLoc &Loc = Inst->getDebugLoc(); > if (!Loc.isUnknown()) { > LLVMContext &Ctx = Inst->getParent()->getParent()->getContext(); > DIScope Scope(Loc.getScope(Ctx)); > StringRef Dir = Scope.getDirectory(); // Wrong: contains filename > iso. directory > > .... > } > } > > Here, if Scope refers to a Subprogram, this works correctly. However, > if Scope is a LexicalBlock, getDirectory() returns the filename > (conv.c) iso. the directory. The associated .ll does have a reference > to the proper directory (/home1/martijn/hello) in !1 referred from > !33: > > ... > store i32 %0, i32* %px.addr.09, align 4, !dbg !33, !tbaa !36 > ... > > !0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"init", > metadata !"init", metadata !"", metadata !1, i32 9, metadata !3, i1 > false, i1 true, i32 0, i32 0, i32 0, i32 256, i1 true, void (i32*, > i32*)* @init, null} ; [ DW_TAG_subprogram ] > !1 = metadata !{i32 589865, metadata !"conv.c", metadata > !"/home1/martijn/hello", metadata !2} ; [ DW_TAG_file_type ] > !2 = metadata !{i32 589841, i32 0, i32 12, metadata !"conv.c", > metadata !"/home1/martijn/hello", metadata !"clang version 3.0 > (trunk)", i1 true, i1 true, metadata !"", i32 0} ; [ > DW_TAG_compile_unit ] > ... > !14 = metadata !{i32 589835, metadata !0, i32 9, i32 1, metadata !1, > i32 0} ; [ DW_TAG_lexical_block ] > ... > !33 = metadata !{i32 13, i32 5, metadata !34, null} > !34 = metadata !{i32 589835, metadata !35, i32 12, i32 3, metadata > !1, i32 2} ; [ DW_TAG_lexical_block ] > !35 = metadata !{i32 589835, metadata !14, i32 11, i32 3, metadata > !1, i32 1} ; [ DW_TAG_lexical_block ] > ... > > In llvm/Analysis/DebugInfo.h, I see some exception code in > DISubProgram for LLVMDebugVersion7: > > StringRef getDirectory() const { > if (getVersion() == llvm::LLVMDebugVersion7) > return getCompileUnit().getFilename(); > > return getFieldAs<DIFile>(6).getDirectory(); > } > > The DILexicalBlock code does not include such exceptions, but even if > I try to add such code, the result is still the filename iso > directory. > > I am at a loss how to address this. Any help would be greatly appreciated! > > Regards, > Martijn Rutten >
Seemingly Similar Threads
- [LLVMdev] context/scope of instruction
- [LLVMdev] context/scope of instruction
- [LLVMdev] context/scope of instruction
- RFC: Supporting all entities declared in lexical scope in LLVM debug info
- RFC: Supporting all entities declared in lexical scope in LLVM debug info