]> granicus.if.org Git - llvm/commitdiff
[UpdateCCTestChecks] Detect function mangled name on separate line
authorDavid Greene <greened@obbligato.org>
Tue, 8 Oct 2019 16:25:42 +0000 (16:25 +0000)
committerDavid Greene <greened@obbligato.org>
Tue, 8 Oct 2019 16:25:42 +0000 (16:25 +0000)
Sometimes functions with large comment blocks in front of them have their
declarations output on several lines by c-index-test.  Hence the one-line
function name/line/mangled pattern will not work to detect them.  Break the
pattern up into two patterns and keep state after seeing the name/line
information until we finally see the mangled name.

Differential Revision: https://reviews.llvm.org/D68272

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374078 91177308-0d34-0410-b5e6-96231b3b80d8

utils/update_cc_test_checks.py

index d4eb9f2ca1bb32df763f78cd28751fdb407be576..ea500ebbb61b430880fe343bca6ce0c814fdae05 100755 (executable)
@@ -50,18 +50,32 @@ def get_line2spell_and_mangled(args, clang_args):
         '-test-print-mangle', f.name])
     if sys.version_info[0] > 2:
       output = output.decode()
-
-  RE = re.compile(r'^FunctionDecl=(\w+):(\d+):\d+ \(Definition\) \[mangled=([^]]+)\]')
+  DeclRE = re.compile(r'^FunctionDecl=(\w+):(\d+):\d+ \(Definition\)')
+  MangleRE = re.compile(r'.*\[mangled=([^]]+)\]')
+  MatchedDecl = False
   for line in output.splitlines():
-    m = RE.match(line)
-    if not m: continue
-    spell, line, mangled = m.groups()
+    # Get the function source name, line number and mangled name.  Sometimes
+    # c-index-test outputs the mangled name on a separate line (this can happen
+    # with block comments in front of functions).  Keep scanning until we see
+    # the mangled name.
+    decl_m = DeclRE.match(line)
+    mangle_m = MangleRE.match(line)
+
+    if decl_m:
+      MatchedDecl = True
+      spell, lineno = decl_m.groups()
+    if MatchedDecl and mangle_m:
+      mangled = mangle_m.group(1)
+      MatchedDecl = False
+    else:
+      continue
+
     if mangled == '_' + spell:
       # HACK for MacOS (where the mangled name includes an _ for C but the IR won't):
       mangled = spell
     # Note -test-print-mangle does not print file names so if #include is used,
     # the line number may come from an included file.
-    ret[int(line)-1] = (spell, mangled)
+    ret[int(lineno)-1] = (spell, mangled)
   if args.verbose:
     for line, func_name in sorted(ret.items()):
       print('line {}: found function {}'.format(line+1, func_name), file=sys.stderr)