From e3d77f51f16ebf40c5214bea5affd3e8faad5a20 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 11 May 2025 09:17:16 +0300 Subject: [PATCH 01/18] fixed getNameInLocation --- src/Distribution/DvmhDirective.cpp | 15 +++------------ src/Utils/module_utils.cpp | 26 +++++++++++++++++++++++--- src/Utils/module_utils.h | 1 + src/Utils/version.h | 2 +- 4 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/Distribution/DvmhDirective.cpp b/src/Distribution/DvmhDirective.cpp index 798eef2..1f8f0d2 100644 --- a/src/Distribution/DvmhDirective.cpp +++ b/src/Distribution/DvmhDirective.cpp @@ -199,15 +199,6 @@ static set fillUsedSymbols(SgStatement *loop) return usedS; } -static string correctSymbolModuleName(const string& origFull) -{ - auto it = origFull.find("::"); - if (it == string::npos) - return origFull; - else - return origFull.substr(it + 2); -} - static SgStatement* getModuleScope(const string& origFull, vector& moduleList, SgStatement *local) { auto it = origFull.find("::"); @@ -959,7 +950,7 @@ ParallelDirective::genDirective(File* file, const vectorsymbol()->identifier()); + redS = getNameInLocation(parentFunc, red, getModuleScope(red, moduleList, parentFunc)->symbol()->identifier()); else redS = findSymbolOrCreate(file, clearName, NULL, parentFunc); @@ -1017,12 +1008,12 @@ ParallelDirective::genDirective(File* file, const vector(list)); if (clearName1 != get<0>(list)) - redS1 = getNameInLocation(parentFunc, clearName1, getModuleScope(get<0>(list), moduleList, parentFunc)->symbol()->identifier()); + redS1 = getNameInLocation(parentFunc, get<0>(list), getModuleScope(get<0>(list), moduleList, parentFunc)->symbol()->identifier()); else redS1 = findSymbolOrCreate(file, clearName1, NULL, parentFunc); if (clearName2 != get<1>(list)) - redS2 = getNameInLocation(parentFunc, clearName2, getModuleScope(get<1>(list), moduleList, parentFunc)->symbol()->identifier()); + redS2 = getNameInLocation(parentFunc, get<1>(list), getModuleScope(get<1>(list), moduleList, parentFunc)->symbol()->identifier()); else redS2 = findSymbolOrCreate(file, clearName2, NULL, parentFunc); diff --git a/src/Utils/module_utils.cpp b/src/Utils/module_utils.cpp index 055e658..9bc9e1a 100644 --- a/src/Utils/module_utils.cpp +++ b/src/Utils/module_utils.cpp @@ -343,9 +343,9 @@ const set& getModuleSymbols(SgStatement *func) return symbs; } -SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const string& locName) +static void findSymbol(SgStatement* func, const string& varName, const string& locName, + map& altNames) { - map altNames; for (const auto& s : getModuleSymbols(func)) { SgSymbol* orig = OriginalSymbol(s); @@ -353,11 +353,22 @@ SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const stri if (orig->identifier() == varName && orig->scope()->symbol()->identifier() == locName) altNames[s->identifier()] = s; } +} + +SgSymbol* getNameInLocation(SgStatement* func, const string& varName, const string& locName) +{ + const string clearName = correctSymbolModuleName(varName); + + map altNames; + findSymbol(func, varName, locName, altNames); + + if (altNames.size() == 0 && clearName != varName) + findSymbol(func, clearName, locName, altNames); if (altNames.size() > 0) return altNames.begin()->second; else { - __spf_print(1, "%s %s %s\n", func->symbol()->identifier(), varName.c_str(), locName.c_str()); + __spf_print(1, "%s (%s %s) %s\n", func->symbol()->identifier(), clearName.c_str(), varName.c_str(), locName.c_str()); printInternalError(convertFileName(__FILE__).c_str(), __LINE__); } @@ -393,6 +404,15 @@ SgSymbol* getNameInLocation(SgSymbol* curr, SgStatement* location) return returnVal; } +string correctSymbolModuleName(const string& origFull) +{ + auto it = origFull.find("::"); + if (it == string::npos) + return origFull; + else + return origFull.substr(it + 2); +} + namespace Distribution { const string Array::GetNameInLocation(void* location_p) const diff --git a/src/Utils/module_utils.h b/src/Utils/module_utils.h index 8fd21da..e78b8e5 100644 --- a/src/Utils/module_utils.h +++ b/src/Utils/module_utils.h @@ -1,5 +1,6 @@ #pragma once +std::string correctSymbolModuleName(const std::string& origFull); const std::set& getModuleSymbols(SgStatement* func); void getModulesAndFunctions(SgFile* file, std::vector& modulesAndFunctions); void findModulesInFile(SgFile* file, std::vector& modules); diff --git a/src/Utils/version.h b/src/Utils/version.h index 2633120..ed408b9 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2416" +#define VERSION_SPF "2417" From 5f98eaf8720f74de8125f0add38ce81e3fe623ce Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 14:53:46 +0300 Subject: [PATCH 02/18] updated submodule --- projects/dvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/dvm b/projects/dvm index a711f8e..3a567d7 160000 --- a/projects/dvm +++ b/projects/dvm @@ -1 +1 @@ -Subproject commit a711f8ebfd023ca90a6d9c9bdf5a4726cd276d51 +Subproject commit 3a567d7582d01ec80d026a320415820e32e82c7c From a719dea05f6fc027a9164cd1bfb6dc80a54a0b39 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 15:38:26 +0300 Subject: [PATCH 03/18] fixed BUILD_INCLUDE_DEPENDENCIES pass --- src/Sapfor.cpp | 24 ++++++++++++++---------- src/SapforData.h | 4 ++-- src/Utils/version.h | 2 +- src/VisualizerCalls/get_information.cpp | 22 ++++++++++++---------- 4 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index b7e80b8..13a8a9e 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -331,9 +331,10 @@ static string unparseProjectIfNeed(SgFile* file, const int curr_regime, const bo unparseToBuf = removeIncludeStatsAndUnparse(file, file_name, fout_name.c_str(), allIncludeFiles, out_free_form == 1, moduleUsesByFile, moduleDecls, getObjectForFileFromMap(file_name, exctactedModuleStats), toString, false, true); auto itI = filesToInclude.find(file_name); - for (auto& [_, incl] : itI->second) - if (allIncludeFiles.find(incl) != allIncludeFiles.end()) - allIncludeFiles.erase(incl); + for (auto& [_, incls] : itI->second) + for (auto& incl : incls) + if (allIncludeFiles.find(incl) != allIncludeFiles.end()) + allIncludeFiles.erase(incl); } else { @@ -827,7 +828,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { auto fileIt = includeDependencies.find(file_name); if (fileIt == includeDependencies.end()) - fileIt = includeDependencies.insert(fileIt, make_pair(file_name, vector>())); + fileIt = includeDependencies.insert(fileIt, make_pair(file_name, map>())); set modFiles; for (auto& elem : moduleDecls) @@ -844,7 +845,7 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne { if (lastFromFile == NULL) printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - fileIt->second.push_back(make_pair(lastFromFile->lineNumber(), st->fileName())); + fileIt->second[lastFromFile->lineNumber()].insert(st->fileName()); } else lastFromFile = st; @@ -1603,12 +1604,15 @@ static bool runAnalysis(SgProject &project, const int curr_regime, const bool ne set includedToThisFile; if (itDep != includeDependencies.end()) { - for (auto& [_, incl] : itDep->second) + for (auto& [_, incls] : itDep->second) { - auto comm = commentsToInclude.find(incl); - if (comm != commentsToInclude.end()) - for (auto &allComm : comm->second) - includedToThisFile.insert(allComm.second.begin(), allComm.second.end()); + for (auto& incl : incls) + { + auto comm = commentsToInclude.find(incl); + if (comm != commentsToInclude.end()) + for (auto& allComm : comm->second) + includedToThisFile.insert(allComm.second.begin(), allComm.second.end()); + } } } diff --git a/src/SapforData.h b/src/SapforData.h index 8a46da9..cfd4f42 100644 --- a/src/SapforData.h +++ b/src/SapforData.h @@ -85,7 +85,7 @@ std::map>> commentsToInclude; // //for INSERT_INCLUDES -std::map>> filesToInclude; // file -> includes [nearest line, include] +std::map>> filesToInclude; // file -> includes [nearest line, include] // //for PASSES DEPENDENSIES @@ -96,7 +96,7 @@ std::set passesIgnoreStateDone; //for files info std::map lineInfo; // file -> lines count std::map, std::set>> dirsInfo; // file -> dirs count -std::map>> includeDependencies; // file -> includes [nearest line, include] +std::map>> includeDependencies; // file -> includes [nearest line, include] std::vector filesCompilationOrder; // order of files for unite to one file std::map>> exctactedModuleStats; // file -> hided excluded modules // diff --git a/src/Utils/version.h b/src/Utils/version.h index ed408b9..c836a7d 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2417" +#define VERSION_SPF "2418" diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 698d970..eb945f3 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -1308,7 +1308,7 @@ int SPF_GetIntrinsics(void*& context, short *&result) return (int)resVal.size() + 1; } -extern map>> includeDependencies; +extern map>> includeDependencies; int SPF_GetIncludeDependencies(void*& context, int winHandler, short *options, short *projName, short *&result, short*& output, int*& outputSize, short*& outputMessage, int*& outputMessageSize) { @@ -1328,12 +1328,15 @@ int SPF_GetIncludeDependencies(void*& context, int winHandler, short *options, s includes["file"] = deps.first; json array = json::array(); - for (const auto& [line, incl] : deps.second) + for (const auto& [line, incls] : deps.second) { - json elem; - elem["line"] = line; - elem["dependencyFileName"] = incl; - array.push_back(elem); + for (auto& incl : incls) + { + json elem; + elem["line"] = line; + elem["dependencyFileName"] = incl; + array.push_back(elem); + } } includes["includes"] = array; inc_array.push_back(includes); @@ -2189,7 +2192,7 @@ int SPF_InlineProcedures(void*& context, int winHandler, short* options, short* } -extern map>> filesToInclude; +extern map>> filesToInclude; int SPF_InsertIncludesPass(void*& context, int winHandler, short *options, short *projName, short *folderName, char *visFilesToInclude, short *&output, int *&outputSize, short *&outputMessage, int *&outputMessageSize) { @@ -2222,9 +2225,8 @@ int SPF_InsertIncludesPass(void*& context, int winHandler, short *options, short if (sscanf(splited[k].c_str(), "%d", &line) == -1) return -5; - auto pair = make_pair(line, splited[k + 1]); - filesToInclude[file].push_back(pair); - __spf_print(1, " include = [%d %s]\n", pair.first, pair.second.c_str()); + filesToInclude[file][line].insert(splited[k + 1]); + __spf_print(1, " include = [%d %s]\n", line, splited[k + 1].c_str()); } i += 2 * num; } From 12d3c2c8e539a25eea86d24faaef0de002cec0f0 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 15:42:38 +0300 Subject: [PATCH 04/18] fixed NULL error in matchParallelAndDist function --- src/DirectiveProcessing/directive_creator_base.cpp | 2 +- src/Utils/version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DirectiveProcessing/directive_creator_base.cpp b/src/DirectiveProcessing/directive_creator_base.cpp index 3747126..6a7f183 100644 --- a/src/DirectiveProcessing/directive_creator_base.cpp +++ b/src/DirectiveProcessing/directive_creator_base.cpp @@ -1601,7 +1601,7 @@ static bool matchParallelAndDist(const pair& parallelOn = NULL; for (auto& refOn : realRefs) { - linkWithTempl = parallelOn->GetLinksWithTemplate(regionId); + linkWithTempl = refOn->GetLinksWithTemplate(regionId); int z = 0; for (int k = 0; k < linkWithTempl.size(); ++k) if (linkWithTempl[k] != -1) diff --git a/src/Utils/version.h b/src/Utils/version.h index c836a7d..2fc9463 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2418" +#define VERSION_SPF "2419" From 719e3723aea64353ba62e54cef777a407e36da8f Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 11 May 2025 08:33:50 +0300 Subject: [PATCH 05/18] added json for SPF_GetAllDeclaratedArrays pass --- src/Distribution/Array.h | 60 +++++++++++++++++++++++++ src/VisualizerCalls/get_information.cpp | 13 +++--- 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/src/Distribution/Array.h b/src/Distribution/Array.h index 4d56db1..dd9f615 100644 --- a/src/Distribution/Array.h +++ b/src/Distribution/Array.h @@ -9,6 +9,7 @@ #include "DvmhDirectiveBase.h" #include "../Utils/utils.h" #include "../Utils/errors.h" +#include "../Utils/json.hpp" class Symbol; class Expression; @@ -20,6 +21,7 @@ struct FuncInfo; #define MAP std::map #define SET std::set #define TO_STR std::to_string +#define JSON nlohmann::json #if __SPF extern int sharedMemoryParallelization; @@ -424,6 +426,7 @@ namespace Distribution void ClearShadowSpecs() { allShadowSpecs.clear(); } + //TODO: to remove STRING toString() { STRING retVal = ""; @@ -466,6 +469,63 @@ namespace Distribution return retVal; } + JSON toJson() + { + JSON retVal; + + retVal["id"] = (int64_t)id; + retVal["name"] = name; + retVal["shortName"] = shortName; + + retVal["dimSize"] = dimSize; + retVal["typeSize"] = typeSize; + retVal["state"] = (int)isNonDistribute; + retVal["location"] = (int)locationPos.first; + retVal["locName"] = locationPos.second; + + retVal["isTemplFlag"] = (int)isTemplFlag; + retVal["isLoopArrayFlag"] = (int)isLoopArrayFlag; + + JSON deprToDist = nlohmann::json::array(); + for (int i = 0; i < depracateToDistribute.size(); ++i) + deprToDist.push_back((int)depracateToDistribute[i]); + retVal["depracateToDist"] = deprToDist; + + JSON mappedDimsJ = nlohmann::json::array(); + for (int i = 0; i < mappedDims.size(); ++i) + mappedDimsJ.push_back((int)mappedDims[i]); + retVal["mappedDims"] = mappedDimsJ; + + JSON sizesJ = nlohmann::json::array(); + for (int i = 0; i < sizes.size(); ++i) + { + JSON pair; + pair["key"] = sizes[i].first; + pair["value"] = sizes[i].second; + sizesJ.push_back(pair); + } + retVal["sizes"] = sizesJ; + + JSON regions = nlohmann::json::array(); + for (auto& reg : containsInRegions) + regions.push_back(reg); + retVal["regions"] = regions; + + + JSON declPlacesJ = nlohmann::json::array(); + for (auto& place : declPlaces) + { + JSON elem; + elem["file"] = place.first; + elem["line"] = place.second; + + declPlacesJ.push_back(elem); + } + retVal["declPlaces"] = declPlacesJ; + + return retVal; + } + Array* GetTemplateArray(const uint64_t regionId, bool withCheck = true) { TemplateLink *currLink = getTemlateInfo(regionId, withCheck); diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index eb945f3..c8a11a7 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -1419,14 +1419,17 @@ int SPF_GetAllDeclaratedArrays(void*& context, int winHandler, short *options, s { runPassesForVisualizer(projName, { GET_ALL_ARRAY_DECL }); - string resVal = ""; - for (auto f = declaredArrays.begin(); f != declaredArrays.end(); ++f) + json arrays = json::array(); + for (const auto& [_, array] : declaredArrays) { - if (f != declaredArrays.begin()) - resVal += "@"; - resVal += f->second.first->toString(); + json jArray = array.first->toJson(); + arrays.push_back(jArray); } + json allArrays; + allArrays["allArrays"] = arrays; + string resVal = allArrays.dump(); + copyStringToShort(result, resVal); retSize = (int)resVal.size() + 1; } From bcecd5460b9dcabbae604209ace457e7b1839c11 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 17 May 2025 18:49:46 +0300 Subject: [PATCH 06/18] added json for SPF_GetArrayDistribution pass --- src/Distribution/Array.h | 43 ------------------- src/Distribution/DvmhDirectiveBase.cpp | 46 ++++++++++++--------- src/Distribution/DvmhDirectiveBase.h | 4 +- src/ParallelizationRegions/ParRegions.h | 55 ++++++++++++++----------- src/VisualizerCalls/get_information.cpp | 16 +++---- 5 files changed, 70 insertions(+), 94 deletions(-) diff --git a/src/Distribution/Array.h b/src/Distribution/Array.h index dd9f615..a6cfc77 100644 --- a/src/Distribution/Array.h +++ b/src/Distribution/Array.h @@ -426,49 +426,6 @@ namespace Distribution void ClearShadowSpecs() { allShadowSpecs.clear(); } - //TODO: to remove - STRING toString() - { - STRING retVal = ""; - retVal += TO_STR(id); - retVal += "#" + name; - retVal += "#" + shortName; - retVal += "#" + TO_STR(dimSize); - retVal += "#" + TO_STR(typeSize); - retVal += "#" + TO_STR(isNonDistribute); - - retVal += "#" + TO_STR(locationPos.first); - retVal += "#" + locationPos.second; - - retVal += "#" + TO_STR(sizes.size()); - for (int i = 0; i < sizes.size(); ++i) - retVal += "#" + TO_STR(sizes[i].first) + "#" + TO_STR(sizes[i].second); - - retVal += "#" + TO_STR(depracateToDistribute.size()); - for (int i = 0; i < depracateToDistribute.size(); ++i) - retVal += "#" + TO_STR((int)depracateToDistribute[i]); - - retVal += "#" + TO_STR(mappedDims.size()); - for (int i = 0; i < mappedDims.size(); ++i) - retVal += "#" + TO_STR((int)mappedDims[i]); - - retVal += "#" + TO_STR(templateInfo.size()); - for (auto it = templateInfo.begin(); it != templateInfo.end(); ++it) - retVal += "#" + TO_STR(it->first) + it->second->toString(); - - retVal += "#" + TO_STR((int)isTemplFlag); - retVal += "|" + TO_STR((int)isLoopArrayFlag); - retVal += "|" + TO_STR(declPlaces.size()); - - for (auto &place : declPlaces) - retVal += "|" + place.first + "|" + TO_STR(place.second); - - retVal += "|" + TO_STR(containsInRegions.size()); - for (auto ® : containsInRegions) - retVal += "|" + reg; - return retVal; - } - JSON toJson() { JSON retVal; diff --git a/src/Distribution/DvmhDirectiveBase.cpp b/src/Distribution/DvmhDirectiveBase.cpp index 55b6586..996a105 100644 --- a/src/Distribution/DvmhDirectiveBase.cpp +++ b/src/Distribution/DvmhDirectiveBase.cpp @@ -12,6 +12,8 @@ #include "../Distribution/GraphCSR.h" #include "../Utils/errors.h" #include "../Utils/utils.h" +#include "../Utils/json.hpp" + #include "../GraphCall/graph_calls_func.h" using std::vector; @@ -27,6 +29,8 @@ using std::make_pair; using std::min; using std::max; +using nlohmann::json; + template static void uniteSets(const set &first, const set &second, set &result) { @@ -732,30 +736,32 @@ string AlignRuleBase::GenRuleBase() const return retVal; } -string AlignRuleBase::toString() +json AlignRuleBase::toJson() { - string retVal = ""; + json retVal; - if (alignArray) - retVal += "#" + std::to_string((long long)alignArray); - else - retVal += "#-1"; + retVal["packedAlignArrayAddress"] = alignArray ? std::to_string((long long)alignArray) : std::to_string((long long)-1); + retVal["packedAlignWithAddress"] = alignWith ? std::to_string((long long)alignWith) : std::to_string((long long)-1); - if (alignWith) - retVal += "#" + std::to_string((long long)alignWith); - else - retVal += "#-1"; - - retVal += "#" + std::to_string(alignRule.size()); - for (int i = 0; i < alignRule.size(); ++i) - retVal += "#" + std::to_string(alignRule[i].first) + "#" + std::to_string(alignRule[i].second); - - retVal += "#" + std::to_string(alignRuleWith.size()); - for (int i = 0; i < alignRuleWith.size(); ++i) - retVal += "#" + std::to_string(alignRuleWith[i].first) - + "#" + std::to_string(alignRuleWith[i].second.first) - + "#" + std::to_string(alignRuleWith[i].second.second); + json alignRules = json::array(); + for (auto& rule : alignRule) + { + json pair; + pair["key"] = rule.first; + pair["value"] = rule.second; + alignRules.push_back(pair); + } + retVal["alignRule"] = alignRules; + json alignRuleWithJ = json::array(); + for (auto& [dimNum, AB] : alignRuleWith) + { + json tuple; + tuple["dimNum"] = dimNum; + tuple["a"] = AB.first; + tuple["b"] = AB.second; + } + retVal["alignRuleWith"] = alignRuleWithJ; return retVal; } diff --git a/src/Distribution/DvmhDirectiveBase.h b/src/Distribution/DvmhDirectiveBase.h index 5d0ac07..d3c98a7 100644 --- a/src/Distribution/DvmhDirectiveBase.h +++ b/src/Distribution/DvmhDirectiveBase.h @@ -3,6 +3,8 @@ #include #include +#include "../Utils/json.hpp" + typedef enum lang : int { LANG_C, LANG_F } language; typedef enum dist : int { BLOCK, NONE } distType; typedef std::pair, std::pair> attrType; @@ -48,7 +50,7 @@ public: public: std::string GenRuleBase() const; - std::string toString(); + nlohmann::json toJson(); public: DIST::Array *alignArray; diff --git a/src/ParallelizationRegions/ParRegions.h b/src/ParallelizationRegions/ParRegions.h index 97a4a50..fc72c3d 100644 --- a/src/ParallelizationRegions/ParRegions.h +++ b/src/ParallelizationRegions/ParRegions.h @@ -11,6 +11,8 @@ #include "../Distribution/Distribution.h" #include "../Utils/AstWrapper.h" +#include "../Utils/json.hpp" + #if __SPF #include "../Utils/SgUtils.h" #endif @@ -235,35 +237,42 @@ public: return retVal; } - std::string toString() + nlohmann::json toJson() { - std::string retVal = ""; + nlohmann::json retVal; - retVal += "#" + std::to_string(regionId); - retVal += "#" + originalName; - retVal += "#" + std::to_string(lines.size()); + retVal["packedRegionId"] = std::to_string(regionId); + retVal["originalName"] = originalName; - for (auto it = lines.begin(); it != lines.end(); ++it) + nlohmann::json arrays = nlohmann::json::array(); + for (auto& array : allArrays.GetArrays()) + arrays.push_back(array->toJson()); + retVal["packedArrays"] = arrays; + + nlohmann::json linesInfo = nlohmann::json::array(); + for (auto& [file, linesByFile] : lines) { - retVal += "|" + it->first + "|"; - retVal += std::to_string(it->second.size()); - for (int i = 0; i < it->second.size(); ++i) - retVal += "#" + std::to_string(it->second[i].lines.first) + "#" + std::to_string(it->second[i].lines.second); + nlohmann::json linesRegs; + nlohmann::json lines = nlohmann::json::array(); + + for (auto& elem : linesByFile) + { + JSON pair; + pair["key"] = elem.lines.first; + pair["value"] = elem.lines.second; + lines.push_back(pair); + } + linesRegs["file"] = file; + linesRegs["lines"] = lines; + + linesInfo.push_back(linesRegs); } + retVal["regionsLines"] = linesInfo; - const std::set &arrays = allArrays.GetArrays(); - retVal += "#" + std::to_string(arrays.size()); - - //create map - for (auto it = arrays.begin(); it != arrays.end(); ++it) - { - retVal += "#" + std::to_string((long long)(*it)); - retVal += "#" + (*it)->toString(); - } - - retVal += "#" + std::to_string(dataDirectives.alignRules.size()); - for (int i = 0; i < dataDirectives.alignRules.size(); ++i) - retVal += dataDirectives.alignRules[i].toString(); + nlohmann::json alignRules = nlohmann::json::array(); + for (auto& rule : dataDirectives.alignRules) + alignRules.push_back(rule.toJson()); + retVal["alignRules"] = alignRules; return retVal; } diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index c8a11a7..fcab5f8 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -766,15 +766,17 @@ int SPF_GetArrayDistribution(void*& context, int winHandler, short *options, sho else printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - string resVal = ""; - resVal += to_string(parallelRegions.size()); - for (int i = 0; i < parallelRegions.size(); ++i) - resVal += parallelRegions[i]->toString(); + json allRegionsV = json::array(); + for (auto& reg : parallelRegions) + { + json currReg = reg->toJson(); + allRegionsV.push_back(currReg); + } - //__spf_print(1, "==============\n"); - //__spf_print(1, "%s\n", resVal.c_str()); - //__spf_print(1, "==============\n"); + json allRegions; + allRegions["allRegions"] = allRegionsV; + string resVal = allRegions.dump(); copyStringToShort(result, resVal); retSize = (int)resVal.size() + 1; } From 4614e166b4ce2e4b47fc2a21b42d8c7b82d6f147 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sat, 17 May 2025 18:51:35 +0300 Subject: [PATCH 07/18] version updated --- src/Utils/version.h | 2 +- src/VisualizerCalls/get_information.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Utils/version.h b/src/Utils/version.h index 2fc9463..e5e1b0e 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2419" +#define VERSION_SPF "2420" diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index fcab5f8..9d73c1b 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -766,15 +766,15 @@ int SPF_GetArrayDistribution(void*& context, int winHandler, short *options, sho else printInternalError(convertFileName(__FILE__).c_str(), __LINE__); - json allRegionsV = json::array(); + json regions = json::array(); for (auto& reg : parallelRegions) { json currReg = reg->toJson(); - allRegionsV.push_back(currReg); + regions.push_back(currReg); } json allRegions; - allRegions["allRegions"] = allRegionsV; + allRegions["allRegions"] = regions; string resVal = allRegions.dump(); copyStringToShort(result, resVal); From 81725651b19c0b51d7776b4c59d8ba6303775e62 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 14:51:37 +0300 Subject: [PATCH 08/18] fixed Array::toJson() --- src/Distribution/Array.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Distribution/Array.h b/src/Distribution/Array.h index a6cfc77..67ac43b 100644 --- a/src/Distribution/Array.h +++ b/src/Distribution/Array.h @@ -433,6 +433,7 @@ namespace Distribution retVal["id"] = (int64_t)id; retVal["name"] = name; retVal["shortName"] = shortName; + retVal["packedAddress"] = std::to_string((long long)this); retVal["dimSize"] = dimSize; retVal["typeSize"] = typeSize; From 0fe97ceb24726f3df38c41a7a176b71edd750dc4 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 15:12:59 +0300 Subject: [PATCH 09/18] fixed AlignRuleBase::toJson() --- src/Distribution/DvmhDirectiveBase.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Distribution/DvmhDirectiveBase.cpp b/src/Distribution/DvmhDirectiveBase.cpp index 996a105..28576a8 100644 --- a/src/Distribution/DvmhDirectiveBase.cpp +++ b/src/Distribution/DvmhDirectiveBase.cpp @@ -760,6 +760,8 @@ json AlignRuleBase::toJson() tuple["dimNum"] = dimNum; tuple["a"] = AB.first; tuple["b"] = AB.second; + + alignRuleWithJ.push_back(tuple); } retVal["alignRuleWith"] = alignRuleWithJ; return retVal; From 718b1738a11d3fe2559d95e8bbbd51fa2ce6035e Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 16:42:38 +0300 Subject: [PATCH 10/18] fixed typo --- src/Distribution/Array.h | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Distribution/Array.h b/src/Distribution/Array.h index 67ac43b..8f77faf 100644 --- a/src/Distribution/Array.h +++ b/src/Distribution/Array.h @@ -106,7 +106,7 @@ namespace Distribution MAP> usagePlaces; VECTOR mappedDims; - VECTOR depracateToDistribute; + VECTOR deprecateToDistribute; bool ompThreadPrivate; bool privateInLoop; @@ -171,7 +171,7 @@ namespace Distribution sizes.resize(dimSize); sizesExpr.resize(dimSize); mappedDims.resize(dimSize); - depracateToDistribute.resize(dimSize); + deprecateToDistribute.resize(dimSize); for (int z = 0; z < dimSize; ++z) { @@ -179,7 +179,7 @@ namespace Distribution PAIR initVal = std::make_pair(0, 0); sizesExpr[z] = std::make_pair(std::make_pair((Expression*)NULL, initVal), std::make_pair((Expression*)NULL, initVal)); mappedDims[z] = false; - depracateToDistribute[z] = false; + deprecateToDistribute[z] = false; } GenUniqKey(); @@ -214,7 +214,7 @@ namespace Distribution uniqKey = copy.uniqKey; containsInRegions = copy.containsInRegions; mappedDims = copy.mappedDims; - depracateToDistribute = copy.depracateToDistribute; + deprecateToDistribute = copy.deprecateToDistribute; ompThreadPrivate = copy.ompThreadPrivate; privateInLoop = copy.privateInLoop; inEquivalence = copy.inEquivalence; @@ -226,7 +226,7 @@ namespace Distribution int countToRem = 0; for (int z = 0; z < dimSize; ++z) { - if (!mappedDims[z] || depracateToDistribute[z]) + if (!mappedDims[z] || deprecateToDistribute[z]) { needToRemove = true; countToRem++; @@ -246,19 +246,19 @@ namespace Distribution for (int z = 0; z < dimSize; ++z) { - if (mappedDims[z] && !depracateToDistribute[z]) + if (mappedDims[z] && !deprecateToDistribute[z]) { newSizes.push_back(sizes[z]); newSizesExpr.push_back(sizesExpr[z]); newMappedDims.push_back(mappedDims[z]); - newDepr.push_back(depracateToDistribute[z]); + newDepr.push_back(deprecateToDistribute[z]); } } sizes = newSizes; sizesExpr = newSizesExpr; mappedDims = newMappedDims; - depracateToDistribute = newDepr; + deprecateToDistribute = newDepr; dimSize = (int)sizes.size(); return false; @@ -445,9 +445,9 @@ namespace Distribution retVal["isLoopArrayFlag"] = (int)isLoopArrayFlag; JSON deprToDist = nlohmann::json::array(); - for (int i = 0; i < depracateToDistribute.size(); ++i) - deprToDist.push_back((int)depracateToDistribute[i]); - retVal["depracateToDist"] = deprToDist; + for (int i = 0; i < deprecateToDistribute.size(); ++i) + deprToDist.push_back((int)deprecateToDistribute[i]); + retVal["deprecateToDist"] = deprToDist; JSON mappedDimsJ = nlohmann::json::array(); for (int i = 0; i < mappedDims.size(); ++i) @@ -605,13 +605,13 @@ namespace Distribution { if (dim >= dimSize) return; - depracateToDistribute[dim] = value; + deprecateToDistribute[dim] = value; } void DeprecateAllDims() { for (int dim = 0; dim < dimSize; ++dim) - depracateToDistribute[dim] = true; + deprecateToDistribute[dim] = true; } bool IsDimDepracated(const int dim) const @@ -621,9 +621,9 @@ namespace Distribution else { if (templateDimsOrder.size() == 0) - return depracateToDistribute[dim]; + return deprecateToDistribute[dim]; else - return depracateToDistribute[templateDimsOrder[dim]]; + return deprecateToDistribute[templateDimsOrder[dim]]; } } @@ -631,11 +631,11 @@ namespace Distribution { bool ret = true; for (int z = 0; z < dimSize; ++z) - ret = ret && depracateToDistribute[z]; + ret = ret && deprecateToDistribute[z]; return ret; } - const VECTOR& GetDeprecetedDims() const { return depracateToDistribute; } + const VECTOR& GetDeprecetedDims() const { return deprecateToDistribute; } int GetTypeSize() const { return typeSize; } From c548f4ab4cd75a4998b8d91acb3e8f5a3c2d7df2 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Sun, 18 May 2025 20:15:50 +0300 Subject: [PATCH 11/18] added json to SPF_GetArrayLinks --- src/Utils/version.h | 2 +- src/VisualizerCalls/get_information.cpp | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Utils/version.h b/src/Utils/version.h index e5e1b0e..495b081 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2420" +#define VERSION_SPF "2421" diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 9d73c1b..8ee66dc 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -1158,8 +1158,6 @@ int SPF_GetArrayLinks(void*& context, int winHandler, short *options, short *pro { runPassesForVisualizer(projName, { CALL_GRAPH2 } ); - string resVal = ""; - map> linkedArrays; for (auto& inMap : arrayLinksByFuncCalls) { @@ -1173,17 +1171,24 @@ int SPF_GetArrayLinks(void*& context, int winHandler, short *options, short *pro linkedArrays[ref].insert(toAdd); } + json links; + json allLinks = json::array(); for (auto& array : linkedArrays) { - resVal += to_string(array.first->GetId()) + "|" + to_string(array.second.size()) + "|"; + json currLink; + currLink["id"] = array.first->GetId(); + + json links = json::array(); for (auto& link : array.second) - resVal += to_string(link->GetId()) + "|"; + links.push_back(link->GetId()); + currLink["links"] = links; + + allLinks.push_back(currLink); } + links["allLinks"] = allLinks; - if (resVal[resVal.size() - 1] == '|') - resVal.erase(resVal.size() - 1); - + string resVal = allLinks.dump(); copyStringToShort(result, resVal); retSize = (int)resVal.size() + 1; } From 4bcf83f551d743000ce89d2fbd88553cb8ee657c Mon Sep 17 00:00:00 2001 From: ALEXks Date: Mon, 19 May 2025 14:07:33 +0300 Subject: [PATCH 12/18] fixed --- src/VisualizerCalls/get_information.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 8ee66dc..520e929 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -1171,9 +1171,7 @@ int SPF_GetArrayLinks(void*& context, int winHandler, short *options, short *pro linkedArrays[ref].insert(toAdd); } - json links; json allLinks = json::array(); - for (auto& array : linkedArrays) { json currLink; @@ -1186,9 +1184,11 @@ int SPF_GetArrayLinks(void*& context, int winHandler, short *options, short *pro allLinks.push_back(currLink); } + + json links; links["allLinks"] = allLinks; - string resVal = allLinks.dump(); + string resVal = links.dump(); copyStringToShort(result, resVal); retSize = (int)resVal.size() + 1; } From b1eeac0b102ecc52803d0ccfcccf9861a1d62eac Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 20 May 2025 16:20:27 +0300 Subject: [PATCH 13/18] added json for SPF_CreateParallelVariant pass --- src/Predictor/PredictScheme.h | 49 ++++++++++++++----------- src/Sapfor.cpp | 3 +- src/VisualizerCalls/get_information.cpp | 38 +------------------ 3 files changed, 30 insertions(+), 60 deletions(-) diff --git a/src/Predictor/PredictScheme.h b/src/Predictor/PredictScheme.h index b444aa1..35ccf9e 100644 --- a/src/Predictor/PredictScheme.h +++ b/src/Predictor/PredictScheme.h @@ -2,6 +2,7 @@ #include #include "dvm.h" #include "../GraphCall/graph_calls.h" +#include "../Utils/json.hpp" class ParallelStats { @@ -11,10 +12,10 @@ public: RemoteCount = ShadowCount = ReductionCount = AcrossCount = 0; } - int RemoteCount; - int ShadowCount; - int ReductionCount; - int AcrossCount; + int RemoteCount = 0; + int ShadowCount = 0; + int ReductionCount = 0; + int AcrossCount = 0; }; class PredictorStats @@ -27,28 +28,32 @@ public: } ParallelStats ParallelStat; - int ParallelCount; - int RemoteCount; - int RedistributeCount; - int IntervalCount; - int TotalScoreComm; - int TotalScorePar; - int TotalScoreDist; + int ParallelCount = 0; + int RemoteCount = 0; + int RedistributeCount = 0; + int IntervalCount = 0; + int TotalScoreComm = 0; + int TotalScorePar = 0; + int TotalScoreDist = 0; - std::string to_string() + nlohmann::json toJson() { - std::string res = ""; - res += std::to_string(ParallelCount) + "|"; - res += std::to_string(RemoteCount) + "|"; - res += std::to_string(RedistributeCount) + "|"; - res += std::to_string(IntervalCount) + "|"; + nlohmann::json stat; - res += std::to_string(ParallelStat.RemoteCount) + "|"; - res += std::to_string(ParallelStat.ShadowCount) + "|"; - res += std::to_string(ParallelStat.ReductionCount) + "|"; - res += std::to_string(ParallelStat.AcrossCount); + stat["ParallelCount"] = ParallelCount; + stat["RemoteCount"] = RemoteCount; + stat["RedistributeCount"] = RedistributeCount; + stat["IntervalCount"] = IntervalCount; - return res; + stat["PS_RemoteCount"] = ParallelStat.RemoteCount; + stat["PS_ShadowCount"] = ParallelStat.ShadowCount; + stat["PS_ReductionCount"] = ParallelStat.ReductionCount; + stat["PS_AcrossCount"] = ParallelStat.AcrossCount; + + //TODO: need to improve + // (summed.TotalScoreComm != 0 ? 1.0 / summed.TotalScoreComm : 0.0) + (double)summed.TotalScorePar * 1000 + (countOfDist == 0 ? -5000 : countOfDist); + stat["TotalScore"] = -1 * (ParallelStat.RemoteCount + ParallelStat.ShadowCount + ParallelStat.ReductionCount + ParallelStat.AcrossCount); + return stat; } }; diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index 13a8a9e..7c7254d 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -2221,8 +2221,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam runPass(GROUP_ACTUAL_AND_REMOTE, proj_name, folderName); runAnalysis(*project, CALCULATE_STATS_SCHEME, false); - for (auto& elem : allPredictorStats) - __spf_print(1, " stat for file %s: %s\n", elem.first.c_str(), elem.second.to_string().c_str()); + //TODO: need to rewrite this to new algo /*if (!folderName && !consoleMode || predictOn) runAnalysis(*project, PREDICT_SCHEME, false); */ diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 520e929..eb08941 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -1065,7 +1065,6 @@ int SPF_CreateParallelVariant(void*& context, int winHandler, short *options, sh printf("SAPFOR: set all info done\n"); runPassesForVisualizer(projName, { INSERT_PARALLEL_DIRS }, folderName); - string predictRes = ""; PredictorStats summed; for (auto &predFile : allPredictorStats) { @@ -1081,44 +1080,11 @@ int SPF_CreateParallelVariant(void*& context, int winHandler, short *options, sh summed.TotalScoreComm += predFile.second.TotalScoreComm; summed.TotalScoreDist += predFile.second.TotalScoreDist; summed.TotalScorePar += predFile.second.TotalScorePar; - } - predictRes += summed.to_string(); - //predictRes += "|" + to_string((summed.TotalScoreComm != 0 ? 1.0 / summed.TotalScoreComm : 0.0 )+ (double)summed.TotalScorePar * 1000 + (countOfDist == 0 ? -5000 : countOfDist)); - if (countOfDist == 0) - predictRes += "|x"; - else - predictRes += "|" + to_string(-1 * (summed.ParallelStat.AcrossCount + summed.ParallelStat.RemoteCount + summed.RedistributeCount + summed.RemoteCount)); - //predictRes += "|0"; - - //TODO: need to rewrite to new algo - /*if (folderName == NULL) - { - SpfInterval *mainIterval = getMainInterval(project, intervals); - const int idxBest = mainIterval->getBestTimeIdx(); - double speedUpBest = 1; - int procCount = 1; - string topo = ""; - if (idxBest != -1 && mainIterval->exec_time != 0) - { - speedUpBest = mainIterval->exec_time / mainIterval->predictedTimes[idxBest]; - topo += "["; - for (int z = 0; z < topologies[idxBest].size(); ++z) - { - topo += to_string(topologies[idxBest][z]); - procCount *= topologies[idxBest][z]; - if (z != topologies[idxBest].size() - 1) - topo += "x"; - } - topo += "]"; - } - char buf[256]; - sprintf(buf, "%.2f", speedUpBest / procCount * 100.0); - predictRes += "|" + string(buf) + topo; } - else - predictRes += "|0";*/ + string predictRes = summed.toJson().dump(); copyStringToShort(predictorStats, predictRes); + __spf_print(1, " statistic to send: %s\n", predictRes.c_str()); retSize = (int)predictRes.size(); } From 6c16cc5432ae8254987f40c92ee159a3c5523eba Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 20 May 2025 16:37:21 +0300 Subject: [PATCH 14/18] added json for SPF_ParseFilesWithOrder pass --- src/VisualizerCalls/get_information.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index eb08941..881386c 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -465,14 +465,15 @@ int SPF_ParseFilesWithOrder(void*& context, int winHandler, short* options, shor { runPassesForVisualizer(projName, { PARSE_FILES }); - string resVal = ""; - for (auto& elem : filesCompilationOrder) - { - if (resVal == "") - resVal += elem; - else - resVal += "|" + elem; - } + json filesArray = json::array(); + + for (auto& file : filesCompilationOrder) + filesArray.push_back(file); + + json filesOrder; + filesOrder["allFiles"] = filesArray; + + string resVal = filesOrder.dump(); copyStringToShort(result, resVal); retSize = 0; } From 879094a6b7423eae1ee40a2a51c0710cc58699e4 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 23 May 2025 15:56:37 +0300 Subject: [PATCH 15/18] moved messages to Json, some refactoring --- src/Sapfor.cpp | 21 +---------- src/Utils/errors.h | 42 ++++++++++++++++----- src/Utils/utils.cpp | 50 ++++++++++++++++++------- src/Utils/utils.h | 2 + src/Utils/version.h | 2 +- src/VisualizerCalls/get_information.cpp | 12 ------ 6 files changed, 74 insertions(+), 55 deletions(-) diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index 7c7254d..66d2010 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -2046,7 +2046,7 @@ static void findFunctionsToInclude(bool needToAddErrors) SPF_messages[byFile.first].push_back(message); else { - if (message.type != ERROR) + if (message.getType() != ERROR) SPF_messages[byFile.first].push_back(message); else lastErrors[byFile.first].push_back(message); @@ -2659,25 +2659,8 @@ int main(int argc, char **argv) printStackTrace(); printf("exception occurred\n"); for (auto& byFile : SPF_messages) - { for (auto& message : byFile.second) - { - string toPrint = ""; - for (int z = 0; z < message.engMessage.size(); ++z) - toPrint += message.engMessage[z]; - string type; - if (message.type == WARR) - type = "WARR"; - else if (message.type == ERROR) - type = "ERROR"; - else if (message.type == NOTE) - type = "NOTE"; - else - type = "UNKN"; - - printf("%s - [#%d: %s: line %d]: %s\n", type.c_str(), message.group, byFile.first.c_str(), message.line, toPrint.c_str()); - } - } + message.print(byFile.first); } deleteAllAllocatedData(withDel); diff --git a/src/Utils/errors.h b/src/Utils/errors.h index 82e198b..6251e3a 100644 --- a/src/Utils/errors.h +++ b/src/Utils/errors.h @@ -1,5 +1,7 @@ #pragma once #include +#include "json.hpp" + #ifdef __SPF #include "dvm.h" #endif @@ -164,18 +166,40 @@ public: engMessage.erase(engMessage.begin() + engMessage.size() - 1); } - std::wstring toString() const + nlohmann::json toJson() const { - std::wstring retVal = L"|"; - retVal += std::to_wstring((int)type) + L" "; - retVal += std::to_wstring(line) + L" "; - retVal += std::to_wstring(group); - retVal += L"|" + value; - return retVal; + nlohmann::json resVal; + + resVal["line"] = line; + resVal["group"] = group; + resVal["value"] = std::string(value.begin(), value.end()); + return resVal; } - std::string getString() const { return std::string(engMessage.begin(), engMessage.end()); } -public: + typeMessage getType() const { return type; } + int getLine() const { return line; } + + void print(const std::string& file) const + { + std::string toPrint = ""; + for (int z = 0; z < engMessage.size(); ++z) + toPrint += engMessage[z]; + + std::string typeStr; + if (type == WARR) + typeStr = "WARR"; + else if (type == ERROR) + typeStr = "ERROR"; + else if (type == NOTE) + typeStr = "NOTE"; + else + typeStr = "UNKN"; + + printf("%s - [#%d: %s: line %d]: %s\n", typeStr.c_str(), group, file.c_str(), line, toPrint.c_str()); + } + + auto getUniqKey() const { return std::make_tuple(type, group, line, value); } +private: typeMessage type; int group; int line; diff --git a/src/Utils/utils.cpp b/src/Utils/utils.cpp index a7d2faf..ea9f073 100644 --- a/src/Utils/utils.cpp +++ b/src/Utils/utils.cpp @@ -30,6 +30,7 @@ #include "../Distribution/Arrays.h" #include "../DynamicAnalysis/gcov_info.h" #include "../ParallelizationRegions/ParRegions.h" +#include "json.hpp" #if __SPF #include "acc_analyzer.h" @@ -42,6 +43,7 @@ using std::set; using std::vector; using std::string; using std::wstring; +using json = nlohmann::json; #if __cplusplus >= 201703L #include @@ -427,7 +429,7 @@ static map> removeCopies(map> map, const Messages*> uniq; for (auto& message : byFile.second) { - auto key = make_tuple(message.type, message.group, message.line, message.value); + auto key = message.getUniqKey(); /*string tmp = ""; for (auto& s : message.toString()) tmp += (char)s; @@ -460,7 +462,7 @@ static void convertGlobalMessagesBuffer(short *&result, int *&resultSize) bool waschanged = false; for (auto &message : byFile.second) { - if (message.line > 0) + if (message.getLine() > 0) newVal.push_back(message); else waschanged = true; @@ -470,22 +472,30 @@ static void convertGlobalMessagesBuffer(short *&result, int *&resultSize) byFile.second = newVal; } - wstring val = L""; - val += std::to_wstring(copySPF_messages.size()); - for (auto it = copySPF_messages.begin(); it != copySPF_messages.end(); ++it) + json allMessages = json::array(); + for (auto& byFile : copySPF_messages) { - val += L"|" + to_wstring(it->first.c_str()) + L"|" + std::to_wstring(it->second.size()); - for (int k = 0; k < it->second.size(); ++k) - val += it->second[k].toString(); + json inFile; + inFile["file"] = byFile.first; + + json array = json::array(); + for (auto& message : byFile.second) + { + json msg = message.toJson(); + array.push_back(msg); + } + inFile["messages"] = array; + allMessages.push_back(inFile); } - const unsigned len = (unsigned)val.size(); - result = new short[len + 1]; - allocated.insert(result); + json all; + all["allMessages"] = allMessages; - result[len] = '\0'; - for (unsigned i = 0; i < len; ++i) - result[i] = val[i]; + const string str = all.dump(); + const unsigned len = (unsigned)str.size(); + + copyStringToShort(result, str); + allocated.insert(result); resultSize = new int[1]; resultSize[0] = (int)len; @@ -1686,4 +1696,16 @@ set fillDistributedArrays(const DataDirective& dataDirectives, for (auto& elem : ret) distrArrays.insert(shortName ? elem->GetShortName() : elem->GetName()); return distrArrays; +} + +void copyStringToShort(short*& result, const string& resVal, bool withEnd) +{ + result = new short[resVal.size() + 1]; + allocated.insert(result); + + for (int i = 0; i < resVal.size(); ++i) + result[i] = resVal[i]; + + if (withEnd) + result[resVal.size()] = (short)'\0'; } \ No newline at end of file diff --git a/src/Utils/utils.h b/src/Utils/utils.h index eb25db1..e96fd1b 100644 --- a/src/Utils/utils.h +++ b/src/Utils/utils.h @@ -96,3 +96,5 @@ std::vector splitAndArgvCreate(const std::string& options); std::set fillDistributedArraysD(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false); std::set fillDistributedArrays(const DataDirective& dataDirectives, const std::map>& tableOfUniqNamesByArray, const std::map>& arrayLinksByFuncCalls, bool onlyCommon = false, bool shortName = false); + +void copyStringToShort(short*& result, const std::string& resVal, bool withEnd = true); diff --git a/src/Utils/version.h b/src/Utils/version.h index 495b081..43758a9 100644 --- a/src/Utils/version.h +++ b/src/Utils/version.h @@ -1,3 +1,3 @@ #pragma once -#define VERSION_SPF "2421" +#define VERSION_SPF "2422" diff --git a/src/VisualizerCalls/get_information.cpp b/src/VisualizerCalls/get_information.cpp index 881386c..8aa5102 100644 --- a/src/VisualizerCalls/get_information.cpp +++ b/src/VisualizerCalls/get_information.cpp @@ -218,18 +218,6 @@ static bool tryOpenProjectFile(const char *project) return ret; } -static void copyStringToShort(short *&result, const string &resVal, bool withEnd = true) -{ - result = new short[resVal.size() + 1]; - allocated.insert(result); - - for (int i = 0; i < resVal.size(); ++i) - result[i] = resVal[i]; - - if (withEnd) - result[resVal.size()] = (short)'\0'; -} - volatile int passDone = 0; static volatile int rethrow = 0; static void runPassesLoop(const vector &passesToRun, const char *prName, const char *folderNameChar) From 78e9b63331e0b81fbd688b18e289bc68566049be Mon Sep 17 00:00:00 2001 From: ALEXks Date: Fri, 23 May 2025 17:36:12 +0300 Subject: [PATCH 16/18] moved messages to Json --- src/Utils/errors.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Utils/errors.h b/src/Utils/errors.h index 6251e3a..3eb0a7c 100644 --- a/src/Utils/errors.h +++ b/src/Utils/errors.h @@ -173,6 +173,7 @@ public: resVal["line"] = line; resVal["group"] = group; resVal["value"] = std::string(value.begin(), value.end()); + resVal["type"] = (int)type; return resVal; } From 7ee9d839a1edb3b8fd61ff4034818da4f03cd846 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Mon, 26 May 2025 21:06:51 +0300 Subject: [PATCH 17/18] moved messages from Parser to SPF_message --- src/ProjectManipulation/ParseFiles.cpp | 55 ++++++++++++++++++++++++-- src/ProjectManipulation/ParseFiles.h | 2 +- src/Sapfor.cpp | 2 +- src/Utils/errors.h | 3 ++ 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/ProjectManipulation/ParseFiles.cpp b/src/ProjectManipulation/ParseFiles.cpp index cfb469e..d474b85 100644 --- a/src/ProjectManipulation/ParseFiles.cpp +++ b/src/ProjectManipulation/ParseFiles.cpp @@ -387,7 +387,50 @@ static string shiftLines(const string &in, const map &m return newStr; } -static int dumpErrors(const vector& listOfProject, const vector& errors) +static void addMessage(const string& in, const map& mapOfFiles, + const FileInfo* currF, map>& messages, typeMessage type) +{ + int byNum = 0; + + auto it = in.find("on line "); + if (it != string::npos) + it += strlen("on line "); + + int line = 0; + sscanf(in.c_str() + it, "%d", &line); + + auto it1 = in.find("of", it + 1); + if (it1 == string::npos) + return; + it1 += 3; + + string fileN = in.substr(it1, in.find(':', it1) - it1); + auto itF = mapOfFiles.find(fileN); + if (itF != mapOfFiles.end() && itF->second != currF) + { + byNum = itF->second->includesAdded; + if (byNum != 0) + { + if (line - byNum <= 0) + { + //return in; + printInternalError(convertFileName(__FILE__).c_str(), __LINE__); + } + else + line -= byNum; + } + } + + const string newStr = in.substr(0, it) + std::to_string(line) + in.substr(in.find(' ', it + 1)); + + wstring messageE, messageR; + __spf_printToLongBuf(messageE, L"%s", to_wstring(newStr).c_str()); + __spf_printToLongBuf(messageR, L"%s", to_wstring(newStr).c_str()); + + messages[fileN].push_back(Messages(type, line, messageR, messageE, 6000)); +} + +static int dumpErrors(const vector& listOfProject, const vector& errors, map>& messages) { int errorsCount = 0; map mapOfFiles; @@ -420,9 +463,13 @@ static int dumpErrors(const vector& listOfProject, const vector& errors, vector& listOfProject, v return rethrow; } -int parseFiles(const char* proj, vector& filesCompilationOrder, int parseForInlining) +int parseFiles(const char* proj, vector& filesCompilationOrder, int parseForInlining, map>& messages) { FILE* list = fopen(proj, "r"); if (!list) @@ -723,7 +770,7 @@ int parseFiles(const char* proj, vector& filesCompilationOrder, int pars vector errors; int rethrow = parseFiles(errors, listOfProject, filesCompilationOrder, parseForInlining); - int errCount = dumpErrors(listOfProject, errors); + int errCount = dumpErrors(listOfProject, errors, messages); if (rethrow != 0) throw rethrow; @@ -732,6 +779,8 @@ int parseFiles(const char* proj, vector& filesCompilationOrder, int pars void parseFiles(int argc, char** argv) { + map> messages; + bool isInline = false; auto result = splitCommandLineForParse(argv, argc, isInline); if (result.second.size() == 0) diff --git a/src/ProjectManipulation/ParseFiles.h b/src/ProjectManipulation/ParseFiles.h index c9f908b..05fb68a 100644 --- a/src/ProjectManipulation/ParseFiles.h +++ b/src/ProjectManipulation/ParseFiles.h @@ -3,5 +3,5 @@ #include #include -int parseFiles(const char* proj, std::vector& filesCompilationOrder, int parseForInlining); +int parseFiles(const char* proj, std::vector& filesCompilationOrder, int parseForInlining, std::map>& messages); void parseFiles(int argc, char** argv); diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index 66d2010..c424b3c 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -2389,7 +2389,7 @@ void runPass(const int curr_regime, const char *proj_name, const char *folderNam break; case PARSE_FILES: { - int err = parseFiles(proj_name, filesCompilationOrder, parseForInlining); + int err = parseFiles(proj_name, filesCompilationOrder, parseForInlining, SPF_messages); if (err != 0) throw err; } diff --git a/src/Utils/errors.h b/src/Utils/errors.h index 3eb0a7c..274e779 100644 --- a/src/Utils/errors.h +++ b/src/Utils/errors.h @@ -145,6 +145,9 @@ enum typeMessage { WARR, ERROR, NOTE }; // 06 "%s clause can be used only once." // 07 "Variable '%s' can't be used in FILES and EXCEPT clauses at the same time." +// 6000 PARSER GROUP +// + extern int langOfMessages; struct Messages { From 8f55c13a0cf3d3e3c97072b2eeb9bba53c8f7ab2 Mon Sep 17 00:00:00 2001 From: ALEXks Date: Tue, 27 May 2025 18:10:24 +0300 Subject: [PATCH 18/18] added dumping messages to json --- src/Sapfor.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/Sapfor.cpp b/src/Sapfor.cpp index c424b3c..5f5f93d 100644 --- a/src/Sapfor.cpp +++ b/src/Sapfor.cpp @@ -64,6 +64,7 @@ #include "DvmhRegions/LoopChecker.h" #include "DvmhRegions/ReadWriteAnalyzer.h" #include "Utils/utils.h" +#include "Utils/json.hpp" #include "Distribution/Array.h" #include "VisualizerCalls/get_information.h" @@ -107,6 +108,7 @@ using namespace std; using std::chrono::high_resolution_clock; using std::chrono::duration_cast; using std::chrono::milliseconds; +using json = nlohmann::json; int PASSES_DONE[EMPTY_PASS]; bool PASSES_DONE_INIT = false; @@ -2658,9 +2660,28 @@ int main(int argc, char **argv) { printStackTrace(); printf("exception occurred\n"); + + json byFileArray = json::array(); for (auto& byFile : SPF_messages) + { + json inFile; + inFile["file"] = byFile.first; + + json messages = json::array(); for (auto& message : byFile.second) + { message.print(byFile.first); + messages.push_back(message.toJson()); + } + inFile["messages"] = messages; + byFileArray.push_back(inFile); + } + json allMessages; + allMessages["allMessage"] = byFileArray; + + FILE* outF = fopen("dump_messages.json", "w"); + fprintf(outF, "%s", allMessages.dump().c_str()); + fclose(outF); } deleteAllAllocatedData(withDel);