You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.6 KiB
46 lines
1.6 KiB
#!/usr/bin/env python
|
|
|
|
"""
|
|
A wrapper for Clang specialized for gathering information about OpenMP programs.
|
|
Simple replace calls to clang or clang++ with llvm-openmp-analyzer to run the
|
|
analysis passes.
|
|
"""
|
|
|
|
import argparse
|
|
import subprocess
|
|
import yaml # PyYaml to save and load analysis information
|
|
import sys
|
|
import io
|
|
|
|
from analyzer import getKernelUsage
|
|
|
|
desc = '''A wrapper around clang that runs OpenMP Analysis passes and gathers
|
|
information about OpenMP programs.'''
|
|
|
|
default_args = ["-fopenmp", "-Rpass=openmp-opt", "-Rpass-missed=openmp-opt", "-Rpass-analysis=openmp-opt"]
|
|
|
|
def main():
|
|
compiler = ["clang++"] if sys.argv[0].endswith('++') else ["clang"]
|
|
parser = argparse.ArgumentParser(description=desc)
|
|
parser.add_argument('--usage-report-file',
|
|
metavar='filename',
|
|
default='usage.yaml',
|
|
help='Filename used for the OpenMP kernel usage reports in YAML format. "usage.yaml" by default.')
|
|
parser.add_argument('--no-usage-report',
|
|
action='store_true',
|
|
default=False,
|
|
help='Do not general a usage report for the OpenMP kernels.')
|
|
args, clang_args = parser.parse_known_args()
|
|
|
|
subprocess.run(compiler + default_args + clang_args, check=True)
|
|
output = subprocess.run(compiler + default_args + clang_args + ["-v"], stderr=subprocess.PIPE)
|
|
stderr = output.stderr.decode('utf-8')
|
|
|
|
if not args.no_usage_report:
|
|
usage = getKernelUsage(stderr, fname=args.usage_report_file)
|
|
with io.open(args.usage_report_file, 'w', encoding = 'utf-8') as f:
|
|
yaml.dump(usage, f)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|