pin-gcc-client/0012-PluginClient-Update-transfer-command.patch
2023-09-19 11:03:33 +08:00

217 lines
8.2 KiB
Diff
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

From b622cc8d95f4ef8bd417d94974e9ff83104beab9 Mon Sep 17 00:00:00 2001
From: Mingchuan Wu <wumingchuan1992@foxmail.com>
Date: Sat, 2 Sep 2023 15:59:19 +0800
Subject: [PATCH 2/2] [PluginClient] Update transfer command.
---
include/PluginAPI/BasicPluginOpsAPI.h | 1 +
include/PluginAPI/PluginClientAPI.h | 1 +
lib/PluginAPI/PluginClientAPI.cpp | 3 ++
lib/PluginClient/PluginClient.cpp | 78 +++++++++++++++++++++++++--
lib/Translate/GimpleToPluginOps.cpp | 11 ++--
5 files changed, 87 insertions(+), 7 deletions(-)
diff --git a/include/PluginAPI/BasicPluginOpsAPI.h b/include/PluginAPI/BasicPluginOpsAPI.h
index 22da8df..37bd73d 100644
--- a/include/PluginAPI/BasicPluginOpsAPI.h
+++ b/include/PluginAPI/BasicPluginOpsAPI.h
@@ -48,6 +48,7 @@ public:
virtual string FuncName(int64_t gccDataAddr) = 0;
virtual int GetDeclSourceLine(uint64_t gccDataAddr) = 0;
virtual int GetDeclSourceColumn(uint64_t gccDataAddr) = 0;
+ virtual void ShutdownCompile() = 0;
// CGnode
virtual vector<uint64_t> GetCGnodeIDs() = 0;
diff --git a/include/PluginAPI/PluginClientAPI.h b/include/PluginAPI/PluginClientAPI.h
index 26ef71d..43e7154 100644
--- a/include/PluginAPI/PluginClientAPI.h
+++ b/include/PluginAPI/PluginClientAPI.h
@@ -38,6 +38,7 @@ public:
string FuncName(int64_t gccDataAddr) override;
int GetDeclSourceLine(uint64_t gccDataAddr) override;
int GetDeclSourceColumn(uint64_t gccDataAddr) override;
+ void ShutdownCompile() override;
uint64_t CreateBlock(uint64_t, uint64_t) override;
void DeleteBlock(uint64_t, uint64_t) override;
diff --git a/lib/PluginAPI/PluginClientAPI.cpp b/lib/PluginAPI/PluginClientAPI.cpp
index 95e9ab3..55f46f7 100644
--- a/lib/PluginAPI/PluginClientAPI.cpp
+++ b/lib/PluginAPI/PluginClientAPI.cpp
@@ -17,6 +17,7 @@
*/
#include "PluginAPI/PluginClientAPI.h"
+#include <unistd.h>
namespace PluginAPI {
@@ -92,6 +93,8 @@ vector<FunctionOp> PluginClientAPI::GetAllFunc()
return gimpleConversion.GetAllFunction();
}
+void PluginClientAPI::ShutdownCompile() { _exit(0); }
+
vector<uint64_t> PluginClientAPI::GetFunctions()
{
return gimpleConversion.GetFunctionIDs();
diff --git a/lib/PluginClient/PluginClient.cpp b/lib/PluginClient/PluginClient.cpp
index c9f3cb7..cf3036d 100644
--- a/lib/PluginClient/PluginClient.cpp
+++ b/lib/PluginClient/PluginClient.cpp
@@ -25,6 +25,10 @@
#include "Dialect/PluginTypes.h"
#include "PluginAPI/PluginClientAPI.h"
+#include "gcc-plugin.h"
+#include "plugin-version.h"
+#include "toplev.h"
+#include "opts.h"
namespace PinClient {
using namespace mlir::Plugin;
using namespace mlir;
@@ -344,6 +348,16 @@ void SetDeclAlignResult(PluginClient *client, Json::Value& root, string& result)
client->ReceiveSendMsg("VoidResult", result);
}
+void ShutdownCompile(PluginClient *client, Json::Value& root, string& result)
+{
+ // Load our Dialect in this MLIR Context.
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ clientAPI.ShutdownCompile();
+ client->ReceiveSendMsg("VoidResult", result);
+}
+
void SetUserAlignResult(PluginClient *client, Json::Value& root, string& result)
{
/// Json格式
@@ -1335,6 +1349,7 @@ std::map<string, GetResultFunc> g_getResultFunc = {
{"IsDomInfoAvailable", IsDomInfoAvailableResult},
{"GetCurrentDefFromSSA", GetCurrentDefFromSSAResult},
{"SetCurrentDefInSSA", SetCurrentDefInSSAResult},
+ {"ShutdownCompile", ShutdownCompile},
{"CopySSAOp", CopySSAOpResult},
{"CreateSSAOp", CreateSSAOpResult},
{"CreateNewDef", CreateNewDefResult},
@@ -1543,7 +1558,12 @@ static bool WaitServer(const string& port)
mode_t mask = umask(0);
mode_t mode = 0666; // 权限是rwrwrw跨进程时其他用户也要可以访问
string semFile = "wait_server_startup" + port;
- sem_t *sem = sem_open(semFile.c_str(), O_CREAT, mode, 0);
+ sem_t *sem = sem_open(semFile.c_str(), O_CREAT | O_EXCL, mode, 0);
+ // Semaphore exception handling.
+ if (sem == SEM_FAILED) {
+ sem_unlink(semFile.c_str());
+ sem = sem_open(semFile.c_str(), O_CREAT, mode, 0);
+ }
umask(mask);
int i = 0;
for (; i < cnt; i++) {
@@ -1561,11 +1581,60 @@ static bool WaitServer(const string& port)
return true;
}
+bool ExecuteWithCommand(string serverPath, string port, string level)
+{
+ string inputFile (main_input_filename);
+ string cwd = get_current_dir_name();
+
+ string outputName="";
+ for (int i = 0; i< save_decoded_options_count; ++i) {
+ if (!strcmp(save_decoded_options[i].canonical_option[0],"-o")) {
+ outputName = save_decoded_options[i].canonical_option[1];
+ }
+ }
+
+ string common_opt = "";
+ for (int i = 0; i< save_decoded_options_count; ++i) {
+ if (!strcmp(save_decoded_options[i].canonical_option[0],"-I") ||
+ !strcmp(save_decoded_options[i].canonical_option[0],"-D")) {
+ common_opt.append(save_decoded_options[i].canonical_option[0]);
+ common_opt.append(save_decoded_options[i].canonical_option[1]);
+ common_opt.append(" ");
+ }
+ if (!strcmp(save_decoded_options[i].canonical_option[0],"-std=gnu90")) {
+ common_opt.append(" -std=gnu90 ");
+ }
+ }
+
+ string extra_opt = "";
+ for (int i = 0; i< save_decoded_options_count; ++i) {
+ if (strcmp(save_decoded_options[i].canonical_option[0],"-I") &&
+ strcmp(save_decoded_options[i].canonical_option[0],"-D") &&
+ strcmp(save_decoded_options[i].canonical_option[0],"-o")) {
+ extra_opt.append(save_decoded_options[i].canonical_option[0]);
+ extra_opt.append(" ");
+ }
+ }
+
+ if (execl(serverPath.c_str(), port.c_str(), level.c_str(),
+ inputFile.c_str(), cwd.c_str(), common_opt.c_str(), extra_opt.c_str(), outputName.c_str(), NULL) == -1)
+ {
+ return true;
+ }
+ return false;
+
+}
+
int PluginClient::ServerStart(pid_t& pid)
{
if (!grpcPort.FindUnusedPort()) {
- LOGE("cannot find port for grpc,port 40001-65535 all used!\n");
- return -1;
+ // Rectify the fault that the port number is not released
+ // because the client is abnormal.
+ LOGW("cannot find port for grpc, try again!\n");
+ if (!grpcPort.FindUnusedPort()) {
+ LOGE("cannot find port for grpc,port 40001-65534 all used!\n");
+ return -1;
+ }
}
int ret = 0;
@@ -1575,7 +1644,8 @@ int PluginClient::ServerStart(pid_t& pid)
if (pid == 0) {
LOGI("start plugin server!\n");
string serverPath = input.GetServerPath();
- if (execl(serverPath.c_str(), port.c_str(), std::to_string(input.GetLogLevel()).c_str(), NULL) == -1) {
+ string level = std::to_string(input.GetLogLevel());
+ if (ExecuteWithCommand(serverPath, port, level)) {
DeleteGrpcPort();
LOGE("server start fail! please check serverPath:%s\n", serverPath.c_str());
ret = -1;
diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp
index 80d4e87..4617c78 100644
--- a/lib/Translate/GimpleToPluginOps.cpp
+++ b/lib/Translate/GimpleToPluginOps.cpp
@@ -1505,9 +1505,14 @@ Value GimpleToPluginOps::TreeToValue(uint64_t treeId)
unsigned HOST_WIDE_INT uinit = tree_to_uhwi(t);
initAttr = builder.getI64IntegerAttr(uinit);
} else {
- abort();
+ wide_int val = wi::to_wide(t);
+ if (wi::neg_p(val, TYPE_SIGN(TREE_TYPE(t)))) {
+ val = -val;
+ }
+ signed HOST_WIDE_INT init = val.to_shwi();
+ initAttr = builder.getI64IntegerAttr(init);
}
- GetTreeAttr(treeId, readOnly, rPluginType);
+ GetTreeAttr(treeId, readOnly, rPluginType);
opValue = builder.create<ConstOp>(
builder.getUnknownLoc(), treeId, IDefineCode::IntCST,
readOnly, initAttr, rPluginType);
@@ -1887,4 +1892,4 @@ Value GimpleToPluginOps::MakeSsaName(mlir::Type type)
return TreeToValue(retId);
}
-} // namespace PluginIR
\ No newline at end of file
+} // namespace PluginIR
--
2.33.0