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

David Blaikie dblaikie at gmail.com
Fri May 16 17:54:21 PDT 2014


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)?

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



More information about the llvm-commits mailing list