From 01a71df9866c4871d68e77f7307107d4e191264c Mon Sep 17 00:00:00 2001 From: Mingchuan Wu Date: Mon, 27 Feb 2023 16:21:41 +0800 Subject: [PATCH 2/6] [Pin-gcc-client] Bugfix for GetFunctionById. diff --git a/include/PluginAPI/BasicPluginOpsAPI.h b/include/PluginAPI/BasicPluginOpsAPI.h index ca74588..981964b 100644 --- a/include/PluginAPI/BasicPluginOpsAPI.h +++ b/include/PluginAPI/BasicPluginOpsAPI.h @@ -55,6 +55,8 @@ public: virtual uint64_t GetImmediateDominator(uint64_t, uint64_t) = 0; virtual uint64_t RecomputeDominator(uint64_t, uint64_t) = 0; virtual vector GetAllFunc() = 0; + virtual vector GetFunctions() = 0; + virtual FunctionOp GetFunctionOpById(uint64_t) = 0; virtual vector GetDecls(uint64_t funcID) = 0; virtual vector GetLoopsFromFunc(uint64_t) = 0; virtual LoopOp GetLoopById(uint64_t) = 0; diff --git a/include/PluginAPI/PluginClientAPI.h b/include/PluginAPI/PluginClientAPI.h index 727d329..d69baff 100644 --- a/include/PluginAPI/PluginClientAPI.h +++ b/include/PluginAPI/PluginClientAPI.h @@ -46,6 +46,8 @@ public: uint64_t RecomputeDominator(uint64_t, uint64_t) override; vector GetAllFunc() override; + vector GetFunctions() override; + FunctionOp GetFunctionOpById(uint64_t) override; vector GetDecls(uint64_t funcID) override; vector GetLoopsFromFunc(uint64_t) override; LoopOp GetLoopById(uint64_t) override; diff --git a/include/PluginClient/PluginJson.h b/include/PluginClient/PluginJson.h index 54517fd..d4e48af 100755 --- a/include/PluginClient/PluginJson.h +++ b/include/PluginClient/PluginJson.h @@ -40,7 +40,7 @@ public: void OpJsonSerialize(vector& data, string& out); void LoopOpsJsonSerialize(vector& loops, string& out); void LoopOpJsonSerialize(mlir::Plugin::LoopOp& loop, string& out); - void BlocksJsonSerialize(vector&, string&); + void IDsJsonSerialize(vector&, string&); void EdgesJsonSerialize(vector >&, string&); void EdgeJsonSerialize(std::pair&, string&); void NopJsonSerialize(string&); diff --git a/include/Translate/GimpleToPluginOps.h b/include/Translate/GimpleToPluginOps.h index 59896fa..0928ece 100644 --- a/include/Translate/GimpleToPluginOps.h +++ b/include/Translate/GimpleToPluginOps.h @@ -61,6 +61,8 @@ public: uint64_t GetImmediateDominator(uint64_t, uint64_t); uint64_t RecomputeDominator(uint64_t, uint64_t); vector GetAllFunction(); + vector GetFunctionIDs(); + mlir::Plugin::FunctionOp GetFunctionById(uint64_t); vector GetAllDecls(uint64_t); vector GetAllLoops(uint64_t); LoopOp GetLoop(uint64_t); diff --git a/lib/PluginAPI/PluginClientAPI.cpp b/lib/PluginAPI/PluginClientAPI.cpp index 362ede1..3623091 100644 --- a/lib/PluginAPI/PluginClientAPI.cpp +++ b/lib/PluginAPI/PluginClientAPI.cpp @@ -76,6 +76,16 @@ vector PluginClientAPI::GetAllFunc() return gimpleConversion.GetAllFunction(); } +vector PluginClientAPI::GetFunctions() +{ + return gimpleConversion.GetFunctionIDs(); +} + +FunctionOp PluginClientAPI::GetFunctionOpById(uint64_t id) +{ + return gimpleConversion.GetFunctionById(id); +} + vector PluginClientAPI::GetDecls(uint64_t funcID) { return gimpleConversion.GetAllDecls(funcID); diff --git a/lib/PluginClient/PluginClient.cpp b/lib/PluginClient/PluginClient.cpp index 81b59c0..937f6e1 100644 --- a/lib/PluginClient/PluginClient.cpp +++ b/lib/PluginClient/PluginClient.cpp @@ -107,6 +107,33 @@ void GetAllFuncResult(PluginClient *client, Json::Value& root, string& result) client->ReceiveSendMsg("FuncOpResult", result); } +void GetFunctionIDsResult(PluginClient *client, Json::Value& root, string& result) +{ + // Load our Dialect in this MLIR Context. + mlir::MLIRContext context; + context.getOrLoadDialect(); + PluginAPI::PluginClientAPI clientAPI(context); + vector ids = clientAPI.GetFunctions(); + PluginJson json = client->GetJson(); + json.IDsJsonSerialize(ids, result); + client->ReceiveSendMsg("IdsResult", result); +} + +void GetFunctionOpByIdResult(PluginClient *client, Json::Value& root, string& result) +{ + // Load our Dialect in this MLIR Context. + mlir::MLIRContext context; + context.getOrLoadDialect(); + PluginAPI::PluginClientAPI clientAPI(context); + std::string funcIdKey = "id"; + uint64_t funcID = atol(root[funcIdKey].asString().c_str()); + vector allFuncOps; + allFuncOps.push_back(clientAPI.GetFunctionOpById(funcID)); + PluginJson json = client->GetJson(); + json.FunctionOpJsonSerialize(allFuncOps, result); + client->ReceiveSendMsg("FuncOpResult", result); +} + void GetLocalDeclsResult(PluginClient *client, Json::Value& root, string& result) { /// Json格式 @@ -280,9 +307,9 @@ void GetBlocksInLoopResult(PluginClient *client, Json::Value& root, string& resu PluginAPI::PluginClientAPI clientAPI(context); std::string loopIdKey = "loopId"; uint64_t loopId = atol(root[loopIdKey].asString().c_str()); - vector blocks = clientAPI.GetBlocksInLoop(loopId); + vector blockIDs = clientAPI.GetBlocksInLoop(loopId); PluginJson json = client->GetJson(); - json.BlocksJsonSerialize(blocks, result); + json.IDsJsonSerialize(blockIDs, result); client->ReceiveSendMsg("IdsResult", result); } @@ -841,6 +868,8 @@ void IsWholeProgramResult(PluginClient *client, Json::Value& root, string& resul typedef std::function GetResultFunc; std::map g_getResultFunc = { {"GetAllFunc", GetAllFuncResult}, + {"GetFunctionIDs", GetFunctionIDsResult}, + {"GetFunctionOpById", GetFunctionOpByIdResult}, {"GetLocalDecls", GetLocalDeclsResult}, {"GetLoopsFromFunc", GetLoopsFromFuncResult}, {"GetLoopById", GetLoopByIdResult}, diff --git a/lib/PluginClient/PluginInputCheck.cpp b/lib/PluginClient/PluginInputCheck.cpp index 12cfcdc..4d17e0a 100755 --- a/lib/PluginClient/PluginInputCheck.cpp +++ b/lib/PluginClient/PluginInputCheck.cpp @@ -43,7 +43,6 @@ bool PluginInputCheck::ReadConfigfile(Json::Value& root) Json::Reader reader; std::ifstream ifs(configFilePath.c_str()); if (!ifs.is_open()) { - LOGW("open %s fail! use default sha256file:%s\n", configFilePath.c_str(), shaPath.c_str()); return false; } @@ -92,12 +91,14 @@ int PluginInputCheck::GetInitInfo() if (root[jsonkey[TIMEOUT]].isInt()) { int timeoutJson = root[jsonkey[TIMEOUT]].asInt(); SetTimeout(timeoutJson); + } else { + LOGW("timeout in config.json is not int or out of int range!use default:%d\n", timeout); } if (root[jsonkey[SHA256]].isString()) { shaPath = root[jsonkey[SHA256]].asString(); } else { - LOGW("sha256file int config.json is not string!\n"); + LOGW("sha256file in config.json is not string!\n"); } if ((shaPath == "") || (CheckShaFile() != 0)) { diff --git a/lib/PluginClient/PluginJson.cpp b/lib/PluginClient/PluginJson.cpp index cf09d86..388efc9 100755 --- a/lib/PluginClient/PluginJson.cpp +++ b/lib/PluginClient/PluginJson.cpp @@ -401,16 +401,16 @@ void PluginJson::LoopOpJsonSerialize(mlir::Plugin::LoopOp& loop, string& out) out = root.toStyledString(); } -void PluginJson::BlocksJsonSerialize(vector& blocks, string& out) +void PluginJson::IDsJsonSerialize(vector& ids, string& out) { Json::Value root; Json::Value item; int i = 0; string index; - for (auto& block : blocks) { - item["id"] = std::to_string(block); - index = "block" + std::to_string(i++); + for (auto& id : ids) { + item["id"] = std::to_string(id); + index = "ID" + std::to_string(i++); root[index] = item; item.clear(); } diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp index 4f59aab..0bb4416 100644 --- a/lib/Translate/GimpleToPluginOps.cpp +++ b/lib/Translate/GimpleToPluginOps.cpp @@ -330,6 +330,28 @@ vector GimpleToPluginOps::GetAllFunction() return functions; } +vector GimpleToPluginOps::GetFunctionIDs() +{ + cgraph_node *node = NULL; + function *fn = NULL; + vector functions; + FOR_EACH_FUNCTION (node) { + fn = DECL_STRUCT_FUNCTION(node->decl); + if (fn == NULL) + continue; + int64_t id = reinterpret_cast(reinterpret_cast(fn)); + functions.push_back(id); + } + return functions; +} + +FunctionOp GimpleToPluginOps::GetFunctionById(uint64_t id) +{ + FunctionOp irFunc = BuildFunctionOp(id); + builder.setInsertionPointAfter(irFunc.getOperation()); + return irFunc; +} + vector GimpleToPluginOps::GetAllDecls(uint64_t funcID) { function *fn = reinterpret_cast(funcID); @@ -934,20 +956,20 @@ AsmOp GimpleToPluginOps::BuildAsmOp(uint64_t gasmId) uint32_t nOuputs = gimple_asm_noutputs(stmt); uint32_t nClobbers = gimple_asm_nclobbers(stmt); - for (int i = 0; i < nInputs; i++) { + for (size_t i = 0; i < nInputs; i++) { uint64_t input = reinterpret_cast( reinterpret_cast(gimple_asm_input_op(stmt, i))); Value tett = TreeToValue(input); ops.push_back(tett); } - for (int i = 0; i < nOuputs; i++) { + for (size_t i = 0; i < nOuputs; i++) { uint64_t input = reinterpret_cast( reinterpret_cast(gimple_asm_output_op(stmt, i))); ops.push_back(TreeToValue(input)); } - for (int i = 0; i < nClobbers; i++) { + for (size_t i = 0; i < nClobbers; i++) { uint64_t input = reinterpret_cast( reinterpret_cast(gimple_asm_clobber_op(stmt, i))); ops.push_back(TreeToValue(input)); @@ -972,7 +994,7 @@ SwitchOp GimpleToPluginOps::BuildSwitchOp(uint64_t gswitchId) Value defaultLabel = TreeToValue(sDefault); unsigned nLabels = gimple_switch_num_labels(stmt); - for (int i = 1; i < nLabels; i++) { + for (size_t i = 1; i < nLabels; i++) { uint64_t input = reinterpret_cast( reinterpret_cast(gimple_switch_label(stmt, i))); ops.push_back(TreeToValue(input)); @@ -983,7 +1005,7 @@ SwitchOp GimpleToPluginOps::BuildSwitchOp(uint64_t gswitchId) llvm::SmallVector caseaddr; push_cfun(fn); - for (int i = 1; i < nLabels; i++) { + for (size_t i = 1; i < nLabels; i++) { basic_block label_bb = gimple_switch_label_bb (cfun, stmt, i); Block *temp = bbTranslator->blockMaps[label_bb]; caseaddr.push_back((uint64_t)label_bb); diff --git a/lib/Translate/TypeTranslation.cpp b/lib/Translate/TypeTranslation.cpp index f332130..458d5a3 100644 --- a/lib/Translate/TypeTranslation.cpp +++ b/lib/Translate/TypeTranslation.cpp @@ -148,7 +148,7 @@ private: StringRef name; for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field)) { - if (TREE_CODE (field) == FIELD_DECL) + if (TREE_CODE (field) == FIELD_DECL && DECL_NAME(field)) { name = IDENTIFIER_POINTER ( DECL_NAME(field)); names.push_back(name); -- 2.33.0