xref: /llvm-project/llvm/test/tools/llvm-symbolizer/symbol-search.test (revision cb1a7d28e608a107d001e11e0e0baa8b4fea97b5)
1# This test checks the case when an address is specified by a symbol name rather
2# than a number.
3#
4# It uses ELF shared object `Inputs/symbols.so` built for x86_64 using
5# the instructions from `Inputs/symbols.h`.
6
7# Show that the "CODE" command supports search by symbol name.
8RUN: llvm-addr2line --obj=%p/Inputs/symbols.so "CODE func_01" | FileCheck --check-prefix=CODE-CMD %s
9RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so "CODE func_01" | FileCheck --check-prefix=CODE-CMD %s
10CODE-CMD: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:12
11
12# Check if a symbol name can be specified on the command-line.
13RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01 | FileCheck --check-prefix=SYMB %s
14RUN: llvm-symbolizer -e %p/Inputs/symbols.so func_01 | FileCheck --check-prefix=SYMB %s
15SYMB: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:12
16
17# Check that if a symbol has a space in its name, ignore everything from the space onwards.
18RUN: llvm-addr2line -e %p/Inputs/symbols.so "func_01 ignored text" | FileCheck --check-prefix=SYMB %s
19RUN: llvm-symbolizer -e %p/Inputs/symbols.so "func_01 ignored text" | FileCheck --check-prefix=SYMB %s
20
21# Show that a symbol name may be resolved to more than one location.
22RUN: llvm-addr2line -e %p/Inputs/symbols.so static_func | FileCheck --check-prefix=SYMB-MULTI %s
23SYMB-MULTI:      /tmp/dbginfo{{[/\]+}}symbols.part3.c:4
24SYMB-MULTI-NEXT: /tmp/dbginfo{{[/\]+}}symbols.part4.c:4
25
26# Show that if a symbol is not found, a special mark is printed.
27RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_666 | FileCheck --check-prefix=NONEXISTENT %s
28RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_666 | FileCheck --check-prefix=NONEXISTENT %s
29NONEXISTENT: ??
30
31# Show that more than one symbol may be specified.
32RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_01 func_02 | FileCheck --check-prefix=FUNCS %s
33RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01 func_02 | FileCheck --check-prefix=FUNCS %s
34FUNCS:  /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:12
35FUNCS:  /tmp/dbginfo{{[/\]+}}symbols.part2.cpp:10
36
37# Symbol may be combined with offset.
38RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+0 | FileCheck --check-prefix=SYMLINE0 %s
39RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01+0 | FileCheck --check-prefix=SYMLINE0 %s
40SYMLINE0: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:12
41
42RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+12 | FileCheck --check-prefix=SYMLINE1 %s
43RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01+12 | FileCheck --check-prefix=SYMLINE1 %s
44SYMLINE1: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:13
45
46RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+19 | FileCheck --check-prefix=SYMLINE2 %s
47RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01+19 | FileCheck --check-prefix=SYMLINE2 %s
48SYMLINE2: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:14
49
50# Offset can be specified with various bases.
51RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+0x0C | FileCheck --check-prefix=SYMLINE1 %s
52RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01+0x0C | FileCheck --check-prefix=SYMLINE1 %s
53
54RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+014 | FileCheck --check-prefix=SYMLINE1 %s
55RUN: llvm-addr2line -e %p/Inputs/symbols.so func_01+014 | FileCheck --check-prefix=SYMLINE1 %s
56
57# If '+' is not followed by a number, it is part of the symbol name, not an offset separator.
58RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+ | FileCheck --check-prefix=NONEXISTENT %s
59RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_01+ | FileCheck --check-prefix=NONEXISTENT %s
60
61RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+abc | FileCheck --check-prefix=NONEXISTENT %s
62RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_01+abc | FileCheck --check-prefix=NONEXISTENT %s
63
64RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so func_01+0A | FileCheck --check-prefix=NONEXISTENT %s
65RUN: llvm-addr2line --obj=%p/Inputs/symbols.so func_01+0A | FileCheck --check-prefix=NONEXISTENT %s
66
67# If '+' is not preceded by a symbol, it is part of a symbol name, not an offset separator.
68RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=NONEXISTENT %s
69RUN: llvm-addr2line --obj=%p/Inputs/symbols.so +0x1138 | FileCheck --check-prefix=NONEXISTENT %s
70
71# Show that C++ mangled names may be specified.
72RUN: llvm-addr2line --obj=%p/Inputs/symbols.so _ZL14static_func_01i | FileCheck --check-prefix=MULTI-CXX %s
73RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so _ZL14static_func_01i | FileCheck --check-prefix=MULTI-CXX %s
74MULTI-CXX: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:7
75MULTI-CXX: /tmp/dbginfo{{[/\]+}}symbols.part2.cpp:5
76
77# Show that containing function name can be printed in mangled form.
78RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so --no-demangle _Z7func_04i | FileCheck --check-prefix=MANGLED %s
79RUN: llvm-addr2line --obj=%p/Inputs/symbols.so -f _Z7func_04i | FileCheck --check-prefix=MANGLED %s
80MANGLED: _Z7func_04i
81MANGLED-NEXT: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:22
82
83# Show that containing function name can be printed in demangled form.
84RUN: llvm-symbolizer --obj=%p/Inputs/symbols.so _Z7func_04i | FileCheck --check-prefix=NOTMANGLED %s
85RUN: llvm-addr2line --obj=%p/Inputs/symbols.so -f --demangle _Z7func_04i | FileCheck --check-prefix=NOTMANGLED %s
86NOTMANGLED: func_04(int)
87NOTMANGLED-NEXT: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:22
88
89# Show that both the symbol and input file can be specified in the search string on the command-line.
90RUN: llvm-addr2line "%p/Inputs/symbols.so func_01" | FileCheck --check-prefix=SYMBIN %s
91RUN: llvm-symbolizer "%p/Inputs/symbols.so func_01" | FileCheck --check-prefix=SYMBIN %s
92SYMBIN: /tmp/dbginfo{{[/\]+}}symbols.part1.cpp:12
93
94# Show that the case of missing input file specified in the search string on the command-line is properly treated.
95RUN: llvm-addr2line "%p/Inputs/666.so func_01" 2> %t.1.stderr | FileCheck --check-prefix=NONEXISTENT %s
96RUN: FileCheck --input-file=%t.1.stderr --check-prefix=BINARY-NOT-FOUND -DMSG=%errc_ENOENT %s
97RUN: llvm-symbolizer "%p/Inputs/666.so func_01" 2> %t.2.stderr | FileCheck --check-prefix=NONEXISTENT %s
98RUN: FileCheck --input-file=%t.2.stderr --check-prefix=BINARY-NOT-FOUND -DMSG=%errc_ENOENT %s
99BINARY-NOT-FOUND: error: '{{.*}}666.so': [[MSG]]
100