283 lines
11 KiB
Diff
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
|
|
|