[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