aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/build_workaround_header.py
blob: f1d45de20e641248daed64875296afc452979b24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/env python
# Copyright (c) 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""code generator for gpu workaround definitions"""

import os
import os.path
import sys
from optparse import OptionParser

_LICENSE = """// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

"""

_DO_NOT_EDIT_WARNING = ("// This file is auto-generated from " +
                        os.path.basename(__file__) + "\n" +
                        "// DO NOT EDIT!\n\n")

def merge_files_into_workarounds(files):
  workarounds = set()
  for filename in files:
    with open(filename, 'r') as f:
      workarounds.update([workaround.strip() for workaround in f])
  return sorted(list(workarounds))


def write_header(filename, workarounds):
  max_workaround_len = len(max(workarounds, key=len))

  with open(filename, 'w') as f:
    f.write(_LICENSE)
    f.write(_DO_NOT_EDIT_WARNING)

    indent = '  '
    macro = 'GPU_OP'

    # length of max string passed to write + 1
    max_len = len(indent) + len(macro) + 1 + max_workaround_len + 1 + 1
    write = lambda line: f.write(line + ' ' * (max_len - len(line)) + '\\\n')

    write('#define GPU_DRIVER_BUG_WORKAROUNDS(GPU_OP)')
    for w in workarounds:
      write(indent + macro + '(' + w.upper() + ',')
      write(indent + ' ' * (len(macro) + 1) + w + ')')

    # one extra line to consume the the last \
    f.write('// The End\n')


def main(argv):
  usage = "usage: %prog [options] file1 file2 file3 etc"
  parser = OptionParser(usage=usage)
  parser.add_option(
      "--output-file",
      dest="output_file",
      default="gpu_driver_bug_workaround_autogen.h",
      help="the name of the header file to write")

  (options, _) = parser.parse_args(args=argv)

  workarounds = merge_files_into_workarounds(parser.largs)
  write_header(options.output_file, workarounds)


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))