From cc2e79b6dd3def7d0b47bd6dfc2f36d73c0d05c6 Mon Sep 17 00:00:00 2001 From: "silas.martens" Date: Fri, 23 May 2025 16:31:01 +0200 Subject: [PATCH] Fix cgmerge to handle callgraphs with null meta field --- AUTHORS | 2 +- cgcollector/lib/src/JSONManager.cpp | 7 +++++-- cgcollector/tools/CGMerge.cpp | 14 +++++++++----- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/AUTHORS b/AUTHORS index 17b168d6..9ce5d053 100644 --- a/AUTHORS +++ b/AUTHORS @@ -18,7 +18,7 @@ Jonas Rickert Sebastian Kreutzer Tim Heldmann Marek Beckmann - +Silas Martens External Contributors Jan-Patrick Lehr diff --git a/cgcollector/lib/src/JSONManager.cpp b/cgcollector/lib/src/JSONManager.cpp index e2a15915..00cc637c 100644 --- a/cgcollector/lib/src/JSONManager.cpp +++ b/cgcollector/lib/src/JSONManager.cpp @@ -170,8 +170,11 @@ nlohmann::json buildFromJSONv2(FuncMapT& functionMap, const std::string& filenam auto ps = it.value()["callers"].get>(); fi.parents.insert(ps.begin(), ps.end()); - readNumStmts(it.value(), fi); - readFileOrigin(it.value(), fi); + if(!it.value()["meta"].is_null()) { + readNumStmts(it.value(), fi); + readFileOrigin(it.value(), fi); + } + } // Now the functions map holds all the information diff --git a/cgcollector/tools/CGMerge.cpp b/cgcollector/tools/CGMerge.cpp index 14a7dcc9..c4364c06 100644 --- a/cgcollector/tools/CGMerge.cpp +++ b/cgcollector/tools/CGMerge.cpp @@ -73,9 +73,12 @@ nlohmann::json mergeFileFormatTwo(const std::string& wholeCGFilename, const std: } else { auto& c = wholeCG[it.key()]; auto& v = it.value(); + if (v["meta"].is_null()) { + doMerge(c, v); // skip merging metadata + // TODO multiple bodies possible, if the body is in header? // TODO separate merge of meta information - if (v["hasBody"].get() && c["hasBody"].get()) { + } else if (v["hasBody"].get() && c["hasBody"].get()) { // std::cout << "WARNING: merge of " << it.key() // << " has detected multiple bodies (equal number of statements would be good.)" << std::endl; // TODO check for equal values @@ -105,10 +108,11 @@ nlohmann::json mergeFileFormatTwo(const std::string& wholeCGFilename, const std: // callees, isVirtual, doesOverride and overriddenFunctions unchanged // hasBody unchanged // numStatements unchanged - } else { - // nothing special - } - if (!c["meta"].contains("estimateCallCount") && v["meta"].contains("estimateCallCount")) { + } + + if (c["meta"].is_null()) { + // Metadata is null, nothing to merge + } else if (!c["meta"].contains("estimateCallCount") && v["meta"].contains("estimateCallCount")) { c["meta"]["estimateCallCount"] = v["meta"]["estimateCallCount"]; } else if (c["meta"].contains("estimateCallCount") && v["meta"].contains("estimateCallCount")) { auto& ccalls = c["meta"]["estimateCallCount"]["calls"];