diff options
Diffstat (limited to 'build/clang-plugin/ThreadAllows.py')
-rw-r--r-- | build/clang-plugin/ThreadAllows.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/build/clang-plugin/ThreadAllows.py b/build/clang-plugin/ThreadAllows.py new file mode 100644 index 0000000000..e45f629254 --- /dev/null +++ b/build/clang-plugin/ThreadAllows.py @@ -0,0 +1,59 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. +import json + +FIRST_LINE = "// This file was generated by generate_thread_allows.py. DO NOT EDIT." + + +def generate_allows(input_paths): + """ + This script reads in the ThreadAllows.txt and ThreadFileAllows.txt lists + and generates a header file containing a two arrays of allowed threads. + These can be the following formats: + -Files which the checker should ignore + These files either contain definitions of NS_NewNamedThread or + use args which the plugin can't cast (such as func args). + -Thread names which the checker should ignore + Specifies which individual thread names to ignore. + """ + file_list = [] + name_list = [] + lines = set() + + for path in input_paths: + with open(path) as file: + lines.update(file.readlines()) + + for line in sorted(lines): + """ + We are assuming lines ending in .cpp, .h are files. Threads should + NOT have names containing filenames. Please don't do that. + """ + line = line.strip() + if line.endswith(".cpp") or line.endswith(".h"): + file_list.append(line) + else: + name_list.append(line) + file_list_s = ",\n ".join(json.dumps(elem) for elem in file_list) + name_list_s = ",\n ".join(json.dumps(elem) for elem in name_list) + output_string = ( + FIRST_LINE + + """ + +static const char *allow_thread_files[] = { + %s +}; + +static const char *allow_thread_names[] = { + %s +}; + + """ + % (file_list_s, name_list_s) + ) + return output_string + + +def generate_file(output, *input_paths): + output.write(generate_allows(input_paths)) |