Skip to content

Commit

Permalink
llvm-symbolizer: Ensure non-zero exit when an error is printed
Browse files Browse the repository at this point in the history
(this doesn't cover all cases - libDebugInfoDWARF has a default error
handler that prints errors without any exit code handling - I'll be
following up with a patch for that after this)
  • Loading branch information
dwblaikie committed Oct 15, 2020
1 parent 6d9a72e commit 338dd13
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 33 deletions.
@@ -1,5 +1,5 @@
RUN: llvm-symbolizer --obj=%p/Inputs/macho-universal 0x1f84 | FileCheck %s
RUN: not llvm-symbolizer --obj=%p/Inputs/macho-universal 0x1f84 2>&1 | FileCheck --implicit-check-not=main %s

CHECK: LLVMSymbolizer: error reading file: Unknown architecture named:

CHECK-NOT: main
CHECK: ??
CHECK-NOT: main
2 changes: 1 addition & 1 deletion llvm/test/DebugInfo/symbolize-missing-file.test
@@ -1,3 +1,3 @@
RUN: llvm-symbolizer --obj=unexisting-file 0x1234 2>&1 | FileCheck %s
RUN: not llvm-symbolizer --obj=unexisting-file 0x1234 2>&1 | FileCheck %s

CHECK: LLVMSymbolizer: error reading file: {{[Nn]}}o such file or directory
55 changes: 28 additions & 27 deletions llvm/test/tools/llvm-symbolizer/input-base.test
@@ -1,33 +1,34 @@
# llvm-symbolizer infers the number base from the form of the address.
RUN: llvm-symbolizer -e /dev/null -a 0x1234 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 0X1234 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 4660 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 011064 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 0b1001000110100 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 0B1001000110100 | FileCheck %s
RUN: llvm-symbolizer -e /dev/null -a 0o11064 | FileCheck %s
# RUN: llvm-mc %s -o %t -filetype=obj
## llvm-symbolizer infers the number base from the form of the address.
# RUN: llvm-symbolizer -e %t -a 0x1234 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 0X1234 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 4660 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 011064 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 0b1001000110100 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 0B1001000110100 | FileCheck %s
# RUN: llvm-symbolizer -e %t -a 0o11064 | FileCheck %s

# llvm-symbolizer / StringRef::getAsInteger only accepts the 0o prefix in lowercase.
RUN: llvm-symbolizer -e /dev/null -a 0O1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-UPPER
## llvm-symbolizer / StringRef::getAsInteger only accepts the 0o prefix in lowercase.
# RUN: llvm-symbolizer -e %t -a 0O1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-UPPER

# llvm-addr2line always requires hexadecimal, but accepts an optional 0x prefix.
RUN: llvm-addr2line -e /dev/null -a 0x1234 | FileCheck %s
RUN: llvm-addr2line -e /dev/null -a 0X1234 | FileCheck %s
RUN: llvm-addr2line -e /dev/null -a 1234 | FileCheck %s
RUN: llvm-addr2line -e /dev/null -a 01234 | FileCheck %s
RUN: llvm-addr2line -e /dev/null -a 0b1010 | FileCheck %s --check-prefix=HEXADECIMAL-NOT-BINARY
RUN: llvm-addr2line -e /dev/null -a 0B1010 | FileCheck %s --check-prefix=HEXADECIMAL-NOT-BINARY
RUN: llvm-addr2line -e /dev/null -a 0o1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-LOWER
RUN: llvm-addr2line -e /dev/null -a 0O1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-UPPER
## llvm-addr2line always requires hexadecimal, but accepts an optional 0x prefix.
# RUN: llvm-addr2line -e %t -a 0x1234 | FileCheck %s
# RUN: llvm-addr2line -e %t -a 0X1234 | FileCheck %s
# RUN: llvm-addr2line -e %t -a 1234 | FileCheck %s
# RUN: llvm-addr2line -e %t -a 01234 | FileCheck %s
# RUN: llvm-addr2line -e %t -a 0b1010 | FileCheck %s --check-prefix=HEXADECIMAL-NOT-BINARY
# RUN: llvm-addr2line -e %t -a 0B1010 | FileCheck %s --check-prefix=HEXADECIMAL-NOT-BINARY
# RUN: llvm-addr2line -e %t -a 0o1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-LOWER
# RUN: llvm-addr2line -e %t -a 0O1234 | FileCheck %s --check-prefix=INVALID-NOT-OCTAL-UPPER

CHECK: 0x1234
CHECK-NEXT: ??
# CHECK: 0x1234
# CHECK-NEXT: ??

HEXADECIMAL-NOT-BINARY: 0xb1010
HEXADECIMAL-NOT-BINARY: ??
# HEXADECIMAL-NOT-BINARY: 0xb1010
# HEXADECIMAL-NOT-BINARY: ??

INVALID-NOT-OCTAL-LOWER: 0o1234
INVALID-NOT-OCTAL-LOWER-NOT: ??
# INVALID-NOT-OCTAL-LOWER: 0o1234
# INVALID-NOT-OCTAL-LOWER-NOT: ??

INVALID-NOT-OCTAL-UPPER: 0O1234
INVALID-NOT-OCTAL-UPPER-NOT: ??
# INVALID-NOT-OCTAL-UPPER: 0O1234
# INVALID-NOT-OCTAL-UPPER-NOT: ??
3 changes: 2 additions & 1 deletion llvm/test/tools/llvm-symbolizer/sym.test
Expand Up @@ -31,7 +31,8 @@ RUN: llvm-symbolizer -i -print-address -p -obj=%p/Inputs/addr.exe < %p/Inputs/ad
RUN: llvm-symbolizer --inlining=true --print-address -p --obj=%p/Inputs/addr.exe < %p/Inputs/addr.inp | FileCheck -check-prefix="PRETTY" %s

RUN: echo "0x1" > %t.input
RUN: llvm-symbolizer -obj=%p/Inputs/zero < %t.input | FileCheck -check-prefix="ZERO" %s
## FIXME: Looks like this was meant to have an input file to test, but it isn't present - so this test probably isn't testing what it's intended to test
RUN: not 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
Expand Down
5 changes: 4 additions & 1 deletion llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
Expand Up @@ -73,12 +73,15 @@ static cl::list<std::string> ClInputAddresses(cl::Positional,
cl::desc("<input addresses>..."),
cl::ZeroOrMore);

static bool HasError = false;

template<typename T>
static bool error(Expected<T> &ResOrErr) {
if (ResOrErr)
return false;
logAllUnhandledErrors(ResOrErr.takeError(), errs(),
"LLVMSymbolizer: error reading file: ");
HasError = true;
return true;
}

Expand Down Expand Up @@ -336,5 +339,5 @@ int main(int argc, char **argv) {
Symbolizer, Printer);
}

return 0;
return HasError;
}

0 comments on commit 338dd13

Please sign in to comment.