summaryrefslogtreecommitdiff
path: root/site_scons
diff options
context:
space:
mode:
authorMitch Wagner <dev@mitchwag.com>2022-08-03 16:32:04 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-08-03 17:52:07 +0000
commit557741f2a966918792ddb22cc276a7628bc8a215 (patch)
treeaa25ae3275d0865a4265e871f7d94e7687500237 /site_scons
parentc9bbd1cfae470f2b3229e69957f512d2a2db6663 (diff)
downloadmongo-557741f2a966918792ddb22cc276a7628bc8a215.tar.gz
SERVER-53532 Add edge list to lipdeps visualizer
Diffstat (limited to 'site_scons')
-rw-r--r--site_scons/libdeps.py35
1 files changed, 24 insertions, 11 deletions
diff --git a/site_scons/libdeps.py b/site_scons/libdeps.py
index 767f2a7baf4..9cb445bd257 100644
--- a/site_scons/libdeps.py
+++ b/site_scons/libdeps.py
@@ -63,6 +63,7 @@ import textwrap
import hashlib
import json
import fileinput
+import subprocess
try:
import networkx
@@ -1265,7 +1266,9 @@ def generate_graph(env, target, source):
libdeps_graph = env.GetLibdepsGraph()
+ demangled_symbols = {}
for symbol_deps_file in source:
+
with open(str(symbol_deps_file)) as f:
symbols = {}
try:
@@ -1279,16 +1282,26 @@ def generate_graph(env, target, source):
except json.JSONDecodeError:
env.FatalError(f"Failed processing json file: {str(symbol_deps_file)}")
- for libdep in symbols:
- from_node = os.path.abspath(str(symbol_deps_file)[:-len(env['SYMBOLDEPSSUFFIX'])])
- to_node = os.path.abspath(libdep).strip()
- libdeps_graph.add_edges_from([(
- from_node,
- to_node,
- {EdgeProps.symbols.name: " ".join(symbols[libdep])},
- )])
- node = env.File(str(symbol_deps_file)[:-len(env['SYMBOLDEPSSUFFIX'])])
- add_node_from(env, node)
+ demangled_symbols[str(symbol_deps_file)] = symbols
+
+ p1 = subprocess.Popen(['c++filt', '-n'], stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ stdout, stderr = p1.communicate(json.dumps(demangled_symbols).encode('utf-8'))
+ demangled_symbols = json.loads(stdout.decode("utf-8"))
+
+ for deps_file in demangled_symbols:
+
+ for libdep in demangled_symbols[deps_file]:
+
+ from_node = os.path.abspath(str(deps_file)[:-len(env['SYMBOLDEPSSUFFIX'])])
+ to_node = os.path.abspath(libdep).strip()
+ libdeps_graph.add_edges_from([(
+ from_node,
+ to_node,
+ {EdgeProps.symbols.name: "\n".join(demangled_symbols[deps_file][libdep])},
+ )])
+ node = env.File(str(deps_file)[:-len(env['SYMBOLDEPSSUFFIX'])])
+ add_node_from(env, node)
libdeps_graph_file = f"{env.Dir('$BUILD_DIR').path}/libdeps/libdeps.graphml"
networkx.write_graphml(libdeps_graph, libdeps_graph_file, named_key_ids=True)
@@ -1364,7 +1377,7 @@ def setup_environment(env, emitting_shared=False, debug='off', linting='on'):
env['LIBDEPS_SYMBOL_DEP_FILES'] = symbol_deps
env['LIBDEPS_GRAPH_FILE'] = env.File("${BUILD_DIR}/libdeps/libdeps.graphml")
- env['LIBDEPS_GRAPH_SCHEMA_VERSION'] = 3
+ env['LIBDEPS_GRAPH_SCHEMA_VERSION'] = 4
env["SYMBOLDEPSSUFFIX"] = '.symbol_deps'
libdeps_graph = LibdepsGraph()