| #!/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() |