[OpenMP] Remove unfinished and unused 'Analyzer' tool

Summary:
This patch removes a tool that was never finished and has no plans of
being picked up again. It does not need to live in LLVM source in an
unusable state.
This commit is contained in:
Joseph Huber 2023-01-20 17:34:26 -06:00
parent 255922be7f
commit c7af1d19f3
3 changed files with 0 additions and 100 deletions

View File

@ -1,54 +0,0 @@
#!/usr/bin/env python
import subprocess
import os.path
import yaml
import io
import re
def parseKernelUsages(usageStr, usageDict):
demangler = 'c++filt -p'
def getKernelMem(usages):
match = re.search(r"([0-9]+) bytes cmem\[0\]", usages)
return match.group(1) if match else None
def getSharedMem(usages):
match = re.search(r"([0-9]+) bytes smem", usages)
return match.group(1) if match else None
def getRegisters(usages):
match = re.search(r"[Uu]sed ([0-9]+) registers", usages)
return match.group(1) if match else None
def demangle(fn):
expr = re.compile("__omp_offloading_[a-zA-Z0-9]*_[a-zA-Z0-9]*_(_Z.*_)_l[0-9]*$")
match = expr.search(fn)
function = match.group(1) if match else fn
output = subprocess.run(demangler.split(' ') + [function], check=True, stdout=subprocess.PIPE)
return output.stdout.decode('utf-8').strip()
def getLine(fn):
expr = re.compile("__omp_offloading_[a-zA-Z0-9]*_[a-zA-Z0-9]*_.*_l([0-9]*)$")
match = expr.search(fn)
return match.group(1) if match else 0
expr = re.compile("Function properties for \'?([a-zA-Z0-9_]*)\'?\n(.*,.*)\n")
for (fn, usages) in expr.findall(usageStr):
info = usageDict[fn] if fn in usageDict else dict()
info["Name"] = demangle(fn)
info["DebugLoc"] = {"File" : "unknown", "Line": getLine(fn), "Column" : 0}
info["Usage"] = {"Registers" : getRegisters(usages), "Shared" : getSharedMem(usages), "Kernel" : getKernelMem(usages)}
usageDict[fn] = info
def getKernelUsage(stderr, fname='usage.yaml'):
remarks = [line for line in stderr.split('\n') if re.search(r"^remark:", line)]
ptxas = '\n'.join([line.split(':')[1].strip() for line in stderr.split('\n') if re.search(r"^ptxas info *:", line)])
nvlink = '\n'.join([line.split(':')[1].strip() for line in stderr.split('\n') if re.search(r"^nvlink info *:", line)])
if os.path.exists(fname):
with io.open(fname, 'r', encoding = 'utf-8') as f:
usage = yaml.load(f, Loader=yaml.Loader)
else:
usage = dict()
parseKernelUsages(ptxas, usage)
parseKernelUsages(nvlink, usage)
return usage

View File

@ -1,45 +0,0 @@
#!/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()

View File

@ -1 +0,0 @@
llvm-openmp-analyzer