pin-gcc-client/0002-Pin-gcc-client-Bugfix-for-GetFunctionById.patch
2023-03-07 11:17:54 +08:00

283 lines
11 KiB
Diff

From 01a71df9866c4871d68e77f7307107d4e191264c Mon Sep 17 00:00:00 2001
From: Mingchuan Wu <wumingchuan1992@foxmail.com>
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<FunctionOp> GetAllFunc() = 0;
+ virtual vector<uint64_t> GetFunctions() = 0;
+ virtual FunctionOp GetFunctionOpById(uint64_t) = 0;
virtual vector<LocalDeclOp> GetDecls(uint64_t funcID) = 0;
virtual vector<LoopOp> 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<FunctionOp> GetAllFunc() override;
+ vector<uint64_t> GetFunctions() override;
+ FunctionOp GetFunctionOpById(uint64_t) override;
vector<LocalDeclOp> GetDecls(uint64_t funcID) override;
vector<LoopOp> 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<mlir::Plugin::FunctionOp>& data, string& out);
void LoopOpsJsonSerialize(vector<mlir::Plugin::LoopOp>& loops, string& out);
void LoopOpJsonSerialize(mlir::Plugin::LoopOp& loop, string& out);
- void BlocksJsonSerialize(vector<uint64_t>&, string&);
+ void IDsJsonSerialize(vector<uint64_t>&, string&);
void EdgesJsonSerialize(vector<std::pair<uint64_t, uint64_t> >&, string&);
void EdgeJsonSerialize(std::pair<uint64_t, uint64_t>&, 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<mlir::Plugin::FunctionOp> GetAllFunction();
+ vector<uint64_t> GetFunctionIDs();
+ mlir::Plugin::FunctionOp GetFunctionById(uint64_t);
vector<mlir::Plugin::LocalDeclOp> GetAllDecls(uint64_t);
vector<mlir::Plugin::LoopOp> 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<FunctionOp> PluginClientAPI::GetAllFunc()
return gimpleConversion.GetAllFunction();
}
+vector<uint64_t> PluginClientAPI::GetFunctions()
+{
+ return gimpleConversion.GetFunctionIDs();
+}
+
+FunctionOp PluginClientAPI::GetFunctionOpById(uint64_t id)
+{
+ return gimpleConversion.GetFunctionById(id);
+}
+
vector<LocalDeclOp> 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<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ vector<uint64_t> 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<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string funcIdKey = "id";
+ uint64_t funcID = atol(root[funcIdKey].asString().c_str());
+ vector<FunctionOp> 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<uint64_t> blocks = clientAPI.GetBlocksInLoop(loopId);
+ vector<uint64_t> 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<void(PluginClient*, Json::Value&, string&)> GetResultFunc;
std::map<string, GetResultFunc> 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<uint64_t>& blocks, string& out)
+void PluginJson::IDsJsonSerialize(vector<uint64_t>& 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<FunctionOp> GimpleToPluginOps::GetAllFunction()
return functions;
}
+vector<uint64_t> GimpleToPluginOps::GetFunctionIDs()
+{
+ cgraph_node *node = NULL;
+ function *fn = NULL;
+ vector<uint64_t> functions;
+ FOR_EACH_FUNCTION (node) {
+ fn = DECL_STRUCT_FUNCTION(node->decl);
+ if (fn == NULL)
+ continue;
+ int64_t id = reinterpret_cast<int64_t>(reinterpret_cast<void*>(fn));
+ functions.push_back(id);
+ }
+ return functions;
+}
+
+FunctionOp GimpleToPluginOps::GetFunctionById(uint64_t id)
+{
+ FunctionOp irFunc = BuildFunctionOp(id);
+ builder.setInsertionPointAfter(irFunc.getOperation());
+ return irFunc;
+}
+
vector<LocalDeclOp> GimpleToPluginOps::GetAllDecls(uint64_t funcID)
{
function *fn = reinterpret_cast<function *>(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<uint64_t>(
reinterpret_cast<void*>(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<uint64_t>(
reinterpret_cast<void*>(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<uint64_t>(
reinterpret_cast<void*>(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<uint64_t>(
reinterpret_cast<void*>(gimple_switch_label(stmt, i)));
ops.push_back(TreeToValue(input));
@@ -983,7 +1005,7 @@ SwitchOp GimpleToPluginOps::BuildSwitchOp(uint64_t gswitchId)
llvm::SmallVector<uint64_t, 4> 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