[LLVMdev] LLVM internal getDirectory() for LexicalBlock debug information returns filename?

Martijn martijn at martijnrutten.com
Wed Apr 27 02:29:37 PDT 2011


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
>




More information about the llvm-dev mailing list