[PATCH] D62371: [llvm-symbolizer] Flush output on bad input

James Henderson via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri May 24 07:19:04 PDT 2019


jhenderson updated this revision to Diff 201234.
jhenderson added a comment.

Add watchdog to timeout the test after 20 seconds.


Repository:
  rL LLVM

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D62371/new/

https://reviews.llvm.org/D62371

Files:
  test/tools/llvm-symbolizer/Inputs/flush-output.py
  test/tools/llvm-symbolizer/flush-output.s
  tools/llvm-symbolizer/llvm-symbolizer.cpp


Index: tools/llvm-symbolizer/llvm-symbolizer.cpp
===================================================================
--- tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -246,7 +246,6 @@
   }
   if (ClOutputStyle == DIPrinter::OutputStyle::LLVM)
     outs() << "\n";
-  outs().flush();
 }
 
 int main(int argc, char **argv) {
@@ -291,8 +290,10 @@
     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);
Index: test/tools/llvm-symbolizer/flush-output.s
===================================================================
--- test/tools/llvm-symbolizer/flush-output.s
+++ 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
Index: test/tools/llvm-symbolizer/Inputs/flush-output.py
===================================================================
--- test/tools/llvm-symbolizer/Inputs/flush-output.py
+++ test/tools/llvm-symbolizer/Inputs/flush-output.py
@@ -0,0 +1,23 @@
+from __future__ import print_function
+import subprocess
+import sys
+import threading
+
+def kill_subprocess(process):
+    process.kill()
+    sys.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()


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62371.201234.patch
Type: text/x-patch
Size: 2590 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190524/fd3016df/attachment.bin>


More information about the llvm-commits mailing list