aboutsummaryrefslogtreecommitdiff
path: root/debug_info_test/allowlist.py
diff options
context:
space:
mode:
authorGeorge Burgess IV <gbiv@google.com>2020-06-24 15:45:15 -0700
committerCommit Bot <commit-bot@chromium.org>2020-06-25 18:34:08 +0000
commitad5e320d98f0101b5c094270d6f26dae981c1460 (patch)
treef757e2e15dc7c1d20d17f31b14e3d80baa7ad3da /debug_info_test/allowlist.py
parent536aff5f6d015f840bafd6ea70774bbc6b3da6f3 (diff)
downloadtoolchain-utils-ad5e320d98f0101b5c094270d6f26dae981c1460.tar.gz
debug_info_test: replace whitelist with allowlist
This CL tweaks language to better reflect the intent that's meant to be conveyed, per go/chromium-project-code-inclusion . This change is meant to trivially be a local, functional nop; renaming extensions will be a later CL. BUG=chromium:1099035 TEST=CQ+1 Change-Id: Iaee8b96c54660b4ebb4363a230e768c3da3f885a Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/2265049 Reviewed-by: Manoj Gupta <manojgupta@chromium.org> Tested-by: George Burgess <gbiv@chromium.org> Commit-Queue: George Burgess <gbiv@chromium.org>
Diffstat (limited to 'debug_info_test/allowlist.py')
-rw-r--r--debug_info_test/allowlist.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/debug_info_test/allowlist.py b/debug_info_test/allowlist.py
new file mode 100644
index 00000000..978b2370
--- /dev/null
+++ b/debug_info_test/allowlist.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+# Copyright 2018 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Allowlist functions."""
+
+from __future__ import print_function
+
+import glob
+import os
+import re
+
+
+# Matching a string of length m in an NFA of size n is O(mn^2), but the
+# performance also depends largely on the implementation. It appears to be fast
+# enough according to the tests.
+#
+# The performance bottleneck of this script is readelf. Unless this becomes
+# slower than readelf, don't waste time here.
+def is_allowlisted(list_name, pattern):
+ """Check whether the given pattern is specified in the allowlist.
+
+ Args:
+ list_name: name of the allowlist.
+ pattern: the target string.
+
+ Returns:
+ True if matched otherwise False.
+ """
+ return pattern and allowlists[list_name].match(pattern)
+
+
+def prepare_allowlist(patterns):
+ """Join and compile the re patterns.
+
+ Args:
+ patterns: regex patterns.
+
+ Returns:
+ A compiled re object.
+ """
+ return re.compile('|'.join(patterns))
+
+
+# FIXME: s/whitelist/allowlist/ in the file extension.
+def load_allowlists(dirname):
+ """Load allowlists under dirname.
+
+ An allowlist ends with .whitelist.
+
+ Args:
+ dirname: path to the dir.
+
+ Returns:
+ A dictionary of 'filename' -> allowlist matcher.
+ """
+ wlist = {}
+ for fn in glob.glob(os.path.join(dirname, '*.whitelist')):
+ key = os.path.splitext(os.path.basename(fn))[0]
+ with open(fn, 'r', encoding='utf-8') as f:
+ patterns = f.read().splitlines()
+ patterns = [l for l in patterns if l != '']
+ patterns = [l for l in patterns if l[0] != '#']
+ wlist[key] = prepare_allowlist(patterns)
+ return wlist
+
+
+allowlists = load_allowlists(os.path.dirname(__file__))