summaryrefslogtreecommitdiffstats
path: root/build/clang-plugin/ThreadAllows.py
diff options
context:
space:
mode:
Diffstat (limited to 'build/clang-plugin/ThreadAllows.py')
-rw-r--r--build/clang-plugin/ThreadAllows.py59
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))