2022-07-14 04:02:32 +08:00
|
|
|
#!/usr/bin/env python3
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
'''A utility to update LLVM IR CHECK lines in C/C++ FileCheck test files.
|
|
|
|
|
|
|
|
Example RUN lines in .c/.cc test files:
|
|
|
|
|
|
|
|
// RUN: %clang -emit-llvm -S %s -o - -O2 | FileCheck %s
|
|
|
|
// RUN: %clangxx -emit-llvm -S %s -o - -O2 | FileCheck -check-prefix=CHECK-A %s
|
|
|
|
|
|
|
|
Usage:
|
|
|
|
|
|
|
|
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
|
2019-11-15 20:50:10 +08:00
|
|
|
% utils/update_cc_test_checks.py --clang=release/bin/clang /tmp/c/a.cc
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
'''
|
|
|
|
|
2020-01-03 02:44:54 +08:00
|
|
|
from __future__ import print_function
|
|
|
|
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
import argparse
|
|
|
|
import collections
|
2019-11-15 20:50:10 +08:00
|
|
|
import json
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
import os
|
2020-07-08 17:59:50 +08:00
|
|
|
import re
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
import shlex
|
2022-09-22 01:55:33 +08:00
|
|
|
import shutil
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
import subprocess
|
|
|
|
import sys
|
|
|
|
import tempfile
|
|
|
|
|
2020-07-08 17:59:50 +08:00
|
|
|
from UpdateTestChecks import common
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
SUBST = {
|
|
|
|
'%clang': [],
|
|
|
|
'%clang_cc1': ['-cc1'],
|
|
|
|
'%clangxx': ['--driver-mode=g++'],
|
|
|
|
}
|
|
|
|
|
2021-07-28 21:49:17 +08:00
|
|
|
def get_line2func_list(args, clang_args):
|
|
|
|
ret = collections.defaultdict(list)
|
2019-11-15 20:50:10 +08:00
|
|
|
# Use clang's JSON AST dump to get the mangled name
|
2020-01-03 02:44:54 +08:00
|
|
|
json_dump_args = [args.clang] + clang_args + ['-fsyntax-only', '-o', '-']
|
2019-11-15 20:50:10 +08:00
|
|
|
if '-cc1' not in json_dump_args:
|
|
|
|
# For tests that invoke %clang instead if %clang_cc1 we have to use
|
|
|
|
# -Xclang -ast-dump=json instead:
|
|
|
|
json_dump_args.append('-Xclang')
|
|
|
|
json_dump_args.append('-ast-dump=json')
|
2019-12-02 18:50:23 +08:00
|
|
|
common.debug('Running', ' '.join(json_dump_args))
|
2020-01-03 02:44:54 +08:00
|
|
|
|
|
|
|
popen = subprocess.Popen(json_dump_args, stdout=subprocess.PIPE,
|
|
|
|
stderr=subprocess.PIPE, universal_newlines=True)
|
|
|
|
stdout, stderr = popen.communicate()
|
|
|
|
if popen.returncode != 0:
|
2019-11-15 20:50:10 +08:00
|
|
|
sys.stderr.write('Failed to run ' + ' '.join(json_dump_args) + '\n')
|
2020-01-03 02:44:54 +08:00
|
|
|
sys.stderr.write(stderr)
|
|
|
|
sys.stderr.write(stdout)
|
2019-11-15 20:50:10 +08:00
|
|
|
sys.exit(2)
|
|
|
|
|
2019-12-02 18:53:57 +08:00
|
|
|
# Parse the clang JSON and add all children of type FunctionDecl.
|
2019-11-15 20:50:10 +08:00
|
|
|
# TODO: Should we add checks for global variables being emitted?
|
2021-07-28 21:49:17 +08:00
|
|
|
def parse_clang_ast_json(node, loc, search):
|
2019-12-02 18:53:57 +08:00
|
|
|
node_kind = node['kind']
|
|
|
|
# Recurse for the following nodes that can contain nested function decls:
|
2020-06-18 22:11:08 +08:00
|
|
|
if node_kind in ('NamespaceDecl', 'LinkageSpecDecl', 'TranslationUnitDecl',
|
2021-07-28 21:49:17 +08:00
|
|
|
'CXXRecordDecl', 'ClassTemplateSpecializationDecl'):
|
|
|
|
# Specializations must use the loc from the specialization, not the
|
|
|
|
# template, and search for the class's spelling as the specialization
|
|
|
|
# does not mention the method names in the source.
|
|
|
|
if node_kind == 'ClassTemplateSpecializationDecl':
|
|
|
|
inner_loc = node['loc']
|
|
|
|
inner_search = node['name']
|
|
|
|
else:
|
|
|
|
inner_loc = None
|
|
|
|
inner_search = None
|
2020-06-18 22:11:08 +08:00
|
|
|
if 'inner' in node:
|
|
|
|
for inner in node['inner']:
|
2021-07-28 21:49:17 +08:00
|
|
|
parse_clang_ast_json(inner, inner_loc, inner_search)
|
2019-12-02 18:53:57 +08:00
|
|
|
# Otherwise we ignore everything except functions:
|
2020-06-18 22:11:08 +08:00
|
|
|
if node_kind not in ('FunctionDecl', 'CXXMethodDecl', 'CXXConstructorDecl',
|
|
|
|
'CXXDestructorDecl', 'CXXConversionDecl'):
|
2019-12-02 18:53:57 +08:00
|
|
|
return
|
2021-07-28 21:49:17 +08:00
|
|
|
if loc is None:
|
|
|
|
loc = node['loc']
|
2019-11-15 20:50:10 +08:00
|
|
|
if node.get('isImplicit') is True and node.get('storageClass') == 'extern':
|
2021-07-28 21:49:17 +08:00
|
|
|
common.debug('Skipping builtin function:', node['name'], '@', loc)
|
2019-12-02 18:53:57 +08:00
|
|
|
return
|
2021-07-28 21:49:17 +08:00
|
|
|
common.debug('Found function:', node['kind'], node['name'], '@', loc)
|
|
|
|
line = loc.get('line')
|
2019-11-15 20:50:10 +08:00
|
|
|
# If there is no line it is probably a builtin function -> skip
|
|
|
|
if line is None:
|
2021-07-28 21:49:17 +08:00
|
|
|
common.debug('Skipping function without line number:', node['name'], '@', loc)
|
2019-12-02 18:53:57 +08:00
|
|
|
return
|
2020-06-18 22:10:54 +08:00
|
|
|
|
|
|
|
# If there is no 'inner' object, it is a function declaration and we can
|
|
|
|
# skip it. However, function declarations may also contain an 'inner' list,
|
|
|
|
# but in that case it will only contains ParmVarDecls. If we find an entry
|
|
|
|
# that is not a ParmVarDecl, we know that this is a function definition.
|
|
|
|
has_body = False
|
|
|
|
if 'inner' in node:
|
|
|
|
for i in node['inner']:
|
|
|
|
if i.get('kind', 'ParmVarDecl') != 'ParmVarDecl':
|
|
|
|
has_body = True
|
|
|
|
break
|
|
|
|
if not has_body:
|
2021-07-28 21:49:17 +08:00
|
|
|
common.debug('Skipping function without body:', node['name'], '@', loc)
|
2020-02-04 16:40:56 +08:00
|
|
|
return
|
2019-11-15 20:50:10 +08:00
|
|
|
spell = node['name']
|
2021-07-28 21:49:17 +08:00
|
|
|
if search is None:
|
|
|
|
search = spell
|
2019-11-15 20:50:10 +08:00
|
|
|
mangled = node.get('mangledName', spell)
|
2021-07-28 21:49:17 +08:00
|
|
|
ret[int(line)-1].append((spell, mangled, search))
|
2019-12-02 18:53:57 +08:00
|
|
|
|
2020-01-03 02:44:54 +08:00
|
|
|
ast = json.loads(stdout)
|
2019-12-02 18:53:57 +08:00
|
|
|
if ast['kind'] != 'TranslationUnitDecl':
|
|
|
|
common.error('Clang AST dump JSON format changed?')
|
|
|
|
sys.exit(2)
|
2021-07-28 21:49:17 +08:00
|
|
|
parse_clang_ast_json(ast, None, None)
|
2019-12-02 18:53:57 +08:00
|
|
|
|
2021-07-28 21:49:17 +08:00
|
|
|
for line, funcs in sorted(ret.items()):
|
|
|
|
for func in funcs:
|
|
|
|
common.debug('line {}: found function {}'.format(line+1, func), file=sys.stderr)
|
2019-11-15 20:50:10 +08:00
|
|
|
if not ret:
|
|
|
|
common.warn('Did not find any functions using', ' '.join(json_dump_args))
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
return ret
|
|
|
|
|
|
|
|
|
2020-07-08 17:59:50 +08:00
|
|
|
def str_to_commandline(value):
|
|
|
|
if not value:
|
|
|
|
return []
|
|
|
|
return shlex.split(value)
|
|
|
|
|
2020-08-03 18:18:01 +08:00
|
|
|
|
|
|
|
def infer_dependent_args(args):
|
|
|
|
if not args.clang:
|
|
|
|
if not args.llvm_bin:
|
|
|
|
args.clang = 'clang'
|
|
|
|
else:
|
|
|
|
args.clang = os.path.join(args.llvm_bin, 'clang')
|
|
|
|
if not args.opt:
|
|
|
|
if not args.llvm_bin:
|
|
|
|
args.opt = 'opt'
|
|
|
|
else:
|
|
|
|
args.opt = os.path.join(args.llvm_bin, 'opt')
|
|
|
|
|
|
|
|
|
2022-09-22 01:55:33 +08:00
|
|
|
def find_executable(executable):
|
|
|
|
_, ext = os.path.splitext(executable)
|
|
|
|
if sys.platform == 'win32' and ext != '.exe':
|
|
|
|
executable = executable + '.exe'
|
|
|
|
|
|
|
|
return shutil.which(executable)
|
|
|
|
|
|
|
|
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
def config():
|
|
|
|
parser = argparse.ArgumentParser(
|
|
|
|
description=__doc__,
|
|
|
|
formatter_class=argparse.RawTextHelpFormatter)
|
|
|
|
parser.add_argument('--llvm-bin', help='llvm $prefix/bin path')
|
|
|
|
parser.add_argument('--clang',
|
|
|
|
help='"clang" executable, defaults to $llvm_bin/clang')
|
2020-07-08 17:59:50 +08:00
|
|
|
parser.add_argument('--clang-args', default=[], type=str_to_commandline,
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
help='Space-separated extra args to clang, e.g. --clang-args=-v')
|
2019-10-10 16:25:34 +08:00
|
|
|
parser.add_argument('--opt',
|
|
|
|
help='"opt" executable, defaults to $llvm_bin/opt')
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
parser.add_argument(
|
|
|
|
'--functions', nargs='+', help='A list of function name regexes. '
|
|
|
|
'If specified, update CHECK lines for functions matching at least one regex')
|
|
|
|
parser.add_argument(
|
|
|
|
'--x86_extra_scrub', action='store_true',
|
|
|
|
help='Use more regex for x86 matching to reduce diffs between various subtargets')
|
2019-11-20 21:20:15 +08:00
|
|
|
parser.add_argument('--function-signature', action='store_true',
|
|
|
|
help='Keep function signature information around for the check line')
|
2020-07-12 03:53:50 +08:00
|
|
|
parser.add_argument('--check-attributes', action='store_true',
|
|
|
|
help='Check "Function Attributes" for functions')
|
2021-06-26 00:40:04 +08:00
|
|
|
parser.add_argument('--check-globals', action='store_true',
|
|
|
|
help='Check global entries (global variables, metadata, attribute sets, ...) for functions')
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
parser.add_argument('tests', nargs='+')
|
2019-11-20 21:19:48 +08:00
|
|
|
args = common.parse_commandline_args(parser)
|
2020-08-03 18:18:01 +08:00
|
|
|
infer_dependent_args(args)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
2022-09-22 01:55:33 +08:00
|
|
|
if not find_executable(args.clang):
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
print('Please specify --llvm-bin or --clang', file=sys.stderr)
|
|
|
|
sys.exit(1)
|
2019-10-10 16:25:34 +08:00
|
|
|
|
2019-11-01 05:18:32 +08:00
|
|
|
# Determine the builtin includes directory so that we can update tests that
|
|
|
|
# depend on the builtin headers. See get_clang_builtin_include_dir() and
|
|
|
|
# use_clang() in llvm/utils/lit/lit/llvm/config.py.
|
|
|
|
try:
|
|
|
|
builtin_include_dir = subprocess.check_output(
|
|
|
|
[args.clang, '-print-file-name=include']).decode().strip()
|
|
|
|
SUBST['%clang_cc1'] = ['-cc1', '-internal-isystem', builtin_include_dir,
|
|
|
|
'-nostdsysteminc']
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
common.warn('Could not determine clang builtins directory, some tests '
|
|
|
|
'might not update correctly.')
|
|
|
|
|
2022-09-22 01:55:33 +08:00
|
|
|
if not find_executable(args.opt):
|
2019-10-10 16:25:34 +08:00
|
|
|
# Many uses of this tool will not need an opt binary, because it's only
|
|
|
|
# needed for updating a test that runs clang | opt | FileCheck. So we
|
|
|
|
# defer this error message until we find that opt is actually needed.
|
|
|
|
args.opt = None
|
|
|
|
|
2020-07-08 17:59:50 +08:00
|
|
|
return args, parser
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
|
2021-03-16 22:41:39 +08:00
|
|
|
def get_function_body(builder, args, filename, clang_args, extra_commands,
|
2020-12-17 02:20:12 +08:00
|
|
|
prefixes):
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
# TODO Clean up duplication of asm/common build_function_body_dictionary
|
|
|
|
# Invoke external tool and extract function bodies.
|
|
|
|
raw_tool_output = common.invoke_tool(args.clang, clang_args, filename)
|
2019-10-10 16:25:34 +08:00
|
|
|
for extra_command in extra_commands:
|
|
|
|
extra_args = shlex.split(extra_command)
|
|
|
|
with tempfile.NamedTemporaryFile() as f:
|
|
|
|
f.write(raw_tool_output.encode())
|
|
|
|
f.flush()
|
|
|
|
if extra_args[0] == 'opt':
|
|
|
|
if args.opt is None:
|
|
|
|
print(filename, 'needs to run opt. '
|
|
|
|
'Please specify --llvm-bin or --opt', file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
extra_args[0] = args.opt
|
|
|
|
raw_tool_output = common.invoke_tool(extra_args[0],
|
|
|
|
extra_args[1:], f.name)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
if '-emit-llvm' in clang_args:
|
2020-12-17 02:20:12 +08:00
|
|
|
builder.process_run_line(
|
|
|
|
common.OPT_FUNCTION_RE, common.scrub_body, raw_tool_output,
|
2021-07-29 18:55:34 +08:00
|
|
|
prefixes, False)
|
2022-07-19 15:43:58 +08:00
|
|
|
builder.processed_prefixes(prefixes)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
else:
|
|
|
|
print('The clang command line should include -emit-llvm as asm tests '
|
|
|
|
'are discouraged in Clang testsuite.', file=sys.stderr)
|
|
|
|
sys.exit(1)
|
|
|
|
|
2021-02-20 02:45:40 +08:00
|
|
|
def exec_run_line(exe):
|
|
|
|
popen = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
|
|
|
|
stdout, stderr = popen.communicate()
|
|
|
|
if popen.returncode != 0:
|
|
|
|
sys.stderr.write('Failed to run ' + ' '.join(exe) + '\n')
|
|
|
|
sys.stderr.write(stderr)
|
|
|
|
sys.stderr.write(stdout)
|
|
|
|
sys.exit(3)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
def main():
|
2020-07-08 17:59:50 +08:00
|
|
|
initial_args, parser = config()
|
2019-08-07 22:44:50 +08:00
|
|
|
script_name = os.path.basename(__file__)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
2020-07-08 17:59:50 +08:00
|
|
|
for ti in common.itertests(initial_args.tests, parser, 'utils/' + script_name,
|
2020-08-03 18:18:01 +08:00
|
|
|
comment_prefix='//', argparse_callback=infer_dependent_args):
|
2021-05-01 12:48:32 +08:00
|
|
|
# Build a list of filechecked and non-filechecked RUN lines.
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
run_list = []
|
2021-07-28 21:49:17 +08:00
|
|
|
line2func_list = collections.defaultdict(list)
|
2021-03-16 22:41:39 +08:00
|
|
|
|
|
|
|
subs = {
|
|
|
|
'%s' : ti.path,
|
|
|
|
'%t' : tempfile.NamedTemporaryFile().name,
|
2022-03-21 20:20:32 +08:00
|
|
|
'%S' : os.path.dirname(ti.path),
|
2021-03-16 22:41:39 +08:00
|
|
|
}
|
|
|
|
|
2020-07-08 17:59:50 +08:00
|
|
|
for l in ti.run_lines:
|
2019-10-10 16:25:34 +08:00
|
|
|
commands = [cmd.strip() for cmd in l.split('|')]
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
triple_in_cmd = None
|
|
|
|
m = common.TRIPLE_ARG_RE.search(commands[0])
|
|
|
|
if m:
|
|
|
|
triple_in_cmd = m.groups()[0]
|
|
|
|
|
2021-02-20 02:45:40 +08:00
|
|
|
# Parse executable args.
|
|
|
|
exec_args = shlex.split(commands[0])
|
|
|
|
# Execute non-clang runline.
|
|
|
|
if exec_args[0] not in SUBST:
|
2021-03-16 22:41:39 +08:00
|
|
|
# Do lit-like substitutions.
|
|
|
|
for s in subs:
|
|
|
|
exec_args = [i.replace(s, subs[s]) if s in i else i for i in exec_args]
|
2021-05-01 12:48:32 +08:00
|
|
|
run_list.append((None, exec_args, None, None))
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
continue
|
2021-03-16 22:41:39 +08:00
|
|
|
# This is a clang runline, apply %clang substitution rule, do lit-like substitutions,
|
2021-02-20 02:45:40 +08:00
|
|
|
# and append args.clang_args
|
|
|
|
clang_args = exec_args
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
clang_args[0:1] = SUBST[clang_args[0]]
|
2021-03-16 22:41:39 +08:00
|
|
|
for s in subs:
|
|
|
|
clang_args = [i.replace(s, subs[s]) if s in i else i for i in clang_args]
|
|
|
|
clang_args += ti.args.clang_args
|
2019-10-10 16:25:34 +08:00
|
|
|
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
# Extract -check-prefix in FileCheck args
|
|
|
|
filecheck_cmd = commands[-1]
|
[UpdateTestChecks] Emit warning when invalid value for -check-prefix(es) option
Summary:
The script is silent for the following issue:
FileCheck %s -check-prefix=CHECK,POPCOUNT
FileCheck will catch it later, but I think we can warn here too.
Now it warns:
./update_llc_test_checks.py file.ll
WARNING: Supplied prefix 'CHECK,POPCOUNT' is invalid. Prefix must contain only alphanumeric characters, hyphens and underscores. Did you mean --check-prefixes=CHECK,POPCOUNT?
Reviewers: lebedev.ri, spatel, RKSimon, craig.topper, nikic, gbedwell
Reviewed By: RKSimon
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D64589
llvm-svn: 367244
2019-07-30 01:41:00 +08:00
|
|
|
common.verify_filecheck_prefixes(filecheck_cmd)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
if not filecheck_cmd.startswith('FileCheck '):
|
2021-02-20 02:45:40 +08:00
|
|
|
# Execute non-filechecked clang runline.
|
|
|
|
exe = [ti.args.clang] + clang_args
|
2021-05-01 12:48:32 +08:00
|
|
|
run_list.append((None, exe, None, None))
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
continue
|
2021-02-20 02:45:40 +08:00
|
|
|
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
check_prefixes = [item for m in common.CHECK_PREFIX_RE.finditer(filecheck_cmd)
|
|
|
|
for item in m.group(1).split(',')]
|
|
|
|
if not check_prefixes:
|
|
|
|
check_prefixes = ['CHECK']
|
2019-10-10 16:25:34 +08:00
|
|
|
run_list.append((check_prefixes, clang_args, commands[1:-1], triple_in_cmd))
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
# Execute clang, generate LLVM IR, and extract functions.
|
2020-12-17 02:20:12 +08:00
|
|
|
|
2021-05-01 12:48:32 +08:00
|
|
|
# Store only filechecked runlines.
|
|
|
|
filecheck_run_list = [i for i in run_list if i[0]]
|
2020-12-17 02:20:12 +08:00
|
|
|
builder = common.FunctionTestBuilder(
|
2021-05-01 12:48:32 +08:00
|
|
|
run_list=filecheck_run_list,
|
2020-12-17 02:20:12 +08:00
|
|
|
flags=ti.args,
|
2021-06-20 18:14:33 +08:00
|
|
|
scrubber_args=[],
|
|
|
|
path=ti.path)
|
2020-12-17 02:20:12 +08:00
|
|
|
|
2021-05-01 12:48:32 +08:00
|
|
|
for prefixes, args, extra_commands, triple_in_cmd in run_list:
|
|
|
|
# Execute non-filechecked runline.
|
|
|
|
if not prefixes:
|
|
|
|
print('NOTE: Executing non-FileChecked RUN line: ' + ' '.join(args), file=sys.stderr)
|
|
|
|
exec_run_line(args)
|
|
|
|
continue
|
|
|
|
|
|
|
|
clang_args = args
|
2019-12-02 18:50:23 +08:00
|
|
|
common.debug('Extracted clang cmd: clang {}'.format(clang_args))
|
|
|
|
common.debug('Extracted FileCheck prefixes: {}'.format(prefixes))
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
2021-03-16 22:41:39 +08:00
|
|
|
get_function_body(builder, ti.args, ti.path, clang_args, extra_commands,
|
2020-12-17 02:20:12 +08:00
|
|
|
prefixes)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
2019-11-15 20:50:10 +08:00
|
|
|
# Invoke clang -Xclang -ast-dump=json to get mapping from start lines to
|
|
|
|
# mangled names. Forward all clang args for now.
|
2021-07-28 21:49:17 +08:00
|
|
|
for k, v in get_line2func_list(ti.args, clang_args).items():
|
|
|
|
line2func_list[k].extend(v)
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
2020-12-17 02:20:12 +08:00
|
|
|
func_dict = builder.finish_and_get_func_dict()
|
2020-08-11 02:59:07 +08:00
|
|
|
global_vars_seen_dict = {}
|
2021-05-01 12:48:32 +08:00
|
|
|
prefix_set = set([prefix for p in filecheck_run_list for prefix in p[0]])
|
2020-07-08 17:59:50 +08:00
|
|
|
output_lines = []
|
2021-06-26 00:40:04 +08:00
|
|
|
has_checked_pre_function_globals = False
|
2020-01-14 02:16:35 +08:00
|
|
|
|
|
|
|
include_generated_funcs = common.find_arg_in_test(ti,
|
|
|
|
lambda args: ti.args.include_generated_funcs,
|
|
|
|
'--include-generated-funcs',
|
|
|
|
True)
|
|
|
|
|
|
|
|
if include_generated_funcs:
|
|
|
|
# Generate the appropriate checks for each function. We need to emit
|
|
|
|
# these in the order according to the generated output so that CHECK-LABEL
|
|
|
|
# works properly. func_order provides that.
|
|
|
|
|
|
|
|
# It turns out that when clang generates functions (for example, with
|
|
|
|
# -fopenmp), it can sometimes cause functions to be re-ordered in the
|
|
|
|
# output, even functions that exist in the source file. Therefore we
|
|
|
|
# can't insert check lines before each source function and instead have to
|
|
|
|
# put them at the end. So the first thing to do is dump out the source
|
|
|
|
# lines.
|
|
|
|
common.dump_input_lines(output_lines, ti, prefix_set, '//')
|
|
|
|
|
|
|
|
# Now generate all the checks.
|
|
|
|
def check_generator(my_output_lines, prefixes, func):
|
|
|
|
if '-emit-llvm' in clang_args:
|
[UpdateTestChecks] Auto-generate stub bodies for unused prefixes
This is scoped to autogenerated tests.
The goal is to support having each RUN line specify a list of
check-prefixes where one can specify potentially redundant prefixes. For example,
for X86, if one specified prefixes for both AVX1 and AVX2, and the codegen happened to
match today, one of the prefixes would be used and the onther one not.
If the unused prefix were dropped, and later, codegen differences were
introduced, one would have to go figure out where to add what prefix
(paraphrasing
https://lists.llvm.org/pipermail/llvm-dev/2021-February/148326.html)
To avoid getting errors due to unused prefixes, whole directories can be
opted out (as discussed on that thread), but that means that tests that
aren't autogenerated in such directories could have undetected unused
prefix bugs.
This patch proposes an alternative that both avoids the above, dir-level
optout, and supports the main autogen scenario discussed first. The autogen
tool appends at the end of the test file the list of unused prefixes,
together with a note explaining that is the case. Each prefix is set up
to always pass.
This way, unexpected unused prefixes are easily discoverable, and
expected cases "just work".
Differential Revision: https://reviews.llvm.org/D124306
2022-04-23 03:49:15 +08:00
|
|
|
return common.add_ir_checks(my_output_lines, '//',
|
|
|
|
prefixes,
|
|
|
|
func_dict, func, False,
|
|
|
|
ti.args.function_signature,
|
|
|
|
global_vars_seen_dict,
|
|
|
|
is_filtered=builder.is_filtered())
|
2020-01-14 02:16:35 +08:00
|
|
|
else:
|
[UpdateTestChecks] Auto-generate stub bodies for unused prefixes
This is scoped to autogenerated tests.
The goal is to support having each RUN line specify a list of
check-prefixes where one can specify potentially redundant prefixes. For example,
for X86, if one specified prefixes for both AVX1 and AVX2, and the codegen happened to
match today, one of the prefixes would be used and the onther one not.
If the unused prefix were dropped, and later, codegen differences were
introduced, one would have to go figure out where to add what prefix
(paraphrasing
https://lists.llvm.org/pipermail/llvm-dev/2021-February/148326.html)
To avoid getting errors due to unused prefixes, whole directories can be
opted out (as discussed on that thread), but that means that tests that
aren't autogenerated in such directories could have undetected unused
prefix bugs.
This patch proposes an alternative that both avoids the above, dir-level
optout, and supports the main autogen scenario discussed first. The autogen
tool appends at the end of the test file the list of unused prefixes,
together with a note explaining that is the case. Each prefix is set up
to always pass.
This way, unexpected unused prefixes are easily discoverable, and
expected cases "just work".
Differential Revision: https://reviews.llvm.org/D124306
2022-04-23 03:49:15 +08:00
|
|
|
return asm.add_checks(my_output_lines, '//',
|
|
|
|
prefixes,
|
|
|
|
func_dict, func, global_vars_seen_dict,
|
|
|
|
is_filtered=builder.is_filtered())
|
2020-01-14 02:16:35 +08:00
|
|
|
|
2021-06-26 00:40:04 +08:00
|
|
|
if ti.args.check_globals:
|
|
|
|
common.add_global_checks(builder.global_var_dict(), '//', run_list,
|
|
|
|
output_lines, global_vars_seen_dict, True,
|
|
|
|
True)
|
2021-05-01 12:48:32 +08:00
|
|
|
common.add_checks_at_end(output_lines, filecheck_run_list, builder.func_order(),
|
2020-12-17 02:20:12 +08:00
|
|
|
'//', lambda my_output_lines, prefixes, func:
|
2020-01-14 02:16:35 +08:00
|
|
|
check_generator(my_output_lines,
|
|
|
|
prefixes, func))
|
|
|
|
else:
|
|
|
|
# Normal mode. Put checks before each source function.
|
|
|
|
for line_info in ti.iterlines(output_lines):
|
|
|
|
idx = line_info.line_number
|
|
|
|
line = line_info.line
|
|
|
|
args = line_info.args
|
|
|
|
include_line = True
|
|
|
|
m = common.CHECK_RE.match(line)
|
|
|
|
if m and m.group(1) in prefix_set:
|
|
|
|
continue # Don't append the existing CHECK lines
|
2021-06-26 00:40:04 +08:00
|
|
|
# Skip special separator comments added by commmon.add_global_checks.
|
|
|
|
if line.strip() == '//' + common.SEPARATOR:
|
|
|
|
continue
|
2021-07-28 21:49:17 +08:00
|
|
|
if idx in line2func_list:
|
2020-01-14 02:16:35 +08:00
|
|
|
added = set()
|
2021-07-28 21:49:17 +08:00
|
|
|
for spell, mangled, search in line2func_list[idx]:
|
2020-01-14 02:16:35 +08:00
|
|
|
# One line may contain multiple function declarations.
|
|
|
|
# Skip if the mangled name has been added before.
|
2021-07-28 21:49:17 +08:00
|
|
|
# The line number may come from an included file, we simply require
|
|
|
|
# the search string (normally the function's spelling name, but is
|
|
|
|
# the class's spelling name for class specializations) to appear on
|
|
|
|
# the line to exclude functions from other files.
|
|
|
|
if mangled in added or search not in line:
|
2020-01-14 02:16:35 +08:00
|
|
|
continue
|
|
|
|
if args.functions is None or any(re.search(regex, spell) for regex in args.functions):
|
2020-07-08 17:59:50 +08:00
|
|
|
last_line = output_lines[-1].strip()
|
2020-01-14 02:16:35 +08:00
|
|
|
while last_line == '//':
|
|
|
|
# Remove the comment line since we will generate a new comment
|
|
|
|
# line as part of common.add_ir_checks()
|
|
|
|
output_lines.pop()
|
|
|
|
last_line = output_lines[-1].strip()
|
2021-06-26 00:40:04 +08:00
|
|
|
if ti.args.check_globals and not has_checked_pre_function_globals:
|
|
|
|
common.add_global_checks(builder.global_var_dict(), '//',
|
|
|
|
run_list, output_lines,
|
|
|
|
global_vars_seen_dict, True, True)
|
|
|
|
has_checked_pre_function_globals = True
|
2020-01-14 02:16:35 +08:00
|
|
|
if added:
|
|
|
|
output_lines.append('//')
|
|
|
|
added.add(mangled)
|
2021-05-01 12:48:32 +08:00
|
|
|
common.add_ir_checks(output_lines, '//', filecheck_run_list, func_dict, mangled,
|
2022-01-31 23:06:08 +08:00
|
|
|
False, args.function_signature, global_vars_seen_dict,
|
|
|
|
is_filtered=builder.is_filtered())
|
2020-01-14 02:16:35 +08:00
|
|
|
if line.rstrip('\n') == '//':
|
|
|
|
include_line = False
|
|
|
|
|
|
|
|
if include_line:
|
|
|
|
output_lines.append(line.rstrip('\n'))
|
2020-02-14 23:17:27 +08:00
|
|
|
|
2021-06-26 00:40:04 +08:00
|
|
|
if ti.args.check_globals:
|
|
|
|
common.add_global_checks(builder.global_var_dict(), '//', run_list,
|
|
|
|
output_lines, global_vars_seen_dict, True, False)
|
2020-07-08 17:59:50 +08:00
|
|
|
common.debug('Writing %d lines to %s...' % (len(output_lines), ti.path))
|
|
|
|
with open(ti.path, 'wb') as f:
|
2020-02-14 23:17:27 +08:00
|
|
|
f.writelines(['{}\n'.format(l).encode('utf-8') for l in output_lines])
|
[utils] Add utils/update_cc_test_checks.py
A utility to update LLVM IR in C/C++ FileCheck test files.
Example RUN lines in .c/.cc test files:
// RUN: %clang -S -Os -DXX %s -o - | FileCheck %s
// RUN: %clangxx -S -Os %s -o - | FileCheck -check-prefix=IR %s
Usage:
% utils/update_cc_test_checks.py --llvm-bin=release/bin test/a.cc
% utils/update_cc_test_checks.py --c-index-test=release/bin/c-index-test --clang=release/bin/clang /tmp/c/a.cc
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
// RUN: %clang -emit-llvm -S -Os -DXX %s -o - | FileCheck -check-prefix=AA %s
// RUN: %clangxx -emit-llvm -S -Os %s -o - | FileCheck -check-prefix=BB %s
using T =
#ifdef XX
int __attribute__((vector_size(16)))
#else
short __attribute__((vector_size(16)))
#endif
;
// AA-LABEL: _Z3fooDv4_i:
// AA: entry:
// AA-NEXT: %add = shl <4 x i32> %a, <i32 1, i32 1, i32 1, i32 1>
// AA-NEXT: ret <4 x i32> %add
//
// BB-LABEL: _Z3fooDv8_s:
// BB: entry:
// BB-NEXT: %add = shl <8 x i16> %a, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
// BB-NEXT: ret <8 x i16> %add
T foo(T a) {
return a + a;
}
Differential Revision: https://reviews.llvm.org/D42712
llvm-svn: 326591
2018-03-03 01:37:04 +08:00
|
|
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
sys.exit(main())
|