llvm-profdata
llvm-stress
llvm-symbolizer
+ llvm-addr2line
llvm-dwarfdump
dsymutil
llvm-mca
--- /dev/null
+# 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.
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.
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
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
llc
lli
lli-child-target
+ llvm-addr2line
llvm-ar
llvm-as
llvm-bcanalyzer
# 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()
--- /dev/null
+RUN: llvm-symbolizer -help | FileCheck %s --check-prefix=SYMBOLIZER\r
+RUN: llvm-addr2line -help | FileCheck %s --check-prefix=ADDR2LINE\r
+\r
+SYMBOLIZER: OVERVIEW: llvm-symbolizer\r
+SYMBOLIZER: USAGE: llvm-symbolizer{{(.exe)?}} [options] <input addresses>...\r
+\r
+ADDR2LINE: OVERVIEW: llvm-addr2line\r
+ADDR2LINE: USAGE: llvm-addr2line{{(.exe)?}} [options] <input addresses>...\r
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{{$}}
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
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
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
#
#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
llvm-symbolizer.cpp
)
+add_llvm_tool_symlink(llvm-addr2line llvm-symbolizer)
+
if(LLVM_INSTALL_BINUTILS_SYMLINKS)
add_llvm_tool_symlink(addr2line llvm-symbolizer)
endif()
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"),
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())