[test-suite] r289267 - utils/tdiff.py: Fix some bugs/improve performance for large targets

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 9 12:47:31 PST 2016


Author: matze
Date: Fri Dec  9 14:47:30 2016
New Revision: 289267

URL: http://llvm.org/viewvc/llvm-project?rev=289267&view=rev
Log:
utils/tdiff.py: Fix some bugs/improve performance for large targets

Because of maximum commandline limits imposed by platforms the script
could fail for targets with many dependencies (like "all").
This new revision also considerably speeds up those cases by querying
for more targets in a single call.

Modified:
    test-suite/trunk/utils/tdiff.py

Modified: test-suite/trunk/utils/tdiff.py
URL: http://llvm.org/viewvc/llvm-project/test-suite/trunk/utils/tdiff.py?rev=289267&r1=289266&r2=289267&view=diff
==============================================================================
--- test-suite/trunk/utils/tdiff.py (original)
+++ test-suite/trunk/utils/tdiff.py Fri Dec  9 14:47:30 2016
@@ -88,28 +88,44 @@ def query_ninja(targets, cwd):
     return parse(out)
 
 
+def determine_max_commandline_len():
+    """Determine maximum length of commandline possible"""
+    # See also http://www.in-ulm.de/~mascheck/various/argmax/
+    sc_arg_max = os.sysconf('SC_ARG_MAX')
+    if sc_arg_max <= 0:
+        return 10000 # wild guess
+    env_len = 0
+    for key,val in os.environ.iteritems():
+        env_len += len(key) + len(val) + 10
+    return sc_arg_max - env_len
+
+
 def get_inputs_rec(target, cwd):
     worklist = [target]
 
     result = dict()
+    maxquerylen = determine_max_commandline_len() - 100
     while len(worklist) > 0:
-        limit = 30   # Limit number of targets to avoid argument list limits
         querylist = []
-        for w in worklist[:limit]:
+        querylen = 0
+        while len(worklist) > 0:
+            w = worklist.pop()
             if w in result:
                 continue
+            querylen += 9 + len(w)
+            if querylen > maxquerylen:
+                break
             querylist.append(w)
-        worklist = worklist[limit:]
         if querylist == []:
             break
 
         queryres = query_ninja(querylist, cwd)
         for res in queryres:
             result[res.target] = res
-            for inp in res.inputs:
-                if inp[1] == 'order-only':
+            for inp,typ in res.inputs:
+                if typ == 'order-only':
                     continue
-                worklist.append(inp[0])
+                worklist.append(inp)
     return result
 
 




More information about the llvm-commits mailing list