diff options
| -rw-r--r-- | llvm/test/tools/llvm-symbolizer/Inputs/flush-output.py | 24 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-symbolizer/flush-output.s | 17 | ||||
| -rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 5 |
3 files changed, 44 insertions, 2 deletions
diff --git a/llvm/test/tools/llvm-symbolizer/Inputs/flush-output.py b/llvm/test/tools/llvm-symbolizer/Inputs/flush-output.py new file mode 100644 index 00000000000..120d49226fa --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/Inputs/flush-output.py @@ -0,0 +1,24 @@ +from __future__ import print_function +import os +import subprocess +import sys +import threading + +def kill_subprocess(process): + process.kill() + os._exit(1) + +# Pass -f=none and --output-style=GNU to get only one line of output per input. +cmd = subprocess.Popen([sys.argv[1], + '--obj=' + sys.argv[2], + '-f=none', + '--output-style=GNU'], stdout=subprocess.PIPE, stdin=subprocess.PIPE) +watchdog = threading.Timer(20, kill_subprocess, args=[cmd]) +watchdog.start() +cmd.stdin.write(b'0\n') +cmd.stdin.flush() +print(cmd.stdout.readline()) +cmd.stdin.write(b'bad\n') +cmd.stdin.flush() +print(cmd.stdout.readline()) +watchdog.cancel() diff --git a/llvm/test/tools/llvm-symbolizer/flush-output.s b/llvm/test/tools/llvm-symbolizer/flush-output.s new file mode 100644 index 00000000000..840f430feaf --- /dev/null +++ b/llvm/test/tools/llvm-symbolizer/flush-output.s @@ -0,0 +1,17 @@ +# REQUIRES: x86-registered-target + +## If a process spawns llvm-symbolizer, and wishes to feed it addresses one at a +## time, llvm-symbolizer needs to flush its output after each input has been +## processed or the parent process will not be able to read the output and may +## deadlock. This test runs a script that simulates this situation for both a +## a good and bad input. + +foo: + nop + +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -g +# RUN: %python %p/Inputs/flush-output.py llvm-symbolizer %t.o \ +# RUN: | FileCheck %s + +# CHECK: flush-output.s:10 +# CHECK: bad diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp index e385ed8fce5..423ad077bd0 100644 --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -246,7 +246,6 @@ static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer, } if (ClOutputStyle == DIPrinter::OutputStyle::LLVM) outs() << "\n"; - outs().flush(); } int main(int argc, char **argv) { @@ -291,8 +290,10 @@ int main(int argc, char **argv) { const int kMaxInputStringLength = 1024; char InputString[kMaxInputStringLength]; - while (fgets(InputString, sizeof(InputString), stdin)) + while (fgets(InputString, sizeof(InputString), stdin)) { symbolizeInput(InputString, Symbolizer, Printer); + outs().flush(); + } } else { for (StringRef Address : ClInputAddresses) symbolizeInput(Address, Symbolizer, Printer); |

