[llvm] r209050 - [DWARF parser] Teach DIContext to fetch short (non-linkage) function names for a given address.

Alexey Samsonov samsonov at google.com
Fri May 16 18:17:23 PDT 2014


On Fri, May 16, 2014 at 5:54 PM, David Blaikie <dblaikie at gmail.com> wrote:

> What're the use cases you have in mind for this? When using the short
> name, are you not going to provide the qualifications (namespace,
> etc)?
>

See http://comments.gmane.org/gmane.comp.compilers.llvm.devel/72792.

In fact, I'm ok with reverting the changes to llvm-symbolizer and just
extending the DebugInfo
library functionality, but that would make the code untested.
Unfortunately, it's still challenging
to test the DWARF parser on anything except actual binary DWARF data.


>
> I was rather hoping the symbolizer would only want/need the mangled
> name - to keep things simple (thinking about this in terms of just how
> minimal the DIEs can be for -gmlt as I'm changing it to cope with
> fission)
>
> On Fri, May 16, 2014 at 5:07 PM, Alexey Samsonov <samsonov at google.com>
> wrote:
> > Author: samsonov
> > Date: Fri May 16 19:07:48 2014
> > New Revision: 209050
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=209050&view=rev
> > Log:
> > [DWARF parser] Teach DIContext to fetch short (non-linkage) function
> names for a given address.
> >
> > Change --functions option in llvm-symbolizer tool to accept
> > values "none", "short" or "linkage". Update the tests and docs
> > accordingly.
> >
> > Modified:
> >     llvm/trunk/docs/CommandGuide/llvm-symbolizer.rst
> >     llvm/trunk/include/llvm/DebugInfo/DIContext.h
> >     llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp
> >     llvm/trunk/test/DebugInfo/llvm-symbolizer.test
> >     llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp
> >     llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.h
> >     llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp
> >
> > Modified: llvm/trunk/docs/CommandGuide/llvm-symbolizer.rst
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/CommandGuide/llvm-symbolizer.rst?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/docs/CommandGuide/llvm-symbolizer.rst (original)
> > +++ llvm/trunk/docs/CommandGuide/llvm-symbolizer.rst Fri May 16 19:07:48
> 2014
> > @@ -61,11 +61,14 @@ OPTIONS
> >  -------
> >
> >  .. option:: -obj
> > +
> >    Path to object file to be symbolized.
> >
> > -.. option:: -functions
> > +.. option:: -functions=[none|short|linkage]
> >
> > -  Print function names as well as source file/line locations. Defaults
> to true.
> > +  Specify the way function names are printed (omit function name,
> > +  print short function name, or print full linkage name, respectively).
> > +  Defaults to ``linkage``.
> >
> >  .. option:: -use-symbol-table
> >
> >
> > Modified: llvm/trunk/include/llvm/DebugInfo/DIContext.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DIContext.h?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/DebugInfo/DIContext.h (original)
> > +++ llvm/trunk/include/llvm/DebugInfo/DIContext.h Fri May 16 19:07:48
> 2014
> > @@ -70,7 +70,7 @@ class DIInliningInfo {
> >  /// should be filled with data.
> >  struct DILineInfoSpecifier {
> >    enum class FileLineInfoKind { None, Default, AbsoluteFilePath };
> > -  enum class FunctionNameKind { None, LinkageName };
> > +  enum class FunctionNameKind { None, ShortName, LinkageName };
> >
> >    FileLineInfoKind FLIKind;
> >    FunctionNameKind FNKind;
> >
> > Modified: llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp (original)
> > +++ llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp Fri May 16 19:07:48
> 2014
> > @@ -277,13 +277,15 @@ DWARFDebugInfoEntryMinimal::getSubroutin
> >                                                FunctionNameKind Kind)
> const {
> >    if (!isSubroutineDIE() || Kind == FunctionNameKind::None)
> >      return nullptr;
> > -  // Try to get mangled name if possible.
> > -  if (const char *name =
> > -      getAttributeValueAsString(U, DW_AT_MIPS_linkage_name, nullptr))
> > -    return name;
> > -  if (const char *name = getAttributeValueAsString(U,
> DW_AT_linkage_name,
> > -                                                   nullptr))
> > -    return name;
> > +  // Try to get mangled name only if it was asked for.
> > +  if (Kind == FunctionNameKind::LinkageName) {
> > +    if (const char *name =
> > +            getAttributeValueAsString(U, DW_AT_MIPS_linkage_name,
> nullptr))
> > +      return name;
> > +    if (const char *name =
> > +            getAttributeValueAsString(U, DW_AT_linkage_name, nullptr))
> > +      return name;
> > +  }
> >    if (const char *name = getAttributeValueAsString(U, DW_AT_name,
> nullptr))
> >      return name;
> >    // Try to get name from specification DIE.
> >
> > Modified: llvm/trunk/test/DebugInfo/llvm-symbolizer.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/llvm-symbolizer.test?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/DebugInfo/llvm-symbolizer.test (original)
> > +++ llvm/trunk/test/DebugInfo/llvm-symbolizer.test Fri May 16 19:07:48
> 2014
> > @@ -10,7 +10,7 @@ RUN: echo "%p/Inputs/macho-universal:i38
> >  RUN: echo "%p/Inputs/macho-universal:x86_64 0x100000f05" >> %t.input
> >  RUN: echo "%p/Inputs/llvm-symbolizer-dwo-test 0x400514" >> %t.input
> >
> > -RUN: llvm-symbolizer --functions --inlining --demangle=false \
> > +RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false \
> >  RUN:    --default-arch=i386 < %t.input | FileCheck %s
> >
> >  CHECK:       main
> > @@ -87,3 +87,9 @@ RUN: llvm-symbolizer --obj %p/Inputs/sha
> >  RUN:   | FileCheck %s --check-prefix=STRIPPED
> >
> >  STRIPPED:  global_func
> > +
> > +RUN: echo "%p/Inputs/dwarfdump-test4.elf-x86-64 0x62c" > %t.input7
> > +RUN: llvm-symbolizer --functions=short --use-symbol-table=false
> --demangle=false < %t.input7 \
> > +RUN:    | FileCheck %s --check-prefix=SHORT_FUNCTION_NAME
> > +
> > +SHORT_FUNCTION_NAME-NOT: _Z1cv
> >
> > Modified: llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp (original)
> > +++ llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.cpp Fri May 16
> 19:07:48 2014
> > @@ -39,8 +39,7 @@ static DILineInfoSpecifier
> >  getDILineInfoSpecifier(const LLVMSymbolizer::Options &Opts) {
> >    return DILineInfoSpecifier(
> >        DILineInfoSpecifier::FileLineInfoKind::AbsoluteFilePath,
> > -      Opts.PrintFunctions ?
> DILineInfoSpecifier::FunctionNameKind::LinkageName
> > -                          :
> DILineInfoSpecifier::FunctionNameKind::None);
> > +      Opts.PrintFunctions);
> >  }
> >
> >  ModuleInfo::ModuleInfo(ObjectFile *Obj, DIContext *DICtx)
> > @@ -117,7 +116,7 @@ DILineInfo ModuleInfo::symbolizeCode(
> >          ModuleOffset, getDILineInfoSpecifier(Opts));
> >    }
> >    // Override function name from symbol table if necessary.
> > -  if (Opts.PrintFunctions && Opts.UseSymbolTable) {
> > +  if (Opts.PrintFunctions != FunctionNameKind::None &&
> Opts.UseSymbolTable) {
> >      std::string FunctionName;
> >      uint64_t Start, Size;
> >      if (getNameFromSymbolTable(SymbolRef::ST_Function, ModuleOffset,
> > @@ -140,7 +139,7 @@ DIInliningInfo ModuleInfo::symbolizeInli
> >      InlinedContext.addFrame(DILineInfo());
> >    }
> >    // Override the function name in lower frame with name from symbol
> table.
> > -  if (Opts.PrintFunctions && Opts.UseSymbolTable) {
> > +  if (Opts.PrintFunctions != FunctionNameKind::None &&
> Opts.UseSymbolTable) {
> >      DIInliningInfo PatchedInlinedContext;
> >      for (uint32_t i = 0, n = InlinedContext.getNumberOfFrames(); i < n;
> i++) {
> >        DILineInfo LineInfo = InlinedContext.getFrame(i);
> > @@ -398,7 +397,7 @@ std::string LLVMSymbolizer::printDILineI
> >    // cannot fetch. We replace it to "??" to make our output closer to
> addr2line.
> >    static const std::string kDILineInfoBadString = "<invalid>";
> >    std::stringstream Result;
> > -  if (Opts.PrintFunctions) {
> > +  if (Opts.PrintFunctions != FunctionNameKind::None) {
> >      std::string FunctionName = LineInfo.FunctionName;
> >      if (FunctionName == kDILineInfoBadString)
> >        FunctionName = kBadString;
> >
> > Modified: llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.h?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.h (original)
> > +++ llvm/trunk/tools/llvm-symbolizer/LLVMSymbolize.h Fri May 16 19:07:48
> 2014
> > @@ -24,6 +24,7 @@
> >
> >  namespace llvm {
> >
> > +typedef DILineInfoSpecifier::FunctionNameKind FunctionNameKind;
> >  using namespace object;
> >
> >  namespace symbolize {
> > @@ -34,17 +35,17 @@ class LLVMSymbolizer {
> >  public:
> >    struct Options {
> >      bool UseSymbolTable : 1;
> > -    bool PrintFunctions : 1;
> > +    FunctionNameKind PrintFunctions;
> >      bool PrintInlining : 1;
> >      bool Demangle : 1;
> >      std::string DefaultArch;
> > -    Options(bool UseSymbolTable = true, bool PrintFunctions = true,
> > +    Options(bool UseSymbolTable = true,
> > +            FunctionNameKind PrintFunctions =
> FunctionNameKind::LinkageName,
> >              bool PrintInlining = true, bool Demangle = true,
> >              std::string DefaultArch = "")
> >          : UseSymbolTable(UseSymbolTable),
> PrintFunctions(PrintFunctions),
> >            PrintInlining(PrintInlining), Demangle(Demangle),
> > -          DefaultArch(DefaultArch) {
> > -    }
> > +          DefaultArch(DefaultArch) {}
> >    };
> >
> >    LLVMSymbolizer(const Options &Opts = Options()) : Opts(Opts) {}
> >
> > Modified: llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp?rev=209050&r1=209049&r2=209050&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp (original)
> > +++ llvm/trunk/tools/llvm-symbolizer/llvm-symbolizer.cpp Fri May 16
> 19:07:48 2014
> > @@ -35,10 +35,15 @@ ClUseSymbolTable("use-symbol-table", cl:
> >                   cl::desc("Prefer names in symbol table to names "
> >                            "in debug info"));
> >
> > -static cl::opt<bool>
> > -ClPrintFunctions("functions", cl::init(true),
> > -                 cl::desc("Print function names as well as line "
> > -                          "information for a given address"));
> > +static cl::opt<FunctionNameKind> ClPrintFunctions(
> > +    "functions", cl::init(FunctionNameKind::LinkageName),
> > +    cl::desc("Print function name for a given address:"),
> > +    cl::values(clEnumValN(FunctionNameKind::None, "none", "omit
> function name"),
> > +               clEnumValN(FunctionNameKind::ShortName, "short",
> > +                          "print short function name"),
> > +               clEnumValN(FunctionNameKind::LinkageName, "linkage",
> > +                          "print function linkage name"),
> > +               clEnumValEnd));
> >
> >  static cl::opt<bool>
> >  ClPrintInlining("inlining", cl::init(true),
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Alexey Samsonov, Mountain View, CA
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140516/b96e3f01/attachment.html>


More information about the llvm-commits mailing list