summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/llvm-symbolizer/Inputs/flush-output.py24
-rw-r--r--llvm/test/tools/llvm-symbolizer/flush-output.s17
-rw-r--r--llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp5
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);
OpenPOWER on IntegriCloud