mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-28 22:00:30 +00:00
[llvm-symbolizer] Add llvm-addr2line
This adds an alias for llvm-symbolizer with different defaults so that it can be used as a drop-in replacement for GNU's addr2line. If a substring "addr2line" is found in the tool's name: * it defaults "-i", "-f" and "-C" to OFF; * it uses "--output-style=GNU" by default. Differential Revision: https://reviews.llvm.org/D60067 llvm-svn: 358749
This commit is contained in:
parent
04199b5946
commit
0d4dd65ccc
@ -31,6 +31,7 @@ Basic Commands
|
||||
llvm-profdata
|
||||
llvm-stress
|
||||
llvm-symbolizer
|
||||
llvm-addr2line
|
||||
llvm-dwarfdump
|
||||
dsymutil
|
||||
llvm-mca
|
||||
|
28
docs/CommandGuide/llvm-addr2line.md
Normal file
28
docs/CommandGuide/llvm-addr2line.md
Normal file
@ -0,0 +1,28 @@
|
||||
# llvm-addr2line - a drop-in replacement for addr2line
|
||||
|
||||
## SYNOPSIS
|
||||
|
||||
**llvm-addr2line** [*options*]
|
||||
|
||||
## DESCRIPTION
|
||||
|
||||
**llvm-addr2line** is an alias for the [llvm-symbolizer](llvm-symbolizer) tool
|
||||
with different defaults. The goal is to make it a drop-in replacement for
|
||||
GNU's **addr2line**.
|
||||
|
||||
Here are some of those differences:
|
||||
|
||||
* Defaults not to print function names. Use [-f](llvm-symbolizer-opt-f)
|
||||
to enable that.
|
||||
|
||||
* Defaults not to demangle function names. Use [-C](llvm-symbolizer-opt-C)
|
||||
to switch the demangling on.
|
||||
|
||||
* Defaults not to print inlined frames. Use [-i](llvm-symbolizer-opt-i)
|
||||
to show inlined frames for a source code location in an inlined function.
|
||||
|
||||
* Uses [--output-style=GNU](llvm-symbolizer-opt-output-style) by default.
|
||||
|
||||
## SEE ALSO
|
||||
|
||||
Refer to [llvm-symbolizer](llvm-symbolizer) for additional information.
|
@ -72,17 +72,23 @@ OPTIONS
|
||||
|
||||
Path to object file to be symbolized.
|
||||
|
||||
.. _llvm-symbolizer-opt-f:
|
||||
|
||||
.. option:: -functions[=<none|short|linkage>], -f
|
||||
|
||||
Specify the way function names are printed (omit function name,
|
||||
print short function name, or print full linkage name, respectively).
|
||||
Defaults to ``linkage``.
|
||||
|
||||
.. _llvm-symbolizer-opt-use-symbol-table:
|
||||
|
||||
.. option:: -use-symbol-table
|
||||
|
||||
Prefer function names stored in symbol table to function names
|
||||
in debug info sections. Defaults to true.
|
||||
|
||||
.. _llvm-symbolizer-opt-C:
|
||||
|
||||
.. option:: -demangle, -C
|
||||
|
||||
Print demangled function names. Defaults to true.
|
||||
@ -91,6 +97,8 @@ OPTIONS
|
||||
|
||||
Don't print demangled function names.
|
||||
|
||||
.. _llvm-symbolizer-opt-i:
|
||||
|
||||
.. option:: -inlining, -inlines, -i
|
||||
|
||||
If a source code location is in an inlined function, prints all the
|
||||
@ -128,6 +136,8 @@ OPTIONS
|
||||
Add the specified offset to object file addresses when performing lookups. This
|
||||
can be used to perform lookups as if the object were relocated by the offset.
|
||||
|
||||
.. _llvm-symbolizer-opt-output-style:
|
||||
|
||||
.. option:: -output-style=<LLVM|GNU>
|
||||
|
||||
Specify the preferred output style. Defaults to ``LLVM``. When the output
|
||||
|
@ -45,6 +45,7 @@ set(LLVM_TEST_DEPENDS
|
||||
llc
|
||||
lli
|
||||
lli-child-target
|
||||
llvm-addr2line
|
||||
llvm-ar
|
||||
llvm-as
|
||||
llvm-bcanalyzer
|
||||
|
@ -25,5 +25,11 @@ _Z1cv:
|
||||
# RUN: llvm-symbolizer --no-demangle -C --obj %t.o 0 \
|
||||
# RUN: | FileCheck %s --check-prefix=DEMANGLED_FUNCTION_NAME
|
||||
|
||||
# Check that for llvm-addr2line the default is not to demangle.
|
||||
# RUN: llvm-addr2line -fe %t.o 0 \
|
||||
# RUN: | FileCheck %s --check-prefix=MANGLED_FUNCTION_NAME
|
||||
# RUN: llvm-addr2line -fCe %t.o 0 \
|
||||
# RUN: | FileCheck %s --check-prefix=DEMANGLED_FUNCTION_NAME
|
||||
|
||||
# MANGLED_FUNCTION_NAME: _Z1cv
|
||||
# DEMANGLED_FUNCTION_NAME: c()
|
||||
|
8
test/tools/llvm-symbolizer/help.test
Normal file
8
test/tools/llvm-symbolizer/help.test
Normal file
@ -0,0 +1,8 @@
|
||||
RUN: llvm-symbolizer -help | FileCheck %s --check-prefix=SYMBOLIZER
|
||||
RUN: llvm-addr2line -help | FileCheck %s --check-prefix=ADDR2LINE
|
||||
|
||||
SYMBOLIZER: OVERVIEW: llvm-symbolizer
|
||||
SYMBOLIZER: USAGE: llvm-symbolizer{{(.exe)?}} [options] <input addresses>...
|
||||
|
||||
ADDR2LINE: OVERVIEW: llvm-addr2line
|
||||
ADDR2LINE: USAGE: llvm-addr2line{{(.exe)?}} [options] <input addresses>...
|
@ -7,5 +7,14 @@ RUN: | FileCheck %s --check-prefix=GNU
|
||||
RUN: llvm-symbolizer --output-style=LLVM -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=LLVM
|
||||
|
||||
RUN: llvm-addr2line -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=GNU
|
||||
|
||||
RUN: llvm-addr2line --output-style=GNU -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=GNU
|
||||
|
||||
RUN: llvm-addr2line --output-style=LLVM -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=LLVM
|
||||
|
||||
LLVM: {{^}}/tmp{{\\|/}}x.c:3:3{{$}}
|
||||
GNU: {{^}}/tmp{{\\|/}}x.c:3{{$}}
|
||||
|
@ -11,6 +11,15 @@ RUN: | FileCheck %s --check-prefix=LLVM
|
||||
RUN: llvm-symbolizer --output-style=GNU -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \
|
||||
RUN: | FileCheck %s --check-prefix=GNU
|
||||
|
||||
RUN: llvm-addr2line -i -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \
|
||||
RUN: | FileCheck %s --check-prefix=GNU
|
||||
|
||||
RUN: llvm-addr2line --output-style=GNU -i -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \
|
||||
RUN: | FileCheck %s --check-prefix=GNU
|
||||
|
||||
RUN: llvm-addr2line --output-style=LLVM -i -e %p/Inputs/addr.exe < %p/Inputs/addr.inp \
|
||||
RUN: | FileCheck %s --check-prefix=LLVM
|
||||
|
||||
LLVM: x.c:14:0
|
||||
LLVM-EMPTY:
|
||||
LLVM-NEXT: some text2
|
||||
|
@ -13,5 +13,14 @@ RUN: | FileCheck %s --check-prefix=LLVM --implicit-check-not=inctwo
|
||||
RUN: llvm-symbolizer --output-style=GNU -i=0 -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=GNU --implicit-check-not=main
|
||||
|
||||
RUN: llvm-addr2line -f -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=GNU --implicit-check-not=main
|
||||
|
||||
RUN: llvm-addr2line --output-style=GNU -f -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=GNU --implicit-check-not=main
|
||||
|
||||
RUN: llvm-addr2line --output-style=LLVM -f -e %p/Inputs/addr.exe 0x40054d \
|
||||
RUN: | FileCheck %s --check-prefix=LLVM --implicit-check-not=inctwo
|
||||
|
||||
LLVM: main
|
||||
GNU: inctwo
|
||||
|
@ -29,6 +29,19 @@ RUN: llvm-symbolizer -i -print-address -p -obj=%p/Inputs/addr.exe < %p/Inputs/ad
|
||||
RUN: echo "0x1" > %t.input
|
||||
RUN: llvm-symbolizer -obj=%p/Inputs/zero < %t.input | FileCheck -check-prefix="ZERO" %s
|
||||
|
||||
RUN: llvm-addr2line -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefix=A2L %s
|
||||
RUN: llvm-addr2line -a -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2L,A2L_A %s
|
||||
RUN: llvm-addr2line -f -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2L,A2L_F %s
|
||||
RUN: llvm-addr2line -i -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2L,A2L_I %s
|
||||
RUN: llvm-addr2line -fi -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2L,A2L_F,A2L_I,A2L_FI %s
|
||||
|
||||
RUN: llvm-addr2line -pa -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_A %s
|
||||
RUN: llvm-addr2line -pf -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_F %s
|
||||
RUN: llvm-addr2line -paf -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_AF %s
|
||||
RUN: llvm-addr2line -pai -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_A,A2LP_I %s
|
||||
RUN: llvm-addr2line -pfi -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_F,A2LP_FI %s
|
||||
RUN: llvm-addr2line -pafi -obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefixes=A2LP,A2LP_AF,A2LP_FI %s
|
||||
|
||||
#CHECK: some text
|
||||
#CHECK: 0x40054d
|
||||
#CHECK: main
|
||||
@ -43,3 +56,23 @@ RUN: llvm-symbolizer -obj=%p/Inputs/zero < %t.input | FileCheck -check-prefix="Z
|
||||
#
|
||||
#ZERO: ??
|
||||
#ZERO: ??:0:0
|
||||
#
|
||||
#A2L: some text
|
||||
#A2L_A-NEXT: 0x40054d
|
||||
#A2L_F-NEXT: inctwo
|
||||
#A2L-NEXT: {{[/\]+}}tmp{{[/\]+}}x.c:3{{$}}
|
||||
#A2L_FI-NEXT: inc{{$}}
|
||||
#A2L_I-NEXT: {{[/\]+}}tmp{{[/\]+}}x.c:7{{$}}
|
||||
#A2L_FI-NEXT: main
|
||||
#A2L_I-NEXT: {{[/\]+}}tmp{{[/\]+}}x.c:14{{$}}
|
||||
#A2L-NEXT: some text2
|
||||
|
||||
#A2LP: some text
|
||||
#A2LP_A-NEXT: 0x40054d: {{[/\]+}}tmp{{[/\]+}}x.c:3{{$}}
|
||||
#A2LP_F-NEXT: inctwo at {{[/\]+}}tmp{{[/\]+}}x.c:3{{$}}
|
||||
#A2LP_AF-NEXT: 0x40054d: inctwo at {{[/\]+}}tmp{{[/\]+}}x.c:3{{$}}
|
||||
#A2LP_I-NEXT: {{[/\]+}}tmp{{[/\]+}}x.c:7{{$}}
|
||||
#A2LP_I-NEXT: {{[/\]+}}tmp{{[/\]+}}x.c:14{{$}}
|
||||
#A2LP_FI-NEXT: (inlined by) inc at {{[/\]+}}tmp{{[/\]+}}x.c:7{{$}}
|
||||
#A2LP_FI-NEXT: (inlined by) main at {{[/\]+}}tmp{{[/\]+}}x.c:14{{$}}
|
||||
#A2LP-NEXT: some text2
|
||||
|
@ -16,6 +16,8 @@ add_llvm_tool(llvm-symbolizer
|
||||
llvm-symbolizer.cpp
|
||||
)
|
||||
|
||||
add_llvm_tool_symlink(llvm-addr2line llvm-symbolizer)
|
||||
|
||||
if(LLVM_INSTALL_BINUTILS_SYMLINKS)
|
||||
add_llvm_tool_symlink(addr2line llvm-symbolizer)
|
||||
endif()
|
||||
|
@ -43,7 +43,7 @@ static cl::opt<FunctionNameKind> ClPrintFunctions(
|
||||
clEnumValN(FunctionNameKind::ShortName, "short",
|
||||
"print short function name"),
|
||||
clEnumValN(FunctionNameKind::LinkageName, "linkage",
|
||||
"print function linkage name (default)"),
|
||||
"print function linkage name"),
|
||||
// Sentinel value for unspecified value.
|
||||
clEnumValN(FunctionNameKind::LinkageName, "", "")));
|
||||
static cl::alias ClPrintFunctionsShort("f", cl::desc("Alias for -functions"),
|
||||
@ -252,8 +252,18 @@ static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer,
|
||||
int main(int argc, char **argv) {
|
||||
InitLLVM X(argc, argv);
|
||||
|
||||
bool IsAddr2Line = sys::path::stem(argv[0]).contains("addr2line");
|
||||
|
||||
if (IsAddr2Line) {
|
||||
ClDemangle.setInitialValue(false);
|
||||
ClPrintFunctions.setInitialValue(FunctionNameKind::None);
|
||||
ClPrintInlining.setInitialValue(false);
|
||||
ClOutputStyle.setInitialValue(DIPrinter::OutputStyle::GNU);
|
||||
}
|
||||
|
||||
llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
|
||||
cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n");
|
||||
cl::ParseCommandLineOptions(argc, argv, IsAddr2Line ? "llvm-addr2line\n"
|
||||
: "llvm-symbolizer\n");
|
||||
|
||||
// If both --demangle and --no-demangle are specified then pick the last one.
|
||||
if (ClNoDemangle.getPosition() > ClDemangle.getPosition())
|
||||
|
Loading…
Reference in New Issue
Block a user