bpo-36876: Add a tool that identifies unsupported global C variables. (#15877)

diff --git a/Tools/c-analyzer/README b/Tools/c-analyzer/README
new file mode 100644
index 0000000..0ee8ac3
--- /dev/null
+++ b/Tools/c-analyzer/README
@@ -0,0 +1,41 @@
+#######################################
+# C Globals and CPython Runtime State.
+
+CPython's C code makes extensive use of global variables.  Each global
+falls into one of several categories:
+
+* (effectively) constants (incl. static types)
+* globals used exclusively in main or in the REPL
+* freelists, caches, and counters
+* process-global state
+* module state
+* Python runtime state
+
+The ignored-globals.txt file is organized similarly.  Of the different
+categories, the last two are problematic and generally should not exist
+in the codebase.
+
+Globals that hold module state (i.e. in Modules/*.c) cause problems
+when multiple interpreters are in use.  For more info, see PEP 3121,
+which addresses the situation for extension modules in general.
+
+Globals in the last category should be avoided as well.  The problem
+isn't with the Python runtime having state.  Rather, the problem is with
+that state being spread throughout the codebase in dozens of individual
+globals.  Unlike the other globals, the runtime state represents a set
+of values that are constantly shifting in a complex way.  When they are
+spread out it's harder to get a clear picture of what the runtime
+involves.  Furthermore, when they are spread out it complicates efforts
+that change the runtime.
+
+Consequently, the globals for Python's runtime state have been
+consolidated under a single top-level _PyRuntime global. No new globals
+should be added for runtime state.  Instead, they should be added to
+_PyRuntimeState or one of its sub-structs.  The check-c-globals script
+should be run to ensure that no new globals have been added:
+
+  python3 Tools/c-globals/check-c-globals.py
+
+If it reports any globals then they should be resolved.  If the globals
+are runtime state then they should be folded into _PyRuntimeState.
+Otherwise they should be added to ignored-globals.txt.
diff --git a/Tools/c-analyzer/c-globals.py b/Tools/c-analyzer/c-globals.py
new file mode 100644
index 0000000..9afe059
--- /dev/null
+++ b/Tools/c-analyzer/c-globals.py
@@ -0,0 +1,9 @@
+# This is a script equivalent of running "python -m test.test_c_globals.cg".
+
+from c_globals.__main__ import parse_args, main
+
+
+# This is effectively copied from cg/__main__.py:
+if __name__ == '__main__':
+    cmd, cmdkwargs = parse_args()
+    main(cmd, cmdkwargs)
diff --git a/Tools/c-analyzer/c_analyzer_common/__init__.py b/Tools/c-analyzer/c_analyzer_common/__init__.py
new file mode 100644
index 0000000..888b16f
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/__init__.py
@@ -0,0 +1,19 @@
+import os.path
+
+
+PKG_ROOT = os.path.dirname(__file__)
+DATA_DIR = os.path.dirname(PKG_ROOT)
+REPO_ROOT = os.path.dirname(
+        os.path.dirname(DATA_DIR))
+
+SOURCE_DIRS = [os.path.join(REPO_ROOT, name) for name in [
+        'Include',
+        'Python',
+        'Parser',
+        'Objects',
+        'Modules',
+        ]]
+
+
+# Clean up the namespace.
+del os
diff --git a/Tools/c-analyzer/c_analyzer_common/_generate.py b/Tools/c-analyzer/c_analyzer_common/_generate.py
new file mode 100644
index 0000000..1629aa6
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/_generate.py
@@ -0,0 +1,328 @@
+# The code here consists of hacks for pre-populating the known.tsv file.
+
+from c_parser.preprocessor import _iter_clean_lines
+from c_parser.naive import (
+        iter_variables, parse_variable_declaration, find_variables,
+        )
+from c_parser.info import Variable
+
+from . import SOURCE_DIRS, REPO_ROOT
+from .known import DATA_FILE as KNOWN_FILE, HEADER as KNOWN_HEADER
+from .info import UNKNOWN, ID
+from .util import write_tsv
+from .files import iter_cpython_files
+
+
+POTS = ('char ', 'wchar_t ', 'int ', 'Py_ssize_t ')
+POTS += tuple('const ' + v for v in POTS)
+STRUCTS = ('PyTypeObject', 'PyObject', 'PyMethodDef', 'PyModuleDef', 'grammar')
+
+
+def _parse_global(line, funcname=None):
+    line = line.strip()
+    if line.startswith('static '):
+        if '(' in line and '[' not in line and ' = ' not in line:
+            return None, None
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')):
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith('_Py_static_string('):
+        decl = line.strip(';').strip()
+        name = line.split('(')[1].split(',')[0].strip()
+    elif line.startswith('_Py_IDENTIFIER('):
+        decl = line.strip(';').strip()
+        name = 'PyId_' + line.split('(')[1].split(')')[0].strip()
+    elif funcname:
+        return None, None
+
+    # global-only
+    elif line.startswith('PyAPI_DATA('):  # only in .h files
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith('extern '):  # only in .h files
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith('PyDoc_VAR('):
+        decl = line.strip(';').strip()
+        name = line.split('(')[1].split(')')[0].strip()
+    elif line.startswith(POTS):  # implied static
+        if '(' in line and '[' not in line and ' = ' not in line:
+            return None, None
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith(STRUCTS) and line.endswith(' = {'):  # implied static
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith(STRUCTS) and line.endswith(' = NULL;'):  # implied static
+        name, decl = parse_variable_declaration(line)
+    elif line.startswith('struct '):
+        if not line.endswith(' = {'):
+            return None, None
+        if not line.partition(' ')[2].startswith(STRUCTS):
+            return None, None
+        # implied static
+        name, decl = parse_variable_declaration(line)
+
+    # file-specific
+    elif line.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')):
+        # Objects/typeobject.c
+        funcname = line.split('(')[1].split(',')[0]
+        return [
+                ('op_id', funcname, '_Py_static_string(op_id, OPSTR)'),
+                ('rop_id', funcname, '_Py_static_string(op_id, OPSTR)'),
+                ]
+    elif line.startswith('WRAP_METHOD('):
+        # Objects/weakrefobject.c
+        funcname, name = (v.strip() for v in line.split('(')[1].split(')')[0].split(','))
+        return [
+                ('PyId_' + name, funcname, f'_Py_IDENTIFIER({name})'),
+                ]
+
+    else:
+        return None, None
+    return name, decl
+
+
+def _pop_cached(varcache, filename, funcname, name, *,
+                _iter_variables=iter_variables,
+                ):
+    # Look for the file.
+    try:
+        cached = varcache[filename]
+    except KeyError:
+        cached = varcache[filename] = {}
+        for variable in _iter_variables(filename,
+                                        parse_variable=_parse_global,
+                                        ):
+            variable._isglobal = True
+            cached[variable.id] = variable
+        for var in cached:
+            print(' ', var)
+
+    # Look for the variable.
+    if funcname == UNKNOWN:
+        for varid in cached:
+            if varid.name == name:
+                break
+        else:
+            return None
+        return cached.pop(varid)
+    else:
+        return cached.pop((filename, funcname, name), None)
+
+
+def find_matching_variable(varid, varcache, allfilenames, *,
+                           _pop_cached=_pop_cached,
+                           ):
+    if varid.filename and varid.filename != UNKNOWN:
+        filenames = [varid.filename]
+    else:
+        filenames = allfilenames
+    for filename in filenames:
+        variable = _pop_cached(varcache, filename, varid.funcname, varid.name)
+        if variable is not None:
+            return variable
+    else:
+        if varid.filename and varid.filename != UNKNOWN and varid.funcname is None:
+            for filename in allfilenames:
+                if not filename.endswith('.h'):
+                    continue
+                variable = _pop_cached(varcache, filename, None, varid.name)
+                if variable is not None:
+                    return variable
+        return None
+
+
+MULTILINE = {
+    # Python/Python-ast.c
+    'Load_singleton': 'PyObject *',
+    'Store_singleton': 'PyObject *',
+    'Del_singleton': 'PyObject *',
+    'AugLoad_singleton': 'PyObject *',
+    'AugStore_singleton': 'PyObject *',
+    'Param_singleton': 'PyObject *',
+    'And_singleton': 'PyObject *',
+    'Or_singleton': 'PyObject *',
+    'Add_singleton': 'static PyObject *',
+    'Sub_singleton': 'static PyObject *',
+    'Mult_singleton': 'static PyObject *',
+    'MatMult_singleton': 'static PyObject *',
+    'Div_singleton': 'static PyObject *',
+    'Mod_singleton': 'static PyObject *',
+    'Pow_singleton': 'static PyObject *',
+    'LShift_singleton': 'static PyObject *',
+    'RShift_singleton': 'static PyObject *',
+    'BitOr_singleton': 'static PyObject *',
+    'BitXor_singleton': 'static PyObject *',
+    'BitAnd_singleton': 'static PyObject *',
+    'FloorDiv_singleton': 'static PyObject *',
+    'Invert_singleton': 'static PyObject *',
+    'Not_singleton': 'static PyObject *',
+    'UAdd_singleton': 'static PyObject *',
+    'USub_singleton': 'static PyObject *',
+    'Eq_singleton': 'static PyObject *',
+    'NotEq_singleton': 'static PyObject *',
+    'Lt_singleton': 'static PyObject *',
+    'LtE_singleton': 'static PyObject *',
+    'Gt_singleton': 'static PyObject *',
+    'GtE_singleton': 'static PyObject *',
+    'Is_singleton': 'static PyObject *',
+    'IsNot_singleton': 'static PyObject *',
+    'In_singleton': 'static PyObject *',
+    'NotIn_singleton': 'static PyObject *',
+    # Python/symtable.c
+    'top': 'static identifier ',
+    'lambda': 'static identifier ',
+    'genexpr': 'static identifier ',
+    'listcomp': 'static identifier ',
+    'setcomp': 'static identifier ',
+    'dictcomp': 'static identifier ',
+    '__class__': 'static identifier ',
+    # Python/compile.c
+    '__doc__': 'static PyObject *',
+    '__annotations__': 'static PyObject *',
+    # Objects/floatobject.c
+    'double_format': 'static float_format_type ',
+    'float_format': 'static float_format_type ',
+    'detected_double_format': 'static float_format_type ',
+    'detected_float_format': 'static float_format_type ',
+    # Parser/listnode.c
+    'level': 'static int ',
+    'atbol': 'static int ',
+    # Python/dtoa.c
+    'private_mem': 'static double private_mem[PRIVATE_mem]',
+    'pmem_next': 'static double *',
+    # Modules/_weakref.c
+    'weakref_functions': 'static PyMethodDef ',
+}
+INLINE = {
+    # Modules/_tracemalloc.c
+    'allocators': 'static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } ',
+    # Modules/faulthandler.c
+    'fatal_error': 'static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } ',
+    'thread': 'static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } ',
+    # Modules/signalmodule.c
+    'Handlers': 'static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG]',
+    'wakeup': 'static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } ',
+    # Python/dynload_shlib.c
+    'handles': 'static struct { dev_t dev; ino_t ino; void *handle; } handles[128]',
+    # Objects/obmalloc.c
+    '_PyMem_Debug': 'static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } ',
+    # Python/bootstrap_hash.c
+    'urandom_cache': 'static struct { int fd; dev_t st_dev; ino_t st_ino; } ',
+    }
+FUNC = {
+    # Objects/object.c
+    '_Py_abstract_hack': 'Py_ssize_t (*_Py_abstract_hack)(PyObject *)',
+    # Parser/myreadline.c
+    'PyOS_InputHook': 'int (*PyOS_InputHook)(void)',
+    # Python/pylifecycle.c
+    '_PyOS_mystrnicmp_hack': 'int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t)',
+    # Parser/myreadline.c
+    'PyOS_ReadlineFunctionPointer': 'char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)',
+    }
+IMPLIED = {
+    # Objects/boolobject.c
+    '_Py_FalseStruct': 'static struct _longobject ',
+    '_Py_TrueStruct': 'static struct _longobject ',
+    # Modules/config.c
+    '_PyImport_Inittab': 'struct _inittab _PyImport_Inittab[]',
+    }
+GLOBALS = {}
+GLOBALS.update(MULTILINE)
+GLOBALS.update(INLINE)
+GLOBALS.update(FUNC)
+GLOBALS.update(IMPLIED)
+
+LOCALS = {
+    'buildinfo': ('Modules/getbuildinfo.c',
+                  'Py_GetBuildInfo',
+                  'static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ?  sizeof(GITTAG) : sizeof(GITBRANCH))]'),
+    'methods': ('Python/codecs.c',
+                '_PyCodecRegistry_Init',
+                'static struct { char *name; PyMethodDef def; } methods[]'),
+    }
+
+
+def _known(symbol):
+    if symbol.funcname:
+        if symbol.funcname != UNKNOWN or symbol.filename != UNKNOWN:
+            raise KeyError(symbol.name)
+        filename, funcname, decl = LOCALS[symbol.name]
+        varid = ID(filename, funcname, symbol.name)
+    elif not symbol.filename or symbol.filename == UNKNOWN:
+        raise KeyError(symbol.name)
+    else:
+        varid = symbol.id
+        try:
+            decl = GLOBALS[symbol.name]
+        except KeyError:
+
+            if symbol.name.endswith('_methods'):
+                decl = 'static PyMethodDef '
+            elif symbol.filename == 'Objects/exceptions.c' and symbol.name.startswith(('PyExc_', '_PyExc_')):
+                decl = 'static PyTypeObject '
+            else:
+                raise
+    if symbol.name not in decl:
+        decl = decl + symbol.name
+    return Variable(varid, decl)
+
+
+def known_row(varid, decl):
+    return (
+            varid.filename,
+            varid.funcname or '-',
+            varid.name,
+            'variable',
+            decl,
+            )
+
+
+def known_rows(symbols, *,
+               cached=True,
+               _get_filenames=iter_cpython_files,
+               _find_match=find_matching_variable,
+               _find_symbols=find_variables,
+               _as_known=known_row,
+               ):
+    filenames = list(_get_filenames())
+    cache = {}
+    if cached:
+        for symbol in symbols:
+            try:
+                found = _known(symbol)
+            except KeyError:
+                found = _find_match(symbol, cache, filenames)
+                if found is None:
+                    found = Variable(symbol.id, UNKNOWN)
+            yield _as_known(found.id, found.vartype)
+    else:
+        raise NotImplementedError  # XXX incorporate KNOWN
+        for variable in _find_symbols(symbols, filenames,
+                                      srccache=cache,
+                                      parse_variable=_parse_global,
+                                      ):
+            #variable = variable._replace(
+            #    filename=os.path.relpath(variable.filename, REPO_ROOT))
+            if variable.funcname == UNKNOWN:
+                print(variable)
+            if variable.vartype== UNKNOWN:
+                print(variable)
+            yield _as_known(variable.id, variable.vartype)
+
+
+def generate(symbols, filename=None, *,
+             _generate_rows=known_rows,
+             _write_tsv=write_tsv,
+             ):
+    if not filename:
+        filename = KNOWN_FILE + '.new'
+
+    rows = _generate_rows(symbols)
+    _write_tsv(filename, KNOWN_HEADER, rows)
+
+
+if __name__ == '__main__':
+    from c_symbols import binary
+    symbols = binary.iter_symbols(
+            binary.PYTHON,
+            find_local_symbol=None,
+            )
+    generate(symbols)
diff --git a/Tools/c-analyzer/c_analyzer_common/files.py b/Tools/c-analyzer/c_analyzer_common/files.py
new file mode 100644
index 0000000..b3cd16c
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/files.py
@@ -0,0 +1,138 @@
+import glob
+import os
+import os.path
+
+from . import SOURCE_DIRS, REPO_ROOT
+
+
+C_SOURCE_SUFFIXES = ('.c', '.h')
+
+
+def _walk_tree(root, *,
+               _walk=os.walk,
+               ):
+    # A wrapper around os.walk that resolves the filenames.
+    for parent, _, names in _walk(root):
+        for name in names:
+            yield os.path.join(parent, name)
+
+
+def walk_tree(root, *,
+              suffix=None,
+              walk=_walk_tree,
+              ):
+    """Yield each file in the tree under the given directory name.
+
+    If "suffix" is provided then only files with that suffix will
+    be included.
+    """
+    if suffix and not isinstance(suffix, str):
+        raise ValueError('suffix must be a string')
+
+    for filename in walk(root):
+        if suffix and not filename.endswith(suffix):
+            continue
+        yield filename
+
+
+def glob_tree(root, *,
+              suffix=None,
+              _glob=glob.iglob,
+              ):
+    """Yield each file in the tree under the given directory name.
+
+    If "suffix" is provided then only files with that suffix will
+    be included.
+    """
+    suffix = suffix or ''
+    if not isinstance(suffix, str):
+        raise ValueError('suffix must be a string')
+
+    for filename in _glob(f'{root}/*{suffix}'):
+        yield filename
+    for filename in _glob(f'{root}/**/*{suffix}'):
+        yield filename
+
+
+def iter_files(root, suffix=None, relparent=None, *,
+               get_files=os.walk,
+               _glob=glob_tree,
+               _walk=walk_tree,
+               ):
+    """Yield each file in the tree under the given directory name.
+
+    If "root" is a non-string iterable then do the same for each of
+    those trees.
+
+    If "suffix" is provided then only files with that suffix will
+    be included.
+
+    if "relparent" is provided then it is used to resolve each
+    filename as a relative path.
+    """
+    if not isinstance(root, str):
+        roots = root
+        for root in roots:
+            yield from iter_files(root, suffix, relparent,
+                                  get_files=get_files,
+                                  _glob=_glob, _walk=_walk)
+        return
+
+    # Use the right "walk" function.
+    if get_files in (glob.glob, glob.iglob, glob_tree):
+        get_files = _glob
+    else:
+        _files = _walk_tree if get_files in (os.walk, walk_tree) else get_files
+        get_files = (lambda *a, **k: _walk(*a, walk=_files, **k))
+
+    # Handle a single suffix.
+    if suffix and not isinstance(suffix, str):
+        filenames = get_files(root)
+        suffix = tuple(suffix)
+    else:
+        filenames = get_files(root, suffix=suffix)
+        suffix = None
+
+    for filename in filenames:
+        if suffix and not isinstance(suffix, str):  # multiple suffixes
+            if not filename.endswith(suffix):
+                continue
+        if relparent:
+            filename = os.path.relpath(filename, relparent)
+        yield filename
+
+
+def iter_files_by_suffix(root, suffixes, relparent=None, *,
+                         walk=walk_tree,
+                         _iter_files=iter_files,
+                         ):
+    """Yield each file in the tree that has the given suffixes.
+
+    Unlike iter_files(), the results are in the original suffix order.
+    """
+    if isinstance(suffixes, str):
+        suffixes = [suffixes]
+    # XXX Ignore repeated suffixes?
+    for suffix in suffixes:
+        yield from _iter_files(root, suffix, relparent)
+
+
+def iter_cpython_files(*,
+                       walk=walk_tree,
+                       _files=iter_files_by_suffix,
+                       ):
+    """Yield each file in the tree for each of the given directory names."""
+    excludedtrees = [
+        os.path.join('Include', 'cpython', ''),
+        ]
+    def is_excluded(filename):
+        for root in excludedtrees:
+            if filename.startswith(root):
+                return True
+        return False
+    for filename in _files(SOURCE_DIRS, C_SOURCE_SUFFIXES, REPO_ROOT,
+                           walk=walk,
+                           ):
+        if is_excluded(filename):
+            continue
+        yield filename
diff --git a/Tools/c-analyzer/c_analyzer_common/info.py b/Tools/c-analyzer/c_analyzer_common/info.py
new file mode 100644
index 0000000..e217380
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/info.py
@@ -0,0 +1,69 @@
+from collections import namedtuple
+import re
+
+from .util import classonly, _NTBase
+
+
+UNKNOWN = '???'
+
+NAME_RE = re.compile(r'^([a-zA-Z]|_\w*[a-zA-Z]\w*|[a-zA-Z]\w*)$')
+
+
+class ID(_NTBase, namedtuple('ID', 'filename funcname name')):
+    """A unique ID for a single symbol or declaration."""
+
+    __slots__ = ()
+    # XXX Add optional conditions (tuple of strings) field.
+    #conditions = Slot()
+
+    @classonly
+    def from_raw(cls, raw):
+        if not raw:
+            return None
+        if isinstance(raw, str):
+            return cls(None, None, raw)
+        try:
+            name, = raw
+            filename = None
+        except ValueError:
+            try:
+                filename, name = raw
+            except ValueError:
+                return super().from_raw(raw)
+        return cls(filename, None, name)
+
+    def __new__(cls, filename, funcname, name):
+        self = super().__new__(
+                cls,
+                filename=str(filename) if filename else None,
+                funcname=str(funcname) if funcname else None,
+                name=str(name) if name else None,
+                )
+        #cls.conditions.set(self, tuple(str(s) if s else None
+        #                               for s in conditions or ()))
+        return self
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        if not self.name:
+            raise TypeError('missing name')
+        else:
+            if not NAME_RE.match(self.name):
+                raise ValueError(
+                        f'name must be an identifier, got {self.name!r}')
+
+        # Symbols from a binary might not have filename/funcname info.
+
+        if self.funcname:
+            if not self.filename:
+                raise TypeError('missing filename')
+            if not NAME_RE.match(self.funcname) and self.funcname != UNKNOWN:
+                raise ValueError(
+                        f'name must be an identifier, got {self.funcname!r}')
+
+        # XXX Require the filename (at least UNKONWN)?
+        # XXX Check the filename?
+
+    @property
+    def islocal(self):
+        return self.funcname is not None
diff --git a/Tools/c-analyzer/c_analyzer_common/known.py b/Tools/c-analyzer/c_analyzer_common/known.py
new file mode 100644
index 0000000..a0c6dfa
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/known.py
@@ -0,0 +1,67 @@
+import csv
+import os.path
+
+from c_parser.info import Variable
+
+from . import DATA_DIR
+from .info import ID, UNKNOWN
+from .util import read_tsv
+
+
+DATA_FILE = os.path.join(DATA_DIR, 'known.tsv')
+
+COLUMNS = ('filename', 'funcname', 'name', 'kind', 'declaration')
+HEADER = '\t'.join(COLUMNS)
+
+
+# XXX need tests:
+# * from_file()
+
+def from_file(infile, *,
+              _read_tsv=read_tsv,
+              ):
+    """Return the info for known declarations in the given file."""
+    known = {
+        'variables': {},
+        #'types': {},
+        #'constants': {},
+        #'macros': {},
+        }
+    for row in _read_tsv(infile, HEADER):
+        filename, funcname, name, kind, declaration = row
+        if not funcname or funcname == '-':
+            funcname = None
+        id = ID(filename, funcname, name)
+        if kind == 'variable':
+            values = known['variables']
+            value = Variable(id, declaration)
+            value._isglobal = _is_global(declaration) or id.funcname is None
+        else:
+            raise ValueError(f'unsupported kind in row {row}')
+        if value.name == 'id' and declaration == UNKNOWN:
+            # None of these are variables.
+            declaration = 'int id';
+        else:
+            value.validate()
+        values[id] = value
+    return known
+
+
+def _is_global(vartype):
+    # statics
+    if vartype.startswith('static '):
+        return True
+    if vartype.startswith(('Py_LOCAL(', 'Py_LOCAL_INLINE(')):
+        return True
+    if vartype.startswith(('_Py_IDENTIFIER(', '_Py_static_string(')):
+        return True
+    if vartype.startswith('PyDoc_VAR('):
+        return True
+    if vartype.startswith(('SLOT1BINFULL(', 'SLOT1BIN(')):
+        return True
+    if vartype.startswith('WRAP_METHOD('):
+        return True
+    # public extern
+    if vartype.startswith('PyAPI_DATA('):
+        return True
+    return False
diff --git a/Tools/c-analyzer/c_analyzer_common/util.py b/Tools/c-analyzer/c_analyzer_common/util.py
new file mode 100644
index 0000000..511c54f
--- /dev/null
+++ b/Tools/c-analyzer/c_analyzer_common/util.py
@@ -0,0 +1,214 @@
+import csv
+import subprocess
+
+
+_NOT_SET = object()
+
+
+def run_cmd(argv, **kwargs):
+    proc = subprocess.run(
+            argv,
+            #capture_output=True,
+            #stderr=subprocess.STDOUT,
+            stdout=subprocess.PIPE,
+            text=True,
+            check=True,
+            **kwargs
+            )
+    return proc.stdout
+
+
+def read_tsv(infile, header, *,
+             _open=open,
+             _get_reader=csv.reader,
+             ):
+    """Yield each row of the given TSV (tab-separated) file."""
+    if isinstance(infile, str):
+        with _open(infile, newline='') as infile:
+            yield from read_tsv(infile, header,
+                                _open=_open,
+                                _get_reader=_get_reader,
+                                )
+            return
+    lines = iter(infile)
+
+    # Validate the header.
+    try:
+        actualheader = next(lines).strip()
+    except StopIteration:
+        actualheader = ''
+    if actualheader != header:
+        raise ValueError(f'bad header {actualheader!r}')
+
+    for row in _get_reader(lines, delimiter='\t'):
+        yield tuple(v.strip() for v in row)
+
+
+def write_tsv(outfile, header, rows, *,
+             _open=open,
+             _get_writer=csv.writer,
+             ):
+    """Write each of the rows to the given TSV (tab-separated) file."""
+    if isinstance(outfile, str):
+        with _open(outfile, 'w', newline='') as outfile:
+            return write_tsv(outfile, header, rows,
+                            _open=_open,
+                            _get_writer=_get_writer,
+                            )
+
+    if isinstance(header, str):
+        header = header.split('\t')
+    writer = _get_writer(outfile, delimiter='\t')
+    writer.writerow(header)
+    for row in rows:
+        writer.writerow('' if v is None else str(v)
+                        for v in row)
+
+
+class Slot:
+    """A descriptor that provides a slot.
+
+    This is useful for types that can't have slots via __slots__,
+    e.g. tuple subclasses.
+    """
+
+    __slots__ = ('initial', 'default', 'readonly', 'instances', 'name')
+
+    def __init__(self, initial=_NOT_SET, *,
+                 default=_NOT_SET,
+                 readonly=False,
+                 ):
+        self.initial = initial
+        self.default = default
+        self.readonly = readonly
+
+        self.instances = {}
+        self.name = None
+
+    def __set_name__(self, cls, name):
+        if self.name is not None:
+            raise TypeError('already used')
+        self.name = name
+
+    def __get__(self, obj, cls):
+        if obj is None:  # called on the class
+            return self
+        try:
+            value = self.instances[id(obj)]
+        except KeyError:
+            if self.initial is _NOT_SET:
+                value = self.default
+            else:
+                value = self.initial
+            self.instances[id(obj)] = value
+        if value is _NOT_SET:
+            raise AttributeError(self.name)
+        # XXX Optionally make a copy?
+        return value
+
+    def __set__(self, obj, value):
+        if self.readonly:
+            raise AttributeError(f'{self.name} is readonly')
+        # XXX Optionally coerce?
+        self.instances[id(obj)] = value
+
+    def __delete__(self, obj):
+        if self.readonly:
+            raise AttributeError(f'{self.name} is readonly')
+        self.instances[id(obj)] = self.default
+
+    def set(self, obj, value):
+        """Update the cached value for an object.
+
+        This works even if the descriptor is read-only.  This is
+        particularly useful when initializing the object (e.g. in
+        its __new__ or __init__).
+        """
+        self.instances[id(obj)] = value
+
+
+class classonly:
+    """A non-data descriptor that makes a value only visible on the class.
+
+    This is like the "classmethod" builtin, but does not show up on
+    instances of the class.  It may be used as a decorator.
+    """
+
+    def __init__(self, value):
+        self.value = value
+        self.getter = classmethod(value).__get__
+        self.name = None
+
+    def __set_name__(self, cls, name):
+        if self.name is not None:
+            raise TypeError('already used')
+        self.name = name
+
+    def __get__(self, obj, cls):
+        if obj is not None:
+            raise AttributeError(self.name)
+        # called on the class
+        return self.getter(None, cls)
+
+
+class _NTBase:
+
+    __slots__ = ()
+
+    @classonly
+    def from_raw(cls, raw):
+        if not raw:
+            return None
+        elif isinstance(raw, cls):
+            return raw
+        elif isinstance(raw, str):
+            return cls.from_string(raw)
+        else:
+            if hasattr(raw, 'items'):
+                return cls(**raw)
+            try:
+                args = tuple(raw)
+            except TypeError:
+                pass
+            else:
+                return cls(*args)
+        raise NotImplementedError
+
+    @classonly
+    def from_string(cls, value):
+        """Return a new instance based on the given string."""
+        raise NotImplementedError
+
+    @classmethod
+    def _make(cls, iterable):  # The default _make() is not subclass-friendly.
+        return cls.__new__(cls, *iterable)
+
+    # XXX Always validate?
+    #def __init__(self, *args, **kwargs):
+    #    self.validate()
+
+    # XXX The default __repr__() is not subclass-friendly (where the name changes).
+    #def __repr__(self):
+    #    _, _, sig = super().__repr__().partition('(')
+    #    return f'{self.__class__.__name__}({sig}'
+
+    # To make sorting work with None:
+    def __lt__(self, other):
+        try:
+            return super().__lt__(other)
+        except TypeError:
+            if None in self:
+                return True
+            elif None in other:
+                return False
+            else:
+                raise
+
+    def validate(self):
+        return
+
+    # XXX Always validate?
+    #def _replace(self, **kwargs):
+    #    obj = super()._replace(**kwargs)
+    #    obj.validate()
+    #    return obj
diff --git a/Tools/c-analyzer/c_globals/README b/Tools/c-analyzer/c_globals/README
new file mode 100644
index 0000000..772b8be
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/README
@@ -0,0 +1,72 @@
+#######################################
+# C Globals and CPython Runtime State.
+
+CPython's C code makes extensive use of global variables (whether static
+globals or static locals).  Each such variable falls into one of several
+categories:
+
+* strictly const data
+* used exclusively in main or in the REPL
+* process-global state (e.g. managing process-level resources
+  like signals and file descriptors)
+* Python "global" runtime state
+* per-interpreter runtime state
+
+The last one can be a problem as soon as anyone creates a second
+interpreter (AKA "subinterpreter") in a process.  It is definitely a
+problem under subinterpreters if they are no longer sharing the GIL,
+since the GIL protects us from a lot of race conditions.  Keep in mind
+that ultimately *all* objects (PyObject) should be treated as
+per-interpreter state.  This includes "static types", freelists,
+_PyIdentifier, and singletons.  Take that in for a second.  It has
+significant implications on where we use static variables!
+
+Be aware that module-global state (stored in C statics) is a kind of
+per-interpreter state.  There have been efforts across many years, and
+still going, to provide extension module authors mechanisms to store
+that state safely (see PEPs 3121, 489, etc.).
+
+(Note that there has been discussion around support for running multiple
+Python runtimes in the same process.  That would ends up with the same
+problems, relative to static variables, that subinterpreters have.)
+
+Historically we have been bad at keeping per-interpreter state out of
+static variables, mostly because until recently subinterpreters were
+not widely used nor even factored in to solutions.  However, the
+feature is growing in popularity and use in the community.
+
+Mandate: "Eliminate use of static variables for per-interpreter state."
+
+The "c-statics.py" script in this directory, along with its accompanying
+data files, are part of the effort to resolve existing problems with
+our use of static variables and to prevent future problems.
+
+#-------------------------
+## statics for actually-global state (and runtime state consolidation)
+
+In general, holding any kind of state in static variables
+increases maintenance burden and increases the complexity of code (e.g.
+we use TSS to identify the active thread state).  So it is a good idea
+to avoid using statics for state even if for the "global" runtime or
+for process-global state.
+
+Relative to maintenance burden, one problem is where the runtime
+state is spread throughout the codebase in dozens of individual
+globals.  Unlike the other globals, the runtime state represents a set
+of values that are constantly shifting in a complex way.  When they are
+spread out it's harder to get a clear picture of what the runtime
+involves.  Furthermore, when they are spread out it complicates efforts
+that change the runtime.
+
+Consequently, the globals for Python's runtime state have been
+consolidated under a single top-level _PyRuntime global. No new globals
+should be added for runtime state.  Instead, they should be added to
+_PyRuntimeState or one of its sub-structs.  The tools in this directory
+are run as part of the test suite to ensure that no new globals have
+been added.  The script can be run manually as well:
+
+  ./python Lib/test/test_c_statics/c-statics.py check
+
+If it reports any globals then they should be resolved.  If the globals
+are runtime state then they should be folded into _PyRuntimeState.
+Otherwise they should be marked as ignored.
diff --git a/Tools/c-analyzer/c_globals/__init__.py b/Tools/c-analyzer/c_globals/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/__init__.py
diff --git a/Tools/c-analyzer/c_globals/__main__.py b/Tools/c-analyzer/c_globals/__main__.py
new file mode 100644
index 0000000..9570fb6
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/__main__.py
@@ -0,0 +1,209 @@
+import argparse
+import os.path
+import re
+import sys
+
+from c_analyzer_common import SOURCE_DIRS, REPO_ROOT
+from c_analyzer_common.info import UNKNOWN
+from c_analyzer_common.known import (
+    from_file as known_from_file,
+    DATA_FILE as KNOWN_FILE,
+    )
+from . import find, show
+from .supported import is_supported, ignored_from_file, IGNORED_FILE, _is_object
+
+
+def _match_unused_global(variable, knownvars, used):
+    found = []
+    for varid in knownvars:
+        if varid in used:
+            continue
+        if varid.funcname is not None:
+            continue
+        if varid.name != variable.name:
+            continue
+        if variable.filename and variable.filename != UNKNOWN:
+            if variable.filename == varid.filename:
+                found.append(varid)
+        else:
+            found.append(varid)
+    return found
+
+
+def _check_results(unknown, knownvars, used):
+    badknown = set()
+    for variable in sorted(unknown):
+        msg = None
+        if variable.funcname != UNKNOWN:
+            msg = f'could not find global symbol {variable.id}'
+        elif m := _match_unused_global(variable, knownvars, used):
+            assert isinstance(m, list)
+            badknown.update(m)
+        elif variable.name in ('completed', 'id'):  # XXX Figure out where these variables are.
+            unknown.remove(variable)
+        else:
+            msg = f'could not find local symbol {variable.id}'
+        if msg:
+            #raise Exception(msg)
+            print(msg)
+    if badknown:
+        print('---')
+        print(f'{len(badknown)} globals in known.tsv, but may actually be local:')
+        for varid in sorted(badknown):
+            print(f'{varid.filename:30} {varid.name}')
+    unused = sorted(varid
+                    for varid in set(knownvars) - used
+                    if varid.name != 'id')  # XXX Figure out where these variables are.
+    if unused:
+        print('---')
+        print(f'did not use {len(unused)} known vars:')
+        for varid in unused:
+            print(f'{varid.filename:30} {varid.funcname or "-":20} {varid.name}')
+        raise Exception('not all known symbols used')
+    if unknown:
+        print('---')
+        raise Exception('could not find all symbols')
+
+
+def _find_globals(dirnames, known, ignored):
+    if dirnames == SOURCE_DIRS:
+        dirnames = [os.path.relpath(d, REPO_ROOT) for d in dirnames]
+
+    ignored = ignored_from_file(ignored)
+    known = known_from_file(known)
+
+    used = set()
+    unknown = set()
+    knownvars = (known or {}).get('variables')
+    for variable in find.globals_from_binary(knownvars=knownvars,
+                                             dirnames=dirnames):
+    #for variable in find.globals(dirnames, known, kind='platform'):
+        if variable.vartype == UNKNOWN:
+            unknown.add(variable)
+            continue
+        yield variable, is_supported(variable, ignored, known)
+        used.add(variable.id)
+
+    #_check_results(unknown, knownvars, used)
+
+
+def cmd_check(cmd, dirs=SOURCE_DIRS, *,
+              ignored=IGNORED_FILE,
+              known=KNOWN_FILE,
+              _find=_find_globals,
+              _show=show.basic,
+              _print=print,
+              ):
+    """
+    Fail if there are unsupported globals variables.
+
+    In the failure case, the list of unsupported variables
+    will be printed out.
+    """
+    unsupported = [v for v, s in _find(dirs, known, ignored) if not s]
+    if not unsupported:
+        #_print('okay')
+        return
+
+    _print('ERROR: found unsupported global variables')
+    _print()
+    _show(sorted(unsupported))
+    _print(f' ({len(unsupported)} total)')
+    sys.exit(1)
+
+
+def cmd_show(cmd, dirs=SOURCE_DIRS, *,
+             ignored=IGNORED_FILE,
+             known=KNOWN_FILE,
+             skip_objects=False,
+              _find=_find_globals,
+             _show=show.basic,
+             _print=print,
+             ):
+    """
+    Print out the list of found global variables.
+
+    The variables will be distinguished as "supported" or "unsupported".
+    """
+    allsupported = []
+    allunsupported = []
+    for found, supported in _find(dirs, known, ignored):
+        if skip_objects:  # XXX Support proper filters instead.
+            if _is_object(found.vartype):
+                continue
+        (allsupported if supported else allunsupported
+         ).append(found)
+
+    _print('supported:')
+    _print('----------')
+    _show(sorted(allsupported))
+    _print(f' ({len(allsupported)} total)')
+    _print()
+    _print('unsupported:')
+    _print('------------')
+    _show(sorted(allunsupported))
+    _print(f' ({len(allunsupported)} total)')
+
+
+#############################
+# the script
+
+COMMANDS = {
+        'check': cmd_check,
+        'show': cmd_show,
+        }
+
+PROG = sys.argv[0]
+PROG = 'c-globals.py'
+
+
+def parse_args(prog=PROG, argv=sys.argv[1:], *, _fail=None):
+    common = argparse.ArgumentParser(add_help=False)
+    common.add_argument('--ignored', metavar='FILE',
+                        default=IGNORED_FILE,
+                        help='path to file that lists ignored vars')
+    common.add_argument('--known', metavar='FILE',
+                        default=KNOWN_FILE,
+                        help='path to file that lists known types')
+    common.add_argument('dirs', metavar='DIR', nargs='*',
+                        default=SOURCE_DIRS,
+                        help='a directory to check')
+
+    parser = argparse.ArgumentParser(
+            prog=prog,
+            )
+    subs = parser.add_subparsers(dest='cmd')
+
+    check = subs.add_parser('check', parents=[common])
+
+    show = subs.add_parser('show', parents=[common])
+    show.add_argument('--skip-objects', action='store_true')
+
+    if _fail is None:
+        def _fail(msg):
+            parser.error(msg)
+
+    # Now parse the args.
+    args = parser.parse_args(argv)
+    ns = vars(args)
+
+    cmd = ns.pop('cmd')
+    if not cmd:
+        _fail('missing command')
+
+    return cmd, ns
+
+
+def main(cmd, cmdkwargs=None, *, _COMMANDS=COMMANDS):
+    try:
+        cmdfunc = _COMMANDS[cmd]
+    except KeyError:
+        raise ValueError(
+            f'unsupported cmd {cmd!r}' if cmd else 'missing cmd')
+
+    cmdfunc(cmd, **cmdkwargs or {})
+
+
+if __name__ == '__main__':
+    cmd, cmdkwargs = parse_args()
+    main(cmd, cmdkwargs)
diff --git a/Tools/c-analyzer/c_globals/find.py b/Tools/c-analyzer/c_globals/find.py
new file mode 100644
index 0000000..a51b947
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/find.py
@@ -0,0 +1,95 @@
+from c_analyzer_common import SOURCE_DIRS
+from c_analyzer_common.info import UNKNOWN
+from c_symbols import (
+        info as s_info,
+        binary as b_symbols,
+        source as s_symbols,
+        resolve,
+        )
+from c_parser import info, declarations
+
+
+# XXX needs tests:
+# * iter_variables
+
+def globals_from_binary(binfile=b_symbols.PYTHON, *,
+                        knownvars=None,
+                        dirnames=None,
+                        _iter_symbols=b_symbols.iter_symbols,
+                        _resolve=resolve.symbols_to_variables,
+                        _get_symbol_resolver=resolve.get_resolver,
+                        ):
+    """Yield a Variable for each found Symbol.
+
+    Details are filled in from the given "known" variables and types.
+    """
+    symbols = _iter_symbols(binfile, find_local_symbol=None)
+    #symbols = list(symbols)
+    for variable in _resolve(symbols,
+                             resolve=_get_symbol_resolver(knownvars, dirnames),
+                             ):
+        # Skip each non-global variable (unless we couldn't find it).
+        # XXX Drop the "UNKNOWN" condition?
+        if not variable.isglobal and variable.vartype != UNKNOWN:
+            continue
+        yield variable
+
+
+def globals_from_declarations(dirnames=SOURCE_DIRS, *,
+                              known=None,
+                              ):
+    """Yield a Variable for each found declaration.
+
+    Details are filled in from the given "known" variables and types.
+    """
+    raise NotImplementedError
+
+
+def iter_variables(kind='platform', *,
+                   known=None,
+                   dirnames=None,
+                   _resolve_symbols=resolve.symbols_to_variables,
+                   _get_symbol_resolver=resolve.get_resolver,
+                   _symbols_from_binary=b_symbols.iter_symbols,
+                   _symbols_from_source=s_symbols.iter_symbols,
+                   _iter_raw=declarations.iter_all,
+                   _iter_preprocessed=declarations.iter_preprocessed,
+                   ):
+    """Yield a Variable for each one found (e.g. in files)."""
+    kind = kind or 'platform'
+
+    if kind == 'symbols':
+        knownvars = (known or {}).get('variables')
+        yield from _resolve_symbols(
+                _symbols_from_source(dirnames, known),
+                resolve=_get_symbol_resolver(knownvars, dirnames),
+                )
+    elif kind == 'platform':
+        knownvars = (known or {}).get('variables')
+        yield from _resolve_symbols(
+                _symbols_from_binary(find_local_symbol=None),
+                resolve=_get_symbol_resolver(knownvars, dirnames),
+                )
+    elif kind == 'declarations':
+        for decl in _iter_raw(dirnames):
+            if not isinstance(decl, info.Variable):
+                continue
+            yield decl
+    elif kind == 'preprocessed':
+        for decl in _iter_preprocessed(dirnames):
+            if not isinstance(decl, info.Variable):
+                continue
+            yield decl
+    else:
+        raise ValueError(f'unsupported kind {kind!r}')
+
+
+def globals(dirnames, known, *,
+            kind=None,  # Use the default.
+            _iter_variables=iter_variables,
+            ):
+    """Return a list of (StaticVar, <supported>) for each found global var."""
+    for found in _iter_variables(kind, known=known, dirnames=dirnames):
+        if not found.isglobal:
+            continue
+        yield found
diff --git a/Tools/c-analyzer/c_globals/show.py b/Tools/c-analyzer/c_globals/show.py
new file mode 100644
index 0000000..f4298b1
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/show.py
@@ -0,0 +1,16 @@
+
+def basic(globals, *,
+          _print=print):
+    """Print each row simply."""
+    for variable in globals:
+        if variable.funcname:
+            line = f'{variable.filename}:{variable.funcname}():{variable.name}'
+        else:
+            line = f'{variable.filename}:{variable.name}'
+        vartype = variable.vartype
+        #if vartype.startswith('static '):
+        #    vartype = vartype.partition(' ')[2]
+        #else:
+        #    vartype = '=' + vartype
+        line = f'{line:<64} {vartype}'
+        _print(line)
diff --git a/Tools/c-analyzer/c_globals/supported.py b/Tools/c-analyzer/c_globals/supported.py
new file mode 100644
index 0000000..4643e4e
--- /dev/null
+++ b/Tools/c-analyzer/c_globals/supported.py
@@ -0,0 +1,368 @@
+import os.path
+import re
+
+from c_analyzer_common import DATA_DIR
+from c_analyzer_common.info import ID
+from c_analyzer_common.util import read_tsv, write_tsv
+
+
+IGNORED_FILE = os.path.join(DATA_DIR, 'ignored.tsv')
+
+IGNORED_COLUMNS = ('filename', 'funcname', 'name', 'kind', 'reason')
+IGNORED_HEADER = '\t'.join(IGNORED_COLUMNS)
+
+# XXX Move these to ignored.tsv.
+IGNORED = {
+        # global
+        'PyImport_FrozenModules': 'process-global',
+        'M___hello__': 'process-global',
+        'inittab_copy': 'process-global',
+        'PyHash_Func': 'process-global',
+        '_Py_HashSecret_Initialized': 'process-global',
+        '_TARGET_LOCALES': 'process-global',
+
+        # startup (only changed before/during)
+        '_PyRuntime': 'runtime startup',
+        'runtime_initialized': 'runtime startup',
+        'static_arg_parsers': 'runtime startup',
+        'orig_argv': 'runtime startup',
+        'opt_ptr': 'runtime startup',
+        '_preinit_warnoptions': 'runtime startup',
+        '_Py_StandardStreamEncoding': 'runtime startup',
+        'Py_FileSystemDefaultEncoding': 'runtime startup',
+        '_Py_StandardStreamErrors': 'runtime startup',
+        'Py_FileSystemDefaultEncodeErrors': 'runtime startup',
+        'Py_BytesWarningFlag': 'runtime startup',
+        'Py_DebugFlag': 'runtime startup',
+        'Py_DontWriteBytecodeFlag': 'runtime startup',
+        'Py_FrozenFlag': 'runtime startup',
+        'Py_HashRandomizationFlag': 'runtime startup',
+        'Py_IgnoreEnvironmentFlag': 'runtime startup',
+        'Py_InspectFlag': 'runtime startup',
+        'Py_InteractiveFlag': 'runtime startup',
+        'Py_IsolatedFlag': 'runtime startup',
+        'Py_NoSiteFlag': 'runtime startup',
+        'Py_NoUserSiteDirectory': 'runtime startup',
+        'Py_OptimizeFlag': 'runtime startup',
+        'Py_QuietFlag': 'runtime startup',
+        'Py_UTF8Mode': 'runtime startup',
+        'Py_UnbufferedStdioFlag': 'runtime startup',
+        'Py_VerboseFlag': 'runtime startup',
+        '_Py_path_config': 'runtime startup',
+        '_PyOS_optarg': 'runtime startup',
+        '_PyOS_opterr': 'runtime startup',
+        '_PyOS_optind': 'runtime startup',
+        '_Py_HashSecret': 'runtime startup',
+
+        # REPL
+        '_PyOS_ReadlineLock': 'repl',
+        '_PyOS_ReadlineTState': 'repl',
+
+        # effectively const
+        'tracemalloc_empty_traceback': 'const',
+        '_empty_bitmap_node': 'const',
+        'posix_constants_pathconf': 'const',
+        'posix_constants_confstr': 'const',
+        'posix_constants_sysconf': 'const',
+        '_PySys_ImplCacheTag': 'const',
+        '_PySys_ImplName': 'const',
+        'PyImport_Inittab': 'const',
+        '_PyImport_DynLoadFiletab': 'const',
+        '_PyParser_Grammar': 'const',
+        'Py_hexdigits': 'const',
+        '_PyImport_Inittab': 'const',
+        '_PyByteArray_empty_string': 'const',
+        '_PyLong_DigitValue': 'const',
+        '_Py_SwappedOp': 'const',
+        'PyStructSequence_UnnamedField': 'const',
+
+        # signals are main-thread only
+        'faulthandler_handlers': 'signals are main-thread only',
+        'user_signals': 'signals are main-thread only',
+        'wakeup': 'signals are main-thread only',
+
+        # hacks
+        '_PySet_Dummy': 'only used as a placeholder',
+        }
+
+BENIGN = 'races here are benign and unlikely'
+
+
+def is_supported(variable, ignored=None, known=None, *,
+                 _ignored=(lambda *a, **k: _is_ignored(*a, **k)),
+                 _vartype_okay=(lambda *a, **k: _is_vartype_okay(*a, **k)),
+                 ):
+    """Return True if the given global variable is okay in CPython."""
+    if _ignored(variable,
+                ignored and ignored.get('variables')):
+        return True
+    elif _vartype_okay(variable.vartype,
+                       ignored.get('types')):
+        return True
+    else:
+        return False
+
+
+def _is_ignored(variable, ignoredvars=None, *,
+                _IGNORED=IGNORED,
+                ):
+    """Return the reason if the variable is a supported global.
+
+    Return None if the variable is not a supported global.
+    """
+    if ignoredvars and (reason := ignoredvars.get(variable.id)):
+        return reason
+
+    if variable.funcname is None:
+        if reason := _IGNORED.get(variable.name):
+            return reason
+
+    # compiler
+    if variable.filename == 'Python/graminit.c':
+        if variable.vartype.startswith('static state '):
+            return 'compiler'
+    if variable.filename == 'Python/symtable.c':
+        if variable.vartype.startswith('static identifier '):
+            return 'compiler'
+    if variable.filename == 'Python/Python-ast.c':
+        # These should be const.
+        if variable.name.endswith('_field'):
+            return 'compiler'
+        if variable.name.endswith('_attribute'):
+            return 'compiler'
+
+    # other
+    if variable.filename == 'Python/dtoa.c':
+        # guarded by lock?
+        if variable.name in ('p5s', 'freelist'):
+            return 'dtoa is thread-safe?'
+        if variable.name in ('private_mem', 'pmem_next'):
+            return 'dtoa is thread-safe?'
+    if variable.filename == 'Python/thread.c':
+        # Threads do not become an issue until after these have been set
+        # and these never get changed after that.
+        if variable.name in ('initialized', 'thread_debug'):
+            return 'thread-safe'
+    if variable.filename == 'Python/getversion.c':
+        if variable.name == 'version':
+            # Races are benign here, as well as unlikely.
+            return BENIGN
+    if variable.filename == 'Python/fileutils.c':
+        if variable.name == 'force_ascii':
+            return BENIGN
+        if variable.name == 'ioctl_works':
+            return BENIGN
+        if variable.name == '_Py_open_cloexec_works':
+            return BENIGN
+    if variable.filename == 'Python/codecs.c':
+        if variable.name == 'ucnhash_CAPI':
+            return BENIGN
+    if variable.filename == 'Python/bootstrap_hash.c':
+        if variable.name == 'getrandom_works':
+            return BENIGN
+    if variable.filename == 'Objects/unicodeobject.c':
+        if variable.name == 'ucnhash_CAPI':
+            return BENIGN
+        if variable.name == 'bloom_linebreak':
+            # *mostly* benign
+            return BENIGN
+    if variable.filename == 'Modules/getbuildinfo.c':
+        if variable.name == 'buildinfo':
+            # The static is used for pre-allocation.
+            return BENIGN
+    if variable.filename == 'Modules/posixmodule.c':
+        if variable.name == 'ticks_per_second':
+            return BENIGN
+        if variable.name == 'dup3_works':
+            return BENIGN
+    if variable.filename == 'Modules/timemodule.c':
+        if variable.name == 'ticks_per_second':
+            return BENIGN
+    if variable.filename == 'Objects/longobject.c':
+        if variable.name == 'log_base_BASE':
+            return BENIGN
+        if variable.name == 'convwidth_base':
+            return BENIGN
+        if variable.name == 'convmultmax_base':
+            return BENIGN
+
+    return None
+
+
+def _is_vartype_okay(vartype, ignoredtypes=None):
+    if _is_object(vartype):
+        return None
+
+    if vartype.startswith('static const '):
+        return 'const'
+    if vartype.startswith('const '):
+        return 'const'
+
+    # components for TypeObject definitions
+    for name in ('PyMethodDef', 'PyGetSetDef', 'PyMemberDef'):
+        if name in vartype:
+            return 'const'
+    for name in ('PyNumberMethods', 'PySequenceMethods', 'PyMappingMethods',
+                 'PyBufferProcs', 'PyAsyncMethods'):
+        if name in vartype:
+            return 'const'
+    for name in ('slotdef', 'newfunc'):
+        if name in vartype:
+            return 'const'
+
+    # structseq
+    for name in ('PyStructSequence_Desc', 'PyStructSequence_Field'):
+        if name in vartype:
+            return 'const'
+
+    # other definiitions
+    if 'PyModuleDef' in vartype:
+        return 'const'
+
+    # thread-safe
+    if '_Py_atomic_int' in vartype:
+        return 'thread-safe'
+    if 'pthread_condattr_t' in vartype:
+        return 'thread-safe'
+
+    # startup
+    if '_Py_PreInitEntry' in vartype:
+        return 'startup'
+
+    # global
+#    if 'PyMemAllocatorEx' in vartype:
+#        return True
+
+    # others
+#    if 'PyThread_type_lock' in vartype:
+#        return True
+
+    # XXX ???
+    # _Py_tss_t
+    # _Py_hashtable_t
+    # stack_t
+    # _PyUnicode_Name_CAPI
+
+    # functions
+    if '(' in vartype and '[' not in vartype:
+        return 'function pointer'
+
+    # XXX finish!
+    # * allow const values?
+    #raise NotImplementedError
+    return None
+
+
+def _is_object(vartype):
+    if re.match(r'.*\bPy\w*Object\b', vartype):
+        return True
+    if '_PyArg_Parser ' in vartype:
+        return True
+    if vartype.startswith(('_Py_IDENTIFIER(', 'static _Py_Identifier',
+                           '_Py_static_string(')):
+        return True
+    if 'traceback_t' in vartype:
+        return True
+    if 'PyAsyncGenASend' in vartype:
+        return True
+    if '_PyAsyncGenWrappedValue' in vartype:
+        return True
+    if 'PyContext' in vartype:
+        return True
+    if 'method_cache_entry' in vartype:
+        return True
+    if vartype.startswith('static identifier '):
+        return True
+    if vartype.endswith((' _Py_FalseStruct', ' _Py_TrueStruct')):
+        return True
+
+    # XXX Add more?
+
+    #for part in vartype.split():
+    #    # XXX const is automatic True?
+    #    if part == 'PyObject' or part.startswith('PyObject['):
+    #        return True
+    return False
+
+
+def ignored_from_file(infile, *,
+                      _read_tsv=read_tsv,
+                      ):
+    """Yield a Variable for each ignored var in the file."""
+    ignored = {
+        'variables': {},
+        #'types': {},
+        #'constants': {},
+        #'macros': {},
+        }
+    for row in _read_tsv(infile, IGNORED_HEADER):
+        filename, funcname, name, kind, reason = row
+        if not funcname or funcname == '-':
+            funcname = None
+        id = ID(filename, funcname, name)
+        if kind == 'variable':
+            values = ignored['variables']
+        else:
+            raise ValueError(f'unsupported kind in row {row}')
+        values[id] = reason
+    return ignored
+
+
+##################################
+# generate
+
+def _get_row(varid, reason):
+    return (
+            varid.filename,
+            varid.funcname or '-',
+            varid.name,
+            'variable',
+            str(reason),
+            )
+
+
+def _get_rows(variables, ignored=None, *,
+              _as_row=_get_row,
+              _is_ignored=_is_ignored,
+              _vartype_okay=_is_vartype_okay,
+              ):
+    count = 0
+    for variable in variables:
+        reason = _is_ignored(variable,
+                             ignored and ignored.get('variables'),
+                             )
+        if not reason:
+            reason = _vartype_okay(variable.vartype,
+                                   ignored and ignored.get('types'))
+        if not reason:
+            continue
+
+        print(' ', variable, repr(reason))
+        yield _as_row(variable.id, reason)
+        count += 1
+    print(f'total: {count}')
+
+
+def _generate_ignored_file(variables, filename=None, *,
+                           _generate_rows=_get_rows,
+                           _write_tsv=write_tsv,
+                           ):
+    if not filename:
+        filename = IGNORED_FILE + '.new'
+    rows = _generate_rows(variables)
+    _write_tsv(filename, IGNORED_HEADER, rows)
+
+
+if __name__ == '__main__':
+    from c_analyzer_common import SOURCE_DIRS
+    from c_analyzer_common.known import (
+        from_file as known_from_file,
+        DATA_FILE as KNOWN_FILE,
+        )
+    from . import find
+    known = known_from_file(KNOWN_FILE)
+    knownvars = (known or {}).get('variables')
+    variables = find.globals_from_binary(knownvars=knownvars,
+                                         dirnames=SOURCE_DIRS)
+
+    _generate_ignored_file(variables)
diff --git a/Tools/c-analyzer/c_parser/__init__.py b/Tools/c-analyzer/c_parser/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/__init__.py
diff --git a/Tools/c-analyzer/c_parser/declarations.py b/Tools/c-analyzer/c_parser/declarations.py
new file mode 100644
index 0000000..19fa3ff
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/declarations.py
@@ -0,0 +1,295 @@
+import re
+import shlex
+import subprocess
+
+from . import source
+
+
+IDENTIFIER = r'(?:[a-zA-z]|_+[a-zA-Z0-9]\w*)'
+
+TYPE_QUAL = r'(?:const|volatile)'
+
+VAR_TYPE_SPEC = r'''(?:
+        void |
+        (?:
+         (?:(?:un)?signed\s+)?
+         (?:
+          char |
+          short |
+          int |
+          long |
+          long\s+int |
+          long\s+long
+          ) |
+         ) |
+        float |
+        double |
+        {IDENTIFIER} |
+        (?:struct|union)\s+{IDENTIFIER}
+        )'''
+
+POINTER = rf'''(?:
+        (?:\s+const)?\s*[*]
+        )'''
+
+#STRUCT = r'''(?:
+#        (?:struct|(struct\s+%s))\s*[{]
+#            [^}]*
+#        [}]
+#        )''' % (IDENTIFIER)
+#UNION = r'''(?:
+#        (?:union|(union\s+%s))\s*[{]
+#            [^}]*
+#        [}]
+#        )''' % (IDENTIFIER)
+#DECL_SPEC = rf'''(?:
+#        ({VAR_TYPE_SPEC}) |
+#        ({STRUCT}) |
+#        ({UNION})
+#        )'''
+
+FUNC_START = rf'''(?:
+        (?:
+          (?:
+            extern |
+            static |
+            static\s+inline
+           )\s+
+         )?
+        #(?:const\s+)?
+        {VAR_TYPE_SPEC}
+        )'''
+#GLOBAL_VAR_START = rf'''(?:
+#        (?:
+#          (?:
+#            extern |
+#            static
+#           )\s+
+#         )?
+#        (?:
+#           {TYPE_QUAL}
+#           (?:\s+{TYPE_QUAL})?
+#         )?\s+
+#        {VAR_TYPE_SPEC}
+#        )'''
+GLOBAL_DECL_START_RE = re.compile(rf'''
+        ^
+        (?:
+            ({FUNC_START})
+         )
+        ''', re.VERBOSE)
+
+LOCAL_VAR_START = rf'''(?:
+        (?:
+          (?:
+            register |
+            static
+           )\s+
+         )?
+        (?:
+          (?:
+            {TYPE_QUAL}
+            (?:\s+{TYPE_QUAL})?
+           )\s+
+         )?
+        {VAR_TYPE_SPEC}
+        {POINTER}?
+        )'''
+LOCAL_STMT_START_RE = re.compile(rf'''
+        ^
+        (?:
+            ({LOCAL_VAR_START})
+         )
+        ''', re.VERBOSE)
+
+
+def iter_global_declarations(lines):
+    """Yield (decl, body) for each global declaration in the given lines.
+
+    For function definitions the header is reduced to one line and
+    the body is provided as-is.  For other compound declarations (e.g.
+    struct) the entire declaration is reduced to one line and "body"
+    is None.  Likewise for simple declarations (e.g. variables).
+
+    Declarations inside function bodies are ignored, though their text
+    is provided in the function body.
+    """
+    # XXX Bail out upon bogus syntax.
+    lines = source.iter_clean_lines(lines)
+    for line in lines:
+        if not GLOBAL_DECL_START_RE.match(line):
+            continue
+        # We only need functions here, since we only need locals for now.
+        if line.endswith(';'):
+            continue
+        if line.endswith('{') and '(' not in line:
+            continue
+
+        # Capture the function.
+        # (assume no func is a one-liner)
+        decl = line
+        while '{' not in line:  # assume no inline structs, etc.
+            try:
+                line = next(lines)
+            except StopIteration:
+                return
+            decl += ' ' + line
+
+        body, end = _extract_block(lines)
+        if end is None:
+            return
+        assert end == '}'
+        yield (f'{decl}\n{body}\n{end}', body)
+
+
+def iter_local_statements(lines):
+    """Yield (lines, blocks) for each statement in the given lines.
+
+    For simple statements, "blocks" is None and the statement is reduced
+    to a single line.  For compound statements, "blocks" is a pair of
+    (header, body) for each block in the statement.  The headers are
+    reduced to a single line each, but the bpdies are provided as-is.
+    """
+    # XXX Bail out upon bogus syntax.
+    lines = source.iter_clean_lines(lines)
+    for line in lines:
+        if not LOCAL_STMT_START_RE.match(line):
+            continue
+
+        stmt = line
+        blocks = None
+        if not line.endswith(';'):
+            # XXX Support compound & multiline simple statements.
+            #blocks = []
+            continue
+
+        yield (stmt, blocks)
+
+
+def _extract_block(lines):
+    end = None
+    depth = 1
+    body = []
+    for line in lines:
+        depth += line.count('{') - line.count('}')
+        if depth == 0:
+            end = line
+            break
+        body.append(line)
+    return '\n'.join(body), end
+
+
+def parse_func(stmt, body):
+    """Return (name, signature) for the given function definition."""
+    header, _, end = stmt.partition(body)
+    assert end.strip() == '}'
+    assert header.strip().endswith('{')
+    header, _, _= header.rpartition('{')
+
+    signature = ' '.join(header.strip().splitlines())
+
+    _, _, name = signature.split('(')[0].strip().rpartition(' ')
+    assert name
+
+    return name, signature
+
+
+def parse_var(stmt):
+    """Return (name, vartype) for the given variable declaration."""
+    stmt = stmt.rstrip(';')
+    m = LOCAL_STMT_START_RE.match(stmt)
+    assert m
+    vartype = m.group(0)
+    name = stmt[len(vartype):].partition('=')[0].strip()
+
+    if name.startswith('('):
+        name, _, after = name[1:].partition(')')
+        assert after
+        name = name.replace('*', '* ')
+        inside, _, name = name.strip().rpartition(' ')
+        vartype = f'{vartype} ({inside.strip()}){after}'
+    else:
+        name = name.replace('*', '* ')
+        before, _, name = name.rpartition(' ')
+        vartype = f'{vartype} {before}'
+
+    vartype = vartype.strip()
+    while '  ' in vartype:
+        vartype = vartype.replace('  ', ' ')
+
+    return name, vartype
+
+
+def parse_compound(stmt, blocks):
+    """Return (headers, bodies) for the given compound statement."""
+    # XXX Identify declarations inside compound statements
+    # (if/switch/for/while).
+    raise NotImplementedError
+
+
+def iter_variables(filename, *,
+                   _iter_source_lines=source.iter_lines,
+                   _iter_global=iter_global_declarations,
+                   _iter_local=iter_local_statements,
+                   _parse_func=parse_func,
+                   _parse_var=parse_var,
+                   _parse_compound=parse_compound,
+                   ):
+    """Yield (funcname, name, vartype) for every variable in the given file."""
+    lines = _iter_source_lines(filename)
+    for stmt, body in _iter_global(lines):
+        # At the file top-level we only have to worry about vars & funcs.
+        if not body:
+            name, vartype = _parse_var(stmt)
+            if name:
+                yield (None, name, vartype)
+        else:
+            funcname, _ = _parse_func(stmt, body)
+            localvars = _iter_locals(body,
+                                     _iter_statements=_iter_local,
+                                     _parse_var=_parse_var,
+                                     _parse_compound=_parse_compound,
+                                     )
+            for name, vartype in localvars:
+                yield (funcname, name, vartype)
+
+
+def _iter_locals(lines, *,
+                 _iter_statements=iter_local_statements,
+                 _parse_var=parse_var,
+                 _parse_compound=parse_compound,
+                 ):
+    compound = [lines]
+    while compound:
+        body = compound.pop(0)
+        bodylines = body.splitlines()
+        for stmt, blocks in _iter_statements(bodylines):
+            if not blocks:
+                name, vartype = _parse_var(stmt)
+                if name:
+                    yield (name, vartype)
+            else:
+                headers, bodies = _parse_compound(stmt, blocks)
+                for header in headers:
+                    for line in header:
+                        name, vartype = _parse_var(line)
+                        if name:
+                            yield (name, vartype)
+                compound.extend(bodies)
+
+
+def iter_all(dirnames):
+    """Yield a Declaration for each one found.
+
+    If there are duplicates, due to preprocessor conditionals, then
+    they are checked to make sure they are the same.
+    """
+    raise NotImplementedError
+
+
+def iter_preprocessed(dirnames):
+    """Yield a Declaration for each one found.
+
+    All source files are run through the preprocessor first.
+    """
+    raise NotImplementedError
diff --git a/Tools/c-analyzer/c_parser/info.py b/Tools/c-analyzer/c_parser/info.py
new file mode 100644
index 0000000..9ab6979
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/info.py
@@ -0,0 +1,78 @@
+from collections import namedtuple
+
+from c_analyzer_common import info, util
+from c_analyzer_common.util import classonly, _NTBase
+
+
+def normalize_vartype(vartype):
+    """Return the canonical form for a variable type (or func signature)."""
+    # We allow empty strring through for semantic reasons.
+    if vartype is None:
+        return None
+
+    # XXX finish!
+    # XXX Return (modifiers, type, pointer)?
+    return str(vartype)
+
+
+class Variable(_NTBase,
+               namedtuple('Variable', 'id vartype')):
+    """Information about a single variable declaration."""
+
+    __slots__ = ()
+    _isglobal = util.Slot()
+
+    @classonly
+    def from_parts(cls, filename, funcname, name, vartype, isglobal=False):
+        id = info.ID(filename, funcname, name)
+        self = cls(id, vartype)
+        if isglobal:
+            self._isglobal = True
+        return self
+
+    def __new__(cls, id, vartype):
+        self = super().__new__(
+                cls,
+                id=info.ID.from_raw(id),
+                vartype=normalize_vartype(vartype) if vartype else None,
+                )
+        return self
+
+    def __hash__(self):
+        return hash(self.id)
+
+    def __getattr__(self, name):
+        return getattr(self.id, name)
+
+    def _validate_id(self):
+        if not self.id:
+            raise TypeError('missing id')
+
+        if not self.filename or self.filename == info.UNKNOWN:
+            raise TypeError(f'id missing filename ({self.id})')
+
+        if self.funcname and self.funcname == info.UNKNOWN:
+            raise TypeError(f'id missing funcname ({self.id})')
+
+        self.id.validate()
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        self._validate_id()
+
+        if self.vartype is None or self.vartype == info.UNKNOWN:
+            raise TypeError('missing vartype')
+
+    @property
+    def isglobal(self):
+        try:
+            return self._isglobal
+        except AttributeError:
+            # XXX Include extern variables.
+            # XXX Ignore functions.
+            self._isglobal = ('static' in self.vartype.split())
+            return self._isglobal
+
+    @property
+    def isconst(self):
+        return 'const' in self.vartype.split()
diff --git a/Tools/c-analyzer/c_parser/naive.py b/Tools/c-analyzer/c_parser/naive.py
new file mode 100644
index 0000000..e0370cc
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/naive.py
@@ -0,0 +1,180 @@
+import re
+
+from c_analyzer_common.info import UNKNOWN
+
+from .info import Variable
+from .preprocessor import _iter_clean_lines
+
+
+_NOT_SET = object()
+
+
+def get_srclines(filename, *,
+                 cache=None,
+                 _open=open,
+                 _iter_lines=_iter_clean_lines,
+                 ):
+    """Return the file's lines as a list.
+
+    Each line will have trailing whitespace removed (including newline).
+
+    If a cache is given the it is used.
+    """
+    if cache is not None:
+        try:
+            return cache[filename]
+        except KeyError:
+            pass
+
+    with _open(filename) as srcfile:
+        srclines = [line
+                    for _, line in _iter_lines(srcfile)
+                    if not line.startswith('#')]
+    for i, line in enumerate(srclines):
+        srclines[i] = line.rstrip()
+
+    if cache is not None:
+        cache[filename] = srclines
+    return srclines
+
+
+def parse_variable_declaration(srcline):
+    """Return (name, decl) for the given declaration line."""
+    # XXX possible false negatives...
+    decl, sep, _ = srcline.partition('=')
+    if not sep:
+        if not srcline.endswith(';'):
+            return None, None
+        decl = decl.strip(';')
+    decl = decl.strip()
+    m = re.match(r'.*\b(\w+)\s*(?:\[[^\]]*\])?$', decl)
+    if not m:
+        return None, None
+    name = m.group(1)
+    return name, decl
+
+
+def parse_variable(srcline, funcname=None):
+    """Return a Variable for the variable declared on the line (or None)."""
+    line = srcline.strip()
+
+    # XXX Handle more than just static variables.
+    if line.startswith('static '):
+        if '(' in line and '[' not in line:
+            # a function
+            return None, None
+        return parse_variable_declaration(line)
+    else:
+        return None, None
+
+
+def iter_variables(filename, *,
+                   srccache=None,
+                   parse_variable=None,
+                   _get_srclines=get_srclines,
+                   _default_parse_variable=parse_variable,
+                   ):
+    """Yield a Variable for each in the given source file."""
+    if parse_variable is None:
+        parse_variable = _default_parse_variable
+
+    indent = ''
+    prev = ''
+    funcname = None
+    for line in _get_srclines(filename, cache=srccache):
+        # remember current funcname
+        if funcname:
+            if line == indent + '}':
+                funcname = None
+                continue
+        else:
+            if '(' in prev and line == indent + '{':
+                if not prev.startswith('__attribute__'):
+                    funcname = prev.split('(')[0].split()[-1]
+                    prev = ''
+                    continue
+            indent = line[:-len(line.lstrip())]
+            prev = line
+
+        info = parse_variable(line, funcname)
+        if isinstance(info, list):
+            for name, _funcname, decl in info:
+                yield Variable.from_parts(filename, _funcname, name, decl)
+            continue
+        name, decl = info
+
+        if name is None:
+            continue
+        yield Variable.from_parts(filename, funcname, name, decl)
+
+
+def _match_varid(variable, name, funcname, ignored=None):
+    if ignored and variable in ignored:
+        return False
+
+    if variable.name != name:
+        return False
+
+    if funcname == UNKNOWN:
+        if not variable.funcname:
+            return False
+    elif variable.funcname != funcname:
+        return False
+
+    return True
+
+
+def find_variable(filename, funcname, name, *,
+                  ignored=None,
+                  srccache=None,  # {filename: lines}
+                  parse_variable=None,
+                  _iter_variables=iter_variables,
+                  ):
+    """Return the matching variable.
+
+    Return None if the variable is not found.
+    """
+    for variable in _iter_variables(filename,
+                                    srccache=srccache,
+                                    parse_variable=parse_variable,
+                                    ):
+        if _match_varid(variable, name, funcname, ignored):
+            return variable
+    else:
+        return None
+
+
+def find_variables(varids, filenames=None, *,
+                   srccache=_NOT_SET,
+                   parse_variable=None,
+                   _find_symbol=find_variable,
+                   ):
+    """Yield a Variable for each ID.
+
+    If the variable is not found then its decl will be UNKNOWN.  That
+    way there will be one resulting Variable per given ID.
+    """
+    if srccache is _NOT_SET:
+        srccache = {}
+
+    used = set()
+    for varid in varids:
+        if varid.filename and varid.filename != UNKNOWN:
+            srcfiles = [varid.filename]
+        else:
+            if not filenames:
+                yield Variable(varid, UNKNOWN)
+                continue
+            srcfiles = filenames
+        for filename in srcfiles:
+            found = _find_varid(filename, varid.funcname, varid.name,
+                                 ignored=used,
+                                 srccache=srccache,
+                                 parse_variable=parse_variable,
+                                 )
+            if found:
+                yield found
+                used.add(found)
+                break
+        else:
+            yield Variable(varid, UNKNOWN)
diff --git a/Tools/c-analyzer/c_parser/preprocessor.py b/Tools/c-analyzer/c_parser/preprocessor.py
new file mode 100644
index 0000000..0e2866e
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/preprocessor.py
@@ -0,0 +1,512 @@
+from collections import namedtuple
+import shlex
+import os
+import re
+
+from c_analyzer_common import util
+from . import info
+
+
+CONTINUATION = '\\' + os.linesep
+
+IDENTIFIER = r'(?:\w*[a-zA-Z]\w*)'
+IDENTIFIER_RE = re.compile('^' + IDENTIFIER + '$')
+
+
+def _coerce_str(value):
+    if not value:
+        return ''
+    return str(value).strip()
+
+
+#############################
+# directives
+
+DIRECTIVE_START = r'''
+    (?:
+      ^ \s*
+      [#] \s*
+      )'''
+DIRECTIVE_TEXT = r'''
+    (?:
+      (?: \s+ ( .*\S ) )?
+      \s* $
+      )'''
+DIRECTIVE = rf'''
+    (?:
+      {DIRECTIVE_START}
+      (
+        include |
+        error | warning |
+        pragma |
+        define | undef |
+        if | ifdef | ifndef | elseif | else | endif |
+        __FILE__ | __LINE__ | __DATE __ | __TIME__ | __TIMESTAMP__
+        )
+      {DIRECTIVE_TEXT}
+      )'''
+#       (?:
+#        [^\\\n] |
+#        \\ [^\n] |
+#        \\ \n
+#        )+
+#      ) \n
+#     )'''
+DIRECTIVE_RE = re.compile(DIRECTIVE, re.VERBOSE)
+
+DEFINE = rf'''
+    (?:
+      {DIRECTIVE_START} define \s+
+      (?:
+        ( \w*[a-zA-Z]\w* )
+        (?: \s* [(] ([^)]*) [)] )?
+        )
+      {DIRECTIVE_TEXT}
+      )'''
+DEFINE_RE = re.compile(DEFINE, re.VERBOSE)
+
+
+def parse_directive(line):
+    """Return the appropriate directive for the given line."""
+    line = line.strip()
+    if line.startswith('#'):
+        line = line[1:].lstrip()
+        line = '#' + line
+    directive = line
+    #directive = '#' + line
+    while '  ' in directive:
+        directive = directive.replace('  ', ' ')
+    return _parse_directive(directive)
+
+
+def _parse_directive(line):
+    m = DEFINE_RE.match(line)
+    if m:
+        name, args, text = m.groups()
+        if args:
+            args = [a.strip() for a in args.split(',')]
+            return Macro(name, args, text)
+        else:
+            return Constant(name, text)
+
+    m = DIRECTIVE_RE.match(line)
+    if not m:
+        raise ValueError(f'unsupported directive {line!r}')
+    kind, text = m.groups()
+    if not text:
+        if kind not in ('else', 'endif'):
+            raise ValueError(f'missing text in directive {line!r}')
+    elif kind in ('else', 'endif', 'define'):
+        raise ValueError(f'unexpected text in directive {line!r}')
+    if kind == 'include':
+        directive = Include(text)
+    elif kind in IfDirective.KINDS:
+        directive = IfDirective(kind, text)
+    else:
+        directive = OtherDirective(kind, text)
+    directive.validate()
+    return directive
+
+
+class PreprocessorDirective(util._NTBase):
+    """The base class for directives."""
+
+    __slots__ = ()
+
+    KINDS = frozenset([
+            'include',
+            'pragma',
+            'error', 'warning',
+            'define', 'undef',
+            'if', 'ifdef', 'ifndef', 'elseif', 'else', 'endif',
+            '__FILE__', '__DATE__', '__LINE__', '__TIME__', '__TIMESTAMP__',
+            ])
+
+    @property
+    def text(self):
+        return ' '.join(v for v in self[1:] if v and v.strip()) or None
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if not self.kind:
+            raise TypeError('missing kind')
+        elif self.kind not in self.KINDS:
+            raise ValueError
+
+        # text can be anything, including None.
+
+
+class Constant(PreprocessorDirective,
+               namedtuple('Constant', 'kind name value')):
+    """A single "constant" directive ("define")."""
+
+    __slots__ = ()
+
+    def __new__(cls, name, value=None):
+        self = super().__new__(
+                cls,
+                'define',
+                name=_coerce_str(name) or None,
+                value=_coerce_str(value) or None,
+                )
+        return self
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if not self.name:
+            raise TypeError('missing name')
+        elif not IDENTIFIER_RE.match(self.name):
+            raise ValueError(f'name must be identifier, got {self.name!r}')
+
+        # value can be anything, including None
+
+
+class Macro(PreprocessorDirective,
+            namedtuple('Macro', 'kind name args body')):
+    """A single "macro" directive ("define")."""
+
+    __slots__ = ()
+
+    def __new__(cls, name, args, body=None):
+        # "args" must be a string or an iterable of strings (or "empty").
+        if isinstance(args, str):
+            args = [v.strip() for v in args.split(',')]
+        if args:
+            args = tuple(_coerce_str(a) or None for a in args)
+        self = super().__new__(
+                cls,
+                kind='define',
+                name=_coerce_str(name) or None,
+                args=args if args else (),
+                body=_coerce_str(body) or None,
+                )
+        return self
+
+    @property
+    def text(self):
+        if self.body:
+            return f'{self.name}({", ".join(self.args)}) {self.body}'
+        else:
+            return f'{self.name}({", ".join(self.args)})'
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if not self.name:
+            raise TypeError('missing name')
+        elif not IDENTIFIER_RE.match(self.name):
+            raise ValueError(f'name must be identifier, got {self.name!r}')
+
+        for arg in self.args:
+            if not arg:
+                raise ValueError(f'missing arg in {self.args}')
+            elif not IDENTIFIER_RE.match(arg):
+                raise ValueError(f'arg must be identifier, got {arg!r}')
+
+        # body can be anything, including None
+
+
+class IfDirective(PreprocessorDirective,
+                  namedtuple('IfDirective', 'kind condition')):
+    """A single conditional directive (e.g. "if", "ifdef").
+
+    This only includes directives that actually provide conditions.  The
+    related directives "else" and "endif" are covered by OtherDirective
+    instead.
+    """
+
+    __slots__ = ()
+
+    KINDS = frozenset([
+            'if',
+            'ifdef',
+            'ifndef',
+            'elseif',
+            ])
+
+    @classmethod
+    def _condition_from_raw(cls, raw, kind):
+        #return Condition.from_raw(raw, _kind=kind)
+        condition = _coerce_str(raw)
+        if not condition:
+            return None
+
+        if kind == 'ifdef':
+            condition = f'defined({condition})'
+        elif kind == 'ifndef':
+            condition = f'! defined({condition})'
+
+        return condition
+
+    def __new__(cls, kind, condition):
+        kind = _coerce_str(kind)
+        self = super().__new__(
+                cls,
+                kind=kind or None,
+                condition=cls._condition_from_raw(condition, kind),
+                )
+        return self
+
+    @property
+    def text(self):
+        if self.kind == 'ifdef':
+            return self.condition[8:-1]  # strip "defined("
+        elif self.kind == 'ifndef':
+            return self.condition[10:-1]  # strip "! defined("
+        else:
+            return self.condition
+        #return str(self.condition)
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if not self.condition:
+            raise TypeError('missing condition')
+        #else:
+        #    for cond in self.condition:
+        #        if not cond:
+        #            raise ValueError(f'missing condition in {self.condition}')
+        #        cond.validate()
+        #    if self.kind in ('ifdef', 'ifndef'):
+        #        if len(self.condition) != 1:
+        #            raise ValueError('too many condition')
+        #        if self.kind == 'ifdef':
+        #            if not self.condition[0].startswith('defined '):
+        #                raise ValueError('bad condition')
+        #        else:
+        #            if not self.condition[0].startswith('! defined '):
+        #                raise ValueError('bad condition')
+
+
+class Include(PreprocessorDirective,
+              namedtuple('Include', 'kind file')):
+    """A single "include" directive.
+
+    Supported "file" values are either follow the bracket style
+    (<stdio>) or double quotes ("spam.h").
+    """
+
+    __slots__ = ()
+
+    def __new__(cls, file):
+        self = super().__new__(
+                cls,
+                kind='include',
+                file=_coerce_str(file) or None,
+                )
+        return self
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if not self.file:
+            raise TypeError('missing file')
+
+
+class OtherDirective(PreprocessorDirective,
+                     namedtuple('OtherDirective', 'kind text')):
+    """A single directive not covered by another class.
+
+    This includes the "else", "endif", and "undef" directives, which are
+    otherwise inherently related to the directives covered by the
+    Constant, Macro, and IfCondition classes.
+
+    Note that all directives must have a text value, except for "else"
+    and "endif" (which must have no text).
+    """
+
+    __slots__ = ()
+
+    KINDS = PreprocessorDirective.KINDS - {'include', 'define'} - IfDirective.KINDS
+
+    def __new__(cls, kind, text):
+        self = super().__new__(
+                cls,
+                kind=_coerce_str(kind) or None,
+                text=_coerce_str(text) or None,
+                )
+        return self
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        super().validate()
+
+        if self.text:
+            if self.kind in ('else', 'endif'):
+                raise ValueError('unexpected text in directive')
+        elif self.kind not in ('else', 'endif'):
+            raise TypeError('missing text')
+
+
+#############################
+# iterating lines
+
+def _recompute_conditions(directive, ifstack):
+    if directive.kind in ('if', 'ifdef', 'ifndef'):
+        ifstack.append(
+                ([], directive.condition))
+    elif directive.kind == 'elseif':
+        if ifstack:
+            negated, active = ifstack.pop()
+            if active:
+                negated.append(active)
+        else:
+            negated = []
+        ifstack.append(
+                (negated, directive.condition))
+    elif directive.kind == 'else':
+        if ifstack:
+            negated, active = ifstack.pop()
+            if active:
+                negated.append(active)
+            ifstack.append(
+                    (negated, None))
+    elif directive.kind == 'endif':
+        if ifstack:
+            ifstack.pop()
+
+    conditions = []
+    for negated, active in ifstack:
+        for condition in negated:
+            conditions.append(f'! ({condition})')
+        if active:
+            conditions.append(active)
+    return tuple(conditions)
+
+
+def _iter_clean_lines(lines):
+    lines = iter(enumerate(lines, 1))
+    for lno, line in lines:
+        # Handle line continuations.
+        while line.endswith(CONTINUATION):
+            try:
+                lno, _line = next(lines)
+            except StopIteration:
+                break
+            line = line[:-len(CONTINUATION)] + ' ' + _line
+
+        # Deal with comments.
+        after = line
+        line = ''
+        while True:
+            # Look for a comment.
+            before, begin, remainder = after.partition('/*')
+            if '//' in before:
+                before, _, _ = before.partition('//')
+                line += before + ' '  # per the C99 spec
+                break
+            line += before
+            if not begin:
+                break
+            line += ' '  # per the C99 spec
+
+            # Go until we find the end of the comment.
+            _, end, after = remainder.partition('*/')
+            while not end:
+                try:
+                    lno, remainder = next(lines)
+                except StopIteration:
+                    raise Exception('unterminated comment')
+                _, end, after = remainder.partition('*/')
+
+        yield lno, line
+
+
+def iter_lines(lines, *,
+                   _iter_clean_lines=_iter_clean_lines,
+                   _parse_directive=_parse_directive,
+                   _recompute_conditions=_recompute_conditions,
+                   ):
+    """Yield (lno, line, directive, active conditions) for each given line.
+
+    This is effectively a subset of the operations taking place in
+    translation phases 2-4 from the C99 spec (ISO/IEC 9899:TC2); see
+    section 5.1.1.2.  Line continuations are removed and comments
+    replaced with a single space.  (In both cases "lno" will be the last
+    line involved.)  Otherwise each line is returned as-is.
+
+    "lno" is the (1-indexed) line number for the line.
+
+    "directive" will be a PreprocessorDirective or None, depending on
+    whether or not there is a directive on the line.
+
+    "active conditions" is the set of preprocessor conditions (e.g.
+    "defined()") under which the current line of code will be included
+    in compilation.  That set is derived from every conditional
+    directive block (e.g. "if defined()", "ifdef", "else") containing
+    that line.  That includes nested directives.  Note that the
+    current line does not affect the active conditions for iteself.
+    It only impacts subsequent lines.  That applies to directives
+    that close blocks (e.g. "endif") just as much as conditional
+    directvies.  Also note that "else" and "elseif" directives
+    update the active conditions (for later lines), rather than
+    adding to them.
+    """
+    ifstack = []
+    conditions = ()
+    for lno, line in _iter_clean_lines(lines):
+        stripped = line.strip()
+        if not stripped.startswith('#'):
+            yield lno, line, None, conditions
+            continue
+
+        directive = '#' + stripped[1:].lstrip()
+        while '  ' in directive:
+            directive = directive.replace('  ', ' ')
+        directive = _parse_directive(directive)
+        yield lno, line, directive, conditions
+
+        if directive.kind in ('else', 'endif'):
+            conditions = _recompute_conditions(directive, ifstack)
+        elif isinstance(directive, IfDirective):
+            conditions = _recompute_conditions(directive, ifstack)
+
+
+#############################
+# running (platform-specific?)
+
+def _gcc(filename, *,
+         _get_argv=(lambda: _get_gcc_argv()),
+         _run=util.run_cmd,
+         ):
+    argv = _get_argv()
+    argv.extend([
+            '-E', filename,
+            ])
+    output = _run(argv)
+    return output
+
+
+def _get_gcc_argv(*,
+                  _open=open,
+                  _run=util.run_cmd,
+                  ):
+    with _open('/tmp/print.mk', 'w') as tmpfile:
+        tmpfile.write('print-%:\n')
+        #tmpfile.write('\t@echo $* = $($*)\n')
+        tmpfile.write('\t@echo $($*)\n')
+    argv = ['/usr/bin/make',
+            '-f', 'Makefile',
+            '-f', '/tmp/print.mk',
+            'print-CC',
+            'print-PY_CORE_CFLAGS',
+            ]
+    output = _run(argv)
+    gcc, cflags = output.strip().splitlines()
+    argv = shlex.split(gcc.strip())
+    cflags = shlex.split(cflags.strip())
+    return argv + cflags
+
+
+def run(filename, *,
+        _gcc=_gcc,
+        ):
+    """Return the text of the given file after running the preprocessor."""
+    return _gcc(filename)
diff --git a/Tools/c-analyzer/c_parser/source.py b/Tools/c-analyzer/c_parser/source.py
new file mode 100644
index 0000000..f8998c8
--- /dev/null
+++ b/Tools/c-analyzer/c_parser/source.py
@@ -0,0 +1,34 @@
+from . import preprocessor
+
+
+def iter_clean_lines(lines):
+    incomment = False
+    for line in lines:
+        # Deal with comments.
+        if incomment:
+            _, sep, line = line.partition('*/')
+            if sep:
+                incomment = False
+            continue
+        line, _, _ = line.partition('//')
+        line, sep, remainder = line.partition('/*')
+        if sep:
+            _, sep, after = remainder.partition('*/')
+            if not sep:
+                incomment = True
+                continue
+            line += ' ' + after
+
+        # Ignore blank lines and leading/trailing whitespace.
+        line = line.strip()
+        if not line:
+            continue
+
+        yield line
+
+
+def iter_lines(filename, *,
+               preprocess=preprocessor.run,
+               ):
+    content = preprocess(filename)
+    return iter(content.splitlines())
diff --git a/Tools/c-analyzer/c_symbols/__init__.py b/Tools/c-analyzer/c_symbols/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/Tools/c-analyzer/c_symbols/__init__.py
diff --git a/Tools/c-analyzer/c_symbols/binary.py b/Tools/c-analyzer/c_symbols/binary.py
new file mode 100644
index 0000000..e125dbd5
--- /dev/null
+++ b/Tools/c-analyzer/c_symbols/binary.py
@@ -0,0 +1,157 @@
+import os
+import os.path
+import shutil
+import sys
+
+from c_analyzer_common import util, info
+from . import source
+from .info import Symbol
+
+
+#PYTHON = os.path.join(REPO_ROOT, 'python')
+PYTHON = sys.executable
+
+
+def iter_symbols(binary=PYTHON, dirnames=None, *,
+                 # Alternately, use look_up_known_symbol()
+                 # from c_globals.supported.
+                 find_local_symbol=source.find_symbol,
+                 _file_exists=os.path.exists,
+                 _iter_symbols_nm=(lambda b, *a: _iter_symbols_nm(b, *a)),
+                 ):
+    """Yield a Symbol for each symbol found in the binary."""
+    if not _file_exists(binary):
+        raise Exception('executable missing (need to build it first?)')
+
+    if find_local_symbol:
+        cache = {}
+        def find_local_symbol(name, *, _find=find_local_symbol):
+            return _find(name, dirnames, _perfilecache=cache)
+    else:
+        find_local_symbol = None
+
+    if os.name == 'nt':
+        # XXX Support this.
+        raise NotImplementedError
+    else:
+        yield from _iter_symbols_nm(binary, find_local_symbol)
+
+
+#############################
+# binary format (e.g. ELF)
+
+SPECIAL_SYMBOLS = {
+        '__bss_start',
+        '__data_start',
+        '__dso_handle',
+        '_DYNAMIC',
+        '_edata',
+        '_end',
+        '__environ@@GLIBC_2.2.5',
+        '_GLOBAL_OFFSET_TABLE_',
+        '__JCR_END__',
+        '__JCR_LIST__',
+        '__TMC_END__',
+        }
+
+
+def _is_special_symbol(name):
+    if name in SPECIAL_SYMBOLS:
+        return True
+    if '@@GLIBC' in name:
+        return True
+    return False
+
+
+#############################
+# "nm"
+
+NM_KINDS = {
+        'b': Symbol.KIND.VARIABLE,  # uninitialized
+        'd': Symbol.KIND.VARIABLE,  # initialized
+        #'g': Symbol.KIND.VARIABLE,  # uninitialized
+        #'s': Symbol.KIND.VARIABLE,  # initialized
+        't': Symbol.KIND.FUNCTION,
+        }
+
+
+def _iter_symbols_nm(binary, find_local_symbol=None,
+                     *,
+                     _which=shutil.which,
+                     _run=util.run_cmd,
+                     ):
+    nm = _which('nm')
+    if not nm:
+        raise NotImplementedError
+    argv = [nm,
+            '--line-numbers',
+            binary,
+            ]
+    try:
+        output = _run(argv)
+    except Exception:
+        if nm is None:
+            # XXX Use dumpbin.exe /SYMBOLS on Windows.
+            raise NotImplementedError
+        raise
+    for line in output.splitlines():
+        (name, kind, external, filename, funcname, vartype,
+         ) = _parse_nm_line(line,
+                            _find_local_symbol=find_local_symbol,
+                            )
+        if kind != Symbol.KIND.VARIABLE:
+            continue
+        elif _is_special_symbol(name):
+            continue
+        assert vartype is None
+        yield Symbol(
+                id=(filename, funcname, name),
+                kind=kind,
+                external=external,
+                )
+
+
+def _parse_nm_line(line, *, _find_local_symbol=None):
+    _origline = line
+    _, _, line = line.partition(' ')  # strip off the address
+    line = line.strip()
+
+    kind, _, line = line.partition(' ')
+    line = line.strip()
+    external = kind.isupper()
+    kind = NM_KINDS.get(kind.lower(), Symbol.KIND.OTHER)
+
+    name, _, filename = line.partition('\t')
+    name = name.strip()
+    if filename:
+        filename = os.path.relpath(filename.partition(':')[0])
+    else:
+        filename = info.UNKNOWN
+
+    vartype = None
+    name, islocal = _parse_nm_name(name, kind)
+    if islocal:
+        funcname = info.UNKNOWN
+        if _find_local_symbol is not None:
+            filename, funcname, vartype = _find_local_symbol(name)
+            filename = filename or info.UNKNOWN
+            funcname = funcname or info.UNKNOWN
+    else:
+        funcname = None
+        # XXX fine filename and vartype?
+    return name, kind, external, filename, funcname, vartype
+
+
+def _parse_nm_name(name, kind):
+    if kind != Symbol.KIND.VARIABLE:
+        return name, None
+    if _is_special_symbol(name):
+        return name, None
+
+    actual, sep, digits = name.partition('.')
+    if not sep:
+        return name, False
+
+    if not digits.isdigit():
+        raise Exception(f'got bogus name {name}')
+    return actual, True
diff --git a/Tools/c-analyzer/c_symbols/info.py b/Tools/c-analyzer/c_symbols/info.py
new file mode 100644
index 0000000..f6ed52c
--- /dev/null
+++ b/Tools/c-analyzer/c_symbols/info.py
@@ -0,0 +1,51 @@
+from collections import namedtuple
+
+from c_analyzer_common.info import ID
+from c_analyzer_common.util import classonly, _NTBase
+
+
+class Symbol(_NTBase, namedtuple('Symbol', 'id kind external')):
+    """Info for a single compilation symbol."""
+
+    __slots__ = ()
+
+    class KIND:
+        VARIABLE = 'variable'
+        FUNCTION = 'function'
+        OTHER = 'other'
+
+    @classonly
+    def from_name(cls, name, filename=None, kind=KIND.VARIABLE, external=None):
+        """Return a new symbol based on the given name."""
+        id = ID(filename, None, name)
+        return cls(id, kind, external)
+
+    def __new__(cls, id, kind=KIND.VARIABLE, external=None):
+        self = super().__new__(
+                cls,
+                id=ID.from_raw(id),
+                kind=str(kind) if kind else None,
+                external=bool(external) if external is not None else None,
+                )
+        return self
+
+    def __hash__(self):
+        return hash(self.id)
+
+    def __getattr__(self, name):
+        return getattr(self.id, name)
+
+    def validate(self):
+        """Fail if the object is invalid (i.e. init with bad data)."""
+        if not self.id:
+            raise TypeError('missing id')
+        else:
+            self.id.validate()
+
+        if not self.kind:
+            raise TypeError('missing kind')
+        elif self.kind not in vars(self.KIND).values():
+            raise ValueError(f'unsupported kind {self.kind}')
+
+        if self.external is None:
+            raise TypeError('missing external')
diff --git a/Tools/c-analyzer/c_symbols/resolve.py b/Tools/c-analyzer/c_symbols/resolve.py
new file mode 100644
index 0000000..dc876ae
--- /dev/null
+++ b/Tools/c-analyzer/c_symbols/resolve.py
@@ -0,0 +1,149 @@
+import os.path
+
+from c_analyzer_common import files
+from c_analyzer_common.info import UNKNOWN
+from c_parser import declarations, info
+from .info import Symbol
+from .source import _find_symbol
+
+
+# XXX need tests:
+# * look_up_known_symbol()
+# * symbol_from_source()
+# * get_resolver()
+# * symbols_to_variables()
+
+def look_up_known_symbol(symbol, knownvars, *,
+                         match_files=(lambda f1, f2: f1 == f2),
+                         ):
+    """Return the known variable matching the given symbol.
+
+    "knownvars" is a mapping of common.ID to parser.Variable.
+
+    "match_files" is used to verify if two filenames point to
+    the same file.
+    """
+    if not knownvars:
+        return None
+
+    if symbol.funcname == UNKNOWN:
+        if not symbol.filename or symbol.filename == UNKNOWN:
+            for varid in knownvars:
+                if not varid.funcname:
+                    continue
+                if varid.name == symbol.name:
+                    return knownvars[varid]
+            else:
+                return None
+        else:
+            for varid in knownvars:
+                if not varid.funcname:
+                    continue
+                if not match_files(varid.filename, symbol.filename):
+                    continue
+                if varid.name == symbol.name:
+                    return knownvars[varid]
+            else:
+                return None
+    elif not symbol.filename or symbol.filename == UNKNOWN:
+        raise NotImplementedError
+    else:
+        return knownvars.get(symbol.id)
+
+
+def find_in_source(symbol, dirnames, *,
+                   _perfilecache={},
+                   _find_symbol=_find_symbol,
+                   _iter_files=files.iter_files_by_suffix,
+                   ):
+    """Return the Variable matching the given Symbol.
+
+    If there is no match then return None.
+    """
+    if symbol.filename and symbol.filename != UNKNOWN:
+        filenames = [symbol.filename]
+    else:
+        filenames = _iter_files(dirnames, ('.c', '.h'))
+
+    if symbol.funcname and symbol.funcname != UNKNOWN:
+        raise NotImplementedError
+
+    (filename, funcname, vartype
+     ) = _find_symbol(symbol.name, filenames, _perfilecache)
+    if filename == UNKNOWN:
+        return None
+    return info.Variable(
+            id=(filename, funcname, symbol.name),
+            vartype=vartype,
+            )
+
+
+def get_resolver(knownvars=None, dirnames=None, *,
+                 _look_up_known=look_up_known_symbol,
+                 _from_source=find_in_source,
+                 ):
+    """Return a "resolver" func for the given known vars and dirnames.
+
+    The func takes a single Symbol and returns a corresponding Variable.
+    If the symbol was located then the variable will be valid, populated
+    with the corresponding information.  Otherwise None is returned.
+    """
+    if knownvars:
+        knownvars = dict(knownvars)  # a copy
+        def resolve_known(symbol):
+            found = _look_up_known(symbol, knownvars)
+            if found is None:
+                return None
+            elif symbol.funcname == UNKNOWN:
+                knownvars.pop(found.id)
+            elif not symbol.filename or symbol.filename == UNKNOWN:
+                knownvars.pop(found.id)
+            return found
+        if dirnames:
+            def resolve(symbol):
+                found = resolve_known(symbol)
+                if found is None:
+                    return None
+                    #return _from_source(symbol, dirnames)
+                else:
+                    for dirname in dirnames:
+                        if not dirname.endswith(os.path.sep):
+                            dirname += os.path.sep
+                        if found.filename.startswith(dirname):
+                            break
+                    else:
+                        return None
+                    return found
+        else:
+            resolve = resolve_known
+    elif dirnames:
+        def resolve(symbol):
+            return _from_source(symbol, dirnames)
+    else:
+        def resolve(symbol):
+            return None
+    return resolve
+
+
+def symbols_to_variables(symbols, *,
+                         resolve=(lambda s: look_up_known_symbol(s, None)),
+                         ):
+    """Yield the variable the matches each given symbol.
+
+    Use get_resolver() for a "resolve" func to use.
+    """
+    for symbol in symbols:
+        if isinstance(symbol, info.Variable):
+            # XXX validate?
+            yield symbol
+            continue
+        if symbol.kind != Symbol.KIND.VARIABLE:
+            continue
+        resolved = resolve(symbol)
+        if resolved is None:
+            #raise NotImplementedError(symbol)
+            resolved = info.Variable(
+                    id=symbol.id,
+                    vartype=UNKNOWN,
+                    )
+        yield resolved
diff --git a/Tools/c-analyzer/c_symbols/source.py b/Tools/c-analyzer/c_symbols/source.py
new file mode 100644
index 0000000..a724810
--- /dev/null
+++ b/Tools/c-analyzer/c_symbols/source.py
@@ -0,0 +1,58 @@
+from c_analyzer_common import files
+from c_analyzer_common.info import UNKNOWN
+from c_parser import declarations
+
+
+# XXX need tests:
+# * find_symbol()
+
+def find_symbol(name, dirnames, *,
+                _perfilecache,
+                _iter_files=files.iter_files_by_suffix,
+                **kwargs
+                ):
+    """Return (filename, funcname, vartype) for the matching Symbol."""
+    filenames = _iter_files(dirnames, ('.c', '.h'))
+    return _find_symbol(name, filenames, _perfilecache, **kwargs)
+
+
+def _get_symbols(filename, *,
+                 _iter_variables=declarations.iter_variables,
+                 ):
+    """Return the list of Symbols found in the given file."""
+    symbols = {}
+    for funcname, name, vartype in _iter_variables(filename):
+        if not funcname:
+            continue
+        try:
+            instances = symbols[name]
+        except KeyError:
+            instances = symbols[name] = []
+        instances.append((funcname, vartype))
+    return symbols
+
+
+def _find_symbol(name, filenames, _perfilecache, *,
+                _get_local_symbols=_get_symbols,
+                ):
+    for filename in filenames:
+        try:
+            symbols = _perfilecache[filename]
+        except KeyError:
+            symbols = _perfilecache[filename] = _get_local_symbols(filename)
+
+        try:
+            instances = symbols[name]
+        except KeyError:
+            continue
+
+        funcname, vartype = instances.pop(0)
+        if not instances:
+            symbols.pop(name)
+        return filename, funcname, vartype
+    else:
+        return UNKNOWN, UNKNOWN, UNKNOWN
+
+
+def iter_symbols():
+    raise NotImplementedError
diff --git a/Tools/c-analyzer/check-c-globals.py b/Tools/c-analyzer/check-c-globals.py
new file mode 100644
index 0000000..e68ed92
--- /dev/null
+++ b/Tools/c-analyzer/check-c-globals.py
@@ -0,0 +1,446 @@
+
+from collections import namedtuple
+import glob
+import os.path
+import re
+import shutil
+import sys
+import subprocess
+
+
+VERBOSITY = 2
+
+C_GLOBALS_DIR = os.path.abspath(os.path.dirname(__file__))
+TOOLS_DIR = os.path.dirname(C_GLOBALS_DIR)
+ROOT_DIR = os.path.dirname(TOOLS_DIR)
+GLOBALS_FILE = os.path.join(C_GLOBALS_DIR, 'ignored-globals.txt')
+
+SOURCE_DIRS = ['Include', 'Objects', 'Modules', 'Parser', 'Python']
+
+CAPI_REGEX = re.compile(r'^ *PyAPI_DATA\([^)]*\) \W*(_?Py\w+(?:, \w+)*\w).*;.*$')
+
+
+IGNORED_VARS = {
+        '_DYNAMIC',
+        '_GLOBAL_OFFSET_TABLE_',
+        '__JCR_LIST__',
+        '__JCR_END__',
+        '__TMC_END__',
+        '__bss_start',
+        '__data_start',
+        '__dso_handle',
+        '_edata',
+        '_end',
+        }
+
+
+def find_capi_vars(root):
+    capi_vars = {}
+    for dirname in SOURCE_DIRS:
+        for filename in glob.glob(os.path.join(ROOT_DIR, dirname, '**/*.[hc]'),
+                                  recursive=True):
+            with open(filename) as file:
+                for name in _find_capi_vars(file):
+                    if name in capi_vars:
+                        assert not filename.endswith('.c')
+                        assert capi_vars[name].endswith('.c')
+                    capi_vars[name] = filename
+    return capi_vars
+
+
+def _find_capi_vars(lines):
+    for line in lines:
+        if not line.startswith('PyAPI_DATA'):
+            continue
+        assert '{' not in line
+        match = CAPI_REGEX.match(line)
+        assert match
+        names, = match.groups()
+        for name in names.split(', '):
+            yield name
+
+
+def _read_global_names(filename):
+    # These variables are shared between all interpreters in the process.
+    with open(filename) as file:
+        return {line.partition('#')[0].strip()
+                for line in file
+                if line.strip() and not line.startswith('#')}
+
+
+def _is_global_var(name, globalnames):
+    if _is_autogen_var(name):
+        return True
+    if _is_type_var(name):
+        return True
+    if _is_module(name):
+        return True
+    if _is_exception(name):
+        return True
+    if _is_compiler(name):
+        return True
+    return name in globalnames
+
+
+def _is_autogen_var(name):
+    return (
+        name.startswith('PyId_') or
+        '.' in name or
+        # Objects/typeobject.c
+        name.startswith('op_id.') or
+        name.startswith('rop_id.') or
+        # Python/graminit.c
+        name.startswith('arcs_') or
+        name.startswith('states_')
+        )
+
+
+def _is_type_var(name):
+    if name.endswith(('Type', '_Type', '_type')):  # XXX Always a static type?
+        return True
+    if name.endswith('_desc'):  # for structseq types
+        return True
+    return (
+        name.startswith('doc_') or
+        name.endswith(('_doc', '__doc__', '_docstring')) or
+        name.endswith('_methods') or
+        name.endswith('_fields') or
+        name.endswith(('_memberlist', '_members')) or
+        name.endswith('_slots') or
+        name.endswith(('_getset', '_getsets', '_getsetlist')) or
+        name.endswith('_as_mapping') or
+        name.endswith('_as_number') or
+        name.endswith('_as_sequence') or
+        name.endswith('_as_buffer') or
+        name.endswith('_as_async')
+        )
+
+
+def _is_module(name):
+    if name.endswith(('_functions', 'Methods', '_Methods')):
+        return True
+    if name == 'module_def':
+        return True
+    if name == 'initialized':
+        return True
+    return name.endswith(('module', '_Module'))
+
+
+def _is_exception(name):
+    # Other vars are enumerated in globals-core.txt.
+    if not name.startswith(('PyExc_', '_PyExc_')):
+        return False
+    return name.endswith(('Error', 'Warning'))
+
+
+def _is_compiler(name):
+    return (
+        # Python/Python-ast.c
+        name.endswith('_type') or
+        name.endswith('_singleton') or
+        name.endswith('_attributes')
+        )
+
+
+class Var(namedtuple('Var', 'name kind scope capi filename')):
+
+    @classmethod
+    def parse_nm(cls, line, expected, ignored, capi_vars, globalnames):
+        _, _, line = line.partition(' ')  # strip off the address
+        line = line.strip()
+        kind, _, line = line.partition(' ')
+        if kind in ignored or ():
+            return None
+        elif kind not in expected or ():
+            raise RuntimeError('unsupported NM type {!r}'.format(kind))
+
+        name, _, filename = line.partition('\t')
+        name = name.strip()
+        if _is_autogen_var(name):
+            return None
+        if _is_global_var(name, globalnames):
+            scope = 'global'
+        else:
+            scope = None
+        capi = (name in capi_vars or ())
+        if filename:
+            filename = os.path.relpath(filename.partition(':')[0])
+        return cls(name, kind, scope, capi, filename or '~???~')
+
+    @property
+    def external(self):
+        return self.kind.isupper()
+
+
+def find_vars(root, globals_filename=GLOBALS_FILE):
+    python = os.path.join(root, 'python')
+    if not os.path.exists(python):
+        raise RuntimeError('python binary missing (need to build it first?)')
+    capi_vars = find_capi_vars(root)
+    globalnames = _read_global_names(globals_filename)
+
+    nm = shutil.which('nm')
+    if nm is None:
+        # XXX Use dumpbin.exe /SYMBOLS on Windows.
+        raise NotImplementedError
+    else:
+        yield from (var
+                    for var in _find_var_symbols(python, nm, capi_vars,
+                                                 globalnames)
+                    if var.name not in IGNORED_VARS)
+
+
+NM_FUNCS = set('Tt')
+NM_PUBLIC_VARS = set('BD')
+NM_PRIVATE_VARS = set('bd')
+NM_VARS = NM_PUBLIC_VARS | NM_PRIVATE_VARS
+NM_DATA = set('Rr')
+NM_OTHER = set('ACGgiINpSsuUVvWw-?')
+NM_IGNORED = NM_FUNCS | NM_DATA | NM_OTHER
+
+
+def _find_var_symbols(python, nm, capi_vars, globalnames):
+    args = [nm,
+            '--line-numbers',
+            python]
+    out = subprocess.check_output(args)
+    for line in out.decode('utf-8').splitlines():
+        var = Var.parse_nm(line, NM_VARS, NM_IGNORED, capi_vars, globalnames)
+        if var is None:
+            continue
+        yield var
+
+
+#######################################
+
+class Filter(namedtuple('Filter', 'name op value action')):
+
+    @classmethod
+    def parse(cls, raw):
+        action = '+'
+        if raw.startswith(('+', '-')):
+            action = raw[0]
+            raw = raw[1:]
+        # XXX Support < and >?
+        name, op, value = raw.partition('=')
+        return cls(name, op, value, action)
+
+    def check(self, var):
+        value = getattr(var, self.name, None)
+        if not self.op:
+            matched = bool(value)
+        elif self.op == '=':
+            matched = (value == self.value)
+        else:
+            raise NotImplementedError
+
+        if self.action == '+':
+            return matched
+        elif self.action == '-':
+            return not matched
+        else:
+            raise NotImplementedError
+
+
+def filter_var(var, filters):
+    for filter in filters:
+        if not filter.check(var):
+            return False
+    return True
+
+
+def make_sort_key(spec):
+    columns = [(col.strip('_'), '_' if col.startswith('_') else '')
+               for col in spec]
+    def sort_key(var):
+        return tuple(getattr(var, col).lstrip(prefix)
+                     for col, prefix in columns)
+    return sort_key
+
+
+def make_groups(allvars, spec):
+    group = spec
+    groups = {}
+    for var in allvars:
+        value = getattr(var, group)
+        key = '{}: {}'.format(group, value)
+        try:
+            groupvars = groups[key]
+        except KeyError:
+            groupvars = groups[key] = []
+        groupvars.append(var)
+    return groups
+
+
+def format_groups(groups, columns, fmts, widths):
+    for group in sorted(groups):
+        groupvars = groups[group]
+        yield '', 0
+        yield '  # {}'.format(group), 0
+        yield from format_vars(groupvars, columns, fmts, widths)
+
+
+def format_vars(allvars, columns, fmts, widths):
+    fmt = ' '.join(fmts[col] for col in columns)
+    fmt = ' ' + fmt.replace(' ', '   ') + ' '  # for div margin
+    header = fmt.replace(':', ':^').format(*(col.upper() for col in columns))
+    yield header, 0
+    div = ' '.join('-'*(widths[col]+2) for col in columns)
+    yield div, 0
+    for var in allvars:
+        values = (getattr(var, col) for col in columns)
+        row = fmt.format(*('X' if val is True else val or ''
+                           for val in values))
+        yield row, 1
+    yield div, 0
+
+
+#######################################
+
+COLUMNS = 'name,external,capi,scope,filename'
+COLUMN_NAMES = COLUMNS.split(',')
+
+COLUMN_WIDTHS = {col: len(col)
+                 for col in COLUMN_NAMES}
+COLUMN_WIDTHS.update({
+        'name': 50,
+        'scope': 7,
+        'filename': 40,
+        })
+COLUMN_FORMATS = {col: '{:%s}' % width
+                  for col, width in COLUMN_WIDTHS.items()}
+for col in COLUMN_FORMATS:
+    if COLUMN_WIDTHS[col] == len(col):
+        COLUMN_FORMATS[col] = COLUMN_FORMATS[col].replace(':', ':^')
+
+
+def _parse_filters_arg(raw, error):
+    filters = []
+    for value in raw.split(','):
+        value=value.strip()
+        if not value:
+            continue
+        try:
+            filter = Filter.parse(value)
+            if filter.name not in COLUMN_NAMES:
+                raise Exception('unsupported column {!r}'.format(filter.name))
+        except Exception as e:
+            error('bad filter {!r}: {}'.format(raw, e))
+        filters.append(filter)
+    return filters
+
+
+def _parse_columns_arg(raw, error):
+    columns = raw.split(',')
+    for column in columns:
+        if column not in COLUMN_NAMES:
+            error('unsupported column {!r}'.format(column))
+    return columns
+
+
+def _parse_sort_arg(raw, error):
+    sort = raw.split(',')
+    for column in sort:
+        if column.lstrip('_') not in COLUMN_NAMES:
+            error('unsupported column {!r}'.format(column))
+    return sort
+
+
+def _parse_group_arg(raw, error):
+    if not raw:
+        return raw
+    group = raw
+    if group not in COLUMN_NAMES:
+        error('unsupported column {!r}'.format(group))
+    if group != 'filename':
+        error('unsupported group {!r}'.format(group))
+    return group
+
+
+def parse_args(argv=None):
+    if argv is None:
+        argv = sys.argv[1:]
+
+    import argparse
+    parser = argparse.ArgumentParser()
+
+    parser.add_argument('-v', '--verbose', action='count', default=0)
+    parser.add_argument('-q', '--quiet', action='count', default=0)
+
+    parser.add_argument('--filters', default='-scope',
+                        help='[[-]<COLUMN>[=<GLOB>]] ...')
+
+    parser.add_argument('--columns', default=COLUMNS,
+                        help='a comma-separated list of columns to show')
+    parser.add_argument('--sort', default='filename,_name',
+                        help='a comma-separated list of columns to sort')
+    parser.add_argument('--group',
+                        help='group by the given column name (- to not group)')
+
+    parser.add_argument('--rc-on-match', dest='rc', type=int)
+
+    parser.add_argument('filename', nargs='?', default=GLOBALS_FILE)
+
+    args = parser.parse_args(argv)
+
+    verbose = vars(args).pop('verbose', 0)
+    quiet = vars(args).pop('quiet', 0)
+    args.verbosity = max(0, VERBOSITY + verbose - quiet)
+
+    if args.sort.startswith('filename') and not args.group:
+        args.group = 'filename'
+
+    if args.rc is None:
+        if '-scope=core' in args.filters or 'core' not in args.filters:
+            args.rc = 0
+        else:
+            args.rc = 1
+
+    args.filters = _parse_filters_arg(args.filters, parser.error)
+    args.columns = _parse_columns_arg(args.columns, parser.error)
+    args.sort = _parse_sort_arg(args.sort, parser.error)
+    args.group = _parse_group_arg(args.group, parser.error)
+
+    return args
+
+
+def main(root=ROOT_DIR, filename=GLOBALS_FILE,
+         filters=None, columns=COLUMN_NAMES, sort=None, group=None,
+         verbosity=VERBOSITY, rc=1):
+
+    log = lambda msg: ...
+    if verbosity >= 2:
+        log = lambda msg: print(msg)
+
+    allvars = (var
+               for var in find_vars(root, filename)
+               if filter_var(var, filters))
+    if sort:
+        allvars = sorted(allvars, key=make_sort_key(sort))
+
+    if group:
+        try:
+            columns.remove(group)
+        except ValueError:
+            pass
+        grouped = make_groups(allvars, group)
+        lines = format_groups(grouped, columns, COLUMN_FORMATS, COLUMN_WIDTHS)
+    else:
+        lines = format_vars(allvars, columns, COLUMN_FORMATS, COLUMN_WIDTHS)
+
+    total = 0
+    for line, count in lines:
+        total += count
+        log(line)
+    log('\ntotal: {}'.format(total))
+
+    if total and rc:
+        print('ERROR: found unsafe globals', file=sys.stderr)
+        return rc
+    return 0
+
+
+if __name__ == '__main__':
+    args = parse_args()
+    sys.exit(
+            main(**vars(args)))
diff --git a/Tools/c-analyzer/ignored-globals.txt b/Tools/c-analyzer/ignored-globals.txt
new file mode 100644
index 0000000..ce6d1d8
--- /dev/null
+++ b/Tools/c-analyzer/ignored-globals.txt
@@ -0,0 +1,492 @@
+# All variables declared here are shared between all interpreters
+# in a single process.  That means that they must not be changed
+# unless that change should apply to all interpreters.
+#
+# See check-c-globals.py.
+#
+# Many generic names are handled via the script:
+#
+# * most exceptions and all warnings handled via _is_exception()
+# * for builtin modules, generic names are handled via _is_module()
+# * generic names for static types handled via _is_type_var()
+# * AST vars handled via _is_compiler()
+
+
+#######################################
+# main
+
+# Modules/getpath.c
+exec_prefix
+module_search_path
+prefix
+progpath
+
+# Modules/main.c
+orig_argc
+orig_argv
+
+# Python/getopt.c
+opt_ptr
+_PyOS_optarg
+_PyOS_opterr
+_PyOS_optind
+
+
+#######################################
+# REPL
+
+# Parser/myreadline.c
+PyOS_InputHook
+PyOS_ReadlineFunctionPointer
+_PyOS_ReadlineLock
+_PyOS_ReadlineTState
+
+
+#######################################
+# state
+
+# Python/dtoa.c
+p5s
+pmem_next  # very slight race
+private_mem  # very slight race
+
+# Python/import.c
+# For the moment the import lock stays global.  Ultimately there should
+# be a global lock for extension modules and a per-interpreter lock.
+import_lock
+import_lock_level
+import_lock_thread
+
+# Python/pylifecycle.c
+_PyRuntime
+
+
+#---------------------------------
+# module globals (PyObject)
+
+# Modules/_functoolsmodule.c
+kwd_mark
+
+# Modules/_localemodule.c
+Error
+
+# Modules/_threadmodule.c
+ThreadError
+
+# Modules/_tracemalloc.c
+unknown_filename
+
+# Modules/gcmodule.c
+gc_str
+
+# Modules/posixmodule.c
+billion
+posix_putenv_garbage
+
+# Modules/signalmodule.c
+DefaultHandler
+IgnoreHandler
+IntHandler
+ItimerError
+
+# Modules/zipimport.c
+ZipImportError
+zip_directory_cache
+
+
+#---------------------------------
+# module globals (other)
+
+# Modules/_tracemalloc.c
+allocators
+tables_lock
+tracemalloc_config
+tracemalloc_empty_traceback
+tracemalloc_filenames
+tracemalloc_peak_traced_memory
+tracemalloc_reentrant_key
+tracemalloc_traceback
+tracemalloc_tracebacks
+tracemalloc_traced_memory
+tracemalloc_traces
+
+# Modules/faulthandler.c
+fatal_error
+faulthandler_handlers
+old_stack
+stack
+thread
+user_signals
+
+# Modules/posixmodule.c
+posix_constants_confstr
+posix_constants_pathconf
+posix_constants_sysconf
+structseq_new
+ticks_per_second
+
+# Modules/signalmodule.c
+Handlers  # main thread only
+is_tripped  # main thread only
+main_pid
+main_thread
+old_siginthandler
+wakeup_fd  # main thread only
+
+# Modules/zipimport.c
+zip_searchorder
+
+# Python/bltinmodule.c
+Py_FileSystemDefaultEncodeErrors
+Py_FileSystemDefaultEncoding
+Py_HasFileSystemDefaultEncoding
+
+# Python/sysmodule.c
+_PySys_ImplCacheTag
+_PySys_ImplName
+
+
+#---------------------------------
+# freelists
+
+# Modules/_collectionsmodule.c
+freeblocks
+numfreeblocks
+
+# Objects/classobject.c
+free_list
+numfree
+
+# Objects/dictobject.c
+free_list
+keys_free_list
+numfree
+numfreekeys
+
+# Objects/exceptions.c
+memerrors_freelist
+memerrors_numfree
+
+# Objects/floatobject.c
+free_list
+numfree
+
+# Objects/frameobject.c
+free_list
+numfree
+
+# Objects/genobject.c
+ag_asend_freelist
+ag_asend_freelist_free
+ag_value_freelist
+ag_value_freelist_free
+
+# Objects/listobject.c
+free_list
+numfree
+
+# Objects/methodobject.c
+free_list
+numfree
+
+# Objects/sliceobject.c
+slice_cache  # slight race
+
+# Objects/tupleobject.c
+free_list
+numfree
+
+# Python/dtoa.c
+freelist  # very slight race
+
+
+#---------------------------------
+# caches (PyObject)
+
+# Objects/typeobject.c
+method_cache  # only for static types
+next_version_tag  # only for static types
+
+# Python/dynload_shlib.c
+handles  # slight race during import
+nhandles  # slight race during import
+
+# Python/import.c
+extensions  # slight race on init during import
+
+
+#---------------------------------
+# caches (other)
+
+# Python/bootstrap_hash.c
+urandom_cache
+
+# Python/modsupport.c
+_Py_PackageContext  # Slight race during import!  Move to PyThreadState?
+
+
+#---------------------------------
+# counters
+
+# Objects/bytesobject.c
+null_strings
+one_strings
+
+# Objects/dictobject.c
+pydict_global_version
+
+# Objects/moduleobject.c
+max_module_number  # slight race during import
+
+
+#######################################
+# constants
+
+#---------------------------------
+# singletons
+
+# Objects/boolobject.c
+_Py_FalseStruct
+_Py_TrueStruct
+
+# Objects/object.c
+_Py_NoneStruct
+_Py_NotImplementedStruct
+
+# Objects/sliceobject.c
+_Py_EllipsisObject
+
+
+#---------------------------------
+# constants (other)
+
+# Modules/config.c
+_PyImport_Inittab
+
+# Objects/bytearrayobject.c
+_PyByteArray_empty_string
+
+# Objects/dictobject.c
+empty_keys_struct
+empty_values
+
+# Objects/floatobject.c
+detected_double_format
+detected_float_format
+double_format
+float_format
+
+# Objects/longobject.c
+_PyLong_DigitValue
+
+# Objects/object.c
+_Py_SwappedOp
+
+# Objects/obmalloc.c
+_PyMem_Debug
+
+# Objects/setobject.c
+_dummy_struct
+
+# Objects/structseq.c
+PyStructSequence_UnnamedField
+
+# Objects/typeobject.c
+name_op
+slotdefs  # almost
+slotdefs_initialized  # almost
+subtype_getsets_dict_only
+subtype_getsets_full
+subtype_getsets_weakref_only
+tp_new_methoddef
+
+# Objects/unicodeobject.c
+bloom_linebreak
+static_strings  # slight race
+
+# Parser/tokenizer.c
+_PyParser_TokenNames
+
+# Python/Python-ast.c
+alias_fields
+
+# Python/codecs.c
+Py_hexdigits
+ucnhash_CAPI  # slight performance-only race
+
+# Python/dynload_shlib.c
+_PyImport_DynLoadFiletab
+
+# Python/fileutils.c
+_Py_open_cloexec_works
+force_ascii
+
+# Python/frozen.c
+M___hello__
+PyImport_FrozenModules
+
+# Python/graminit.c
+_PyParser_Grammar
+dfas
+labels
+
+# Python/import.c
+PyImport_Inittab
+
+# Python/pylifecycle.c
+_TARGET_LOCALES
+
+
+#---------------------------------
+# initialized (PyObject)
+
+# Objects/bytesobject.c
+characters
+nullstring
+
+# Objects/exceptions.c
+PyExc_RecursionErrorInst
+errnomap
+
+# Objects/longobject.c
+_PyLong_One
+_PyLong_Zero
+small_ints
+
+# Objects/setobject.c
+emptyfrozenset
+
+# Objects/unicodeobject.c
+interned  # slight race on init in PyUnicode_InternInPlace()
+unicode_empty
+unicode_latin1
+
+
+#---------------------------------
+# initialized (other)
+
+# Python/getargs.c
+static_arg_parsers
+
+# Python/pyhash.c
+PyHash_Func
+_Py_HashSecret
+_Py_HashSecret_Initialized
+
+# Python/pylifecycle.c
+_Py_StandardStreamEncoding
+_Py_StandardStreamErrors
+default_home
+env_home
+progname
+Py_BytesWarningFlag
+Py_DebugFlag
+Py_DontWriteBytecodeFlag
+Py_FrozenFlag
+Py_HashRandomizationFlag
+Py_IgnoreEnvironmentFlag
+Py_InspectFlag
+Py_InteractiveFlag
+Py_IsolatedFlag
+Py_NoSiteFlag
+Py_NoUserSiteDirectory
+Py_OptimizeFlag
+Py_QuietFlag
+Py_UnbufferedStdioFlag
+Py_VerboseFlag
+
+
+#---------------------------------
+# types
+
+# Modules/_threadmodule.c
+Locktype
+RLocktype
+localdummytype
+localtype
+
+# Objects/exceptions.c
+PyExc_BaseException
+PyExc_Exception
+PyExc_GeneratorExit
+PyExc_KeyboardInterrupt
+PyExc_StopAsyncIteration
+PyExc_StopIteration
+PyExc_SystemExit
+_PyExc_BaseException
+_PyExc_Exception
+_PyExc_GeneratorExit
+_PyExc_KeyboardInterrupt
+_PyExc_StopAsyncIteration
+_PyExc_StopIteration
+_PyExc_SystemExit
+
+# Objects/structseq.c
+_struct_sequence_template
+
+
+#---------------------------------
+# interned strings/bytes
+
+# Modules/_io/_iomodule.c
+_PyIO_empty_bytes
+_PyIO_empty_str
+_PyIO_str_close
+_PyIO_str_closed
+_PyIO_str_decode
+_PyIO_str_encode
+_PyIO_str_fileno
+_PyIO_str_flush
+_PyIO_str_getstate
+_PyIO_str_isatty
+_PyIO_str_newlines
+_PyIO_str_nl
+_PyIO_str_read
+_PyIO_str_read1
+_PyIO_str_readable
+_PyIO_str_readall
+_PyIO_str_readinto
+_PyIO_str_readline
+_PyIO_str_reset
+_PyIO_str_seek
+_PyIO_str_seekable
+_PyIO_str_setstate
+_PyIO_str_tell
+_PyIO_str_truncate
+_PyIO_str_writable
+_PyIO_str_write
+
+# Modules/_threadmodule.c
+str_dict
+
+# Objects/boolobject.c
+false_str
+true_str
+
+# Objects/listobject.c
+indexerr
+
+# Python/symtable.c
+__class__
+dictcomp
+genexpr
+lambda
+listcomp
+setcomp
+top
+
+# Python/sysmodule.c
+whatstrings
+
+
+#######################################
+# hacks
+
+# Objects/object.c
+_Py_abstract_hack
+
+# Objects/setobject.c
+_PySet_Dummy
+
+# Python/pylifecycle.c
+_PyOS_mystrnicmp_hack
diff --git a/Tools/c-analyzer/ignored.tsv b/Tools/c-analyzer/ignored.tsv
new file mode 100644
index 0000000..a0e0e50
--- /dev/null
+++ b/Tools/c-analyzer/ignored.tsv
@@ -0,0 +1 @@
+filename	funcname	name	kind	reason
diff --git a/Tools/c-analyzer/known.tsv b/Tools/c-analyzer/known.tsv
new file mode 100644
index 0000000..ce2afcb
--- /dev/null
+++ b/Tools/c-analyzer/known.tsv
@@ -0,0 +1,1922 @@
+filename	funcname	name	kind	declaration
+Modules/_abc.c	-	_abc_data_type	variable	static PyTypeObject _abc_data_type
+Modules/_abc.c	-	abc_invalidation_counter	variable	static unsigned long long abc_invalidation_counter
+Modules/_abc.c	-	_abcmodule	variable	static struct PyModuleDef _abcmodule
+Python/import.c	import_find_and_load	accumulated	variable	static _PyTime_t accumulated
+Modules/itertoolsmodule.c	-	accumulate_methods	variable	static PyMethodDef accumulate_methods
+Modules/itertoolsmodule.c	-	accumulate_type	variable	static PyTypeObject accumulate_type
+Python/Python-ast.c	-	Add_singleton	variable	static PyObject *Add_singleton
+Python/Python-ast.c	-	Add_type	variable	static PyTypeObject *Add_type
+Objects/genobject.c	-	ag_asend_freelist	variable	static PyAsyncGenASend *ag_asend_freelist[_PyAsyncGen_MAXFREELIST]
+Objects/genobject.c	-	ag_asend_freelist_free	variable	static int ag_asend_freelist_free
+Objects/genobject.c	-	ag_value_freelist	variable	static _PyAsyncGenWrappedValue *ag_value_freelist[_PyAsyncGen_MAXFREELIST]
+Objects/genobject.c	-	ag_value_freelist_free	variable	static int ag_value_freelist_free
+Python/Python-ast.c	-	alias_fields	variable	static const char *alias_fields[]
+Python/Python-ast.c	-	alias_type	variable	static PyTypeObject *alias_type
+Modules/_tracemalloc.c	-	allocators	variable	static struct { PyMemAllocatorEx mem; PyMemAllocatorEx raw; PyMemAllocatorEx obj; } allocators
+Python/Python-ast.c	-	And_singleton	variable	static PyObject *And_singleton
+Python/Python-ast.c	-	And_type	variable	static PyTypeObject *And_type
+Python/Python-ast.c	-	AnnAssign_fields	variable	static const char *AnnAssign_fields[]
+Python/Python-ast.c	-	AnnAssign_type	variable	static PyTypeObject *AnnAssign_type
+Python/compile.c	-	__annotations__	variable	static PyObject *__annotations__
+Objects/obmalloc.c	-	arenas	variable	static struct arena_object* arenas
+Python/Python-ast.c	-	arg_attributes	variable	static const char *arg_attributes[]
+Python/Python-ast.c	-	arg_fields	variable	static const char *arg_fields[]
+Python/Python-ast.c	-	arg_type	variable	static PyTypeObject *arg_type
+Python/Python-ast.c	-	arguments_fields	variable	static const char *arguments_fields[]
+Python/Python-ast.c	-	arguments_type	variable	static PyTypeObject *arguments_type
+Python/Python-ast.c	-	Assert_fields	variable	static const char *Assert_fields[]
+Python/compile.c	compiler_assert	assertion_error	variable	static PyObject *assertion_error
+Python/Python-ast.c	-	Assert_type	variable	static PyTypeObject *Assert_type
+Python/Python-ast.c	-	Assign_fields	variable	static const char *Assign_fields[]
+Python/Python-ast.c	-	Assign_type	variable	static PyTypeObject *Assign_type
+Python/Python-ast.c	-	_astmodule	variable	static struct PyModuleDef _astmodule
+Python/Python-ast.c	-	AST_type	variable	static PyTypeObject AST_type
+Python/Python-ast.c	-	ast_type_getsets	variable	static PyGetSetDef ast_type_getsets[]
+Python/Python-ast.c	-	ast_type_methods	variable	static PyMethodDef ast_type_methods
+Python/Python-ast.c	-	AsyncFor_fields	variable	static const char *AsyncFor_fields[]
+Python/Python-ast.c	-	AsyncFor_type	variable	static PyTypeObject *AsyncFor_type
+Python/Python-ast.c	-	AsyncFunctionDef_fields	variable	static const char *AsyncFunctionDef_fields[]
+Python/Python-ast.c	-	AsyncFunctionDef_type	variable	static PyTypeObject *AsyncFunctionDef_type
+Objects/genobject.c	-	async_gen_as_async	variable	static PyAsyncMethods async_gen_as_async
+Objects/genobject.c	-	async_gen_asend_as_async	variable	static PyAsyncMethods async_gen_asend_as_async
+Objects/genobject.c	-	async_gen_asend_methods	variable	static PyMethodDef async_gen_asend_methods
+Objects/genobject.c	-	async_gen_athrow_as_async	variable	static PyAsyncMethods async_gen_athrow_as_async
+Objects/genobject.c	-	async_gen_athrow_methods	variable	static PyMethodDef async_gen_athrow_methods
+Objects/genobject.c	-	async_gen_getsetlist	variable	static PyGetSetDef async_gen_getsetlist[]
+Python/sysmodule.c	-	asyncgen_hooks_desc	variable	static PyStructSequence_Desc asyncgen_hooks_desc
+Python/sysmodule.c	-	asyncgen_hooks_fields	variable	static PyStructSequence_Field asyncgen_hooks_fields[]
+Python/sysmodule.c	-	AsyncGenHooksType	variable	static PyTypeObject AsyncGenHooksType
+Objects/genobject.c	-	async_gen_memberlist	variable	static PyMemberDef async_gen_memberlist[]
+Objects/genobject.c	-	async_gen_methods	variable	static PyMethodDef async_gen_methods
+Python/Python-ast.c	-	AsyncWith_fields	variable	static const char *AsyncWith_fields[]
+Python/Python-ast.c	-	AsyncWith_type	variable	static PyTypeObject *AsyncWith_type
+Parser/listnode.c	-	atbol	variable	static int atbol
+Modules/atexitmodule.c	-	atexit_methods	variable	static PyMethodDef atexit_methods
+Modules/atexitmodule.c	-	atexitmodule	variable	static struct PyModuleDef atexitmodule
+Modules/atexitmodule.c	-	atexit_slots	variable	static PyModuleDef_Slot atexit_slots[]
+Modules/_operator.c	-	attrgetter_methods	variable	static PyMethodDef attrgetter_methods
+Modules/_operator.c	-	attrgetter_type	variable	static PyTypeObject attrgetter_type
+Python/Python-ast.c	-	Attribute_fields	variable	static const char *Attribute_fields[]
+Python/Python-ast.c	-	Attribute_type	variable	static PyTypeObject *Attribute_type
+Python/Python-ast.c	-	AugAssign_fields	variable	static const char *AugAssign_fields[]
+Python/Python-ast.c	-	AugAssign_type	variable	static PyTypeObject *AugAssign_type
+Python/Python-ast.c	-	AugLoad_singleton	variable	static PyObject *AugLoad_singleton
+Python/Python-ast.c	-	AugLoad_type	variable	static PyTypeObject *AugLoad_type
+Python/Python-ast.c	-	AugStore_singleton	variable	static PyObject *AugStore_singleton
+Python/Python-ast.c	-	AugStore_type	variable	static PyTypeObject *AugStore_type
+Python/Python-ast.c	-	Await_fields	variable	static const char *Await_fields[]
+Python/Python-ast.c	-	Await_type	variable	static PyTypeObject *Await_type
+Objects/exceptions.c	-	BaseException_getset	variable	static PyGetSetDef BaseException_getset[]
+Objects/exceptions.c	-	BaseException_members	variable	static struct PyMemberDef BaseException_members[]
+Objects/exceptions.c	-	BaseException_methods	variable	static PyMethodDef BaseException_methods
+Modules/posixmodule.c	-	billion	variable	static PyObject *billion
+Python/Python-ast.c	-	BinOp_fields	variable	static const char *BinOp_fields[]
+Python/Python-ast.c	-	BinOp_type	variable	static PyTypeObject *BinOp_type
+Python/Python-ast.c	-	BitAnd_singleton	variable	static PyObject *BitAnd_singleton
+Python/Python-ast.c	-	BitAnd_type	variable	static PyTypeObject *BitAnd_type
+Python/Python-ast.c	-	BitOr_singleton	variable	static PyObject *BitOr_singleton
+Python/Python-ast.c	-	BitOr_type	variable	static PyTypeObject *BitOr_type
+Python/Python-ast.c	-	BitXor_singleton	variable	static PyObject *BitXor_singleton
+Python/Python-ast.c	-	BitXor_type	variable	static PyTypeObject *BitXor_type
+Objects/unicodeobject.c	-	bloom_linebreak	variable	static BLOOM_MASK bloom_linebreak
+Objects/boolobject.c	-	bool_as_number	variable	static PyNumberMethods bool_as_number
+Python/Python-ast.c	-	BoolOp_fields	variable	static const char *BoolOp_fields[]
+Python/Python-ast.c	-	boolop_type	variable	static PyTypeObject *boolop_type
+Python/Python-ast.c	-	BoolOp_type	variable	static PyTypeObject *BoolOp_type
+Python/_warnings.c	is_internal_frame	bootstrap_string	variable	static PyObject *bootstrap_string
+Python/Python-ast.c	-	Break_type	variable	static PyTypeObject *Break_type
+Modules/_io/bufferedio.c	-	bufferediobase_methods	variable	static PyMethodDef bufferediobase_methods
+Modules/_io/bufferedio.c	-	bufferedrandom_getset	variable	static PyGetSetDef bufferedrandom_getset[]
+Modules/_io/bufferedio.c	-	bufferedrandom_members	variable	static PyMemberDef bufferedrandom_members[]
+Modules/_io/bufferedio.c	-	bufferedrandom_methods	variable	static PyMethodDef bufferedrandom_methods
+Modules/_io/bufferedio.c	-	bufferedreader_getset	variable	static PyGetSetDef bufferedreader_getset[]
+Modules/_io/bufferedio.c	-	bufferedreader_members	variable	static PyMemberDef bufferedreader_members[]
+Modules/_io/bufferedio.c	-	bufferedreader_methods	variable	static PyMethodDef bufferedreader_methods
+Modules/_io/bufferedio.c	-	bufferedrwpair_getset	variable	static PyGetSetDef bufferedrwpair_getset[]
+Modules/_io/bufferedio.c	-	bufferedrwpair_methods	variable	static PyMethodDef bufferedrwpair_methods
+Modules/_io/bufferedio.c	-	bufferedwriter_getset	variable	static PyGetSetDef bufferedwriter_getset[]
+Modules/_io/bufferedio.c	-	bufferedwriter_members	variable	static PyMemberDef bufferedwriter_members[]
+Modules/_io/bufferedio.c	-	bufferedwriter_methods	variable	static PyMethodDef bufferedwriter_methods
+Modules/getbuildinfo.c	Py_GetBuildInfo	buildinfo	variable	static char buildinfo[50 + sizeof(GITVERSION) + ((sizeof(GITTAG) > sizeof(GITBRANCH)) ?  sizeof(GITTAG) : sizeof(GITBRANCH))]
+Python/bltinmodule.c	-	builtin_methods	variable	static PyMethodDef builtin_methods
+Python/bltinmodule.c	-	builtinsmodule	variable	static struct PyModuleDef builtinsmodule
+Python/import.c	PyImport_Import	builtins_str	variable	static PyObject *builtins_str
+Python/ceval.c	make_pending_calls	busy	variable	static int busy
+Objects/bytearrayobject.c	-	bytearray_as_buffer	variable	static PyBufferProcs bytearray_as_buffer
+Objects/bytearrayobject.c	-	bytearray_as_mapping	variable	static PyMappingMethods bytearray_as_mapping
+Objects/bytearrayobject.c	-	bytearray_as_number	variable	static PyNumberMethods bytearray_as_number
+Objects/bytearrayobject.c	-	bytearray_as_sequence	variable	static PySequenceMethods bytearray_as_sequence
+Objects/bytearrayobject.c	-	bytearrayiter_methods	variable	static PyMethodDef bytearrayiter_methods
+Objects/bytearrayobject.c	-	bytearray_methods	variable	static PyMethodDef bytearray_methods
+Objects/bytesobject.c	-	bytes_as_buffer	variable	static PyBufferProcs bytes_as_buffer
+Objects/bytesobject.c	-	bytes_as_mapping	variable	static PyMappingMethods bytes_as_mapping
+Objects/bytesobject.c	-	bytes_as_number	variable	static PyNumberMethods bytes_as_number
+Objects/bytesobject.c	-	bytes_as_sequence	variable	static PySequenceMethods bytes_as_sequence
+Modules/_io/bytesio.c	-	bytesiobuf_as_buffer	variable	static PyBufferProcs bytesiobuf_as_buffer
+Modules/_io/bytesio.c	-	bytesio_getsetlist	variable	static PyGetSetDef bytesio_getsetlist[]
+Modules/_io/bytesio.c	-	bytesio_methods	variable	static PyMethodDef bytesio_methods
+Objects/bytesobject.c	-	bytes_methods	variable	static PyMethodDef bytes_methods
+Python/thread_pthread.h	init_condattr	ca	variable	static pthread_condattr_t ca
+Python/Python-ast.c	-	Call_fields	variable	static const char *Call_fields[]
+Objects/iterobject.c	-	calliter_methods	variable	static PyMethodDef calliter_methods
+Python/Python-ast.c	-	Call_type	variable	static PyTypeObject *Call_type
+Objects/cellobject.c	-	cell_getsetlist	variable	static PyGetSetDef cell_getsetlist[]
+Modules/itertoolsmodule.c	-	chain_methods	variable	static PyMethodDef chain_methods
+Modules/itertoolsmodule.c	-	chain_type	variable	static PyTypeObject chain_type
+Objects/bytesobject.c	-	characters	variable	static PyBytesObject *characters[UCHAR_MAX + 1]
+Python/symtable.c	-	__class__	variable	static identifier __class__
+Python/Python-ast.c	-	ClassDef_fields	variable	static const char *ClassDef_fields[]
+Python/Python-ast.c	-	ClassDef_type	variable	static PyTypeObject *ClassDef_type
+Objects/funcobject.c	-	cm_getsetlist	variable	static PyGetSetDef cm_getsetlist[]
+Objects/funcobject.c	-	cm_memberlist	variable	static PyMemberDef cm_memberlist[]
+Python/Python-ast.c	-	cmpop_type	variable	static PyTypeObject *cmpop_type
+Modules/_codecsmodule.c	-	_codecs_functions	variable	static PyMethodDef _codecs_functions[]
+Modules/_codecsmodule.c	-	codecsmodule	variable	static struct PyModuleDef codecsmodule
+Objects/codeobject.c	-	code_memberlist	variable	static PyMemberDef code_memberlist[]
+Objects/codeobject.c	-	code_methods	variable	static PyMethodDef code_methods
+Modules/_collectionsmodule.c	-	_collectionsmodule	variable	static struct PyModuleDef _collectionsmodule
+Modules/itertoolsmodule.c	-	combinations_methods	variable	static PyMethodDef combinations_methods
+Modules/itertoolsmodule.c	-	combinations_type	variable	static PyTypeObject combinations_type
+Objects/typeobject.c	object_new	comma_id	variable	_Py_static_string(comma_id, "", "")
+Python/Python-ast.c	-	Compare_fields	variable	static const char *Compare_fields[]
+Python/Python-ast.c	-	Compare_type	variable	static PyTypeObject *Compare_type
+Objects/complexobject.c	-	complex_as_number	variable	static PyNumberMethods complex_as_number
+Objects/complexobject.c	-	complex_members	variable	static PyMemberDef complex_members[]
+Objects/complexobject.c	-	complex_methods	variable	static PyMethodDef complex_methods
+Python/Python-ast.c	-	comprehension_fields	variable	static const char *comprehension_fields[]
+Python/Python-ast.c	-	comprehension_type	variable	static PyTypeObject *comprehension_type
+Modules/itertoolsmodule.c	-	compress_methods	variable	static PyMethodDef compress_methods
+Modules/itertoolsmodule.c	-	compress_type	variable	static PyTypeObject compress_type
+Python/thread_pthread.h	-	condattr_monotonic	variable	static pthread_condattr_t *condattr_monotonic
+Python/Python-ast.c	-	Constant_fields	variable	static const char *Constant_fields[]
+Python/Python-ast.c	-	Constant_type	variable	static PyTypeObject *Constant_type
+Python/Python-ast.c	-	Continue_type	variable	static PyTypeObject *Continue_type
+Objects/longobject.c	PyLong_FromString	convmultmax_base	variable	static twodigits convmultmax_base[37]
+Objects/longobject.c	PyLong_FromString	convwidth_base	variable	static int convwidth_base[37]
+Objects/genobject.c	-	coro_as_async	variable	static PyAsyncMethods coro_as_async
+Objects/genobject.c	-	coro_getsetlist	variable	static PyGetSetDef coro_getsetlist[]
+Objects/genobject.c	-	coro_memberlist	variable	static PyMemberDef coro_memberlist[]
+Objects/genobject.c	-	coro_methods	variable	static PyMethodDef coro_methods
+Objects/genobject.c	-	coro_wrapper_methods	variable	static PyMethodDef coro_wrapper_methods
+Modules/itertoolsmodule.c	-	count_methods	variable	static PyMethodDef count_methods
+Modules/itertoolsmodule.c	-	count_type	variable	static PyTypeObject count_type
+Python/context.c	-	ctx_freelist	variable	static PyContext *ctx_freelist
+Python/context.c	-	ctx_freelist_len	variable	static int ctx_freelist_len
+Modules/itertoolsmodule.c	-	cwr_methods	variable	static PyMethodDef cwr_methods
+Modules/itertoolsmodule.c	-	cwr_type	variable	static PyTypeObject cwr_type
+Modules/itertoolsmodule.c	-	cycle_methods	variable	static PyMethodDef cycle_methods
+Modules/itertoolsmodule.c	-	cycle_type	variable	static PyTypeObject cycle_type
+Objects/obmalloc.c	new_arena	debug_stats	variable	static int debug_stats
+Modules/signalmodule.c	-	DefaultHandler	variable	static PyObject *DefaultHandler
+Modules/_collectionsmodule.c	-	defdict_members	variable	static PyMemberDef defdict_members[]
+Modules/_collectionsmodule.c	-	defdict_methods	variable	static PyMethodDef defdict_methods
+Modules/_collectionsmodule.c	-	defdict_type	variable	static PyTypeObject defdict_type
+Python/Python-ast.c	-	Delete_fields	variable	static const char *Delete_fields[]
+Python/Python-ast.c	-	Delete_type	variable	static PyTypeObject *Delete_type
+Python/Python-ast.c	-	Del_singleton	variable	static PyObject *Del_singleton
+Python/Python-ast.c	-	Del_type	variable	static PyTypeObject *Del_type
+Modules/_collectionsmodule.c	-	deque_as_number	variable	static PyNumberMethods deque_as_number
+Modules/_collectionsmodule.c	-	deque_as_sequence	variable	static PySequenceMethods deque_as_sequence
+Modules/_collectionsmodule.c	-	deque_getset	variable	static PyGetSetDef deque_getset[]
+Modules/_collectionsmodule.c	-	dequeiter_methods	variable	static PyMethodDef dequeiter_methods
+Modules/_collectionsmodule.c	-	dequeiter_type	variable	static PyTypeObject dequeiter_type
+Modules/_collectionsmodule.c	-	deque_methods	variable	static PyMethodDef deque_methods
+Modules/_collectionsmodule.c	-	dequereviter_type	variable	static PyTypeObject dequereviter_type
+Modules/_collectionsmodule.c	-	deque_type	variable	static PyTypeObject deque_type
+Objects/descrobject.c	-	descr_members	variable	static PyMemberDef descr_members[]
+Objects/descrobject.c	-	descr_methods	variable	static PyMethodDef descr_methods
+Modules/_abc.c	-	_destroy_def	variable	static PyMethodDef _destroy_def
+Objects/floatobject.c	-	detected_double_format	variable	static float_format_type detected_double_format
+Objects/floatobject.c	-	detected_float_format	variable	static float_format_type detected_float_format
+Objects/dictobject.c	-	dict_as_mapping	variable	static PyMappingMethods dict_as_mapping
+Objects/dictobject.c	-	dict_as_sequence	variable	static PySequenceMethods dict_as_sequence
+Python/symtable.c	-	dictcomp	variable	static identifier dictcomp
+Python/Python-ast.c	-	DictComp_fields	variable	static const char *DictComp_fields[]
+Python/Python-ast.c	-	DictComp_type	variable	static PyTypeObject *DictComp_type
+Python/Python-ast.c	-	Dict_fields	variable	static const char *Dict_fields[]
+Objects/dictobject.c	-	dictitems_as_sequence	variable	static PySequenceMethods dictitems_as_sequence
+Objects/dictobject.c	-	dictitems_methods	variable	static PyMethodDef dictitems_methods
+Objects/dictobject.c	-	dictiter_methods	variable	static PyMethodDef dictiter_methods
+Objects/dictobject.c	-	dictkeys_as_sequence	variable	static PySequenceMethods dictkeys_as_sequence
+Objects/dictobject.c	-	dictkeys_methods	variable	static PyMethodDef dictkeys_methods
+Python/Python-ast.c	-	Dict_type	variable	static PyTypeObject *Dict_type
+Objects/dictobject.c	-	dictvalues_as_sequence	variable	static PySequenceMethods dictvalues_as_sequence
+Objects/dictobject.c	-	dictvalues_methods	variable	static PyMethodDef dictvalues_methods
+Objects/dictobject.c	-	dictviews_as_number	variable	static PyNumberMethods dictviews_as_number
+Modules/posixmodule.c	-	DirEntry_members	variable	static PyMemberDef DirEntry_members[]
+Modules/posixmodule.c	-	DirEntry_methods	variable	static PyMethodDef DirEntry_methods
+Modules/posixmodule.c	-	DirEntryType	variable	static PyTypeObject DirEntryType
+Python/Python-ast.c	-	Div_singleton	variable	static PyObject *Div_singleton
+Python/Python-ast.c	-	Div_type	variable	static PyTypeObject *Div_type
+Python/compile.c	-	__doc__	variable	static PyObject *__doc__
+Objects/classobject.c	method_get_doc	docstr	variable	static PyObject *docstr
+Objects/classobject.c	instancemethod_get_doc	docstr	variable	static PyObject *docstr
+Python/compile.c	compiler_set_qualname	dot	variable	_Py_static_string(dot, ""."")
+Python/compile.c	compiler_set_qualname	dot_locals	variable	_Py_static_string(dot_locals, "".<locals>"")
+Objects/floatobject.c	-	double_format	variable	static float_format_type double_format
+Modules/itertoolsmodule.c	-	dropwhile_methods	variable	static PyMethodDef dropwhile_methods
+Modules/itertoolsmodule.c	-	dropwhile_type	variable	static PyTypeObject dropwhile_type
+Objects/setobject.c	-	_dummy_struct	variable	static PyObject _dummy_struct
+Modules/posixmodule.c	os_dup2_impl	dup3_works	variable	static int dup3_works
+Modules/_io/bufferedio.c	_PyIO_trap_eintr	eintr_int	variable	static PyObject *eintr_int
+Objects/sliceobject.c	-	ellipsis_methods	variable	static PyMethodDef ellipsis_methods
+Python/hamt.c	-	_empty_bitmap_node	variable	static PyHamtNode_Bitmap *_empty_bitmap_node
+Objects/setobject.c	-	emptyfrozenset	variable	static PyObject *emptyfrozenset
+Python/hamt.c	-	_empty_hamt	variable	static PyHamtObject *_empty_hamt
+Objects/dictobject.c	-	empty_keys_struct	variable	static PyDictKeysObject empty_keys_struct
+Objects/codeobject.c	PyCode_NewEmpty	emptystring	variable	static PyObject *emptystring
+Python/compile.c	compiler_from_import	empty_string	variable	static PyObject *empty_string
+Objects/dictobject.c	-	empty_values	variable	static PyObject *empty_values[1]
+Objects/unicodeobject.c	-	encoding_map_methods	variable	static PyMethodDef encoding_map_methods
+Objects/unicodeobject.c	-	EncodingMapType	variable	static PyTypeObject EncodingMapType
+Objects/enumobject.c	-	enum_methods	variable	static PyMethodDef enum_methods
+Python/Python-ast.c	-	Eq_singleton	variable	static PyObject *Eq_singleton
+Python/Python-ast.c	-	Eq_type	variable	static PyTypeObject *Eq_type
+Objects/exceptions.c	-	errnomap	variable	static PyObject *errnomap
+Modules/errnomodule.c	-	errno_methods	variable	static PyMethodDef errno_methods
+Modules/errnomodule.c	-	errnomodule	variable	static struct PyModuleDef errnomodule
+Modules/_localemodule.c	-	Error	variable	static PyObject *Error
+Python/Python-ast.c	-	excepthandler_attributes	variable	static const char *excepthandler_attributes[]
+Python/Python-ast.c	-	ExceptHandler_fields	variable	static const char *ExceptHandler_fields[]
+Python/Python-ast.c	-	excepthandler_type	variable	static PyTypeObject *excepthandler_type
+Python/Python-ast.c	-	ExceptHandler_type	variable	static PyTypeObject *ExceptHandler_type
+Modules/_threadmodule.c	-	ExceptHookArgs_desc	variable	static PyStructSequence_Desc ExceptHookArgs_desc
+Modules/_threadmodule.c	-	ExceptHookArgs_fields	variable	static PyStructSequence_Field ExceptHookArgs_fields[]
+Modules/_threadmodule.c	-	ExceptHookArgsType	variable	static PyTypeObject ExceptHookArgsType
+Objects/exceptions.c	_check_for_legacy_statements	exec_prefix	variable	static PyObject *exec_prefix
+Python/Python-ast.c	-	expr_attributes	variable	static const char *expr_attributes[]
+Python/Python-ast.c	-	expr_context_type	variable	static PyTypeObject *expr_context_type
+Python/Python-ast.c	-	Expression_fields	variable	static const char *Expression_fields[]
+Python/Python-ast.c	-	Expression_type	variable	static PyTypeObject *Expression_type
+Python/Python-ast.c	-	Expr_fields	variable	static const char *Expr_fields[]
+Python/Python-ast.c	-	expr_type	variable	static PyTypeObject *expr_type
+Python/Python-ast.c	-	Expr_type	variable	static PyTypeObject *Expr_type
+Python/import.c	-	extensions	variable	static PyObject *extensions
+Python/Python-ast.c	-	ExtSlice_fields	variable	static const char *ExtSlice_fields[]
+Python/Python-ast.c	-	ExtSlice_type	variable	static PyTypeObject *ExtSlice_type
+Objects/boolobject.c	-	false_str	variable	static PyObject *false_str
+Modules/faulthandler.c	-	fatal_error	variable	static struct { int enabled; PyObject *file; int fd; int all_threads; PyInterpreterState *interp; void *exc_handler; } fatal_error
+Modules/faulthandler.c	-	faulthandler_handlers	variable	static fault_handler_t faulthandler_handlers[]
+Objects/stringlib/unicode_format.h	-	fieldnameiter_methods	variable	static PyMethodDef fieldnameiter_methods
+Modules/_io/fileio.c	-	fileio_getsetlist	variable	static PyGetSetDef fileio_getsetlist[]
+Modules/_io/fileio.c	-	fileio_members	variable	static PyMemberDef fileio_members[]
+Modules/_io/fileio.c	-	fileio_methods	variable	static PyMethodDef fileio_methods
+Modules/itertoolsmodule.c	-	filterfalse_methods	variable	static PyMethodDef filterfalse_methods
+Modules/itertoolsmodule.c	-	filterfalse_type	variable	static PyTypeObject filterfalse_type
+Python/bltinmodule.c	-	filter_methods	variable	static PyMethodDef filter_methods
+Python/sysmodule.c	-	flags_desc	variable	static PyStructSequence_Desc flags_desc
+Python/sysmodule.c	-	flags_fields	variable	static PyStructSequence_Field flags_fields[]
+Python/sysmodule.c	-	FlagsType	variable	static PyTypeObject FlagsType
+Objects/floatobject.c	-	float_as_number	variable	static PyNumberMethods float_as_number
+Objects/floatobject.c	-	float_format	variable	static float_format_type 
+Objects/floatobject.c	-	float_getset	variable	static PyGetSetDef float_getset[]
+Objects/floatobject.c	-	floatinfo_desc	variable	static PyStructSequence_Desc floatinfo_desc
+Objects/floatobject.c	-	floatinfo_fields	variable	static PyStructSequence_Field floatinfo_fields[]
+Objects/floatobject.c	-	FloatInfoType	variable	static PyTypeObject FloatInfoType
+Objects/floatobject.c	-	float_methods	variable	static PyMethodDef float_methods
+Python/Python-ast.c	-	FloorDiv_singleton	variable	static PyObject *FloorDiv_singleton
+Python/Python-ast.c	-	FloorDiv_type	variable	static PyTypeObject *FloorDiv_type
+Python/fileutils.c	-	force_ascii	variable	static int force_ascii
+Python/Python-ast.c	-	For_fields	variable	static const char *For_fields[]
+Python/Python-ast.c	-	FormattedValue_fields	variable	static const char *FormattedValue_fields[]
+Python/Python-ast.c	-	FormattedValue_type	variable	static PyTypeObject *FormattedValue_type
+Objects/stringlib/unicode_format.h	-	formatteriter_methods	variable	static PyMethodDef formatteriter_methods
+Python/Python-ast.c	-	For_type	variable	static PyTypeObject *For_type
+Objects/frameobject.c	-	frame_getsetlist	variable	static PyGetSetDef frame_getsetlist[]
+Objects/frameobject.c	-	frame_memberlist	variable	static PyMemberDef frame_memberlist[]
+Objects/frameobject.c	-	frame_methods	variable	static PyMethodDef frame_methods
+Modules/_collectionsmodule.c	-	freeblocks	variable	static block *freeblocks[MAXFREEBLOCKS]
+Python/dtoa.c	-	freelist	variable	static Bigint *freelist[Kmax+1]
+Objects/floatobject.c	-	free_list	variable	static PyFloatObject *free_list
+Objects/frameobject.c	-	free_list	variable	static PyFrameObject *free_list
+Objects/listobject.c	-	free_list	variable	static PyListObject *free_list[PyList_MAXFREELIST]
+Objects/dictobject.c	-	free_list	variable	static PyDictObject *free_list[PyDict_MAXFREELIST]
+Objects/methodobject.c	-	free_list	variable	static PyCFunctionObject *free_list
+Objects/tupleobject.c	-	free_list	variable	static PyTupleObject *free_list[PyTuple_MAXSAVESIZE]
+Objects/classobject.c	-	free_list	variable	static PyMethodObject *free_list
+Objects/setobject.c	-	frozenset_as_number	variable	static PyNumberMethods frozenset_as_number
+Objects/setobject.c	-	frozenset_methods	variable	static PyMethodDef frozenset_methods
+Objects/funcobject.c	-	func_getsetlist	variable	static PyGetSetDef func_getsetlist[]
+Objects/funcobject.c	-	func_memberlist	variable	static PyMemberDef func_memberlist[]
+Python/Python-ast.c	-	FunctionDef_fields	variable	static const char *FunctionDef_fields[]
+Python/Python-ast.c	-	FunctionDef_type	variable	static PyTypeObject *FunctionDef_type
+Modules/_sre.c	-	_functions	variable	static PyMethodDef _functions[]
+Python/Python-ast.c	-	FunctionType_fields	variable	static const char *FunctionType_fields[]
+Python/Python-ast.c	-	FunctionType_type	variable	static PyTypeObject *FunctionType_type
+Modules/_functoolsmodule.c	-	_functoolsmodule	variable	static struct PyModuleDef _functoolsmodule
+Modules/gcmodule.c	-	GcMethods	variable	static PyMethodDef GcMethods[]
+Modules/gcmodule.c	-	gcmodule	variable	static struct PyModuleDef gcmodule
+Modules/gcmodule.c	-	gc_str	variable	static PyObject *gc_str
+Python/Python-ast.c	-	GeneratorExp_fields	variable	static const char *GeneratorExp_fields[]
+Python/Python-ast.c	-	GeneratorExp_type	variable	static PyTypeObject *GeneratorExp_type
+Python/symtable.c	-	genexpr	variable	static identifier genexpr
+Objects/genobject.c	-	gen_getsetlist	variable	static PyGetSetDef gen_getsetlist[]
+Objects/genobject.c	-	gen_memberlist	variable	static PyMemberDef gen_memberlist[]
+Objects/genobject.c	-	gen_methods	variable	static PyMethodDef gen_methods
+Python/bootstrap_hash.c	py_getrandom	getrandom_works	variable	static int getrandom_works
+Objects/descrobject.c	-	getset_getset	variable	static PyGetSetDef getset_getset[]
+Python/Python-ast.c	-	Global_fields	variable	static const char *Global_fields[]
+Python/Python-ast.c	-	Global_type	variable	static PyTypeObject *Global_type
+Modules/itertoolsmodule.c	-	groupby_methods	variable	static PyMethodDef groupby_methods
+Modules/itertoolsmodule.c	-	groupby_type	variable	static PyTypeObject groupby_type
+Modules/itertoolsmodule.c	-	_grouper_methods	variable	static PyMethodDef _grouper_methods
+Modules/itertoolsmodule.c	-	_grouper_type	variable	static PyTypeObject _grouper_type
+Python/Python-ast.c	-	GtE_singleton	variable	static PyObject *GtE_singleton
+Python/Python-ast.c	-	GtE_type	variable	static PyTypeObject *GtE_type
+Python/Python-ast.c	-	Gt_singleton	variable	static PyObject *Gt_singleton
+Python/Python-ast.c	-	Gt_type	variable	static PyTypeObject *Gt_type
+Modules/signalmodule.c	-	Handlers	variable	static volatile struct { _Py_atomic_int tripped; PyObject *func; } Handlers[NSIG]
+Python/dynload_shlib.c	-	handles	variable	static struct { dev_t dev; ino_t ino; void *handle; } handles[128]
+Python/sysmodule.c	-	hash_info_desc	variable	static PyStructSequence_Desc hash_info_desc
+Python/sysmodule.c	-	hash_info_fields	variable	static PyStructSequence_Field hash_info_fields[]
+Python/sysmodule.c	-	Hash_InfoType	variable	static PyTypeObject Hash_InfoType
+Python/import.c	import_find_and_load	header	variable	static int header
+Python/Python-ast.c	-	IfExp_fields	variable	static const char *IfExp_fields[]
+Python/Python-ast.c	-	IfExp_type	variable	static PyTypeObject *IfExp_type
+Python/Python-ast.c	-	If_fields	variable	static const char *If_fields[]
+Python/Python-ast.c	-	If_type	variable	static PyTypeObject *If_type
+Modules/signalmodule.c	-	IgnoreHandler	variable	static PyObject *IgnoreHandler
+Python/import.c	-	imp_methods	variable	static PyMethodDef imp_methods
+Python/import.c	-	impmodule	variable	static struct PyModuleDef impmodule
+Objects/exceptions.c	-	ImportError_members	variable	static PyMemberDef ImportError_members[]
+Objects/exceptions.c	-	ImportError_methods	variable	static PyMethodDef ImportError_methods
+Python/Python-ast.c	-	Import_fields	variable	static const char *Import_fields[]
+Python/Python-ast.c	-	ImportFrom_fields	variable	static const char *ImportFrom_fields[]
+Python/Python-ast.c	-	ImportFrom_type	variable	static PyTypeObject *ImportFrom_type
+Python/import.c	import_find_and_load	import_level	variable	static int import_level
+Python/_warnings.c	is_internal_frame	importlib_string	variable	static PyObject *importlib_string
+Python/import.c	-	import_lock	variable	static PyThread_type_lock import_lock
+Python/import.c	-	import_lock_level	variable	static int import_lock_level
+Python/import.c	-	import_lock_thread	variable	static unsigned long import_lock_thread
+Python/import.c	PyImport_Import	import_str	variable	static PyObject *import_str
+Python/Python-ast.c	-	Import_type	variable	static PyTypeObject *Import_type
+Modules/_io/textio.c	-	incrementalnewlinedecoder_getset	variable	static PyGetSetDef incrementalnewlinedecoder_getset[]
+Modules/_io/textio.c	-	incrementalnewlinedecoder_methods	variable	static PyMethodDef incrementalnewlinedecoder_methods
+Objects/listobject.c	-	indexerr	variable	static PyObject *indexerr
+Python/Python-ast.c	-	Index_fields	variable	static const char *Index_fields[]
+Python/Python-ast.c	-	Index_type	variable	static PyTypeObject *Index_type
+Python/thread.c	-	initialized	variable	static int initialized
+Modules/posixmodule.c	-	initialized	variable	static int initialized
+Modules/pwdmodule.c	-	initialized	variable	static int initialized
+Modules/signalmodule.c	-	initialized	variable	static int initialized
+Modules/timemodule.c	-	initialized	variable	static int initialized
+Python/Python-ast.c	init_types	initialized	variable	static int initialized
+Objects/listobject.c	PyList_New	initialized	variable	static int initialized
+Python/import.c	-	inittab_copy	variable	static struct _inittab *inittab_copy
+Python/Python-ast.c	-	In_singleton	variable	static PyObject *In_singleton
+Objects/classobject.c	-	instancemethod_getset	variable	static PyGetSetDef instancemethod_getset[]
+Objects/classobject.c	-	instancemethod_memberlist	variable	static PyMemberDef instancemethod_memberlist[]
+Python/Python-ast.c	-	Interactive_fields	variable	static const char *Interactive_fields[]
+Python/Python-ast.c	-	Interactive_type	variable	static PyTypeObject *Interactive_type
+Objects/unicodeobject.c	-	interned	variable	static PyObject *interned
+Objects/interpreteridobject.c	-	interpid_as_number	variable	static PyNumberMethods interpid_as_number
+Modules/signalmodule.c	-	IntHandler	variable	static PyObject *IntHandler
+Objects/longobject.c	-	int_info_desc	variable	static PyStructSequence_Desc int_info_desc
+Objects/longobject.c	-	int_info_fields	variable	static PyStructSequence_Field int_info_fields[]
+Objects/longobject.c	-	Int_InfoType	variable	static PyTypeObject Int_InfoType
+Python/Python-ast.c	-	In_type	variable	static PyTypeObject *In_type
+Python/Python-ast.c	-	Invert_singleton	variable	static PyObject *Invert_singleton
+Python/Python-ast.c	-	Invert_type	variable	static PyTypeObject *Invert_type
+Modules/_io/iobase.c	-	iobase_getset	variable	static PyGetSetDef iobase_getset[]
+Modules/_io/iobase.c	-	iobase_methods	variable	static PyMethodDef iobase_methods
+Python/fileutils.c	set_inheritable	ioctl_works	variable	static int ioctl_works
+Modules/itertoolsmodule.c	-	islice_methods	variable	static PyMethodDef islice_methods
+Modules/itertoolsmodule.c	-	islice_type	variable	static PyTypeObject islice_type
+Python/Python-ast.c	-	IsNot_singleton	variable	static PyObject *IsNot_singleton
+Python/Python-ast.c	-	IsNot_type	variable	static PyTypeObject *IsNot_type
+Python/Python-ast.c	-	Is_singleton	variable	static PyObject *Is_singleton
+Modules/signalmodule.c	-	is_tripped	variable	static _Py_atomic_int is_tripped
+Python/Python-ast.c	-	Is_type	variable	static PyTypeObject *Is_type
+Modules/_operator.c	-	itemgetter_methods	variable	static PyMethodDef itemgetter_methods
+Modules/_operator.c	-	itemgetter_type	variable	static PyTypeObject itemgetter_type
+Modules/itertoolsmodule.c	-	itertoolsmodule	variable	static struct PyModuleDef itertoolsmodule
+Modules/signalmodule.c	-	ItimerError	variable	static PyObject *ItimerError
+Python/Python-ast.c	-	JoinedStr_fields	variable	static const char *JoinedStr_fields[]
+Python/Python-ast.c	-	JoinedStr_type	variable	static PyTypeObject *JoinedStr_type
+Modules/_functoolsmodule.c	-	keyobject_members	variable	static PyMemberDef keyobject_members[]
+Modules/_functoolsmodule.c	-	keyobject_type	variable	static PyTypeObject keyobject_type
+Objects/dictobject.c	-	keys_free_list	variable	static PyDictKeysObject *keys_free_list[PyDict_MAXFREELIST]
+Python/Python-ast.c	-	keyword_fields	variable	static const char *keyword_fields[]
+Python/sysmodule.c	sys_set_asyncgen_hooks	keywords	variable	static const char *keywords[]
+Modules/_bisectmodule.c	bisect_right	keywords	variable	static const char *keywords[]
+Modules/_bisectmodule.c	insort_right	keywords	variable	static const char *keywords[]
+Python/Python-ast.c	-	keyword_type	variable	static PyTypeObject *keyword_type
+Modules/_functoolsmodule.c	keyobject_call	kwargs	variable	static const char *kwargs[]
+Modules/_functoolsmodule.c	functools_cmp_to_key	kwargs	variable	static const char *kwargs[]
+Modules/itertoolsmodule.c	repeat_new	kwargs	variable	static const char *kwargs[]
+Python/_warnings.c	warnings_warn_explicit	kwd_list	variable	static const char *kwd_list[]
+Modules/_functoolsmodule.c	-	kwd_mark	variable	static PyObject *kwd_mark
+Python/bltinmodule.c	builtin___import__	kwlist	variable	static const char *kwlist[]
+Python/bltinmodule.c	min_max	kwlist	variable	static const char *kwlist[]
+Python/context.c	contextvar_tp_new	kwlist	variable	static const char *kwlist[]
+Python/sysmodule.c	sys_getsizeof	kwlist	variable	static const char *kwlist[]
+Objects/bytearrayobject.c	bytearray_init	kwlist	variable	static const char *kwlist[]
+Objects/bytesobject.c	bytes_new	kwlist	variable	static const char *kwlist[]
+Objects/exceptions.c	ImportError_init	kwlist	variable	static const char *kwlist[]
+Objects/interpreteridobject.c	interpid_new	kwlist	variable	static const char *kwlist[]
+Objects/memoryobject.c	memory_new	kwlist	variable	static const char *kwlist[]
+Objects/memoryobject.c	memory_cast	kwlist	variable	static const char *kwlist[]
+Objects/memoryobject.c	memory_tobytes	kwlist	variable	static const char *kwlist[]
+Objects/odictobject.c	odict_pop	kwlist	variable	static const char *kwlist[]
+Objects/unicodeobject.c	unicode_new	kwlist	variable	static const char *kwlist[]
+Objects/weakrefobject.c	weakref_call	kwlist	variable	static const char *kwlist[]
+Modules/_elementtree.c	element_setstate_from_Python	kwlist	variable	static const char *kwlist[]
+Modules/_json.c	scanner_call	kwlist	variable	static const char *kwlist[]
+Modules/_json.c	scanner_new	kwlist	variable	static const char *kwlist[]
+Modules/_json.c	encoder_new	kwlist	variable	static const char *kwlist[]
+Modules/_json.c	encoder_call	kwlist	variable	static const char *kwlist[]
+Python/symtable.c	-	lambda	variable	static identifier lambda
+Python/Python-ast.c	-	Lambda_fields	variable	static const char *Lambda_fields[]
+Python/Python-ast.c	-	Lambda_type	variable	static PyTypeObject *Lambda_type
+Parser/listnode.c	-	level	variable	static int level
+Objects/listobject.c	-	list_as_mapping	variable	static PyMappingMethods list_as_mapping
+Objects/listobject.c	-	list_as_sequence	variable	static PySequenceMethods list_as_sequence
+Python/symtable.c	-	listcomp	variable	static identifier listcomp
+Python/Python-ast.c	-	ListComp_fields	variable	static const char *ListComp_fields[]
+Python/Python-ast.c	-	ListComp_type	variable	static PyTypeObject *ListComp_type
+Python/Python-ast.c	-	List_fields	variable	static const char *List_fields[]
+Objects/listobject.c	-	listiter_methods	variable	static PyMethodDef listiter_methods
+Objects/listobject.c	-	list_methods	variable	static PyMethodDef list_methods
+Objects/listobject.c	-	listreviter_methods	variable	static PyMethodDef listreviter_methods
+Python/Python-ast.c	-	List_type	variable	static PyTypeObject *List_type
+Python/ceval.c	-	lltrace	variable	static int lltrace
+Python/Python-ast.c	-	Load_singleton	variable	static PyObject *Load_singleton
+Python/Python-ast.c	-	Load_type	variable	static PyTypeObject *Load_type
+Modules/_threadmodule.c	-	localdummytype	variable	static PyTypeObject localdummytype
+Modules/_localemodule.c	-	_localemodule	variable	static struct PyModuleDef _localemodule
+Modules/_threadmodule.c	-	localtype	variable	static PyTypeObject localtype
+Modules/_threadmodule.c	-	lock_methods	variable	static PyMethodDef lock_methods
+Modules/_threadmodule.c	-	Locktype	variable	static PyTypeObject Locktype
+Objects/longobject.c	PyLong_FromString	log_base_BASE	variable	static double log_base_BASE[37]
+Objects/longobject.c	-	long_as_number	variable	static PyNumberMethods long_as_number
+Objects/longobject.c	-	long_getset	variable	static PyGetSetDef long_getset[]
+Objects/longobject.c	-	long_methods	variable	static PyMethodDef long_methods
+Objects/rangeobject.c	-	longrangeiter_methods	variable	static PyMethodDef longrangeiter_methods
+Modules/_functoolsmodule.c	-	lru_cache_getsetlist	variable	static PyGetSetDef lru_cache_getsetlist[]
+Modules/_functoolsmodule.c	-	lru_cache_methods	variable	static PyMethodDef lru_cache_methods
+Modules/_functoolsmodule.c	-	lru_cache_type	variable	static PyTypeObject lru_cache_type
+Modules/_functoolsmodule.c	-	lru_list_elem_type	variable	static PyTypeObject lru_list_elem_type
+Python/Python-ast.c	-	LShift_singleton	variable	static PyObject *LShift_singleton
+Python/Python-ast.c	-	LShift_type	variable	static PyTypeObject *LShift_type
+Python/Python-ast.c	-	LtE_singleton	variable	static PyObject *LtE_singleton
+Python/Python-ast.c	-	LtE_type	variable	static PyTypeObject *LtE_type
+Python/Python-ast.c	-	Lt_singleton	variable	static PyObject *Lt_singleton
+Python/Python-ast.c	-	Lt_type	variable	static PyTypeObject *Lt_type
+Python/bltinmodule.c	-	map_methods	variable	static PyMethodDef map_methods
+Objects/descrobject.c	-	mappingproxy_as_mapping	variable	static PyMappingMethods mappingproxy_as_mapping
+Objects/descrobject.c	-	mappingproxy_as_sequence	variable	static PySequenceMethods mappingproxy_as_sequence
+Objects/descrobject.c	-	mappingproxy_methods	variable	static PyMethodDef mappingproxy_methods
+Objects/dictobject.c	-	mapp_methods	variable	static PyMethodDef mapp_methods
+Python/marshal.c	-	marshal_methods	variable	static PyMethodDef marshal_methods
+Python/marshal.c	-	marshalmodule	variable	static struct PyModuleDef marshalmodule
+Modules/_sre.c	-	match_as_mapping	variable	static PyMappingMethods match_as_mapping
+Modules/_sre.c	-	match_getset	variable	static PyGetSetDef match_getset[]
+Modules/_sre.c	-	match_members	variable	static PyMemberDef match_members[]
+Modules/_sre.c	-	match_methods	variable	static PyMethodDef match_methods
+Modules/_sre.c	-	Match_Type	variable	static PyTypeObject Match_Type
+Python/Python-ast.c	-	MatMult_singleton	variable	static PyObject *MatMult_singleton
+Python/Python-ast.c	-	MatMult_type	variable	static PyTypeObject *MatMult_type
+Objects/obmalloc.c	-	maxarenas	variable	static uint maxarenas
+Objects/moduleobject.c	-	max_module_number	variable	static Py_ssize_t max_module_number
+Objects/descrobject.c	-	member_getset	variable	static PyGetSetDef member_getset[]
+Objects/exceptions.c	-	memerrors_freelist	variable	static PyBaseExceptionObject *memerrors_freelist
+Objects/exceptions.c	-	memerrors_numfree	variable	static int memerrors_numfree
+Objects/memoryobject.c	-	memory_as_buffer	variable	static PyBufferProcs memory_as_buffer
+Objects/memoryobject.c	-	memory_as_mapping	variable	static PyMappingMethods memory_as_mapping
+Objects/memoryobject.c	-	memory_as_sequence	variable	static PySequenceMethods memory_as_sequence
+Objects/memoryobject.c	-	memory_getsetlist	variable	static PyGetSetDef memory_getsetlist[]
+Objects/memoryobject.c	-	memory_methods	variable	static PyMethodDef memory_methods
+Objects/methodobject.c	-	meth_getsets	variable	static PyGetSetDef meth_getsets []
+Objects/methodobject.c	-	meth_members	variable	static PyMemberDef meth_members[]
+Objects/methodobject.c	-	meth_methods	variable	static PyMethodDef meth_methods
+Objects/typeobject.c	-	method_cache	variable	static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP]
+Modules/_operator.c	-	methodcaller_methods	variable	static PyMethodDef methodcaller_methods
+Modules/_operator.c	-	methodcaller_type	variable	static PyTypeObject methodcaller_type
+Objects/classobject.c	-	method_getset	variable	static PyGetSetDef method_getset[]
+Objects/descrobject.c	-	method_getset	variable	static PyGetSetDef method_getset[]
+Objects/classobject.c	-	method_memberlist	variable	static PyMemberDef method_memberlist[]
+Objects/classobject.c	-	method_methods	variable	static PyMethodDef method_methods
+Python/codecs.c	_PyCodecRegistry_Init	methods	variable	static struct { char *name; PyMethodDef def; } methods[]
+Python/frozen.c	-	M___hello__	variable	static unsigned char M___hello__[]
+Python/Python-ast.c	-	Mod_singleton	variable	static PyObject *Mod_singleton
+Python/Python-ast.c	-	mod_type	variable	static PyTypeObject *mod_type
+Python/Python-ast.c	-	Mod_type	variable	static PyTypeObject *Mod_type
+Modules/faulthandler.c	-	module_def	variable	static struct PyModuleDef module_def
+Modules/_tracemalloc.c	-	module_def	variable	static struct PyModuleDef module_def
+Python/Python-ast.c	-	Module_fields	variable	static const char *Module_fields[]
+Modules/_collectionsmodule.c	-	module_functions	variable	static struct PyMethodDef module_functions[]
+Modules/_abc.c	-	module_functions	variable	static struct PyMethodDef module_functions[]
+Objects/moduleobject.c	-	module_members	variable	static PyMemberDef module_members[]
+Objects/moduleobject.c	-	module_methods	variable	static PyMethodDef module_methods
+Modules/_functoolsmodule.c	-	module_methods	variable	static PyMethodDef module_methods
+Modules/itertoolsmodule.c	-	module_methods	variable	static PyMethodDef module_methods
+Modules/_io/_iomodule.c	-	module_methods	variable	static PyMethodDef module_methods
+Modules/faulthandler.c	-	module_methods	variable	static PyMethodDef module_methods
+Modules/_tracemalloc.c	-	module_methods	variable	static PyMethodDef module_methods
+Python/Python-ast.c	-	Module_type	variable	static PyTypeObject *Module_type
+Python/Python-ast.c	-	Mult_singleton	variable	static PyObject *Mult_singleton
+Python/Python-ast.c	-	Mult_type	variable	static PyTypeObject *Mult_type
+Objects/funcobject.c	PyFunction_NewWithQualName	__name__	variable	static PyObject *__name__
+Python/compile.c	compiler_lambda	name	variable	static identifier name
+Python/compile.c	compiler_genexp	name	variable	static identifier name
+Python/compile.c	compiler_listcomp	name	variable	static identifier name
+Python/compile.c	compiler_setcomp	name	variable	static identifier name
+Python/compile.c	compiler_dictcomp	name	variable	static identifier name
+Python/Python-ast.c	-	NamedExpr_fields	variable	static const char *NamedExpr_fields[]
+Python/Python-ast.c	-	NamedExpr_type	variable	static PyTypeObject *NamedExpr_type
+Python/Python-ast.c	-	Name_fields	variable	static const char *Name_fields[]
+Objects/typeobject.c	-	name_op	variable	static _Py_Identifier name_op[]
+Objects/namespaceobject.c	-	namespace_members	variable	static PyMemberDef namespace_members[]
+Objects/namespaceobject.c	-	namespace_methods	variable	static PyMethodDef namespace_methods
+Python/Python-ast.c	-	Name_type	variable	static PyTypeObject *Name_type
+Objects/obmalloc.c	-	narenas_currently_allocated	variable	static size_t narenas_currently_allocated
+Objects/obmalloc.c	-	narenas_highwater	variable	static size_t narenas_highwater
+Python/sysmodule.c	sys_displayhook	newline	variable	static PyObject *newline
+Objects/typeobject.c	-	next_version_tag	variable	static unsigned int next_version_tag
+Objects/obmalloc.c	-	nfp2lasta	variable	static struct arena_object* nfp2lasta[MAX_POOLS_IN_ARENA + 1]
+Python/dynload_shlib.c	-	nhandles	variable	static int nhandles
+Objects/object.c	-	none_as_number	variable	static PyNumberMethods none_as_number
+Python/Python-ast.c	-	Nonlocal_fields	variable	static const char *Nonlocal_fields[]
+Python/Python-ast.c	-	Nonlocal_type	variable	static PyTypeObject *Nonlocal_type
+Python/Python-ast.c	-	NotEq_singleton	variable	static PyObject *NotEq_singleton
+Python/Python-ast.c	-	NotEq_type	variable	static PyTypeObject *NotEq_type
+Objects/object.c	-	notimplemented_methods	variable	static PyMethodDef notimplemented_methods
+Python/Python-ast.c	-	NotIn_singleton	variable	static PyObject *NotIn_singleton
+Python/Python-ast.c	-	NotIn_type	variable	static PyTypeObject *NotIn_type
+Python/Python-ast.c	-	Not_singleton	variable	static PyObject *Not_singleton
+Python/Python-ast.c	-	Not_type	variable	static PyTypeObject *Not_type
+Objects/obmalloc.c	-	ntimes_arena_allocated	variable	static size_t ntimes_arena_allocated
+Objects/bytesobject.c	-	nullstring	variable	static PyBytesObject *nullstring
+Objects/codeobject.c	PyCode_NewEmpty	nulltuple	variable	static PyObject *nulltuple
+Objects/floatobject.c	-	numfree	variable	static int numfree
+Objects/frameobject.c	-	numfree	variable	static int numfree
+Objects/listobject.c	-	numfree	variable	static int numfree
+Objects/dictobject.c	-	numfree	variable	static int numfree
+Objects/methodobject.c	-	numfree	variable	static int numfree
+Objects/tupleobject.c	-	numfree	variable	static int numfree[PyTuple_MAXSAVESIZE]
+Objects/classobject.c	-	numfree	variable	static int numfree
+Modules/_collectionsmodule.c	-	numfreeblocks	variable	static Py_ssize_t numfreeblocks
+Objects/dictobject.c	-	numfreekeys	variable	static int numfreekeys
+Objects/typeobject.c	-	object_getsets	variable	static PyGetSetDef object_getsets[]
+Objects/typeobject.c	-	object_methods	variable	static PyMethodDef object_methods
+Objects/typeobject.c	object___reduce_ex___impl	objreduce	variable	static PyObject *objreduce
+Objects/odictobject.c	-	odict_as_mapping	variable	static PyMappingMethods odict_as_mapping
+Objects/odictobject.c	-	odict_getset	variable	static PyGetSetDef odict_getset[]
+Objects/odictobject.c	-	odictitems_methods	variable	static PyMethodDef odictitems_methods
+Objects/odictobject.c	-	odictiter_methods	variable	static PyMethodDef odictiter_methods
+Objects/odictobject.c	-	odictkeys_methods	variable	static PyMethodDef odictkeys_methods
+Objects/odictobject.c	-	odict_methods	variable	static PyMethodDef odict_methods
+Objects/odictobject.c	-	odictvalues_methods	variable	static PyMethodDef odictvalues_methods
+Modules/faulthandler.c	-	old_stack	variable	static stack_t old_stack
+Modules/_operator.c	-	operator_methods	variable	static PyMethodDef operator_methods
+Modules/_operator.c	-	operatormodule	variable	static struct PyModuleDef operatormodule
+Python/Python-ast.c	-	operator_type	variable	static PyTypeObject *operator_type
+Objects/typeobject.c	slot_nb_add	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_subtract	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_multiply	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_matrix_multiply	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_remainder	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_divmod	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_power_binary	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_lshift	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_rshift	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_and	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_xor	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_or	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_floor_divide	op_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_true_divide	op_id	variable	_Py_static_string(op_id, OPSTR)
+Python/getopt.c	-	opt_ptr	variable	static const wchar_t *opt_ptr
+Python/initconfig.c	-	orig_argv	variable	static PyWideStringList orig_argv
+Python/Python-ast.c	-	Or_singleton	variable	static PyObject *Or_singleton
+Python/Python-ast.c	-	Or_type	variable	static PyTypeObject *Or_type
+Objects/exceptions.c	-	OSError_getset	variable	static PyGetSetDef OSError_getset[]
+Objects/exceptions.c	-	OSError_members	variable	static PyMemberDef OSError_members[]
+Objects/exceptions.c	-	OSError_methods	variable	static PyMethodDef OSError_methods
+Python/dtoa.c	-	p5s	variable	static Bigint *p5s
+Python/Python-ast.c	-	Param_singleton	variable	static PyObject *Param_singleton
+Python/Python-ast.c	-	Param_type	variable	static PyTypeObject *Param_type
+Python/bltinmodule.c	builtin_print	_parser	variable	static struct _PyArg_Parser _parser
+Python/clinic/_warnings.c.h	warnings_warn	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/bltinmodule.c.h	builtin_compile	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/bltinmodule.c.h	builtin_round	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/bltinmodule.c.h	builtin_sum	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/import.c.h	_imp_source_hash	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/sysmodule.c.h	sys_addaudithook	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/sysmodule.c.h	sys_set_coroutine_origin_tracking_depth	_parser	variable	static _PyArg_Parser _parser
+Python/clinic/traceback.c.h	tb_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_translate	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_split	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_rsplit	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_decode	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_splitlines	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytearrayobject.c.h	bytearray_hex	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_split	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_rsplit	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_translate	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_decode	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_splitlines	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/bytesobject.c.h	bytes_hex	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/codeobject.c.h	code_replace	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/complexobject.c.h	complex_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/descrobject.c.h	mappingproxy_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/descrobject.c.h	property_init	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/enumobject.c.h	enum_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/funcobject.c.h	func_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/listobject.c.h	list_sort	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/longobject.c.h	long_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/longobject.c.h	int_to_bytes	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/longobject.c.h	int_from_bytes	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/memoryobject.c.h	memoryview_hex	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/moduleobject.c.h	module___init__	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/odictobject.c.h	OrderedDict_fromkeys	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/odictobject.c.h	OrderedDict_setdefault	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/odictobject.c.h	OrderedDict_popitem	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/odictobject.c.h	OrderedDict_move_to_end	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/structseq.c.h	structseq_new	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/unicodeobject.c.h	unicode_encode	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/unicodeobject.c.h	unicode_expandtabs	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/unicodeobject.c.h	unicode_split	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/unicodeobject.c.h	unicode_rsplit	_parser	variable	static _PyArg_Parser _parser
+Objects/clinic/unicodeobject.c.h	unicode_splitlines	_parser	variable	static _PyArg_Parser _parser
+Objects/stringlib/clinic/transmogrify.h.h	stringlib_expandtabs	_parser	variable	static _PyArg_Parser _parser
+Modules/_blake2/clinic/blake2b_impl.c.h	py_blake2b_new	_parser	variable	static _PyArg_Parser _parser
+Modules/_blake2/clinic/blake2s_impl.c.h	py_blake2s_new	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/_iomodule.c.h	_io_open	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/_iomodule.c.h	_io_open_code	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/bufferedio.c.h	_io_BufferedReader___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/bufferedio.c.h	_io_BufferedWriter___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/bufferedio.c.h	_io_BufferedRandom___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/bytesio.c.h	_io_BytesIO___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/fileio.c.h	_io_FileIO___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/stringio.c.h	_io_StringIO___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/textio.c.h	_io_IncrementalNewlineDecoder___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/textio.c.h	_io_IncrementalNewlineDecoder_decode	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/textio.c.h	_io_TextIOWrapper___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/textio.c.h	_io_TextIOWrapper_reconfigure	_parser	variable	static _PyArg_Parser _parser
+Modules/_io/clinic/winconsoleio.c.h	_io__WindowsConsoleIO___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/_multiprocessing/clinic/posixshmem.c.h	_posixshmem_shm_open	_parser	variable	static _PyArg_Parser _parser
+Modules/_multiprocessing/clinic/posixshmem.c.h	_posixshmem_shm_unlink	_parser	variable	static _PyArg_Parser _parser
+Modules/cjkcodecs/clinic/multibytecodec.c.h	_multibytecodec_MultibyteCodec_encode	_parser	variable	static _PyArg_Parser _parser
+Modules/cjkcodecs/clinic/multibytecodec.c.h	_multibytecodec_MultibyteCodec_decode	_parser	variable	static _PyArg_Parser _parser
+Modules/cjkcodecs/clinic/multibytecodec.c.h	_multibytecodec_MultibyteIncrementalEncoder_encode	_parser	variable	static _PyArg_Parser _parser
+Modules/cjkcodecs/clinic/multibytecodec.c.h	_multibytecodec_MultibyteIncrementalDecoder_decode	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Future___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Future_add_done_callback	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Task___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Task_current_task	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Task_all_tasks	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Task_get_stack	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio_Task_print_stack	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio__register_task	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio__unregister_task	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio__enter_task	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_asynciomodule.c.h	_asyncio__leave_task	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_bz2module.c.h	_bz2_BZ2Decompressor_decompress	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_codecsmodule.c.h	_codecs_encode	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_codecsmodule.c.h	_codecs_decode	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_cursesmodule.c.h	_curses_setupterm	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_datetimemodule.c.h	datetime_datetime_now	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_find	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_findtext	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_findall	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_iterfind	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_get	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_iter	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_Element_getiterator	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_TreeBuilder___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_elementtree.c.h	_elementtree_XMLParser___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_hashopenssl.c.h	EVP_new	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_hashopenssl.c.h	pbkdf2_hmac	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_hashopenssl.c.h	_hashlib_scrypt	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_hashopenssl.c.h	_hashlib_hmac_digest	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_lzmamodule.c.h	_lzma_LZMADecompressor_decompress	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_lzmamodule.c.h	_lzma_LZMADecompressor___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_opcode.c.h	_opcode_stack_effect	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_Pickler___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_Unpickler___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_dump	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_dumps	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_load	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_pickle.c.h	_pickle_loads	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_queuemodule.c.h	_queue_SimpleQueue_put	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_queuemodule.c.h	_queue_SimpleQueue_put_nowait	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_queuemodule.c.h	_queue_SimpleQueue_get	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_match	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_fullmatch	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_search	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_findall	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_finditer	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_scanner	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_split	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_sub	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Pattern_subn	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_compile	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Match_expand	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Match_groups	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_sre.c.h	_sre_SRE_Match_groupdict	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLSocket_get_channel_binding	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLContext_load_cert_chain	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLContext_load_verify_locations	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLContext__wrap_socket	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLContext__wrap_bio	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl__SSLContext_get_ca_certs	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl_txt2obj	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl_enum_certificates	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_ssl.c.h	_ssl_enum_crls	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_struct.c.h	Struct___init__	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_struct.c.h	Struct_unpack_from	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_struct.c.h	unpack_from	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_winapi.c.h	_winapi_ConnectNamedPipe	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_winapi.c.h	_winapi_ReadFile	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_winapi.c.h	_winapi_WriteFile	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/_winapi.c.h	_winapi_GetFileType	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_b2a_uu	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_b2a_base64	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_b2a_hex	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_hexlify	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_a2b_qp	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/binascii.c.h	binascii_b2a_qp	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/cmathmodule.c.h	cmath_isclose	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/gcmodule.c.h	gc_collect	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/gcmodule.c.h	gc_get_objects	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/grpmodule.c.h	grp_getgrgid	_parser	variable	static _PyArg_Parser _parser
+Modules/clinic/grpmodule.c.h	grp_getgrnam	_parser	variable	static _PyArg_Parser _parser
+Modules/_functoolsmodule.c	-	partial_getsetlist	variable	static PyGetSetDef partial_getsetlist[]
+Modules/_functoolsmodule.c	-	partial_memberlist	variable	static PyMemberDef partial_memberlist[]
+Modules/_functoolsmodule.c	-	partial_methods	variable	static PyMethodDef partial_methods
+Modules/_functoolsmodule.c	-	partial_type	variable	static PyTypeObject partial_type
+Python/Python-ast.c	-	Pass_type	variable	static PyTypeObject *Pass_type
+Modules/_sre.c	-	pattern_getset	variable	static PyGetSetDef pattern_getset[]
+Modules/_sre.c	-	pattern_members	variable	static PyMemberDef pattern_members[]
+Modules/_sre.c	-	pattern_methods	variable	static PyMethodDef pattern_methods
+Modules/_sre.c	-	Pattern_Type	variable	static PyTypeObject Pattern_Type
+Modules/itertoolsmodule.c	-	permuations_methods	variable	static PyMethodDef permuations_methods
+Modules/itertoolsmodule.c	-	permutations_type	variable	static PyTypeObject permutations_type
+Objects/picklebufobject.c	-	picklebuf_as_buffer	variable	static PyBufferProcs picklebuf_as_buffer
+Objects/picklebufobject.c	-	picklebuf_methods	variable	static PyMethodDef picklebuf_methods
+Python/dtoa.c	-	pmem_next	variable	static double *pmem_next
+Objects/typeobject.c	resolve_slotdups	pname	variable	static PyObject *pname
+Modules/posixmodule.c	-	posix_constants_confstr	variable	static struct constdef posix_constants_confstr[]
+Modules/posixmodule.c	-	posix_constants_pathconf	variable	static struct constdef  posix_constants_pathconf[]
+Modules/posixmodule.c	-	posix_constants_sysconf	variable	static struct constdef posix_constants_sysconf[]
+Modules/posixmodule.c	-	posix_methods	variable	static PyMethodDef posix_methods
+Modules/posixmodule.c	-	posixmodule	variable	static struct PyModuleDef posixmodule
+Modules/posixmodule.c	-	posix_putenv_garbage	variable	static PyObject *posix_putenv_garbage
+Python/Python-ast.c	-	Pow_singleton	variable	static PyObject *Pow_singleton
+Python/Python-ast.c	-	Pow_type	variable	static PyTypeObject *Pow_type
+Python/sysmodule.c	-	_preinit_warnoptions	variable	static _Py_PreInitEntry _preinit_warnoptions
+Python/sysmodule.c	-	_preinit_xoptions	variable	static _Py_PreInitEntry _preinit_xoptions
+Objects/exceptions.c	_check_for_legacy_statements	print_prefix	variable	static PyObject *print_prefix
+Python/dtoa.c	-	private_mem	variable	static double private_mem[PRIVATE_mem]
+Modules/itertoolsmodule.c	-	product_methods	variable	static PyMethodDef product_methods
+Modules/itertoolsmodule.c	-	product_type	variable	static PyTypeObject product_type
+Objects/descrobject.c	-	property_getsetlist	variable	static PyGetSetDef property_getsetlist[]
+Objects/descrobject.c	-	property_members	variable	static PyMemberDef property_members[]
+Objects/descrobject.c	-	property_methods	variable	static PyMethodDef property_methods
+Objects/weakrefobject.c	-	proxy_as_mapping	variable	static PyMappingMethods proxy_as_mapping
+Objects/weakrefobject.c	-	proxy_as_number	variable	static PyNumberMethods proxy_as_number
+Objects/weakrefobject.c	-	proxy_as_sequence	variable	static PySequenceMethods proxy_as_sequence
+Objects/weakrefobject.c	-	proxy_methods	variable	static PyMethodDef proxy_methods
+Objects/typeobject.c	resolve_slotdups	ptrs	variable	static slotdef *ptrs[MAX_EQUIV]
+Modules/pwdmodule.c	-	pwd_methods	variable	static PyMethodDef pwd_methods
+Modules/pwdmodule.c	-	pwdmodule	variable	static struct PyModuleDef pwdmodule
+Objects/obmalloc.c	-	_Py_AllocatedBlocks	variable	static Py_ssize_t _Py_AllocatedBlocks
+Objects/genobject.c	-	_PyAsyncGenASend_Type	variable	PyTypeObject _PyAsyncGenASend_Type
+Objects/genobject.c	-	_PyAsyncGenAThrow_Type	variable	PyTypeObject _PyAsyncGenAThrow_Type
+Objects/genobject.c	-	PyAsyncGen_Type	variable	PyTypeObject PyAsyncGen_Type
+Objects/genobject.c	-	_PyAsyncGenWrappedValue_Type	variable	PyTypeObject _PyAsyncGenWrappedValue_Type
+Objects/typeobject.c	-	PyBaseObject_Type	variable	PyTypeObject PyBaseObject_Type
+Objects/boolobject.c	-	PyBool_Type	variable	PyTypeObject PyBool_Type
+Modules/_io/bufferedio.c	-	PyBufferedIOBase_Type	variable	PyTypeObject PyBufferedIOBase_Type
+Modules/_io/bufferedio.c	-	PyBufferedRandom_Type	variable	PyTypeObject PyBufferedRandom_Type
+Modules/_io/bufferedio.c	-	PyBufferedReader_Type	variable	PyTypeObject PyBufferedReader_Type
+Modules/_io/bufferedio.c	-	PyBufferedRWPair_Type	variable	PyTypeObject PyBufferedRWPair_Type
+Modules/_io/bufferedio.c	-	PyBufferedWriter_Type	variable	PyTypeObject PyBufferedWriter_Type
+Objects/bytearrayobject.c	-	_PyByteArray_empty_string	variable	char _PyByteArray_empty_string[]
+Objects/bytearrayobject.c	-	PyByteArrayIter_Type	variable	PyTypeObject PyByteArrayIter_Type
+Objects/bytearrayobject.c	-	PyByteArray_Type	variable	PyTypeObject PyByteArray_Type
+Modules/_io/bytesio.c	-	_PyBytesIOBuffer_Type	variable	PyTypeObject _PyBytesIOBuffer_Type
+Modules/_io/bytesio.c	-	PyBytesIO_Type	variable	PyTypeObject PyBytesIO_Type
+Objects/bytesobject.c	-	PyBytesIter_Type	variable	PyTypeObject PyBytesIter_Type
+Objects/bytesobject.c	-	PyBytes_Type	variable	PyTypeObject PyBytes_Type
+Python/initconfig.c	-	Py_BytesWarningFlag	variable	int Py_BytesWarningFlag
+Objects/iterobject.c	-	PyCallIter_Type	variable	PyTypeObject PyCallIter_Type
+Objects/capsule.c	-	PyCapsule_Type	variable	PyTypeObject PyCapsule_Type
+Objects/cellobject.c	-	PyCell_Type	variable	PyTypeObject PyCell_Type
+Objects/methodobject.c	-	PyCFunction_Type	variable	PyTypeObject PyCFunction_Type
+Python/ceval.c	-	_Py_CheckRecursionLimit	variable	int _Py_CheckRecursionLimit
+Objects/descrobject.c	-	PyClassMethodDescr_Type	variable	PyTypeObject PyClassMethodDescr_Type
+Objects/funcobject.c	-	PyClassMethod_Type	variable	PyTypeObject PyClassMethod_Type
+Objects/codeobject.c	-	PyCode_Type	variable	PyTypeObject PyCode_Type
+Objects/complexobject.c	-	PyComplex_Type	variable	PyTypeObject PyComplex_Type
+Python/context.c	-	PyContext_as_mapping	variable	static PyMappingMethods PyContext_as_mapping
+Python/context.c	-	PyContext_as_sequence	variable	static PySequenceMethods PyContext_as_sequence
+Python/context.c	-	PyContext_methods	variable	static PyMethodDef PyContext_methods
+Python/context.c	-	PyContextTokenMissing_Type	variable	PyTypeObject PyContextTokenMissing_Type
+Python/context.c	-	PyContextToken_Type	variable	PyTypeObject PyContextToken_Type
+Python/context.c	-	PyContextTokenType_getsetlist	variable	static PyGetSetDef PyContextTokenType_getsetlist[]
+Python/context.c	-	PyContext_Type	variable	PyTypeObject PyContext_Type
+Python/context.c	-	PyContextVar_members	variable	static PyMemberDef PyContextVar_members[]
+Python/context.c	-	PyContextVar_methods	variable	static PyMethodDef PyContextVar_methods
+Python/context.c	-	PyContextVar_Type	variable	PyTypeObject PyContextVar_Type
+Objects/genobject.c	-	PyCoro_Type	variable	PyTypeObject PyCoro_Type
+Objects/genobject.c	-	_PyCoroWrapper_Type	variable	PyTypeObject _PyCoroWrapper_Type
+Python/initconfig.c	-	Py_DebugFlag	variable	int Py_DebugFlag
+Objects/dictobject.c	-	pydict_global_version	variable	static uint64_t pydict_global_version
+Objects/dictobject.c	-	PyDictItems_Type	variable	PyTypeObject PyDictItems_Type
+Objects/dictobject.c	-	PyDictIterItem_Type	variable	PyTypeObject PyDictIterItem_Type
+Objects/dictobject.c	-	PyDictIterKey_Type	variable	PyTypeObject PyDictIterKey_Type
+Objects/dictobject.c	-	PyDictIterValue_Type	variable	PyTypeObject PyDictIterValue_Type
+Objects/dictobject.c	-	PyDictKeys_Type	variable	PyTypeObject PyDictKeys_Type
+Objects/descrobject.c	-	PyDictProxy_Type	variable	PyTypeObject PyDictProxy_Type
+Objects/dictobject.c	-	PyDictRevIterItem_Type	variable	PyTypeObject PyDictRevIterItem_Type
+Objects/dictobject.c	-	PyDictRevIterKey_Type	variable	PyTypeObject PyDictRevIterKey_Type
+Objects/dictobject.c	-	PyDictRevIterValue_Type	variable	PyTypeObject PyDictRevIterValue_Type
+Objects/dictobject.c	-	PyDict_Type	variable	PyTypeObject PyDict_Type
+Objects/dictobject.c	-	PyDictValues_Type	variable	PyTypeObject PyDictValues_Type
+Python/initconfig.c	-	Py_DontWriteBytecodeFlag	variable	int Py_DontWriteBytecodeFlag
+Objects/sliceobject.c	-	_Py_EllipsisObject	variable	PyObject _Py_EllipsisObject
+Objects/sliceobject.c	-	PyEllipsis_Type	variable	PyTypeObject PyEllipsis_Type
+Objects/enumobject.c	-	PyEnum_Type	variable	PyTypeObject PyEnum_Type
+Objects/exceptions.c	-	_PyExc_ArithmeticError	variable	static PyTypeObject _PyExc_ArithmeticError
+Objects/exceptions.c	-	PyExc_ArithmeticError	variable	static PyTypeObject PyExc_ArithmeticError
+Objects/exceptions.c	-	_PyExc_AssertionError	variable	static PyTypeObject _PyExc_AssertionError
+Objects/exceptions.c	-	PyExc_AssertionError	variable	static PyTypeObject PyExc_AssertionError
+Objects/exceptions.c	-	_PyExc_AttributeError	variable	static PyTypeObject _PyExc_AttributeError
+Objects/exceptions.c	-	PyExc_AttributeError	variable	static PyTypeObject PyExc_AttributeError
+Objects/exceptions.c	-	_PyExc_BaseException	variable	static PyTypeObject _PyExc_BaseException
+Objects/exceptions.c	-	PyExc_BaseException	variable	static PyTypeObject PyExc_BaseException
+Objects/exceptions.c	-	_PyExc_BlockingIOError	variable	static PyTypeObject _PyExc_BlockingIOError
+Objects/exceptions.c	-	PyExc_BlockingIOError	variable	static PyTypeObject PyExc_BlockingIOError
+Objects/exceptions.c	-	_PyExc_BrokenPipeError	variable	static PyTypeObject _PyExc_BrokenPipeError
+Objects/exceptions.c	-	PyExc_BrokenPipeError	variable	static PyTypeObject PyExc_BrokenPipeError
+Objects/exceptions.c	-	_PyExc_BufferError	variable	static PyTypeObject _PyExc_BufferError
+Objects/exceptions.c	-	PyExc_BufferError	variable	static PyTypeObject PyExc_BufferError
+Objects/exceptions.c	-	_PyExc_BytesWarning	variable	static PyTypeObject _PyExc_BytesWarning
+Objects/exceptions.c	-	PyExc_BytesWarning	variable	static PyTypeObject PyExc_BytesWarning
+Objects/exceptions.c	-	_PyExc_ChildProcessError	variable	static PyTypeObject _PyExc_ChildProcessError
+Objects/exceptions.c	-	PyExc_ChildProcessError	variable	static PyTypeObject PyExc_ChildProcessError
+Objects/exceptions.c	-	_PyExc_ConnectionAbortedError	variable	static PyTypeObject _PyExc_ConnectionAbortedError
+Objects/exceptions.c	-	PyExc_ConnectionAbortedError	variable	static PyTypeObject PyExc_ConnectionAbortedError
+Objects/exceptions.c	-	_PyExc_ConnectionError	variable	static PyTypeObject _PyExc_ConnectionError
+Objects/exceptions.c	-	PyExc_ConnectionError	variable	static PyTypeObject PyExc_ConnectionError
+Objects/exceptions.c	-	_PyExc_ConnectionRefusedError	variable	static PyTypeObject _PyExc_ConnectionRefusedError
+Objects/exceptions.c	-	PyExc_ConnectionRefusedError	variable	static PyTypeObject PyExc_ConnectionRefusedError
+Objects/exceptions.c	-	_PyExc_ConnectionResetError	variable	static PyTypeObject _PyExc_ConnectionResetError
+Objects/exceptions.c	-	PyExc_ConnectionResetError	variable	static PyTypeObject PyExc_ConnectionResetError
+Objects/exceptions.c	-	_PyExc_DeprecationWarning	variable	static PyTypeObject _PyExc_DeprecationWarning
+Objects/exceptions.c	-	PyExc_DeprecationWarning	variable	static PyTypeObject PyExc_DeprecationWarning
+Objects/exceptions.c	-	PyExc_EnvironmentError	variable	static PyTypeObject PyExc_EnvironmentError
+Objects/exceptions.c	-	_PyExc_EOFError	variable	static PyTypeObject _PyExc_EOFError
+Objects/exceptions.c	-	PyExc_EOFError	variable	static PyTypeObject PyExc_EOFError
+Objects/exceptions.c	-	_PyExc_Exception	variable	static PyTypeObject _PyExc_Exception
+Objects/exceptions.c	-	PyExc_Exception	variable	static PyTypeObject PyExc_Exception
+Objects/exceptions.c	-	_PyExc_FileExistsError	variable	static PyTypeObject _PyExc_FileExistsError
+Objects/exceptions.c	-	PyExc_FileExistsError	variable	static PyTypeObject PyExc_FileExistsError
+Objects/exceptions.c	-	_PyExc_FileNotFoundError	variable	static PyTypeObject _PyExc_FileNotFoundError
+Objects/exceptions.c	-	PyExc_FileNotFoundError	variable	static PyTypeObject PyExc_FileNotFoundError
+Objects/exceptions.c	-	_PyExc_FloatingPointError	variable	static PyTypeObject _PyExc_FloatingPointError
+Objects/exceptions.c	-	PyExc_FloatingPointError	variable	static PyTypeObject PyExc_FloatingPointError
+Objects/exceptions.c	-	_PyExc_FutureWarning	variable	static PyTypeObject _PyExc_FutureWarning
+Objects/exceptions.c	-	PyExc_FutureWarning	variable	static PyTypeObject PyExc_FutureWarning
+Objects/exceptions.c	-	_PyExc_GeneratorExit	variable	static PyTypeObject _PyExc_GeneratorExit
+Objects/exceptions.c	-	PyExc_GeneratorExit	variable	static PyTypeObject PyExc_GeneratorExit
+Objects/exceptions.c	-	_PyExc_ImportError	variable	static PyTypeObject _PyExc_ImportError
+Objects/exceptions.c	-	PyExc_ImportError	variable	static PyTypeObject PyExc_ImportError
+Objects/exceptions.c	-	_PyExc_ImportWarning	variable	static PyTypeObject _PyExc_ImportWarning
+Objects/exceptions.c	-	PyExc_ImportWarning	variable	static PyTypeObject PyExc_ImportWarning
+Objects/exceptions.c	-	_PyExc_IndentationError	variable	static PyTypeObject _PyExc_IndentationError
+Objects/exceptions.c	-	PyExc_IndentationError	variable	static PyTypeObject PyExc_IndentationError
+Objects/exceptions.c	-	_PyExc_IndexError	variable	static PyTypeObject _PyExc_IndexError
+Objects/exceptions.c	-	PyExc_IndexError	variable	static PyTypeObject PyExc_IndexError
+Objects/exceptions.c	-	_PyExc_InterruptedError	variable	static PyTypeObject _PyExc_InterruptedError
+Objects/exceptions.c	-	PyExc_InterruptedError	variable	static PyTypeObject PyExc_InterruptedError
+Objects/exceptions.c	-	PyExc_IOError	variable	static PyTypeObject PyExc_IOError
+Objects/exceptions.c	-	_PyExc_IsADirectoryError	variable	static PyTypeObject _PyExc_IsADirectoryError
+Objects/exceptions.c	-	PyExc_IsADirectoryError	variable	static PyTypeObject PyExc_IsADirectoryError
+Objects/exceptions.c	-	_PyExc_KeyboardInterrupt	variable	static PyTypeObject _PyExc_KeyboardInterrupt
+Objects/exceptions.c	-	PyExc_KeyboardInterrupt	variable	static PyTypeObject PyExc_KeyboardInterrupt
+Objects/exceptions.c	-	_PyExc_KeyError	variable	static PyTypeObject _PyExc_KeyError
+Objects/exceptions.c	-	PyExc_KeyError	variable	static PyTypeObject PyExc_KeyError
+Objects/exceptions.c	-	_PyExc_LookupError	variable	static PyTypeObject _PyExc_LookupError
+Objects/exceptions.c	-	PyExc_LookupError	variable	static PyTypeObject PyExc_LookupError
+Objects/exceptions.c	-	_PyExc_MemoryError	variable	static PyTypeObject _PyExc_MemoryError
+Objects/exceptions.c	-	PyExc_MemoryError	variable	static PyTypeObject PyExc_MemoryError
+Objects/exceptions.c	-	_PyExc_ModuleNotFoundError	variable	static PyTypeObject _PyExc_ModuleNotFoundError
+Objects/exceptions.c	-	PyExc_ModuleNotFoundError	variable	static PyTypeObject PyExc_ModuleNotFoundError
+Objects/exceptions.c	-	_PyExc_NameError	variable	static PyTypeObject _PyExc_NameError
+Objects/exceptions.c	-	PyExc_NameError	variable	static PyTypeObject PyExc_NameError
+Objects/exceptions.c	-	_PyExc_NotADirectoryError	variable	static PyTypeObject _PyExc_NotADirectoryError
+Objects/exceptions.c	-	PyExc_NotADirectoryError	variable	static PyTypeObject PyExc_NotADirectoryError
+Objects/exceptions.c	-	_PyExc_NotImplementedError	variable	static PyTypeObject _PyExc_NotImplementedError
+Objects/exceptions.c	-	PyExc_NotImplementedError	variable	static PyTypeObject PyExc_NotImplementedError
+Objects/exceptions.c	-	_PyExc_OSError	variable	static PyTypeObject _PyExc_OSError
+Objects/exceptions.c	-	PyExc_OSError	variable	static PyTypeObject PyExc_OSError
+Objects/exceptions.c	-	_PyExc_OverflowError	variable	static PyTypeObject _PyExc_OverflowError
+Objects/exceptions.c	-	PyExc_OverflowError	variable	static PyTypeObject PyExc_OverflowError
+Objects/exceptions.c	-	_PyExc_PendingDeprecationWarning	variable	static PyTypeObject _PyExc_PendingDeprecationWarning
+Objects/exceptions.c	-	PyExc_PendingDeprecationWarning	variable	static PyTypeObject PyExc_PendingDeprecationWarning
+Objects/exceptions.c	-	_PyExc_PermissionError	variable	static PyTypeObject _PyExc_PermissionError
+Objects/exceptions.c	-	PyExc_PermissionError	variable	static PyTypeObject PyExc_PermissionError
+Objects/exceptions.c	-	_PyExc_ProcessLookupError	variable	static PyTypeObject _PyExc_ProcessLookupError
+Objects/exceptions.c	-	PyExc_ProcessLookupError	variable	static PyTypeObject PyExc_ProcessLookupError
+Objects/exceptions.c	-	_PyExc_RecursionError	variable	static PyTypeObject _PyExc_RecursionError
+Objects/exceptions.c	-	PyExc_RecursionError	variable	static PyTypeObject PyExc_RecursionError
+Objects/exceptions.c	-	_PyExc_ReferenceError	variable	static PyTypeObject _PyExc_ReferenceError
+Objects/exceptions.c	-	PyExc_ReferenceError	variable	static PyTypeObject PyExc_ReferenceError
+Objects/exceptions.c	-	_PyExc_ResourceWarning	variable	static PyTypeObject _PyExc_ResourceWarning
+Objects/exceptions.c	-	PyExc_ResourceWarning	variable	static PyTypeObject PyExc_ResourceWarning
+Objects/exceptions.c	-	_PyExc_RuntimeError	variable	static PyTypeObject _PyExc_RuntimeError
+Objects/exceptions.c	-	PyExc_RuntimeError	variable	static PyTypeObject PyExc_RuntimeError
+Objects/exceptions.c	-	_PyExc_RuntimeWarning	variable	static PyTypeObject _PyExc_RuntimeWarning
+Objects/exceptions.c	-	PyExc_RuntimeWarning	variable	static PyTypeObject PyExc_RuntimeWarning
+Objects/exceptions.c	-	_PyExc_StopAsyncIteration	variable	static PyTypeObject _PyExc_StopAsyncIteration
+Objects/exceptions.c	-	PyExc_StopAsyncIteration	variable	static PyTypeObject PyExc_StopAsyncIteration
+Objects/exceptions.c	-	_PyExc_StopIteration	variable	static PyTypeObject _PyExc_StopIteration
+Objects/exceptions.c	-	PyExc_StopIteration	variable	static PyTypeObject PyExc_StopIteration
+Objects/exceptions.c	-	_PyExc_SyntaxError	variable	static PyTypeObject _PyExc_SyntaxError
+Objects/exceptions.c	-	PyExc_SyntaxError	variable	static PyTypeObject PyExc_SyntaxError
+Objects/exceptions.c	-	_PyExc_SyntaxWarning	variable	static PyTypeObject _PyExc_SyntaxWarning
+Objects/exceptions.c	-	PyExc_SyntaxWarning	variable	static PyTypeObject PyExc_SyntaxWarning
+Objects/exceptions.c	-	_PyExc_SystemError	variable	static PyTypeObject _PyExc_SystemError
+Objects/exceptions.c	-	PyExc_SystemError	variable	static PyTypeObject PyExc_SystemError
+Objects/exceptions.c	-	_PyExc_SystemExit	variable	static PyTypeObject _PyExc_SystemExit
+Objects/exceptions.c	-	PyExc_SystemExit	variable	static PyTypeObject PyExc_SystemExit
+Objects/exceptions.c	-	_PyExc_TabError	variable	static PyTypeObject _PyExc_TabError
+Objects/exceptions.c	-	PyExc_TabError	variable	static PyTypeObject PyExc_TabError
+Objects/exceptions.c	-	_PyExc_TargetScopeError	variable	static PyTypeObject _PyExc_TargetScopeError
+Objects/exceptions.c	-	PyExc_TargetScopeError	variable	static PyTypeObject PyExc_TargetScopeError
+Objects/exceptions.c	-	_PyExc_TimeoutError	variable	static PyTypeObject _PyExc_TimeoutError
+Objects/exceptions.c	-	PyExc_TimeoutError	variable	static PyTypeObject PyExc_TimeoutError
+Objects/exceptions.c	-	_PyExc_TypeError	variable	static PyTypeObject _PyExc_TypeError
+Objects/exceptions.c	-	PyExc_TypeError	variable	static PyTypeObject PyExc_TypeError
+Objects/exceptions.c	-	_PyExc_UnboundLocalError	variable	static PyTypeObject _PyExc_UnboundLocalError
+Objects/exceptions.c	-	PyExc_UnboundLocalError	variable	static PyTypeObject PyExc_UnboundLocalError
+Objects/exceptions.c	-	_PyExc_UnicodeDecodeError	variable	static PyTypeObject _PyExc_UnicodeDecodeError
+Objects/exceptions.c	-	PyExc_UnicodeDecodeError	variable	static PyTypeObject PyExc_UnicodeDecodeError
+Objects/exceptions.c	-	_PyExc_UnicodeEncodeError	variable	static PyTypeObject _PyExc_UnicodeEncodeError
+Objects/exceptions.c	-	PyExc_UnicodeEncodeError	variable	static PyTypeObject PyExc_UnicodeEncodeError
+Objects/exceptions.c	-	_PyExc_UnicodeError	variable	static PyTypeObject _PyExc_UnicodeError
+Objects/exceptions.c	-	PyExc_UnicodeError	variable	static PyTypeObject PyExc_UnicodeError
+Objects/exceptions.c	-	_PyExc_UnicodeTranslateError	variable	static PyTypeObject _PyExc_UnicodeTranslateError
+Objects/exceptions.c	-	PyExc_UnicodeTranslateError	variable	static PyTypeObject PyExc_UnicodeTranslateError
+Objects/exceptions.c	-	_PyExc_UnicodeWarning	variable	static PyTypeObject _PyExc_UnicodeWarning
+Objects/exceptions.c	-	PyExc_UnicodeWarning	variable	static PyTypeObject PyExc_UnicodeWarning
+Objects/exceptions.c	-	_PyExc_UserWarning	variable	static PyTypeObject _PyExc_UserWarning
+Objects/exceptions.c	-	PyExc_UserWarning	variable	static PyTypeObject PyExc_UserWarning
+Objects/exceptions.c	-	_PyExc_ValueError	variable	static PyTypeObject _PyExc_ValueError
+Objects/exceptions.c	-	PyExc_ValueError	variable	static PyTypeObject PyExc_ValueError
+Objects/exceptions.c	-	_PyExc_Warning	variable	static PyTypeObject _PyExc_Warning
+Objects/exceptions.c	-	PyExc_Warning	variable	static PyTypeObject PyExc_Warning
+Objects/exceptions.c	-	_PyExc_ZeroDivisionError	variable	static PyTypeObject _PyExc_ZeroDivisionError
+Objects/exceptions.c	-	PyExc_ZeroDivisionError	variable	static PyTypeObject PyExc_ZeroDivisionError
+Objects/boolobject.c	-	_Py_FalseStruct	variable	static struct _longobject _Py_FalseStruct
+Objects/stringlib/unicode_format.h	-	PyFieldNameIter_Type	variable	static PyTypeObject PyFieldNameIter_Type
+Modules/_io/fileio.c	-	PyFileIO_Type	variable	PyTypeObject PyFileIO_Type
+Python/preconfig.c	-	Py_FileSystemDefaultEncodeErrors	variable	const char *Py_FileSystemDefaultEncodeErrors
+Python/preconfig.c	-	Py_FileSystemDefaultEncoding	variable	const char * Py_FileSystemDefaultEncoding
+Python/bltinmodule.c	-	PyFilter_Type	variable	PyTypeObject PyFilter_Type
+Objects/floatobject.c	-	PyFloat_Type	variable	PyTypeObject PyFloat_Type
+Objects/stringlib/unicode_format.h	-	PyFormatterIter_Type	variable	static PyTypeObject PyFormatterIter_Type
+Objects/frameobject.c	-	PyFrame_Type	variable	PyTypeObject PyFrame_Type
+Python/initconfig.c	-	Py_FrozenFlag	variable	int Py_FrozenFlag
+Objects/setobject.c	-	PyFrozenSet_Type	variable	PyTypeObject PyFrozenSet_Type
+Objects/funcobject.c	-	PyFunction_Type	variable	PyTypeObject PyFunction_Type
+Objects/genobject.c	-	PyGen_Type	variable	PyTypeObject PyGen_Type
+Objects/descrobject.c	-	PyGetSetDescr_Type	variable	PyTypeObject PyGetSetDescr_Type
+Python/hamt.c	-	_PyHamt_ArrayNode_Type	variable	PyTypeObject _PyHamt_ArrayNode_Type
+Python/hamt.c	-	PyHamt_as_mapping	variable	static PyMappingMethods PyHamt_as_mapping
+Python/hamt.c	-	PyHamt_as_sequence	variable	static PySequenceMethods PyHamt_as_sequence
+Python/hamt.c	-	_PyHamt_BitmapNode_Type	variable	PyTypeObject _PyHamt_BitmapNode_Type
+Python/hamt.c	-	_PyHamt_CollisionNode_Type	variable	PyTypeObject _PyHamt_CollisionNode_Type
+Python/hamt.c	-	_PyHamtItems_Type	variable	PyTypeObject _PyHamtItems_Type
+Python/hamt.c	-	PyHamtIterator_as_mapping	variable	static PyMappingMethods PyHamtIterator_as_mapping
+Python/hamt.c	-	_PyHamtKeys_Type	variable	PyTypeObject _PyHamtKeys_Type
+Python/hamt.c	-	PyHamt_methods	variable	static PyMethodDef PyHamt_methods
+Python/hamt.c	-	_PyHamt_Type	variable	PyTypeObject _PyHamt_Type
+Python/hamt.c	-	_PyHamtValues_Type	variable	PyTypeObject _PyHamtValues_Type
+Python/preconfig.c	-	_Py_HasFileSystemDefaultEncodeErrors	variable	const(int) _Py_HasFileSystemDefaultEncodeErrors
+Python/preconfig.c	-	Py_HasFileSystemDefaultEncoding	variable	const(int) Py_HasFileSystemDefaultEncoding
+Python/pyhash.c	-	PyHash_Func	variable	static PyHash_FuncDef PyHash_Func
+Python/initconfig.c	-	Py_HashRandomizationFlag	variable	int Py_HashRandomizationFlag
+Python/pyhash.c	-	_Py_HashSecret	variable	_Py_HashSecret_t _Py_HashSecret
+Python/bootstrap_hash.c	-	_Py_HashSecret_Initialized	variable	static int _Py_HashSecret_Initialized
+Python/codecs.c	-	Py_hexdigits	variable	const char * Py_hexdigits
+Python/sysmodule.c	-	PyId__	variable	_Py_IDENTIFIER(_)
+Modules/_abc.c	-	PyId__abc_impl	variable	_Py_IDENTIFIER(_abc_impl)
+Objects/typeobject.c	-	PyId___abstractmethods__	variable	_Py_IDENTIFIER(__abstractmethods__)
+Modules/_abc.c	-	PyId___abstractmethods__	variable	_Py_IDENTIFIER(__abstractmethods__)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___aenter__	variable	_Py_IDENTIFIER(__aenter__)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___aexit__	variable	_Py_IDENTIFIER(__aexit__)
+Objects/typeobject.c	slot_am_aiter	PyId___aiter__	variable	_Py_IDENTIFIER(__aiter__)
+Python/ceval.c	import_all_from	PyId___all__	variable	_Py_IDENTIFIER(__all__)
+Objects/typeobject.c	slot_am_anext	PyId___anext__	variable	_Py_IDENTIFIER(__anext__)
+Python/Python-ast.c	-	PyId_annotation	variable	_Py_IDENTIFIER(annotation)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___annotations__	variable	_Py_IDENTIFIER(__annotations__)
+Python/Python-ast.c	-	PyId_arg	variable	_Py_IDENTIFIER(arg)
+Python/Python-ast.c	-	PyId_args	variable	_Py_IDENTIFIER(args)
+Python/Python-ast.c	-	PyId_argtypes	variable	_Py_IDENTIFIER(argtypes)
+Python/Python-ast.c	-	PyId_asname	variable	_Py_IDENTIFIER(asname)
+Python/Python-ast.c	make_type	PyId__ast	variable	_Py_IDENTIFIER(_ast)
+Python/Python-ast.c	-	PyId_attr	variable	_Py_IDENTIFIER(attr)
+Python/Python-ast.c	-	PyId__attributes	variable	_Py_IDENTIFIER(_attributes)
+Objects/typeobject.c	slot_am_await	PyId___await__	variable	_Py_IDENTIFIER(__await__)
+Python/Python-ast.c	-	PyId_bases	variable	_Py_IDENTIFIER(bases)
+Modules/_abc.c	-	PyId___bases__	variable	_Py_IDENTIFIER(__bases__)
+Objects/abstract.c	abstract_get_bases	PyId___bases__	variable	_Py_IDENTIFIER(__bases__)
+Objects/typeobject.c	merge_class_dict	PyId___bases__	variable	_Py_IDENTIFIER(__bases__)
+Objects/longobject.c	-	PyId_big	variable	_Py_IDENTIFIER(big)
+Modules/_io/_iomodule.c	_io_open_impl	PyId__blksize	variable	_Py_IDENTIFIER(_blksize)
+Python/Python-ast.c	-	PyId_body	variable	_Py_IDENTIFIER(body)
+Objects/typeobject.c	slot_nb_bool	PyId___bool__	variable	_Py_IDENTIFIER(__bool__)
+Python/sysmodule.c	-	PyId_buffer	variable	_Py_IDENTIFIER(buffer)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___build_class__	variable	_Py_IDENTIFIER(__build_class__)
+Objects/typeobject.c	-	PyId_builtins	variable	_Py_IDENTIFIER(builtins)
+Python/errors.c	-	PyId_builtins	variable	_Py_IDENTIFIER(builtins)
+Python/pythonrun.c	-	PyId_builtins	variable	_Py_IDENTIFIER(builtins)
+Python/sysmodule.c	-	PyId_builtins	variable	_Py_IDENTIFIER(builtins)
+Objects/frameobject.c	-	PyId___builtins__	variable	_Py_IDENTIFIER(__builtins__)
+Python/bltinmodule.c	-	PyId___builtins__	variable	_Py_IDENTIFIER(__builtins__)
+Python/import.c	module_dict_for_exec	PyId___builtins__	variable	_Py_IDENTIFIER(__builtins__)
+Objects/object.c	-	PyId___bytes__	variable	_Py_IDENTIFIER(__bytes__)
+Objects/bytesobject.c	format_obj	PyId___bytes__	variable	_Py_IDENTIFIER(__bytes__)
+Objects/bytesobject.c	bytes_new	PyId___bytes__	variable	_Py_IDENTIFIER(__bytes__)
+Objects/weakrefobject.c	proxy_bytes	PyId___bytes__	variable	_Py_IDENTIFIER(__bytes__)
+Objects/typeobject.c	slot_tp_call	PyId___call__	variable	_Py_IDENTIFIER(__call__)
+Python/Python-ast.c	-	PyId_cause	variable	_Py_IDENTIFIER(cause)
+Objects/typeobject.c	-	PyId___class__	variable	_Py_IDENTIFIER(__class__)
+Modules/_abc.c	-	PyId___class__	variable	_Py_IDENTIFIER(__class__)
+Python/compile.c	compiler_enter_scope	PyId___class__	variable	_Py_IDENTIFIER(__class__)
+Objects/abstract.c	recursive_isinstance	PyId___class__	variable	_Py_IDENTIFIER(__class__)
+Objects/typeobject.c	type_new	PyId___classcell__	variable	_Py_IDENTIFIER(__classcell__)
+Objects/typeobject.c	-	PyId___class_getitem__	variable	_Py_IDENTIFIER(__class_getitem__)
+Objects/abstract.c	PyObject_GetItem	PyId___class_getitem__	variable	_Py_IDENTIFIER(__class_getitem__)
+Python/import.c	PyImport_Cleanup	PyId_clear	variable	_Py_IDENTIFIER(clear)
+Python/traceback.c	-	PyId_close	variable	_Py_IDENTIFIER(close)
+Modules/_io/bufferedio.c	-	PyId_close	variable	_Py_IDENTIFIER(close)
+Modules/_io/textio.c	-	PyId_close	variable	_Py_IDENTIFIER(close)
+Objects/genobject.c	gen_close_iter	PyId_close	variable	_Py_IDENTIFIER(close)
+Modules/_dbmmodule.c	dbm__exit__	PyId_close	variable	_Py_IDENTIFIER(close)
+Modules/_gdbmmodule.c	dbm__exit__	PyId_close	variable	_Py_IDENTIFIER(close)
+Python/pythonrun.c	_Py_HandleSystemExit	PyId_code	variable	_Py_IDENTIFIER(code)
+Python/Python-ast.c	-	PyId_col_offset	variable	_Py_IDENTIFIER(col_offset)
+Python/Python-ast.c	-	PyId_comparators	variable	_Py_IDENTIFIER(comparators)
+Objects/complexobject.c	try_complex_special_method	PyId___complex__	variable	_Py_IDENTIFIER(__complex__)
+Objects/typeobject.c	slot_sq_contains	PyId___contains__	variable	_Py_IDENTIFIER(__contains__)
+Python/Python-ast.c	-	PyId_context_expr	variable	_Py_IDENTIFIER(context_expr)
+Python/Python-ast.c	-	PyId_conversion	variable	_Py_IDENTIFIER(conversion)
+Modules/itertoolsmodule.c	itertools_tee_impl	PyId___copy__	variable	_Py_IDENTIFIER(__copy__)
+Objects/descrobject.c	mappingproxy_copy	PyId_copy	variable	_Py_IDENTIFIER(copy)
+Objects/typeobject.c	import_copyreg	PyId_copyreg	variable	_Py_IDENTIFIER(copyreg)
+Python/Python-ast.c	-	PyId_ctx	variable	_Py_IDENTIFIER(ctx)
+Modules/_io/bufferedio.c	-	PyId__dealloc_warn	variable	_Py_IDENTIFIER(_dealloc_warn)
+Modules/_io/textio.c	-	PyId__dealloc_warn	variable	_Py_IDENTIFIER(_dealloc_warn)
+Modules/_io/textio.c	-	PyId_decode	variable	_Py_IDENTIFIER(decode)
+Python/Python-ast.c	-	PyId_decorator_list	variable	_Py_IDENTIFIER(decorator_list)
+Python/_warnings.c	get_default_action	PyId_defaultaction	variable	_Py_IDENTIFIER(defaultaction)
+Python/Python-ast.c	-	PyId_defaults	variable	_Py_IDENTIFIER(defaults)
+Objects/typeobject.c	slot_tp_finalize	PyId___del__	variable	_Py_IDENTIFIER(__del__)
+Objects/typeobject.c	slot_tp_setattro	PyId___delattr__	variable	_Py_IDENTIFIER(__delattr__)
+Objects/typeobject.c	slot_tp_descr_set	PyId___delete__	variable	_Py_IDENTIFIER(__delete__)
+Objects/typeobject.c	-	PyId___delitem__	variable	_Py_IDENTIFIER(__delitem__)
+Objects/typeobject.c	-	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Modules/_abc.c	-	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Python/bltinmodule.c	-	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Python/Python-ast.c	ast_type_reduce	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Python/ceval.c	import_all_from	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Objects/bytearrayobject.c	_common_reduce	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Objects/moduleobject.c	module_dir	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Objects/odictobject.c	odict_reduce	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Objects/setobject.c	set_reduce	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Modules/_collectionsmodule.c	deque_reduce	PyId___dict__	variable	_Py_IDENTIFIER(__dict__)
+Objects/dictobject.c	dictviews_sub	PyId_difference_update	variable	_Py_IDENTIFIER(difference_update)
+Python/Python-ast.c	-	PyId_dims	variable	_Py_IDENTIFIER(dims)
+Objects/object.c	-	PyId___dir__	variable	_Py_IDENTIFIER(__dir__)
+Objects/moduleobject.c	module_dir	PyId___dir__	variable	_Py_IDENTIFIER(__dir__)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId_displayhook	variable	_Py_IDENTIFIER(displayhook)
+Objects/typeobject.c	-	PyId___doc__	variable	_Py_IDENTIFIER(__doc__)
+Objects/descrobject.c	property_init_impl	PyId___doc__	variable	_Py_IDENTIFIER(__doc__)
+Objects/moduleobject.c	module_init_dict	PyId___doc__	variable	_Py_IDENTIFIER(__doc__)
+Objects/moduleobject.c	PyModule_SetDocString	PyId___doc__	variable	_Py_IDENTIFIER(__doc__)
+Python/Python-ast.c	-	PyId_elt	variable	_Py_IDENTIFIER(elt)
+Python/Python-ast.c	-	PyId_elts	variable	_Py_IDENTIFIER(elts)
+Modules/faulthandler.c	-	PyId_enable	variable	_Py_IDENTIFIER(enable)
+Python/sysmodule.c	-	PyId_encoding	variable	_Py_IDENTIFIER(encoding)
+Python/bltinmodule.c	-	PyId_encoding	variable	_Py_IDENTIFIER(encoding)
+Python/pythonrun.c	PyRun_InteractiveOneObjectEx	PyId_encoding	variable	_Py_IDENTIFIER(encoding)
+Python/Python-ast.c	-	PyId_end_col_offset	variable	_Py_IDENTIFIER(end_col_offset)
+Python/Python-ast.c	-	PyId_end_lineno	variable	_Py_IDENTIFIER(end_lineno)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___enter__	variable	_Py_IDENTIFIER(__enter__)
+Objects/typeobject.c	overrides_hash	PyId___eq__	variable	_Py_IDENTIFIER(__eq__)
+Python/bltinmodule.c	-	PyId_errors	variable	_Py_IDENTIFIER(errors)
+Python/Python-ast.c	-	PyId_exc	variable	_Py_IDENTIFIER(exc)
+Python/pythonrun.c	-	PyId_excepthook	variable	_Py_IDENTIFIER(excepthook)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___exit__	variable	_Py_IDENTIFIER(__exit__)
+Modules/_pickle.c	do_append	PyId_extend	variable	_Py_IDENTIFIER(extend)
+Python/Python-ast.c	-	PyId__fields	variable	_Py_IDENTIFIER(_fields)
+Objects/moduleobject.c	PyModule_GetFilenameObject	PyId___file__	variable	_Py_IDENTIFIER(__file__)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_filename	variable	_Py_IDENTIFIER(filename)
+Python/pythonrun.c	parse_syntax_error	PyId_filename	variable	_Py_IDENTIFIER(filename)
+Modules/_io/textio.c	-	PyId_fileno	variable	_Py_IDENTIFIER(fileno)
+Modules/faulthandler.c	-	PyId_fileno	variable	_Py_IDENTIFIER(fileno)
+Python/bltinmodule.c	-	PyId_fileno	variable	_Py_IDENTIFIER(fileno)
+Objects/fileobject.c	PyObject_AsFileDescriptor	PyId_fileno	variable	_Py_IDENTIFIER(fileno)
+Modules/itertoolsmodule.c	zip_longest_new	PyId_fillvalue	variable	_Py_IDENTIFIER(fillvalue)
+Python/_warnings.c	get_filter	PyId_filters	variable	_Py_IDENTIFIER(filters)
+Python/Python-ast.c	-	PyId_finalbody	variable	_Py_IDENTIFIER(finalbody)
+Modules/_io/iobase.c	iobase_finalize	PyId__finalizing	variable	_Py_IDENTIFIER(_finalizing)
+Python/import.c	import_find_and_load	PyId__find_and_load	variable	_Py_IDENTIFIER(_find_and_load)
+Python/import.c	PyImport_ExecCodeModuleObject	PyId__fix_up_module	variable	_Py_IDENTIFIER(_fix_up_module)
+Python/errors.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Python/pylifecycle.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Python/pythonrun.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Modules/_threadmodule.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Modules/_io/bufferedio.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Modules/_io/textio.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Modules/faulthandler.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Python/bltinmodule.c	-	PyId_flush	variable	_Py_IDENTIFIER(flush)
+Objects/abstract.c	PyObject_Format	PyId___format__	variable	_Py_IDENTIFIER(__format__)
+Python/Python-ast.c	-	PyId_format_spec	variable	_Py_IDENTIFIER(format_spec)
+Modules/posixmodule.c	path_converter	PyId___fspath__	variable	_Py_IDENTIFIER(__fspath__)
+Modules/posixmodule.c	PyOS_FSPath	PyId___fspath__	variable	_Py_IDENTIFIER(__fspath__)
+Python/Python-ast.c	-	PyId_func	variable	_Py_IDENTIFIER(func)
+Python/Python-ast.c	-	PyId_generators	variable	_Py_IDENTIFIER(generators)
+Objects/descrobject.c	mappingproxy_get	PyId_get	variable	_Py_IDENTIFIER(get)
+Modules/_collectionsmodule.c	_count_elements	PyId_get	variable	_Py_IDENTIFIER(get)
+Objects/typeobject.c	slot_tp_descr_get	PyId___get__	variable	_Py_IDENTIFIER(__get__)
+Objects/classobject.c	method_reduce	PyId_getattr	variable	_Py_IDENTIFIER(getattr)
+Objects/descrobject.c	descr_reduce	PyId_getattr	variable	_Py_IDENTIFIER(getattr)
+Objects/descrobject.c	wrapper_reduce	PyId_getattr	variable	_Py_IDENTIFIER(getattr)
+Objects/moduleobject.c	module_getattro	PyId___getattr__	variable	_Py_IDENTIFIER(__getattr__)
+Objects/methodobject.c	meth_reduce	PyId_getattr	variable	_Py_IDENTIFIER(getattr)
+Objects/typeobject.c	slot_tp_getattr_hook	PyId___getattr__	variable	_Py_IDENTIFIER(__getattr__)
+Objects/typeobject.c	-	PyId___getattribute__	variable	_Py_IDENTIFIER(__getattribute__)
+Objects/typeobject.c	-	PyId___getitem__	variable	_Py_IDENTIFIER(__getitem__)
+Objects/typeobject.c	_PyObject_GetNewArguments	PyId___getnewargs__	variable	_Py_IDENTIFIER(__getnewargs__)
+Objects/typeobject.c	_PyObject_GetNewArguments	PyId___getnewargs_ex__	variable	_Py_IDENTIFIER(__getnewargs_ex__)
+Modules/_io/textio.c	-	PyId_getpreferredencoding	variable	_Py_IDENTIFIER(getpreferredencoding)
+Python/_warnings.c	get_source_line	PyId_get_source	variable	_Py_IDENTIFIER(get_source)
+Python/import.c	PyImport_ExecCodeModuleWithPathnames	PyId__get_sourcefile	variable	_Py_IDENTIFIER(_get_sourcefile)
+Objects/typeobject.c	_PyObject_GetState	PyId___getstate__	variable	_Py_IDENTIFIER(__getstate__)
+Python/import.c	PyImport_ImportModuleLevelObject	PyId__handle_fromlist	variable	_Py_IDENTIFIER(_handle_fromlist)
+Python/Python-ast.c	-	PyId_handlers	variable	_Py_IDENTIFIER(handlers)
+Objects/typeobject.c	-	PyId___hash__	variable	_Py_IDENTIFIER(__hash__)
+Python/Python-ast.c	-	PyId_id	variable	_Py_IDENTIFIER(id)
+Python/Python-ast.c	-	PyId_ifs	variable	_Py_IDENTIFIER(ifs)
+Python/import.c	PyImport_ReloadModule	PyId_imp	variable	_Py_IDENTIFIER(imp)
+Python/ceval.c	import_name	PyId___import__	variable	_Py_IDENTIFIER(__import__)
+Objects/typeobject.c	slot_nb_index	PyId___index__	variable	_Py_IDENTIFIER(__index__)
+Objects/typeobject.c	slot_tp_init	PyId___init__	variable	_Py_IDENTIFIER(__init__)
+Objects/moduleobject.c	_PyModuleSpec_IsInitializing	PyId__initializing	variable	_Py_IDENTIFIER(_initializing)
+Objects/typeobject.c	-	PyId___init_subclass__	variable	_Py_IDENTIFIER(__init_subclass__)
+Objects/abstract.c	PyObject_IsInstance	PyId___instancecheck__	variable	_Py_IDENTIFIER(__instancecheck__)
+Objects/dictobject.c	_PyDictView_Intersect	PyId_intersection_update	variable	_Py_IDENTIFIER(intersection_update)
+Modules/_io/iobase.c	-	PyId___IOBase_closed	variable	_Py_IDENTIFIER(__IOBase_closed)
+Objects/typeobject.c	slot_nb_inplace_power	PyId___ipow__	variable	_Py_IDENTIFIER(__ipow__)
+Objects/object.c	-	PyId___isabstractmethod__	variable	_Py_IDENTIFIER(__isabstractmethod__)
+Python/Python-ast.c	-	PyId_is_async	variable	_Py_IDENTIFIER(is_async)
+Modules/_io/bufferedio.c	-	PyId_isatty	variable	_Py_IDENTIFIER(isatty)
+Modules/_io/textio.c	-	PyId_isatty	variable	_Py_IDENTIFIER(isatty)
+Python/pylifecycle.c	create_stdio	PyId_isatty	variable	_Py_IDENTIFIER(isatty)
+Modules/_io/_iomodule.c	_io_open_impl	PyId_isatty	variable	_Py_IDENTIFIER(isatty)
+Python/codecs.c	_PyCodec_LookupTextEncoding	PyId__is_text_encoding	variable	_Py_IDENTIFIER(_is_text_encoding)
+Python/Python-ast.c	-	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/abstract.c	PyMapping_Items	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/descrobject.c	mappingproxy_items	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/odictobject.c	odict_reduce	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/odictobject.c	odict_repr	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/odictobject.c	mutablemapping_update	PyId_items	variable	_Py_IDENTIFIER(items)
+Objects/typeobject.c	_PyObject_GetItemsIter	PyId_items	variable	_Py_IDENTIFIER(items)
+Modules/_collectionsmodule.c	defdict_reduce	PyId_items	variable	_Py_IDENTIFIER(items)
+Python/Python-ast.c	-	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/bytearrayobject.c	bytearrayiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/bytesobject.c	striter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/dictobject.c	dictiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/iterobject.c	iter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/iterobject.c	calliter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/listobject.c	listiter_reduce_general	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/odictobject.c	odictiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/rangeobject.c	rangeiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/rangeobject.c	longrangeiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/setobject.c	setiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/tupleobject.c	tupleiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/unicodeobject.c	unicodeiter_reduce	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Objects/typeobject.c	slot_tp_iter	PyId___iter__	variable	_Py_IDENTIFIER(__iter__)
+Modules/arraymodule.c	array_arrayiterator___reduce___impl	PyId_iter	variable	_Py_IDENTIFIER(iter)
+Python/Python-ast.c	-	PyId_key	variable	_Py_IDENTIFIER(key)
+Python/Python-ast.c	-	PyId_keys	variable	_Py_IDENTIFIER(keys)
+Objects/abstract.c	PyMapping_Keys	PyId_keys	variable	_Py_IDENTIFIER(keys)
+Objects/descrobject.c	mappingproxy_keys	PyId_keys	variable	_Py_IDENTIFIER(keys)
+Objects/dictobject.c	dict_update_common	PyId_keys	variable	_Py_IDENTIFIER(keys)
+Objects/odictobject.c	mutablemapping_update	PyId_keys	variable	_Py_IDENTIFIER(keys)
+Python/Python-ast.c	-	PyId_keywords	variable	_Py_IDENTIFIER(keywords)
+Python/Python-ast.c	-	PyId_kind	variable	_Py_IDENTIFIER(kind)
+Python/Python-ast.c	-	PyId_kwarg	variable	_Py_IDENTIFIER(kwarg)
+Python/Python-ast.c	-	PyId_kw_defaults	variable	_Py_IDENTIFIER(kw_defaults)
+Python/Python-ast.c	-	PyId_kwonlyargs	variable	_Py_IDENTIFIER(kwonlyargs)
+Python/pythonrun.c	-	PyId_last_traceback	variable	_Py_IDENTIFIER(last_traceback)
+Python/pythonrun.c	-	PyId_last_type	variable	_Py_IDENTIFIER(last_type)
+Python/pythonrun.c	-	PyId_last_value	variable	_Py_IDENTIFIER(last_value)
+Python/Python-ast.c	-	PyId_left	variable	_Py_IDENTIFIER(left)
+Objects/typeobject.c	-	PyId___len__	variable	_Py_IDENTIFIER(__len__)
+Objects/abstract.c	PyObject_LengthHint	PyId___length_hint__	variable	_Py_IDENTIFIER(__length_hint__)
+Python/Python-ast.c	-	PyId_level	variable	_Py_IDENTIFIER(level)
+Python/Python-ast.c	-	PyId_lineno	variable	_Py_IDENTIFIER(lineno)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_lineno	variable	_Py_IDENTIFIER(lineno)
+Python/pythonrun.c	parse_syntax_error	PyId_lineno	variable	_Py_IDENTIFIER(lineno)
+Objects/longobject.c	-	PyId_little	variable	_Py_IDENTIFIER(little)
+Python/_warnings.c	get_source_line	PyId___loader__	variable	_Py_IDENTIFIER(__loader__)
+Objects/moduleobject.c	module_init_dict	PyId___loader__	variable	_Py_IDENTIFIER(__loader__)
+Python/import.c	PyImport_ImportModuleLevelObject	PyId__lock_unlock_module	variable	_Py_IDENTIFIER(_lock_unlock_module)
+Python/Python-ast.c	-	PyId_lower	variable	_Py_IDENTIFIER(lower)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId___ltrace__	variable	_Py_IDENTIFIER(__ltrace__)
+Python/pythonrun.c	PyRun_InteractiveOneObjectEx	PyId___main__	variable	_Py_IDENTIFIER(__main__)
+Python/_warnings.c	check_matched	PyId_match	variable	_Py_IDENTIFIER(match)
+Python/bltinmodule.c	-	PyId_metaclass	variable	_Py_IDENTIFIER(metaclass)
+Objects/dictobject.c	dict_subscript	PyId___missing__	variable	_Py_IDENTIFIER(__missing__)
+Modules/_io/bufferedio.c	-	PyId_mode	variable	_Py_IDENTIFIER(mode)
+Modules/_io/textio.c	-	PyId_mode	variable	_Py_IDENTIFIER(mode)
+Python/pylifecycle.c	create_stdio	PyId_mode	variable	_Py_IDENTIFIER(mode)
+Modules/_io/_iomodule.c	_io_open_impl	PyId_mode	variable	_Py_IDENTIFIER(mode)
+Python/Python-ast.c	-	PyId_module	variable	_Py_IDENTIFIER(module)
+Objects/typeobject.c	-	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Python/Python-ast.c	make_type	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Python/errors.c	PyErr_NewException	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Python/errors.c	PyErr_NewException	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Python/pythonrun.c	print_exception	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Modules/_pickle.c	whichmodule	PyId___module__	variable	_Py_IDENTIFIER(__module__)
+Objects/typeobject.c	type_mro_modified	PyId_mro	variable	_Py_IDENTIFIER(mro)
+Objects/typeobject.c	mro_invoke	PyId_mro	variable	_Py_IDENTIFIER(mro)
+Python/bltinmodule.c	-	PyId___mro_entries__	variable	_Py_IDENTIFIER(__mro_entries__)
+Objects/typeobject.c	type_new	PyId___mro_entries__	variable	_Py_IDENTIFIER(__mro_entries__)
+Python/Python-ast.c	-	PyId_msg	variable	_Py_IDENTIFIER(msg)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_msg	variable	_Py_IDENTIFIER(msg)
+Python/pythonrun.c	parse_syntax_error	PyId_msg	variable	_Py_IDENTIFIER(msg)
+Python/pylifecycle.c	-	PyId_name	variable	_Py_IDENTIFIER(name)
+Modules/_io/fileio.c	-	PyId_name	variable	_Py_IDENTIFIER(name)
+Modules/_io/bufferedio.c	-	PyId_name	variable	_Py_IDENTIFIER(name)
+Modules/_io/textio.c	-	PyId_name	variable	_Py_IDENTIFIER(name)
+Python/Python-ast.c	-	PyId_name	variable	_Py_IDENTIFIER(name)
+Objects/exceptions.c	ImportError_getstate	PyId_name	variable	_Py_IDENTIFIER(name)
+Objects/typeobject.c	-	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Objects/classobject.c	-	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/_warnings.c	setup_context	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/_warnings.c	get_source_line	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/_warnings.c	show_warning	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/ceval.c	import_from	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/ceval.c	import_all_from	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/import.c	resolve_name	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Objects/moduleobject.c	module_init_dict	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Objects/moduleobject.c	PyModule_GetNameObject	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Objects/moduleobject.c	module_getattro	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Objects/weakrefobject.c	weakref_repr	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Modules/_pickle.c	save_global	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Modules/_pickle.c	save_reduce	PyId___name__	variable	_Py_IDENTIFIER(__name__)
+Python/Python-ast.c	-	PyId_names	variable	_Py_IDENTIFIER(names)
+Objects/typeobject.c	-	PyId___new__	variable	_Py_IDENTIFIER(__new__)
+Objects/typeobject.c	reduce_newobj	PyId___newobj__	variable	_Py_IDENTIFIER(__newobj__)
+Objects/typeobject.c	reduce_newobj	PyId___newobj_ex__	variable	_Py_IDENTIFIER(__newobj_ex__)
+Objects/typeobject.c	slot_tp_iternext	PyId___next__	variable	_Py_IDENTIFIER(__next__)
+Objects/structseq.c	-	PyId_n_fields	variable	_Py_IDENTIFIER(n_fields)
+Python/ast.c	new_identifier	PyId_NFKC	variable	_Py_IDENTIFIER(NFKC)
+Objects/structseq.c	-	PyId_n_sequence_fields	variable	_Py_IDENTIFIER(n_sequence_fields)
+Objects/structseq.c	-	PyId_n_unnamed_fields	variable	_Py_IDENTIFIER(n_unnamed_fields)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_offset	variable	_Py_IDENTIFIER(offset)
+Python/pythonrun.c	parse_syntax_error	PyId_offset	variable	_Py_IDENTIFIER(offset)
+Python/_warnings.c	get_once_registry	PyId_onceregistry	variable	_Py_IDENTIFIER(onceregistry)
+Python/Python-ast.c	-	PyId_op	variable	_Py_IDENTIFIER(op)
+Python/traceback.c	-	PyId_open	variable	_Py_IDENTIFIER(open)
+Python/pylifecycle.c	create_stdio	PyId_open	variable	_Py_IDENTIFIER(open)
+Parser/tokenizer.c	fp_setreadl	PyId_open	variable	_Py_IDENTIFIER(open)
+Objects/fileobject.c	PyFile_FromFd	PyId_open	variable	_Py_IDENTIFIER(open)
+Objects/fileobject.c	PyFile_OpenCodeObject	PyId_open	variable	_Py_IDENTIFIER(open)
+Python/Python-ast.c	-	PyId_operand	variable	_Py_IDENTIFIER(operand)
+Python/Python-ast.c	-	PyId_ops	variable	_Py_IDENTIFIER(ops)
+Python/Python-ast.c	-	PyId_optional_vars	variable	_Py_IDENTIFIER(optional_vars)
+Python/Python-ast.c	-	PyId_orelse	variable	_Py_IDENTIFIER(orelse)
+Python/import.c	resolve_name	PyId___package__	variable	_Py_IDENTIFIER(__package__)
+Objects/moduleobject.c	module_init_dict	PyId___package__	variable	_Py_IDENTIFIER(__package__)
+Python/import.c	resolve_name	PyId_parent	variable	_Py_IDENTIFIER(parent)
+Modules/_operator.c	methodcaller_reduce	PyId_partial	variable	_Py_IDENTIFIER(partial)
+Python/sysmodule.c	-	PyId_path	variable	_Py_IDENTIFIER(path)
+Python/traceback.c	-	PyId_path	variable	_Py_IDENTIFIER(path)
+Objects/exceptions.c	ImportError_getstate	PyId_path	variable	_Py_IDENTIFIER(path)
+Modules/main.c	pymain_sys_path_add_path0	PyId_path	variable	_Py_IDENTIFIER(path)
+Python/import.c	resolve_name	PyId___path__	variable	_Py_IDENTIFIER(__path__)
+Python/import.c	PyImport_ImportModuleLevelObject	PyId___path__	variable	_Py_IDENTIFIER(__path__)
+Modules/_io/bufferedio.c	-	PyId_peek	variable	_Py_IDENTIFIER(peek)
+Python/Python-ast.c	-	PyId_posonlyargs	variable	_Py_IDENTIFIER(posonlyargs)
+Objects/typeobject.c	slot_nb_power	PyId___pow__	variable	_Py_IDENTIFIER(__pow__)
+Python/bltinmodule.c	-	PyId___prepare__	variable	_Py_IDENTIFIER(__prepare__)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_print_file_and_line	variable	_Py_IDENTIFIER(print_file_and_line)
+Python/pythonrun.c	print_exception	PyId_print_file_and_line	variable	_Py_IDENTIFIER(print_file_and_line)
+Python/pythonrun.c	-	PyId_ps1	variable	_Py_IDENTIFIER(ps1)
+Python/pythonrun.c	-	PyId_ps2	variable	_Py_IDENTIFIER(ps2)
+Objects/object.c	-	PyId_Py_Repr	variable	_Py_IDENTIFIER(Py_Repr)
+Objects/classobject.c	-	PyId___qualname__	variable	_Py_IDENTIFIER(__qualname__)
+Objects/descrobject.c	calculate_qualname	PyId___qualname__	variable	_Py_IDENTIFIER(__qualname__)
+Objects/methodobject.c	meth_get__qualname__	PyId___qualname__	variable	_Py_IDENTIFIER(__qualname__)
+Objects/typeobject.c	type_new	PyId___qualname__	variable	_Py_IDENTIFIER(__qualname__)
+Modules/_io/textio.c	-	PyId_raw	variable	_Py_IDENTIFIER(raw)
+Python/pylifecycle.c	create_stdio	PyId_raw	variable	_Py_IDENTIFIER(raw)
+Modules/_io/iobase.c	-	PyId_read	variable	_Py_IDENTIFIER(read)
+Modules/_io/bufferedio.c	-	PyId_read	variable	_Py_IDENTIFIER(read)
+Modules/_io/textio.c	-	PyId_read	variable	_Py_IDENTIFIER(read)
+Modules/_io/bufferedio.c	-	PyId_read1	variable	_Py_IDENTIFIER(read1)
+Python/marshal.c	marshal_load	PyId_read	variable	_Py_IDENTIFIER(read)
+Modules/_io/bufferedio.c	-	PyId_readable	variable	_Py_IDENTIFIER(readable)
+Modules/_io/textio.c	-	PyId_readable	variable	_Py_IDENTIFIER(readable)
+Modules/_io/iobase.c	_io__RawIOBase_read_impl	PyId_readall	variable	_Py_IDENTIFIER(readall)
+Modules/_io/bufferedio.c	-	PyId_readinto	variable	_Py_IDENTIFIER(readinto)
+Modules/_io/bufferedio.c	-	PyId_readinto1	variable	_Py_IDENTIFIER(readinto1)
+Python/marshal.c	r_string	PyId_readinto	variable	_Py_IDENTIFIER(readinto)
+Parser/tokenizer.c	fp_setreadl	PyId_readline	variable	_Py_IDENTIFIER(readline)
+Objects/fileobject.c	PyFile_GetLine	PyId_readline	variable	_Py_IDENTIFIER(readline)
+Objects/typeobject.c	object___reduce_ex___impl	PyId___reduce__	variable	_Py_IDENTIFIER(__reduce__)
+Python/import.c	PyImport_ReloadModule	PyId_reload	variable	_Py_IDENTIFIER(reload)
+Modules/_io/textio.c	-	PyId_replace	variable	_Py_IDENTIFIER(replace)
+Python/importdl.c	get_encoded_name	PyId_replace	variable	_Py_IDENTIFIER(replace)
+Objects/typeobject.c	slot_tp_repr	PyId___repr__	variable	_Py_IDENTIFIER(__repr__)
+Modules/_io/textio.c	-	PyId_reset	variable	_Py_IDENTIFIER(reset)
+Python/Python-ast.c	-	PyId_returns	variable	_Py_IDENTIFIER(returns)
+Objects/enumobject.c	reversed_new_impl	PyId___reversed__	variable	_Py_IDENTIFIER(__reversed__)
+Objects/listobject.c	listiter_reduce_general	PyId_reversed	variable	_Py_IDENTIFIER(reversed)
+Python/Python-ast.c	-	PyId_right	variable	_Py_IDENTIFIER(right)
+Python/bltinmodule.c	-	PyId___round__	variable	_Py_IDENTIFIER(__round__)
+Modules/_io/textio.c	-	PyId_seek	variable	_Py_IDENTIFIER(seek)
+Modules/_io/iobase.c	_io__IOBase_tell_impl	PyId_seek	variable	_Py_IDENTIFIER(seek)
+Modules/_io/textio.c	-	PyId_seekable	variable	_Py_IDENTIFIER(seekable)
+Python/ceval.c	_PyEval_EvalFrameDefault	PyId_send	variable	_Py_IDENTIFIER(send)
+Objects/typeobject.c	slot_tp_descr_set	PyId___set__	variable	_Py_IDENTIFIER(__set__)
+Objects/typeobject.c	slot_tp_setattro	PyId___setattr__	variable	_Py_IDENTIFIER(__setattr__)
+Objects/typeobject.c	-	PyId___setitem__	variable	_Py_IDENTIFIER(__setitem__)
+Modules/_collectionsmodule.c	_count_elements	PyId___setitem__	variable	_Py_IDENTIFIER(__setitem__)
+Objects/typeobject.c	-	PyId___set_name__	variable	_Py_IDENTIFIER(__set_name__)
+Modules/_io/textio.c	-	PyId_setstate	variable	_Py_IDENTIFIER(setstate)
+Modules/_pickle.c	load_build	PyId___setstate__	variable	_Py_IDENTIFIER(__setstate__)
+Python/_warnings.c	call_show_warning	PyId__showwarnmsg	variable	_Py_IDENTIFIER(_showwarnmsg)
+Python/pylifecycle.c	wait_for_thread_shutdown	PyId__shutdown	variable	_Py_IDENTIFIER(_shutdown)
+Python/Python-ast.c	-	PyId_simple	variable	_Py_IDENTIFIER(simple)
+Python/sysmodule.c	-	PyId___sizeof__	variable	_Py_IDENTIFIER(__sizeof__)
+Python/Python-ast.c	-	PyId_slice	variable	_Py_IDENTIFIER(slice)
+Objects/typeobject.c	_PyType_GetSlotNames	PyId___slotnames__	variable	_Py_IDENTIFIER(__slotnames__)
+Objects/typeobject.c	_PyType_GetSlotNames	PyId__slotnames	variable	_Py_IDENTIFIER(_slotnames)
+Objects/typeobject.c	type_new	PyId___slots__	variable	_Py_IDENTIFIER(__slots__)
+Python/bltinmodule.c	-	PyId_sort	variable	_Py_IDENTIFIER(sort)
+Python/import.c	resolve_name	PyId___spec__	variable	_Py_IDENTIFIER(__spec__)
+Python/import.c	PyImport_ImportModuleLevelObject	PyId___spec__	variable	_Py_IDENTIFIER(__spec__)
+Objects/moduleobject.c	module_init_dict	PyId___spec__	variable	_Py_IDENTIFIER(__spec__)
+Objects/moduleobject.c	module_getattro	PyId___spec__	variable	_Py_IDENTIFIER(__spec__)
+Python/_warnings.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/errors.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/pylifecycle.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/pythonrun.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/sysmodule.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Modules/_threadmodule.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Modules/faulthandler.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/bltinmodule.c	-	PyId_stderr	variable	_Py_IDENTIFIER(stderr)
+Python/pylifecycle.c	-	PyId_stdin	variable	_Py_IDENTIFIER(stdin)
+Python/pythonrun.c	-	PyId_stdin	variable	_Py_IDENTIFIER(stdin)
+Python/bltinmodule.c	-	PyId_stdin	variable	_Py_IDENTIFIER(stdin)
+Python/pylifecycle.c	-	PyId_stdout	variable	_Py_IDENTIFIER(stdout)
+Python/pythonrun.c	-	PyId_stdout	variable	_Py_IDENTIFIER(stdout)
+Python/sysmodule.c	-	PyId_stdout	variable	_Py_IDENTIFIER(stdout)
+Python/bltinmodule.c	-	PyId_stdout	variable	_Py_IDENTIFIER(stdout)
+Python/Python-ast.c	-	PyId_step	variable	_Py_IDENTIFIER(step)
+Modules/posixmodule.c	DirEntry_test_mode	PyId_st_mode	variable	_Py_IDENTIFIER(st_mode)
+Modules/_io/textio.c	-	PyId_strict	variable	_Py_IDENTIFIER(strict)
+Python/pythonrun.c	-	PyId_string	variable	_Py_static_string(PyId_string, ""<string>"")
+Modules/timemodule.c	time_strptime	PyId__strptime_time	variable	_Py_IDENTIFIER(_strptime_time)
+Modules/posixmodule.c	wait_helper	PyId_struct_rusage	variable	_Py_IDENTIFIER(struct_rusage)
+Modules/_abc.c	-	PyId___subclasscheck__	variable	_Py_IDENTIFIER(__subclasscheck__)
+Objects/abstract.c	PyObject_IsSubclass	PyId___subclasscheck__	variable	_Py_IDENTIFIER(__subclasscheck__)
+Modules/_abc.c	-	PyId___subclasshook__	variable	_Py_IDENTIFIER(__subclasshook__)
+Objects/dictobject.c	dictviews_xor	PyId_symmetric_difference_update	variable	_Py_IDENTIFIER(symmetric_difference_update)
+Python/Python-ast.c	-	PyId_tag	variable	_Py_IDENTIFIER(tag)
+Python/Python-ast.c	-	PyId_target	variable	_Py_IDENTIFIER(target)
+Python/Python-ast.c	-	PyId_targets	variable	_Py_IDENTIFIER(targets)
+Modules/_io/textio.c	-	PyId_tell	variable	_Py_IDENTIFIER(tell)
+Python/Python-ast.c	-	PyId_test	variable	_Py_IDENTIFIER(test)
+Python/errors.c	PyErr_SyntaxLocationObject	PyId_text	variable	_Py_IDENTIFIER(text)
+Python/pythonrun.c	parse_syntax_error	PyId_text	variable	_Py_IDENTIFIER(text)
+Python/traceback.c	-	PyId_TextIOWrapper	variable	_Py_IDENTIFIER(TextIOWrapper)
+Python/pylifecycle.c	create_stdio	PyId_TextIOWrapper	variable	_Py_IDENTIFIER(TextIOWrapper)
+Python/pylifecycle.c	-	PyId_threading	variable	_Py_IDENTIFIER(threading)
+Objects/genobject.c	_gen_throw	PyId_throw	variable	_Py_IDENTIFIER(throw)
+Objects/abstract.c	PyNumber_Long	PyId___trunc__	variable	_Py_IDENTIFIER(__trunc__)
+Python/Python-ast.c	-	PyId_type	variable	_Py_IDENTIFIER(type)
+Python/Python-ast.c	-	PyId_type_comment	variable	_Py_IDENTIFIER(type_comment)
+Python/Python-ast.c	-	PyId_type_ignores	variable	_Py_IDENTIFIER(type_ignores)
+Python/errors.c	_PyErr_WriteUnraisableMsg	PyId_unraisablehook	variable	_Py_IDENTIFIER(unraisablehook)
+Objects/dictobject.c	dictviews_or	PyId_update	variable	_Py_IDENTIFIER(update)
+Python/Python-ast.c	-	PyId_upper	variable	_Py_IDENTIFIER(upper)
+Python/Python-ast.c	-	PyId_value	variable	_Py_IDENTIFIER(value)
+Python/Python-ast.c	-	PyId_values	variable	_Py_IDENTIFIER(values)
+Objects/abstract.c	PyMapping_Values	PyId_values	variable	_Py_IDENTIFIER(values)
+Objects/descrobject.c	mappingproxy_values	PyId_values	variable	_Py_IDENTIFIER(values)
+Python/Python-ast.c	-	PyId_vararg	variable	_Py_IDENTIFIER(vararg)
+Python/_warnings.c	already_warned	PyId_version	variable	_Py_IDENTIFIER(version)
+Python/_warnings.c	call_show_warning	PyId_WarningMessage	variable	_Py_IDENTIFIER(WarningMessage)
+Python/_warnings.c	setup_context	PyId___warningregistry__	variable	_Py_IDENTIFIER(__warningregistry__)
+Python/_warnings.c	get_warnings_attr	PyId_warnings	variable	_Py_IDENTIFIER(warnings)
+Python/sysmodule.c	-	PyId_warnoptions	variable	_Py_IDENTIFIER(warnoptions)
+Python/_warnings.c	_PyErr_WarnUnawaitedCoroutine	PyId__warn_unawaited_coroutine	variable	_Py_IDENTIFIER(_warn_unawaited_coroutine)
+Modules/_io/bufferedio.c	-	PyId_writable	variable	_Py_IDENTIFIER(writable)
+Modules/_io/textio.c	-	PyId_writable	variable	_Py_IDENTIFIER(writable)
+Python/sysmodule.c	-	PyId_write	variable	_Py_IDENTIFIER(write)
+Modules/_io/bufferedio.c	-	PyId_write	variable	_Py_IDENTIFIER(write)
+Python/marshal.c	marshal_dump_impl	PyId_write	variable	_Py_IDENTIFIER(write)
+Objects/fileobject.c	PyFile_WriteObject	PyId_write	variable	_Py_IDENTIFIER(write)
+Python/sysmodule.c	-	PyId__xoptions	variable	_Py_IDENTIFIER(_xoptions)
+Python/import.c	_PyImportZip_Init	PyId_zipimporter	variable	_Py_IDENTIFIER(zipimporter)
+Python/initconfig.c	-	Py_IgnoreEnvironmentFlag	variable	int Py_IgnoreEnvironmentFlag
+Python/dynload_shlib.c	-	_PyImport_DynLoadFiletab	variable	const char *_PyImport_DynLoadFiletab[]
+Python/frozen.c	-	PyImport_FrozenModules	variable	const struct _frozen * PyImport_FrozenModules
+Modules/config.c	-	_PyImport_Inittab	variable	struct _inittab _PyImport_Inittab[]
+Python/import.c	-	PyImport_Inittab	variable	struct _inittab * PyImport_Inittab
+Modules/_io/textio.c	-	PyIncrementalNewlineDecoder_Type	variable	PyTypeObject PyIncrementalNewlineDecoder_Type
+Python/initconfig.c	-	Py_InspectFlag	variable	int Py_InspectFlag
+Objects/classobject.c	-	PyInstanceMethod_Type	variable	PyTypeObject PyInstanceMethod_Type
+Python/initconfig.c	-	Py_InteractiveFlag	variable	int Py_InteractiveFlag
+Objects/interpreteridobject.c	-	_PyInterpreterID_Type	variable	PyTypeObject _PyInterpreterID_Type
+Modules/_io/iobase.c	-	PyIOBase_Type	variable	PyTypeObject PyIOBase_Type
+Modules/_io/_iomodule.c	-	_PyIO_empty_bytes	variable	PyObject *_PyIO_empty_bytes
+Modules/_io/_iomodule.c	-	_PyIO_empty_str	variable	PyObject *_PyIO_empty_str
+Modules/_io/_iomodule.c	-	_PyIO_Module	variable	struct PyModuleDef _PyIO_Module
+Modules/_io/_iomodule.c	-	_PyIO_str_close	variable	PyObject *_PyIO_str_close
+Modules/_io/_iomodule.c	-	_PyIO_str_closed	variable	PyObject *_PyIO_str_closed
+Modules/_io/_iomodule.c	-	_PyIO_str_decode	variable	PyObject *_PyIO_str_decode
+Modules/_io/_iomodule.c	-	_PyIO_str_encode	variable	PyObject *_PyIO_str_encode
+Modules/_io/_iomodule.c	-	_PyIO_str_fileno	variable	PyObject *_PyIO_str_fileno
+Modules/_io/_iomodule.c	-	_PyIO_str_flush	variable	PyObject *_PyIO_str_flush
+Modules/_io/_iomodule.c	-	_PyIO_str_getstate	variable	PyObject *_PyIO_str_getstate
+Modules/_io/_iomodule.c	-	_PyIO_str_isatty	variable	PyObject *_PyIO_str_isatty
+Modules/_io/_iomodule.c	-	_PyIO_str_newlines	variable	PyObject *_PyIO_str_newlines
+Modules/_io/_iomodule.c	-	_PyIO_str_nl	variable	PyObject *_PyIO_str_nl
+Modules/_io/_iomodule.c	-	_PyIO_str_peek	variable	PyObject *_PyIO_str_peek
+Modules/_io/_iomodule.c	-	_PyIO_str_read	variable	PyObject *_PyIO_str_read
+Modules/_io/_iomodule.c	-	_PyIO_str_read1	variable	PyObject *_PyIO_str_read1
+Modules/_io/_iomodule.c	-	_PyIO_str_readable	variable	PyObject *_PyIO_str_readable
+Modules/_io/_iomodule.c	-	_PyIO_str_readall	variable	PyObject *_PyIO_str_readall
+Modules/_io/_iomodule.c	-	_PyIO_str_readinto	variable	PyObject *_PyIO_str_readinto
+Modules/_io/_iomodule.c	-	_PyIO_str_readline	variable	PyObject *_PyIO_str_readline
+Modules/_io/_iomodule.c	-	_PyIO_str_reset	variable	PyObject *_PyIO_str_reset
+Modules/_io/_iomodule.c	-	_PyIO_str_seek	variable	PyObject *_PyIO_str_seek
+Modules/_io/_iomodule.c	-	_PyIO_str_seekable	variable	PyObject *_PyIO_str_seekable
+Modules/_io/_iomodule.c	-	_PyIO_str_setstate	variable	PyObject *_PyIO_str_setstate
+Modules/_io/_iomodule.c	-	_PyIO_str_tell	variable	PyObject *_PyIO_str_tell
+Modules/_io/_iomodule.c	-	_PyIO_str_truncate	variable	PyObject *_PyIO_str_truncate
+Modules/_io/_iomodule.c	-	_PyIO_str_writable	variable	PyObject *_PyIO_str_writable
+Modules/_io/_iomodule.c	-	_PyIO_str_write	variable	PyObject *_PyIO_str_write
+Python/initconfig.c	-	Py_IsolatedFlag	variable	int Py_IsolatedFlag
+Objects/listobject.c	-	PyListIter_Type	variable	PyTypeObject PyListIter_Type
+Objects/listobject.c	-	PyListRevIter_Type	variable	PyTypeObject PyListRevIter_Type
+Objects/listobject.c	-	PyList_Type	variable	PyTypeObject PyList_Type
+Modules/_localemodule.c	-	PyLocale_Methods	variable	static struct PyMethodDef PyLocale_Methods[]
+Objects/longobject.c	-	_PyLong_DigitValue	variable	unsigned char _PyLong_DigitValue[256]
+Objects/longobject.c	-	_PyLong_One	variable	PyObject *_PyLong_One
+Objects/rangeobject.c	-	PyLongRangeIter_Type	variable	PyTypeObject PyLongRangeIter_Type
+Objects/longobject.c	-	PyLong_Type	variable	PyTypeObject PyLong_Type
+Objects/longobject.c	-	_PyLong_Zero	variable	PyObject *_PyLong_Zero
+Objects/memoryobject.c	-	_PyManagedBuffer_Type	variable	PyTypeObject _PyManagedBuffer_Type
+Python/bltinmodule.c	-	PyMap_Type	variable	PyTypeObject PyMap_Type
+Objects/obmalloc.c	-	_PyMem	variable	static PyMemAllocatorEx _PyMem
+Objects/descrobject.c	-	PyMemberDescr_Type	variable	PyTypeObject PyMemberDescr_Type
+Objects/obmalloc.c	-	_PyMem_Debug	variable	static struct { debug_alloc_api_t raw; debug_alloc_api_t mem; debug_alloc_api_t obj; } _PyMem_Debug
+Objects/memoryobject.c	-	PyMemoryView_Type	variable	PyTypeObject PyMemoryView_Type
+Objects/obmalloc.c	-	_PyMem_Raw	variable	static PyMemAllocatorEx _PyMem_Raw
+Objects/descrobject.c	-	PyMethodDescr_Type	variable	PyTypeObject PyMethodDescr_Type
+Objects/classobject.c	-	PyMethod_Type	variable	PyTypeObject PyMethod_Type
+Objects/descrobject.c	-	_PyMethodWrapper_Type	variable	PyTypeObject _PyMethodWrapper_Type
+Objects/moduleobject.c	-	PyModuleDef_Type	variable	PyTypeObject PyModuleDef_Type
+Objects/moduleobject.c	-	PyModule_Type	variable	PyTypeObject PyModule_Type
+Objects/namespaceobject.c	-	_PyNamespace_Type	variable	PyTypeObject _PyNamespace_Type
+Objects/object.c	-	_Py_NoneStruct	variable	PyObject _Py_NoneStruct
+Objects/object.c	-	_PyNone_Type	variable	PyTypeObject _PyNone_Type
+Python/initconfig.c	-	Py_NoSiteFlag	variable	int Py_NoSiteFlag
+Objects/object.c	-	_Py_NotImplementedStruct	variable	PyObject _Py_NotImplementedStruct
+Objects/object.c	-	_PyNotImplemented_Type	variable	PyTypeObject _PyNotImplemented_Type
+Python/initconfig.c	-	Py_NoUserSiteDirectory	variable	int Py_NoUserSiteDirectory
+Objects/obmalloc.c	-	_PyObject	variable	static PyMemAllocatorEx _PyObject
+Objects/obmalloc.c	-	_PyObject_Arena	variable	static PyObjectArenaAllocator _PyObject_Arena
+Objects/odictobject.c	-	PyODictItems_Type	variable	PyTypeObject PyODictItems_Type
+Objects/odictobject.c	-	PyODictIter_Type	variable	PyTypeObject PyODictIter_Type
+Objects/odictobject.c	-	PyODictKeys_Type	variable	PyTypeObject PyODictKeys_Type
+Objects/odictobject.c	-	PyODict_Type	variable	PyTypeObject PyODict_Type
+Objects/odictobject.c	-	PyODictValues_Type	variable	PyTypeObject PyODictValues_Type
+Python/fileutils.c	-	_Py_open_cloexec_works	variable	int _Py_open_cloexec_works
+Python/initconfig.c	-	Py_OptimizeFlag	variable	int Py_OptimizeFlag
+Parser/myreadline.c	-	PyOS_InputHook	variable	int (*PyOS_InputHook)(void)
+Python/pylifecycle.c	-	_PyOS_mystrnicmp_hack	variable	int (*_PyOS_mystrnicmp_hack)(const char *, const char *, Py_ssize_t)
+Python/getopt.c	-	_PyOS_optarg	variable	const wchar_t *_PyOS_optarg
+Python/getopt.c	-	_PyOS_opterr	variable	int _PyOS_opterr
+Python/getopt.c	-	_PyOS_optind	variable	Py_ssize_t _PyOS_optind
+Parser/myreadline.c	-	PyOS_ReadlineFunctionPointer	variable	char *(*PyOS_ReadlineFunctionPointer)(FILE *, FILE *, const char *)
+Parser/myreadline.c	-	_PyOS_ReadlineLock	variable	static PyThread_type_lock _PyOS_ReadlineLock
+Parser/myreadline.c	-	_PyOS_ReadlineTState	variable	PyThreadState* _PyOS_ReadlineTState
+Python/modsupport.c	-	_Py_PackageContext	variable	const char *_Py_PackageContext
+Python/graminit.c	-	_PyParser_Grammar	variable	grammar _PyParser_Grammar
+Python/pathconfig.c	-	_Py_path_config	variable	_PyPathConfig _Py_path_config
+Objects/picklebufobject.c	-	PyPickleBuffer_Type	variable	PyTypeObject PyPickleBuffer_Type
+Objects/descrobject.c	-	PyProperty_Type	variable	PyTypeObject PyProperty_Type
+Python/initconfig.c	-	Py_QuietFlag	variable	int Py_QuietFlag
+Objects/rangeobject.c	-	PyRangeIter_Type	variable	PyTypeObject PyRangeIter_Type
+Objects/rangeobject.c	-	PyRange_Type	variable	PyTypeObject PyRange_Type
+Modules/_io/iobase.c	-	PyRawIOBase_Type	variable	PyTypeObject PyRawIOBase_Type
+Objects/object.c	-	_Py_RefTotal	variable	Py_ssize_t _Py_RefTotal
+Objects/enumobject.c	-	PyReversed_Type	variable	PyTypeObject PyReversed_Type
+Python/pylifecycle.c	-	_PyRuntime	variable	_PyRuntimeState _PyRuntime
+Objects/iterobject.c	-	PySeqIter_Type	variable	PyTypeObject PySeqIter_Type
+Objects/setobject.c	-	_PySet_Dummy	variable	PyObject * _PySet_Dummy
+Objects/setobject.c	-	_PySetDummy_Type	variable	static PyTypeObject _PySetDummy_Type
+Objects/setobject.c	-	PySetIter_Type	variable	PyTypeObject PySetIter_Type
+Objects/setobject.c	-	PySet_Type	variable	PyTypeObject PySet_Type
+Objects/sliceobject.c	-	PySlice_Type	variable	PyTypeObject PySlice_Type
+Python/initconfig.c	-	_Py_StandardStreamEncoding	variable	static char *_Py_StandardStreamEncoding
+Python/initconfig.c	-	_Py_StandardStreamErrors	variable	static char *_Py_StandardStreamErrors
+Objects/funcobject.c	-	PyStaticMethod_Type	variable	PyTypeObject PyStaticMethod_Type
+Objects/fileobject.c	-	PyStdPrinter_Type	variable	PyTypeObject PyStdPrinter_Type
+Python/symtable.c	-	PySTEntry_Type	variable	PyTypeObject PySTEntry_Type
+Modules/_io/stringio.c	-	PyStringIO_Type	variable	PyTypeObject PyStringIO_Type
+Objects/structseq.c	-	PyStructSequence_UnnamedField	variable	char *PyStructSequence_UnnamedField
+Objects/typeobject.c	-	PySuper_Type	variable	PyTypeObject PySuper_Type
+Objects/object.c	-	_Py_SwappedOp	variable	int _Py_SwappedOp[]
+Python/sysmodule.c	-	_PySys_ImplCacheTag	variable	const char *_PySys_ImplCacheTag
+Python/sysmodule.c	-	_PySys_ImplName	variable	const char *_PySys_ImplName
+Modules/_io/textio.c	-	PyTextIOBase_Type	variable	PyTypeObject PyTextIOBase_Type
+Modules/_io/textio.c	-	PyTextIOWrapper_Type	variable	PyTypeObject PyTextIOWrapper_Type
+Python/traceback.c	-	PyTraceBack_Type	variable	PyTypeObject PyTraceBack_Type
+Objects/obmalloc.c	-	_Py_tracemalloc_config	variable	struct _PyTraceMalloc_Config _Py_tracemalloc_config
+Objects/boolobject.c	-	_Py_TrueStruct	variable	static struct _longobject _Py_TrueStruct
+Objects/tupleobject.c	-	PyTupleIter_Type	variable	PyTypeObject PyTupleIter_Type
+Objects/tupleobject.c	-	PyTuple_Type	variable	PyTypeObject PyTuple_Type
+Objects/typeobject.c	-	PyType_Type	variable	PyTypeObject PyType_Type
+Python/initconfig.c	-	Py_UnbufferedStdioFlag	variable	int Py_UnbufferedStdioFlag
+Python/pylifecycle.c	-	_Py_UnhandledKeyboardInterrupt	variable	int _Py_UnhandledKeyboardInterrupt
+Objects/unicodeobject.c	-	PyUnicodeIter_Type	variable	PyTypeObject PyUnicodeIter_Type
+Objects/unicodeobject.c	-	PyUnicode_Type	variable	PyTypeObject PyUnicode_Type
+Python/initconfig.c	-	Py_UTF8Mode	variable	int Py_UTF8Mode
+Python/initconfig.c	-	Py_VerboseFlag	variable	int Py_VerboseFlag
+Objects/weakrefobject.c	-	_PyWeakref_CallableProxyType	variable	PyTypeObject _PyWeakref_CallableProxyType
+Objects/weakrefobject.c	-	_PyWeakref_ProxyType	variable	PyTypeObject _PyWeakref_ProxyType
+Objects/weakrefobject.c	-	_PyWeakref_RefType	variable	PyTypeObject _PyWeakref_RefType
+Objects/weakrefobject.c	-	_PyWeakref_RefType	variable	PyTypeObject _PyWeakref_RefType
+Objects/descrobject.c	-	PyWrapperDescr_Type	variable	PyTypeObject PyWrapperDescr_Type
+Python/bltinmodule.c	-	PyZip_Type	variable	PyTypeObject PyZip_Type
+Python/Python-ast.c	-	Raise_fields	variable	static const char *Raise_fields[]
+Python/Python-ast.c	-	Raise_type	variable	static PyTypeObject *Raise_type
+Objects/rangeobject.c	-	range_as_mapping	variable	static PyMappingMethods range_as_mapping
+Objects/rangeobject.c	-	range_as_number	variable	static PyNumberMethods range_as_number
+Objects/rangeobject.c	-	range_as_sequence	variable	static PySequenceMethods range_as_sequence
+Objects/rangeobject.c	-	rangeiter_methods	variable	static PyMethodDef rangeiter_methods
+Objects/rangeobject.c	-	range_members	variable	static PyMemberDef range_members[]
+Objects/rangeobject.c	-	range_methods	variable	static PyMethodDef range_methods
+Modules/_io/iobase.c	-	rawiobase_methods	variable	static PyMethodDef rawiobase_methods
+Python/pylifecycle.c	fatal_error	reentrant	variable	static int reentrant
+Modules/faulthandler.c	faulthandler_dump_traceback	reentrant	variable	static volatile int reentrant
+Modules/itertoolsmodule.c	-	repeat_methods	variable	static PyMethodDef repeat_methods
+Modules/itertoolsmodule.c	-	repeat_type	variable	static PyTypeObject repeat_type
+Python/Python-ast.c	-	Return_fields	variable	static const char *Return_fields[]
+Python/compile.c	compiler_visit_annotations	return_str	variable	static identifier return_str
+Python/Python-ast.c	-	Return_type	variable	static PyTypeObject *Return_type
+Objects/enumobject.c	-	reversediter_methods	variable	static PyMethodDef reversediter_methods
+Modules/_threadmodule.c	-	rlock_methods	variable	static PyMethodDef rlock_methods
+Modules/_threadmodule.c	-	RLocktype	variable	static PyTypeObject RLocktype
+Objects/typeobject.c	slot_nb_add	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_subtract	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_multiply	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_matrix_multiply	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_remainder	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_divmod	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_power_binary	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_lshift	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_rshift	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_and	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_xor	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_or	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_floor_divide	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Objects/typeobject.c	slot_nb_true_divide	rop_id	variable	_Py_static_string(op_id, OPSTR)
+Python/Python-ast.c	-	RShift_singleton	variable	static PyObject *RShift_singleton
+Python/Python-ast.c	-	RShift_type	variable	static PyTypeObject *RShift_type
+Python/pylifecycle.c	-	runtime_initialized	variable	static int runtime_initialized
+Modules/posixmodule.c	-	ScandirIterator_methods	variable	static PyMethodDef ScandirIterator_methods
+Modules/posixmodule.c	-	ScandirIteratorType	variable	static PyTypeObject ScandirIteratorType
+Modules/_sre.c	-	scanner_members	variable	static PyMemberDef scanner_members[]
+Modules/_sre.c	-	scanner_methods	variable	static PyMethodDef scanner_methods
+Modules/_sre.c	-	Scanner_Type	variable	static PyTypeObject Scanner_Type
+Modules/posixmodule.c	-	sched_param_desc	variable	static PyStructSequence_Desc sched_param_desc
+Modules/posixmodule.c	-	sched_param_fields	variable	static PyStructSequence_Field sched_param_fields[]
+Modules/posixmodule.c	-	SchedParamType	variable	static PyTypeObject* SchedParamType
+Objects/iterobject.c	-	seqiter_methods	variable	static PyMethodDef seqiter_methods
+Objects/setobject.c	-	set_as_number	variable	static PyNumberMethods set_as_number
+Objects/setobject.c	-	set_as_sequence	variable	static PySequenceMethods set_as_sequence
+Python/symtable.c	-	setcomp	variable	static identifier setcomp
+Python/Python-ast.c	-	SetComp_fields	variable	static const char *SetComp_fields[]
+Python/Python-ast.c	-	SetComp_type	variable	static PyTypeObject *SetComp_type
+Python/Python-ast.c	-	Set_fields	variable	static const char *Set_fields[]
+Objects/setobject.c	-	setiter_methods	variable	static PyMethodDef setiter_methods
+Objects/setobject.c	-	set_methods	variable	static PyMethodDef set_methods
+Python/Python-ast.c	-	Set_type	variable	static PyTypeObject *Set_type
+Modules/signalmodule.c	-	SiginfoType	variable	static PyTypeObject SiginfoType
+Modules/signalmodule.c	-	signal_methods	variable	static PyMethodDef signal_methods
+Modules/signalmodule.c	-	signalmodule	variable	static struct PyModuleDef signalmodule
+Python/import.c	PyImport_Import	silly_list	variable	static PyObject *silly_list
+Objects/sliceobject.c	-	slice_cache	variable	static PySliceObject *slice_cache
+Python/Python-ast.c	-	Slice_fields	variable	static const char *Slice_fields[]
+Objects/sliceobject.c	-	slice_members	variable	static PyMemberDef slice_members[]
+Objects/sliceobject.c	-	slice_methods	variable	static PyMethodDef slice_methods
+Python/Python-ast.c	-	slice_type	variable	static PyTypeObject *slice_type
+Python/Python-ast.c	-	Slice_type	variable	static PyTypeObject *Slice_type
+Objects/typeobject.c	-	slotdefs	variable	static slotdef slotdefs[]
+Objects/typeobject.c	-	slotdefs_initialized	variable	static int slotdefs_initialized
+Objects/longobject.c	-	small_ints	variable	static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]
+Objects/funcobject.c	-	sm_getsetlist	variable	static PyGetSetDef sm_getsetlist[]
+Objects/funcobject.c	-	sm_memberlist	variable	static PyMemberDef sm_memberlist[]
+Modules/xxsubtype.c	-	spamdict_members	variable	static PyMemberDef spamdict_members[]
+Modules/xxsubtype.c	-	spamdict_methods	variable	static PyMethodDef spamdict_methods
+Modules/xxsubtype.c	-	spamdict_type	variable	static PyTypeObject spamdict_type
+Modules/xxsubtype.c	-	spamlist_getsets	variable	static PyGetSetDef spamlist_getsets[]
+Modules/xxsubtype.c	-	spamlist_methods	variable	static PyMethodDef spamlist_methods
+Modules/xxsubtype.c	-	spamlist_type	variable	static PyTypeObject spamlist_type
+Modules/_sre.c	-	sremodule	variable	static struct PyModuleDef sremodule
+Modules/faulthandler.c	-	stack	variable	static stack_t stack
+Modules/itertoolsmodule.c	-	starmap_methods	variable	static PyMethodDef starmap_methods
+Modules/itertoolsmodule.c	-	starmap_type	variable	static PyTypeObject starmap_type
+Python/Python-ast.c	-	Starred_fields	variable	static const char *Starred_fields[]
+Python/Python-ast.c	-	Starred_type	variable	static PyTypeObject *Starred_type
+Python/graminit.c	-	states_0	variable	static state states_0[3]
+Python/graminit.c	-	states_1	variable	static state states_1[2]
+Python/graminit.c	-	states_10	variable	static state states_10[4]
+Python/graminit.c	-	states_11	variable	static state states_11[34]
+Python/graminit.c	-	states_12	variable	static state states_12[2]
+Python/graminit.c	-	states_13	variable	static state states_13[2]
+Python/graminit.c	-	states_14	variable	static state states_14[4]
+Python/graminit.c	-	states_15	variable	static state states_15[2]
+Python/graminit.c	-	states_16	variable	static state states_16[6]
+Python/graminit.c	-	states_17	variable	static state states_17[5]
+Python/graminit.c	-	states_18	variable	static state states_18[3]
+Python/graminit.c	-	states_19	variable	static state states_19[2]
+Python/graminit.c	-	states_2	variable	static state states_2[3]
+Python/graminit.c	-	states_20	variable	static state states_20[3]
+Python/graminit.c	-	states_21	variable	static state states_21[2]
+Python/graminit.c	-	states_22	variable	static state states_22[2]
+Python/graminit.c	-	states_23	variable	static state states_23[2]
+Python/graminit.c	-	states_24	variable	static state states_24[2]
+Python/graminit.c	-	states_25	variable	static state states_25[3]
+Python/graminit.c	-	states_26	variable	static state states_26[2]
+Python/graminit.c	-	states_27	variable	static state states_27[5]
+Python/graminit.c	-	states_28	variable	static state states_28[2]
+Python/graminit.c	-	states_29	variable	static state states_29[3]
+Python/graminit.c	-	states_3	variable	static state states_3[7]
+Python/graminit.c	-	states_30	variable	static state states_30[8]
+Python/graminit.c	-	states_31	variable	static state states_31[4]
+Python/graminit.c	-	states_32	variable	static state states_32[4]
+Python/graminit.c	-	states_33	variable	static state states_33[3]
+Python/graminit.c	-	states_34	variable	static state states_34[2]
+Python/graminit.c	-	states_35	variable	static state states_35[2]
+Python/graminit.c	-	states_36	variable	static state states_36[3]
+Python/graminit.c	-	states_37	variable	static state states_37[3]
+Python/graminit.c	-	states_38	variable	static state states_38[5]
+Python/graminit.c	-	states_39	variable	static state states_39[2]
+Python/graminit.c	-	states_4	variable	static state states_4[2]
+Python/graminit.c	-	states_40	variable	static state states_40[3]
+Python/graminit.c	-	states_41	variable	static state states_41[8]
+Python/graminit.c	-	states_42	variable	static state states_42[8]
+Python/graminit.c	-	states_43	variable	static state states_43[11]
+Python/graminit.c	-	states_44	variable	static state states_44[13]
+Python/graminit.c	-	states_45	variable	static state states_45[6]
+Python/graminit.c	-	states_46	variable	static state states_46[4]
+Python/graminit.c	-	states_47	variable	static state states_47[5]
+Python/graminit.c	-	states_48	variable	static state states_48[5]
+Python/graminit.c	-	states_49	variable	static state states_49[4]
+Python/graminit.c	-	states_5	variable	static state states_5[3]
+Python/graminit.c	-	states_50	variable	static state states_50[6]
+Python/graminit.c	-	states_51	variable	static state states_51[2]
+Python/graminit.c	-	states_52	variable	static state states_52[5]
+Python/graminit.c	-	states_53	variable	static state states_53[5]
+Python/graminit.c	-	states_54	variable	static state states_54[2]
+Python/graminit.c	-	states_55	variable	static state states_55[2]
+Python/graminit.c	-	states_56	variable	static state states_56[3]
+Python/graminit.c	-	states_57	variable	static state states_57[2]
+Python/graminit.c	-	states_58	variable	static state states_58[4]
+Python/graminit.c	-	states_59	variable	static state states_59[3]
+Python/graminit.c	-	states_6	variable	static state states_6[3]
+Python/graminit.c	-	states_60	variable	static state states_60[2]
+Python/graminit.c	-	states_61	variable	static state states_61[2]
+Python/graminit.c	-	states_62	variable	static state states_62[2]
+Python/graminit.c	-	states_63	variable	static state states_63[2]
+Python/graminit.c	-	states_64	variable	static state states_64[2]
+Python/graminit.c	-	states_65	variable	static state states_65[2]
+Python/graminit.c	-	states_66	variable	static state states_66[3]
+Python/graminit.c	-	states_67	variable	static state states_67[4]
+Python/graminit.c	-	states_68	variable	static state states_68[3]
+Python/graminit.c	-	states_69	variable	static state states_69[9]
+Python/graminit.c	-	states_7	variable	static state states_7[9]
+Python/graminit.c	-	states_70	variable	static state states_70[5]
+Python/graminit.c	-	states_71	variable	static state states_71[7]
+Python/graminit.c	-	states_72	variable	static state states_72[3]
+Python/graminit.c	-	states_73	variable	static state states_73[5]
+Python/graminit.c	-	states_74	variable	static state states_74[3]
+Python/graminit.c	-	states_75	variable	static state states_75[3]
+Python/graminit.c	-	states_76	variable	static state states_76[3]
+Python/graminit.c	-	states_77	variable	static state states_77[14]
+Python/graminit.c	-	states_78	variable	static state states_78[8]
+Python/graminit.c	-	states_79	variable	static state states_79[3]
+Python/graminit.c	-	states_8	variable	static state states_8[4]
+Python/graminit.c	-	states_80	variable	static state states_80[4]
+Python/graminit.c	-	states_81	variable	static state states_81[2]
+Python/graminit.c	-	states_82	variable	static state states_82[6]
+Python/graminit.c	-	states_83	variable	static state states_83[3]
+Python/graminit.c	-	states_84	variable	static state states_84[4]
+Python/graminit.c	-	states_85	variable	static state states_85[2]
+Python/graminit.c	-	states_86	variable	static state states_86[3]
+Python/graminit.c	-	states_87	variable	static state states_87[3]
+Python/graminit.c	-	states_88	variable	static state states_88[7]
+Python/graminit.c	-	states_89	variable	static state states_89[3]
+Python/graminit.c	-	states_9	variable	static state states_9[42]
+Python/graminit.c	-	states_90	variable	static state states_90[6]
+Python/graminit.c	-	states_91	variable	static state states_91[11]
+Python/getargs.c	-	static_arg_parsers	variable	static struct _PyArg_Parser *static_arg_parsers
+Objects/unicodeobject.c	-	static_strings	variable	static _Py_Identifier *static_strings
+Modules/_stat.c	-	stat_methods	variable	static PyMethodDef stat_methods
+Modules/_stat.c	-	statmodule	variable	static struct PyModuleDef statmodule
+Modules/posixmodule.c	-	stat_result_desc	variable	static PyStructSequence_Desc stat_result_desc
+Modules/posixmodule.c	-	stat_result_fields	variable	static PyStructSequence_Field stat_result_fields[]
+Modules/posixmodule.c	-	StatResultType	variable	static PyTypeObject* StatResultType
+Modules/posixmodule.c	-	statvfs_result_desc	variable	static PyStructSequence_Desc statvfs_result_desc
+Modules/posixmodule.c	-	statvfs_result_fields	variable	static PyStructSequence_Field statvfs_result_fields[]
+Modules/posixmodule.c	-	StatVFSResultType	variable	static PyTypeObject* StatVFSResultType
+Objects/fileobject.c	-	stdprinter_getsetlist	variable	static PyGetSetDef stdprinter_getsetlist[]
+Objects/fileobject.c	-	stdprinter_methods	variable	static PyMethodDef stdprinter_methods
+Python/symtable.c	-	ste_memberlist	variable	static PyMemberDef ste_memberlist[]
+Python/Python-ast.c	-	stmt_attributes	variable	static const char *stmt_attributes[]
+Python/Python-ast.c	-	stmt_type	variable	static PyTypeObject *stmt_type
+Objects/exceptions.c	-	StopIteration_members	variable	static PyMemberDef StopIteration_members[]
+Python/Python-ast.c	-	Store_singleton	variable	static PyObject *Store_singleton
+Python/Python-ast.c	-	Store_type	variable	static PyTypeObject *Store_type
+Python/ast_unparse.c	-	_str_close_br	variable	static PyObject *_str_close_br
+Python/ast_unparse.c	-	_str_dbl_close_br	variable	static PyObject *_str_dbl_close_br
+Python/ast_unparse.c	-	_str_dbl_open_br	variable	static PyObject *_str_dbl_open_br
+Modules/_threadmodule.c	-	str_dict	variable	static PyObject *str_dict
+Modules/_io/stringio.c	-	stringio_getset	variable	static PyGetSetDef stringio_getset[]
+Modules/_io/stringio.c	-	stringio_methods	variable	static PyMethodDef stringio_methods
+Objects/unicodeobject.c	-	_string_methods	variable	static PyMethodDef _string_methods
+Objects/unicodeobject.c	-	_string_module	variable	static struct PyModuleDef _string_module
+Objects/bytesobject.c	-	striter_methods	variable	static PyMethodDef striter_methods
+Python/ast_unparse.c	-	_str_open_br	variable	static PyObject *_str_open_br
+Modules/pwdmodule.c	-	StructPwdType	variable	static PyTypeObject StructPwdType
+Modules/pwdmodule.c	-	struct_pwd_type_desc	variable	static PyStructSequence_Desc struct_pwd_type_desc
+Modules/pwdmodule.c	-	struct_pwd_type_fields	variable	static PyStructSequence_Field struct_pwd_type_fields[]
+Modules/posixmodule.c	wait_helper	struct_rusage	variable	static PyObject *struct_rusage
+Objects/structseq.c	-	structseq_methods	variable	static PyMethodDef structseq_methods
+Modules/posixmodule.c	-	structseq_new	variable	static newfunc structseq_new
+Modules/signalmodule.c	-	struct_siginfo_desc	variable	static PyStructSequence_Desc struct_siginfo_desc
+Modules/signalmodule.c	-	struct_siginfo_fields	variable	static PyStructSequence_Field struct_siginfo_fields[]
+Modules/timemodule.c	-	StructTimeType	variable	static PyTypeObject StructTimeType
+Modules/timemodule.c	-	struct_time_type_desc	variable	static PyStructSequence_Desc struct_time_type_desc
+Modules/timemodule.c	-	struct_time_type_fields	variable	static PyStructSequence_Field struct_time_type_fields[]
+Python/Python-ast.c	-	Subscript_fields	variable	static const char *Subscript_fields[]
+Python/Python-ast.c	-	Subscript_type	variable	static PyTypeObject *Subscript_type
+Python/Python-ast.c	-	Sub_singleton	variable	static PyObject *Sub_singleton
+Python/Python-ast.c	-	Sub_type	variable	static PyTypeObject *Sub_type
+Objects/typeobject.c	-	subtype_getsets_dict_only	variable	static PyGetSetDef subtype_getsets_dict_only[]
+Objects/typeobject.c	-	subtype_getsets_full	variable	static PyGetSetDef subtype_getsets_full[]
+Objects/typeobject.c	-	subtype_getsets_weakref_only	variable	static PyGetSetDef subtype_getsets_weakref_only[]
+Python/Python-ast.c	-	Suite_fields	variable	static const char *Suite_fields[]
+Python/Python-ast.c	-	Suite_type	variable	static PyTypeObject *Suite_type
+Objects/typeobject.c	-	super_members	variable	static PyMemberDef super_members[]
+Modules/symtablemodule.c	-	symtable_methods	variable	static PyMethodDef symtable_methods
+Modules/symtablemodule.c	-	symtablemodule	variable	static struct PyModuleDef symtablemodule
+Objects/exceptions.c	-	SyntaxError_members	variable	static PyMemberDef SyntaxError_members[]
+Python/sysmodule.c	-	sys_methods	variable	static PyMethodDef sys_methods
+Python/sysmodule.c	-	sysmodule	variable	static struct PyModuleDef sysmodule
+Objects/exceptions.c	-	SystemExit_members	variable	static PyMemberDef SystemExit_members[]
+Modules/_tracemalloc.c	-	tables_lock	variable	static PyThread_type_lock tables_lock
+Modules/itertoolsmodule.c	-	takewhile_reduce_methods	variable	static PyMethodDef takewhile_reduce_methods
+Modules/itertoolsmodule.c	-	takewhile_type	variable	static PyTypeObject takewhile_type
+Python/pylifecycle.c	-	_TARGET_LOCALES	variable	static _LocaleCoercionTarget _TARGET_LOCALES[]
+Python/traceback.c	-	tb_getsetters	variable	static PyGetSetDef tb_getsetters[]
+Python/traceback.c	-	tb_memberlist	variable	static PyMemberDef tb_memberlist[]
+Python/traceback.c	-	tb_methods	variable	static PyMethodDef tb_methods
+Modules/itertoolsmodule.c	-	teedataobject_methods	variable	static PyMethodDef teedataobject_methods
+Modules/itertoolsmodule.c	-	teedataobject_type	variable	static PyTypeObject teedataobject_type
+Modules/itertoolsmodule.c	-	tee_methods	variable	static PyMethodDef tee_methods
+Modules/itertoolsmodule.c	-	tee_type	variable	static PyTypeObject tee_type
+Modules/posixmodule.c	-	TerminalSize_desc	variable	static PyStructSequence_Desc TerminalSize_desc
+Modules/posixmodule.c	-	TerminalSize_fields	variable	static PyStructSequence_Field TerminalSize_fields[]
+Modules/posixmodule.c	-	TerminalSizeType	variable	static PyTypeObject* TerminalSizeType
+Modules/_io/textio.c	-	textiobase_getset	variable	static PyGetSetDef textiobase_getset[]
+Modules/_io/textio.c	-	textiobase_methods	variable	static PyMethodDef textiobase_methods
+Modules/_io/textio.c	-	textiowrapper_getset	variable	static PyGetSetDef textiowrapper_getset[]
+Modules/_io/textio.c	-	textiowrapper_members	variable	static PyMemberDef textiowrapper_members[]
+Modules/_io/textio.c	-	textiowrapper_methods	variable	static PyMethodDef textiowrapper_methods
+Modules/faulthandler.c	-	thread	variable	static struct { PyObject *file; int fd; PY_TIMEOUT_T timeout_us; int repeat; PyInterpreterState *interp; int exit; char *header; size_t header_len; PyThread_type_lock cancel_event; PyThread_type_lock running; } thread
+Python/thread.c	-	thread_debug	variable	static int thread_debug
+Modules/_threadmodule.c	-	ThreadError	variable	static PyObject *ThreadError
+Python/thread.c	-	threadinfo_desc	variable	static PyStructSequence_Desc threadinfo_desc
+Python/thread.c	-	threadinfo_fields	variable	static PyStructSequence_Field threadinfo_fields[]
+Python/thread.c	-	ThreadInfoType	variable	static PyTypeObject ThreadInfoType
+Modules/_threadmodule.c	-	thread_methods	variable	static PyMethodDef thread_methods
+Modules/_threadmodule.c	-	threadmodule	variable	static struct PyModuleDef threadmodule
+Modules/posixmodule.c	-	ticks_per_second	variable	static long ticks_per_second
+Modules/timemodule.c	_PyTime_GetProcessTimeWithInfo	ticks_per_second	variable	static long ticks_per_second
+Modules/timemodule.c	-	time_methods	variable	static PyMethodDef time_methods
+Modules/timemodule.c	-	timemodule	variable	static struct PyModuleDef timemodule
+Modules/posixmodule.c	-	times_result_desc	variable	static PyStructSequence_Desc times_result_desc
+Modules/posixmodule.c	-	times_result_fields	variable	static PyStructSequence_Field times_result_fields[]
+Modules/posixmodule.c	-	TimesResultType	variable	static PyTypeObject* TimesResultType
+Python/context.c	-	_token_missing	variable	static PyObject *_token_missing
+Python/symtable.c	-	top	variable	static identifier top
+Objects/typeobject.c	-	tp_new_methoddef	variable	static struct PyMethodDef tp_new_methoddef[]
+Modules/_tracemalloc.c	-	tracemalloc_empty_traceback	variable	static traceback_t tracemalloc_empty_traceback
+Modules/_tracemalloc.c	-	tracemalloc_filenames	variable	static _Py_hashtable_t *tracemalloc_filenames
+Modules/_tracemalloc.c	-	tracemalloc_peak_traced_memory	variable	static size_t tracemalloc_peak_traced_memory
+Modules/_tracemalloc.c	-	tracemalloc_reentrant_key	variable	static Py_tss_t tracemalloc_reentrant_key
+Modules/_tracemalloc.c	-	tracemalloc_traceback	variable	static traceback_t *tracemalloc_traceback
+Modules/_tracemalloc.c	-	tracemalloc_tracebacks	variable	static _Py_hashtable_t *tracemalloc_tracebacks
+Modules/_tracemalloc.c	-	tracemalloc_traced_memory	variable	static size_t tracemalloc_traced_memory
+Modules/_tracemalloc.c	-	tracemalloc_traces	variable	static _Py_hashtable_t *tracemalloc_traces
+Objects/boolobject.c	-	true_str	variable	static PyObject *true_str
+Python/Python-ast.c	-	Try_fields	variable	static const char *Try_fields[]
+Python/Python-ast.c	-	Try_type	variable	static PyTypeObject *Try_type
+Objects/tupleobject.c	-	tuple_as_mapping	variable	static PyMappingMethods tuple_as_mapping
+Objects/tupleobject.c	-	tuple_as_sequence	variable	static PySequenceMethods tuple_as_sequence
+Python/Python-ast.c	-	Tuple_fields	variable	static const char *Tuple_fields[]
+Modules/_collectionsmodule.c	-	tuplegetter_members	variable	static PyMemberDef tuplegetter_members[]
+Modules/_collectionsmodule.c	-	tuplegetter_methods	variable	static PyMethodDef tuplegetter_methods
+Modules/_collectionsmodule.c	-	tuplegetter_type	variable	static PyTypeObject tuplegetter_type
+Objects/tupleobject.c	-	tupleiter_methods	variable	static PyMethodDef tupleiter_methods
+Objects/tupleobject.c	-	tuple_methods	variable	static PyMethodDef tuple_methods
+Python/Python-ast.c	-	Tuple_type	variable	static PyTypeObject *Tuple_type
+Objects/typeobject.c	-	type_getsets	variable	static PyGetSetDef type_getsets[]
+Python/Python-ast.c	-	TypeIgnore_fields	variable	static const char *TypeIgnore_fields[]
+Python/Python-ast.c	-	type_ignore_type	variable	static PyTypeObject *type_ignore_type
+Python/Python-ast.c	-	TypeIgnore_type	variable	static PyTypeObject *TypeIgnore_type
+Objects/typeobject.c	-	type_members	variable	static PyMemberDef type_members[]
+Objects/typeobject.c	-	type_methods	variable	static PyMethodDef type_methods
+Python/Python-ast.c	-	UAdd_singleton	variable	static PyObject *UAdd_singleton
+Python/Python-ast.c	-	UAdd_type	variable	static PyTypeObject *UAdd_type
+Objects/unicodeobject.c	-	ucnhash_CAPI	variable	static _PyUnicode_Name_CAPI *ucnhash_CAPI
+Python/codecs.c	-	ucnhash_CAPI	variable	static _PyUnicode_Name_CAPI *ucnhash_CAPI
+Python/ast.c	-	u_kind	variable	static PyObject *u_kind
+Modules/posixmodule.c	-	uname_result_desc	variable	static PyStructSequence_Desc uname_result_desc
+Modules/posixmodule.c	-	uname_result_fields	variable	static PyStructSequence_Field uname_result_fields[]
+Modules/posixmodule.c	-	UnameResultType	variable	static PyTypeObject* UnameResultType
+Python/Python-ast.c	-	UnaryOp_fields	variable	static const char *UnaryOp_fields[]
+Python/Python-ast.c	-	unaryop_type	variable	static PyTypeObject *unaryop_type
+Python/Python-ast.c	-	UnaryOp_type	variable	static PyTypeObject *UnaryOp_type
+Objects/unicodeobject.c	-	unicode_as_mapping	variable	static PyMappingMethods unicode_as_mapping
+Objects/unicodeobject.c	-	unicode_as_number	variable	static PyNumberMethods unicode_as_number
+Objects/unicodeobject.c	-	unicode_as_sequence	variable	static PySequenceMethods unicode_as_sequence
+Objects/unicodeobject.c	-	unicode_empty	variable	static PyObject *unicode_empty
+Objects/exceptions.c	-	UnicodeError_members	variable	static PyMemberDef UnicodeError_members[]
+Objects/unicodeobject.c	-	unicodeiter_methods	variable	static PyMethodDef unicodeiter_methods
+Objects/unicodeobject.c	-	unicode_latin1	variable	static PyObject *unicode_latin1[256]
+Objects/unicodeobject.c	-	unicode_methods	variable	static PyMethodDef unicode_methods
+Modules/_tracemalloc.c	-	unknown_filename	variable	static PyObject *unknown_filename
+Python/errors.c	-	UnraisableHookArgs_desc	variable	static PyStructSequence_Desc UnraisableHookArgs_desc
+Python/errors.c	-	UnraisableHookArgs_fields	variable	static PyStructSequence_Field UnraisableHookArgs_fields[]
+Python/errors.c	-	UnraisableHookArgsType	variable	static PyTypeObject UnraisableHookArgsType
+Objects/obmalloc.c	-	unused_arena_objects	variable	static struct arena_object* unused_arena_objects
+Python/bootstrap_hash.c	-	urandom_cache	variable	static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache
+Objects/obmalloc.c	-	usable_arenas	variable	static struct arena_object* usable_arenas
+Objects/obmalloc.c	-	usedpools	variable	static poolp usedpools[2 * ((NB_SMALL_SIZE_CLASSES + 7) / 8) * 8]
+Modules/faulthandler.c	-	user_signals	variable	static user_signal_t *user_signals
+Python/Python-ast.c	-	USub_singleton	variable	static PyObject *USub_singleton
+Python/Python-ast.c	-	USub_type	variable	static PyTypeObject *USub_type
+Python/getversion.c	Py_GetVersion	version	variable	static char version[250]
+Python/sysmodule.c	-	version_info_desc	variable	static PyStructSequence_Desc version_info_desc
+Python/sysmodule.c	-	version_info_fields	variable	static PyStructSequence_Field version_info_fields[]
+Python/sysmodule.c	-	VersionInfoType	variable	static PyTypeObject VersionInfoType
+Modules/posixmodule.c	-	waitid_result_desc	variable	static PyStructSequence_Desc waitid_result_desc
+Modules/posixmodule.c	-	waitid_result_fields	variable	static PyStructSequence_Field waitid_result_fields[]
+Modules/posixmodule.c	-	WaitidResultType	variable	static PyTypeObject* WaitidResultType
+Modules/signalmodule.c	-	wakeup	variable	static volatile struct { SOCKET_T fd; int warn_on_full_buffer; int use_send; } wakeup
+Python/_warnings.c	-	warnings_functions	variable	static PyMethodDef warnings_functions[]
+Python/_warnings.c	-	warningsmodule	variable	static struct PyModuleDef warningsmodule
+Modules/_weakref.c	-	weakref_functions	variable	static PyMethodDef weakref_functions
+Objects/weakrefobject.c	-	weakref_members	variable	static PyMemberDef weakref_members[]
+Modules/_weakref.c	-	weakrefmodule	variable	static struct PyModuleDef weakrefmodule
+Python/sysmodule.c	-	whatstrings	variable	static PyObject *whatstrings[8]
+Python/Python-ast.c	-	While_fields	variable	static const char *While_fields[]
+Python/Python-ast.c	-	While_type	variable	static PyTypeObject *While_type
+Python/Python-ast.c	-	With_fields	variable	static const char *With_fields[]
+Python/Python-ast.c	-	withitem_fields	variable	static const char *withitem_fields[]
+Python/Python-ast.c	-	withitem_type	variable	static PyTypeObject *withitem_type
+Python/Python-ast.c	-	With_type	variable	static PyTypeObject *With_type
+Objects/descrobject.c	-	wrapperdescr_getset	variable	static PyGetSetDef wrapperdescr_getset[]
+Objects/descrobject.c	-	wrapper_getsets	variable	static PyGetSetDef wrapper_getsets[]
+Objects/descrobject.c	-	wrapper_members	variable	static PyMemberDef wrapper_members[]
+Objects/descrobject.c	-	wrapper_methods	variable	static PyMethodDef wrapper_methods
+Modules/_threadmodule.c	local_new	wr_callback_def	variable	static PyMethodDef wr_callback_def
+Modules/xxsubtype.c	-	xxsubtype_functions	variable	static PyMethodDef xxsubtype_functions[]
+Modules/xxsubtype.c	-	xxsubtypemodule	variable	static struct PyModuleDef xxsubtypemodule
+Modules/xxsubtype.c	-	xxsubtype_slots	variable	static struct PyModuleDef_Slot xxsubtype_slots[]
+Python/Python-ast.c	-	Yield_fields	variable	static const char *Yield_fields[]
+Python/Python-ast.c	-	YieldFrom_fields	variable	static const char *YieldFrom_fields[]
+Python/Python-ast.c	-	YieldFrom_type	variable	static PyTypeObject *YieldFrom_type
+Python/Python-ast.c	-	Yield_type	variable	static PyTypeObject *Yield_type
+Modules/itertoolsmodule.c	-	zip_longest_methods	variable	static PyMethodDef zip_longest_methods
+Modules/itertoolsmodule.c	-	ziplongest_type	variable	static PyTypeObject ziplongest_type
+Python/bltinmodule.c	-	zip_methods	variable	static PyMethodDef zip_methods