pin-gcc-client/0004-Refactoring-Code-refactoring-of-Communication-Subsys.patch
d00573793 fdcab1229a [sync] Sync patch from openeuler/pin-gcc-client
(cherry picked from commit c479a0e1cdb0f7672c180d94662776012d7bc37a)
2023-02-27 09:22:08 +08:00

2398 lines
87 KiB
Diff
Raw 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 62597c33d89c967f7d4a4255699cd12a91b42a91 Mon Sep 17 00:00:00 2001
From: Mingchuan Wu <wumingchuan1992@foxmail.com>
Date: Tue, 7 Feb 2023 19:38:52 +0800
Subject: [PATCH 4/9] [Refactoring] Code refactoring of Communication Subsystem
[3/3]. Code refactoring of communication subsystem.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d688fdf..fcd737b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -89,9 +89,12 @@ add_subdirectory(include)
add_subdirectory(lib)
add_library(pin_gcc_client SHARED
+ "lib/gccPlugin/gccPlugin.cpp"
"lib/PluginClient/PluginLog.cpp"
+ "lib/PluginClient/PluginJson.cpp"
+ "lib/PluginClient/PluginInputCheck.cpp"
+ "lib/PluginClient/PluginGrpcPort.cpp"
"lib/PluginClient/PluginClient.cpp"
- "lib/IRTrans/IRTransPlugin.cpp"
)
target_link_libraries(pin_gcc_client
diff --git a/configs/pin-gcc-client.json b/configs/pin-gcc-client.json
index 390f8bf..bd0ff0c 100755
--- a/configs/pin-gcc-client.json
+++ b/configs/pin-gcc-client.json
@@ -1,10 +1,10 @@
{
- //server路径
+ "//" : "server路径",
"path" : "/usr/local/bin/pin_server",
- //libuser.so sha256文件名
+ "//" : "libuser.so sha256文件名",
"sha256file" : "/usr/local/lib/libpin_user.sha256",
- //超时时间单位ms
- "timeout" : 200,
+ "//" : "超时时间,单位ms",
+ "timeout" : 200
}
\ No newline at end of file
diff --git a/include/Dialect/PluginDialect.h b/include/Dialect/PluginDialect.h
index c5d3ad8..8cdb593 100644
--- a/include/Dialect/PluginDialect.h
+++ b/include/Dialect/PluginDialect.h
@@ -16,11 +16,11 @@
*/
-//===----------------------------------------------------------------------===//
-//
+// ===----------------------------------------------------------------------===//
+//
// This is the header file for the Plugin dialect.
//
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
#ifndef PLUGIN_DIALECT_H
#define PLUGIN_DIALECT_H
diff --git a/include/Dialect/PluginOps.h b/include/Dialect/PluginOps.h
index 25089fe..a2fb310 100644
--- a/include/Dialect/PluginOps.h
+++ b/include/Dialect/PluginOps.h
@@ -16,11 +16,11 @@
*/
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
//
-// This is the header file for operations in Plugin dialect.
+// This is the header file for operations in Plugin dialect.
//
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
#ifndef Plugin_OPS_H
#define Plugin_OPS_H
diff --git a/include/Dialect/PluginTypes.h b/include/Dialect/PluginTypes.h
index 60ba258..157b868 100644
--- a/include/Dialect/PluginTypes.h
+++ b/include/Dialect/PluginTypes.h
@@ -74,13 +74,13 @@ private:
unsigned size;
}; // class PluginTypeBase
-namespace detail {
+namespace Detail {
struct PluginIntegerTypeStorage;
struct PluginFloatTypeStorage;
struct PluginPointerTypeStorage;
}
-class PluginIntegerType : public Type::TypeBase<PluginIntegerType, PluginTypeBase, detail::PluginIntegerTypeStorage> {
+class PluginIntegerType : public Type::TypeBase<PluginIntegerType, PluginTypeBase, Detail::PluginIntegerTypeStorage> {
public:
using Base::Base;
@@ -104,7 +104,7 @@ public:
SignednessSemantics getSignedness() const;
};
-class PluginFloatType : public Type::TypeBase<PluginFloatType, PluginTypeBase, detail::PluginFloatTypeStorage> {
+class PluginFloatType : public Type::TypeBase<PluginFloatType, PluginTypeBase, Detail::PluginFloatTypeStorage> {
public:
using Base::Base;
@@ -115,7 +115,7 @@ public:
unsigned getWidth() const;
};
-class PluginPointerType : public Type::TypeBase<PluginPointerType, PluginTypeBase, detail::PluginPointerTypeStorage> {
+class PluginPointerType : public Type::TypeBase<PluginPointerType, PluginTypeBase, Detail::PluginPointerTypeStorage> {
public:
using Base::Base;
@@ -133,7 +133,6 @@ public:
using Base::Base;
PluginTypeID getPluginTypeID ();
-
}; // class PluginVoidType
class PluginUndefType : public Type::TypeBase<PluginUndefType, PluginTypeBase, TypeStorage> {
@@ -141,7 +140,6 @@ public:
using Base::Base;
PluginTypeID getPluginTypeID ();
-
}; // class PluginUndefType
class PluginBooleanType : public Type::TypeBase<PluginBooleanType, PluginTypeBase, TypeStorage> {
@@ -149,7 +147,6 @@ public:
using Base::Base;
PluginTypeID getPluginTypeID ();
-
}; // class PluginBooleanType
} // namespace PluginIR
diff --git a/include/PluginAPI/BasicPluginOpsAPI.h b/include/PluginAPI/BasicPluginOpsAPI.h
index 5eb1eed..8c47c58 100644
--- a/include/PluginAPI/BasicPluginOpsAPI.h
+++ b/include/PluginAPI/BasicPluginOpsAPI.h
@@ -43,6 +43,12 @@ public:
BasicPluginOpsAPI() = default;
virtual ~BasicPluginOpsAPI() = default;
+ virtual string GetDeclSourceFile(uint64_t gccDataAddr) = 0;
+ virtual string VariableName(int64_t gccDataAddr) = 0;
+ virtual string FuncName(int64_t gccDataAddr) = 0;
+ virtual int GetDeclSourceLine(uint64_t gccDataAddr) = 0;
+ virtual int GetDeclSourceColumn(uint64_t gccDataAddr) = 0;
+
virtual uint64_t CreateBlock(uint64_t, uint64_t) = 0;
virtual void DeleteBlock(uint64_t, uint64_t) = 0;
virtual void SetImmediateDominator(uint64_t, uint64_t, uint64_t) = 0;
diff --git a/include/PluginAPI/PluginClientAPI.h b/include/PluginAPI/PluginClientAPI.h
index cb81986..07d6e52 100644
--- a/include/PluginAPI/PluginClientAPI.h
+++ b/include/PluginAPI/PluginClientAPI.h
@@ -33,6 +33,12 @@ public:
PluginClientAPI () = default;
~PluginClientAPI () = default;
+ string GetDeclSourceFile(uint64_t gccDataAddr) override;
+ string VariableName(int64_t gccDataAddr) override;
+ string FuncName(int64_t gccDataAddr) override;
+ int GetDeclSourceLine(uint64_t gccDataAddr) override;
+ int GetDeclSourceColumn(uint64_t gccDataAddr) override;
+
uint64_t CreateBlock(uint64_t, uint64_t) override;
void DeleteBlock(uint64_t, uint64_t) override;
void SetImmediateDominator(uint64_t, uint64_t, uint64_t) override;
diff --git a/include/PluginClient/GrpcKey.def b/include/PluginClient/GrpcKey.def
new file mode 100755
index 0000000..f996544
--- /dev/null
+++ b/include/PluginClient/GrpcKey.def
@@ -0,0 +1,6 @@
+/* Definition of GRPC key name */
+
+GRPC_KEY(START, "start")
+GRPC_KEY(STOP, "stop")
+GRPC_KEY(USERFUNC, "userFunc")
+GRPC_KEY(INJECT, "injectPoint")
diff --git a/include/PluginClient/GrpcValue.def b/include/PluginClient/GrpcValue.def
new file mode 100755
index 0000000..d9b391b
--- /dev/null
+++ b/include/PluginClient/GrpcValue.def
@@ -0,0 +1,6 @@
+/* Definition of GRPC value */
+
+GRPC_VALUE(START_VALUE, "ok")
+GRPC_VALUE(STOP_VALUE, "ok")
+GRPC_VALUE(USERFUNC_VALUE, "execution completed")
+GRPC_VALUE(FINISH_VALUE, "finished")
diff --git a/include/PluginClient/JsonKey.def b/include/PluginClient/JsonKey.def
new file mode 100755
index 0000000..adbd27e
--- /dev/null
+++ b/include/PluginClient/JsonKey.def
@@ -0,0 +1,5 @@
+/* Definition of JsonKey */
+
+JSON_KEY(PATH, "path")
+JSON_KEY(SHA256, "sha256file")
+JSON_KEY(TIMEOUT, "timeout")
diff --git a/include/PluginClient/PassValue.def b/include/PluginClient/PassValue.def
new file mode 100755
index 0000000..b9090ea
--- /dev/null
+++ b/include/PluginClient/PassValue.def
@@ -0,0 +1,5 @@
+/* Definition of PASS value */
+
+PASS_VALUE(PASS_NAME, "refPassName")
+PASS_VALUE(PASS_NUM, "passNum")
+PASS_VALUE(PASS_POSITION, "passPosition")
diff --git a/include/PluginClient/PluginClient.h b/include/PluginClient/PluginClient.h
index a0137b5..89d7573 100644
--- a/include/PluginClient/PluginClient.h
+++ b/include/PluginClient/PluginClient.h
@@ -18,35 +18,26 @@
Create: 2022-08-18
Description:
This file contains the declaration of the PluginClient class.
+ 主要完成功能完成和server之间grpc通信及数据解析获取gcc插件数据并进行IR转换完成
+ gcc注册点注入及参数保存。提供GetInstance获取client对象唯一实例完成插件初始化并启动
+ server子进程处理超时异常事件
*/
#ifndef PLUGIN_CLIENT_H
#define PLUGIN_CLIENT_H
-#include <memory>
-#include <string>
-#include <vector>
-#include <time.h>
-#include <signal.h>
-#include <json/json.h>
-
#include "Dialect/PluginOps.h"
#include "Dialect/PluginTypes.h"
#include <grpcpp/grpcpp.h>
#include "plugin.grpc.pb.h"
-#include "gcc-plugin.h"
#include "PluginAPI/PluginClientAPI.h"
+#include "PluginClient/PluginGrpcPort.h"
+#include "PluginClient/PluginInputCheck.h"
+#include "PluginClient/PluginJson.h"
#include "PluginClient/PluginLog.h"
#include "Dialect/PluginDialect.h"
namespace PinClient {
-using std::cout;
-using std::string;
-using std::endl;
-using std::vector;
-using std::map;
-using std::pair;
-
using plugin::PluginService;
using grpc::Channel;
using grpc::ClientContext;
@@ -55,6 +46,45 @@ using grpc::Status;
using plugin::ClientMsg;
using plugin::ServerMsg;
+enum Grpckey {
+#define GRPC_KEY(KEY, NAME) KEY,
+#include "GrpcKey.def"
+#undef GRPC_KEY
+MAX_GRPC_KEYS
+};
+
+#define GRPC_KEY(KEY, NAME) NAME,
+const char *const grpckey[] = {
+#include "GrpcKey.def"
+};
+#undef GRPC_KEY
+
+enum GrpcValue {
+#define GRPC_VALUE(KEY, NAME) KEY,
+#include "GrpcValue.def"
+#undef GRPC_VALUE
+MAX_GRPC_VALUES
+};
+
+#define GRPC_VALUE(KEY, NAME) NAME,
+const char *const grpcValue[] = {
+#include "GrpcValue.def"
+};
+#undef GRPC_VALUE
+
+enum PassValue {
+#define PASS_VALUE(KEY, NAME) KEY,
+#include "PassValue.def"
+#undef PASS_VALUE
+MAX_PASS_VALUES
+};
+
+#define PASS_VALUE(KEY, NAME) NAME,
+const char *const passValue[] = {
+#include "PassValue.def"
+};
+#undef PASS_VALUE
+
enum InjectPoint : uint8_t {
HANDLE_PARSE_TYPE = 0,
HANDLE_PARSE_DECL,
@@ -68,8 +98,10 @@ enum InjectPoint : uint8_t {
HANDLE_AFTER_ALL_PASS,
HANDLE_COMPILE_END,
HANDLE_MANAGER_SETUP,
+ HANDLE_INCLUDE_FILE,
HANDLE_MAX,
};
+
typedef enum {
STATE_WAIT_BEGIN = 0,
STATE_BEGIN,
@@ -101,50 +133,17 @@ struct ManagerSetupData {
class PluginClient {
public:
- PluginClient() = default;
- ~PluginClient() = default;
- PluginClient(std::shared_ptr<Channel> channel) : serviceStub(PluginService::NewStub(channel)) {}
/* 定义的grpc服务端和客户端通信的接口函数 */
void ReceiveSendMsg(const string& attribute, const string& value);
/* 获取client对象实例,有且只有一个实例对象 */
- static std::shared_ptr<PluginClient> GetInstance(void);
- 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 EdgesJsonSerialize(vector<pair<uint64_t, uint64_t> >&, string&);
- void EdgeJsonSerialize(pair<uint64_t, uint64_t>&, string&);
- void NopJsonSerialize(string&);
- void FunctionOpJsonSerialize(vector<mlir::Plugin::FunctionOp>& data, string& out);
- void LocalDeclsJsonSerialize(vector<mlir::Plugin::LocalDeclOp>& decls, string& out);
- void GetPhiOpsJsonSerialize(vector<mlir::Plugin::PhiOp> phiOps, string& out);
- Json::Value OperationJsonSerialize(mlir::Operation *, uint64_t&);
- Json::Value CallOpJsonSerialize(mlir::Plugin::CallOp& data);
- Json::Value CondOpJsonSerialize(mlir::Plugin::CondOp& data, uint64_t&);
- Json::Value PhiOpJsonSerialize(mlir::Plugin::PhiOp& data);
- Json::Value AssignOpJsonSerialize(mlir::Plugin::AssignOp& data);
- Json::Value BaseOpJsonSerialize(mlir::Plugin::BaseOp data);
- Json::Value FallThroughOpJsonSerialize(mlir::Plugin::FallThroughOp data, uint64_t&);
- Json::Value RetOpJsonSerialize(mlir::Plugin::RetOp data, uint64_t&);
- Json::Value ValueJsonSerialize(mlir::Value value);
- Json::Value MemOpJsonSerialize(mlir::Plugin::MemOp& data);
- Json::Value SSAOpJsonSerialize(mlir::Plugin::SSAOp& data);
- /* 将Type类型数据序列化 */
- Json::Value TypeJsonSerialize(PluginIR::PluginTypeBase& type);
- PluginIR::PluginTypeBase TypeJsonDeSerialize(const string& data, mlir::MLIRContext &context);
+ static PluginClient *GetInstance();
/* 获取gcc插件数据并进行IR转换将转换后的数据序列化返回给server。param函数入参序列化后的数据 */
- void IRTransBegin(const string& funname, const string& param);
- /* 从配置文件读取初始化信息 */
- static int GetInitInfo(string& serverPath, string& shaPath, int& timeout);
- /* 进行sha256校验 */
- static int CheckSHA256(const string& shaPath);
- static void CheckSafeCompileFlag(const string& argName, const string& param);
- /* 解析gcc编译时传递的-fplugin-arg参数 */
- static void GetArg(struct plugin_name_args *pluginInfo, string& serverPath, string& arg, LogPriority& logLevel);
+ void GetIRTransResult(void *gccData, const string& funname, const string& param);
+ void GetGccData(const string& funcName, const string& param, string& key, string& result);
/* 将服务端传递的InjectPoint转换为plugin_event */
static int GetEvent(InjectPoint inject, plugin_event *event);
- static unsigned short FindUnusedPort(void); // 查找未被使用的端口号确保并发情况下server和client一对一
- UserFuncStateEnum GetUserFuncState(void)
+ void Init(struct plugin_name_args *pluginInfo, const string& pluginName, pid_t& serverPid);
+ UserFuncStateEnum GetUserFuncState()
{
return userFuncState;
}
@@ -168,10 +167,6 @@ public:
{
pluginAPIParams = name;
}
- void SetTimeout(int time)
- {
- timeout = time;
- }
void SetPluginName(const string& pluginName)
{
this->pluginName = pluginName;
@@ -188,19 +183,11 @@ public:
{
return injectFlag;
}
- void SetGrpcPort(unsigned short port)
- {
- grpcPort = port;
- }
- unsigned short GetGrpcPort(void)
- {
- return grpcPort;
- }
- bool TimerInit(void);
+ bool TimerInit(clockid_t id);
void TimerStart(int interval);
/* 保存注入点和函数名信息,value格式为 注入点:函数名称 */
int AddRegisteredUserFunc(const string& value);
- map<InjectPoint, vector<string>>& GetRegisteredUserFunc(void)
+ map<InjectPoint, vector<string>>& GetRegisteredUserFunc()
{
return registeredUserFunc;
}
@@ -210,13 +197,24 @@ public:
}
/* grpc消息处理函数 */
void ServerMsgProc(const string& attribute, const string& value);
- /* grpc的server被client拉起之前将port记录在/tmp/grpc_ports_pin_client.txt中, server和client建立通信后从文件中删除port避免多进程时端口冲突
- 文件若不存在,先创建文件 */
- static int OpenLockFile(const char *path);
- /* 读取文件中保存的grpc端口号 */
- static void ReadPortsFromLockFile(int fd, string& grpcPorts);
- /* server启动异常或者grpc建立通信后,将文件中记录的端口号删除 */
- static bool DeletePortFromLockFile(unsigned short port);
+ int ClientStart();
+ int ServerStart(pid_t& pid); // pid server线程pid
+ bool DeleteGrpcPort()
+ {
+ return grpcPort.DeletePortFromLockFile();
+ }
+ bool GetStartFlag()
+ {
+ return startFlag;
+ }
+ void SetStartFlag(bool flag)
+ {
+ startFlag = flag;
+ }
+ PluginJson &GetJson(void)
+ {
+ return json;
+ }
private:
std::unique_ptr<PluginService::Stub> serviceStub; // 保存grpc客户端stub对象
@@ -225,18 +223,17 @@ private:
volatile UserFuncStateEnum userFuncState;
string pluginAPIName; // 保存用户调用PluginAPI的函数名
string pluginAPIParams; // 保存用户调用PluginAPI函数的参数
- int timeout;
timer_t timerId;
string pluginName; // 向gcc插件注册回调函数时需要
bool injectFlag; // 是否完成将注册点信息注册到gcc
- unsigned short grpcPort; // server和client使用的端口号
+ PluginGrpcPort grpcPort;
+ PluginInputCheck input;
+ PluginJson json;
/* 保存注册点和函数信息 */
map<InjectPoint, vector<string>> registeredUserFunc;
+ std::shared_ptr<Channel> grpcChannel;
+ bool startFlag;
};
-
-/* pid:子进程server返回的pidport:查找到的未使用的端口号 */
-int ServerStart(int timeout, const string& serverPath, pid_t& pid, string& port, const LogPriority logLevel);
-int ClientStart(int timeout, const string& arg, const string& pluginName, const string& port);
} // namespace PinClient
#endif
diff --git a/include/PluginClient/PluginGrpcPort.h b/include/PluginClient/PluginGrpcPort.h
new file mode 100755
index 0000000..cd06864
--- /dev/null
+++ b/include/PluginClient/PluginGrpcPort.h
@@ -0,0 +1,73 @@
+/* Copyright (c) 2022-2022 Huawei Technologies Co., Ltd.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the declaration of the PluginGrpcPort class.
+ 主要完成功能:查找未使用的端口号,并将端口号写入到共享文件中,通过文件锁控制多进程间访问,并提供
+ DeletePortFromLockFile接口在退出时删除写入的端口号
+*/
+
+#ifndef PLUGIN_GRPC_PORT_H
+#define PLUGIN_GRPC_PORT_H
+
+#include <string>
+
+namespace PinClient {
+using std::string;
+
+class PluginGrpcPort {
+public:
+ PluginGrpcPort()
+ {
+ const int startPort = 40000;
+ lockFilePath = "/tmp/grpc_ports_pin_client.txt";
+ basePort = startPort;
+ port = 0;
+ }
+ bool FindUnusedPort(); // 查找未被使用的端口号确保并发情况下server和client一对一
+ /* grpc的server被client拉起之前将port记录在/tmp/grpc_ports_pin_client.txt中, server和client建立通信后从文件中删除port避免多进程时端口冲突
+ 文件若不存在,先创建文件 */
+ int OpenFile(const char *path);
+ /* 读取文件中保存的grpc端口号 */
+ bool ReadPortsFromLockFile(int fd, string& grpcPorts);
+ /* server启动异常或者grpc建立通信后,将文件中记录的端口号删除 */
+ bool DeletePortFromLockFile();
+ unsigned short GetPort()
+ {
+ return port;
+ }
+ void SetLockFilePath(const string& path)
+ {
+ lockFilePath = path;
+ }
+ void SetBasePort(unsigned short port)
+ {
+ basePort = port;
+ }
+ unsigned short GetBasePort()
+ {
+ return basePort;
+ }
+
+private:
+ unsigned short port; // server和client使用的端口号
+ string lockFilePath;
+ unsigned short basePort;
+};
+} // namespace PinClient
+#endif
\ No newline at end of file
diff --git a/include/PluginClient/PluginInputCheck.h b/include/PluginClient/PluginInputCheck.h
new file mode 100755
index 0000000..cbbfc3f
--- /dev/null
+++ b/include/PluginClient/PluginInputCheck.h
@@ -0,0 +1,136 @@
+/* Copyright (c) 2022-2022 Huawei Technologies Co., Ltd.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the declaration of the PluginInputCheck class.
+ 主要完成功能获取gcc编译时的参数读取config.json配置文件完成sha256校验完成
+ 安全编译选项参数检查并保存serverPathshaPathtimeout等信息
+*/
+
+#ifndef PLUGIN_INPUT_CHECK_H
+#define PLUGIN_INPUT_CHECK_H
+
+#include <map>
+#include <string>
+#include <json/json.h>
+#include "gcc-plugin.h"
+#include "PluginClient/PluginLog.h"
+
+namespace PinClient {
+using std::map;
+using std::string;
+using std::vector;
+
+enum Jsonkey {
+#define JSON_KEY(KEY, NAME) KEY,
+#include "JsonKey.def"
+#undef JSON_KEY
+MAX_JSON_KEYS
+};
+
+#define JSON_KEY(KEY, NAME) NAME,
+const char *const jsonkey[] = {
+#include "JsonKey.def"
+};
+#undef JSON_KEY
+
+enum {
+ KEY_SERVER_PATH,
+ KEY_LOG_LEVEL,
+};
+
+class PluginInputCheck {
+public:
+ const string shaFile = "/libpin_user.sha256";
+ PluginInputCheck();
+ /* 从配置文件读取初始化信息 */
+ int GetInitInfo();
+ int CheckServerFile(); // 对server文件进行检查
+ int CheckShaFile(); // 对sha256校验文件进行检查
+ bool ReadConfigfile(Json::Value& root);
+ /* 进行sha256校验 */
+ int CheckSHA256();
+ void CheckSafeCompileFlag(const string& argName, const string& param);
+ /* 解析gcc编译时传递的-fplugin-arg参数 */
+ void GetInputArgs(struct plugin_name_args *pluginInfo);
+ int mapFind(const std::map<string, int>& map, const string& key)
+ {
+ auto it = map.find(key);
+ if (it != map.end()) {
+ return it->second;
+ }
+ return -1;
+ }
+ string& GetArgs()
+ {
+ return args;
+ }
+ string& GetServerPath()
+ {
+ return serverPath;
+ }
+ void SetServerPath(const string& path)
+ {
+ serverPath = path;
+ }
+ LogPriority GetLogLevel()
+ {
+ return logLevel;
+ }
+ void SetLogLevel(LogPriority level)
+ {
+ logLevel = level;
+ }
+ string& GetShaPath()
+ {
+ return shaPath;
+ }
+ void SetShaPath(const string& path)
+ {
+ shaPath = path;
+ }
+ int GetTimeout()
+ {
+ return timeout;
+ }
+ void SetTimeout(int time);
+ void SetConfigPath(const string& path)
+ {
+ configFilePath = path;
+ }
+ string& GetConfigPath()
+ {
+ return configFilePath;
+ }
+ string GetServerDir()
+ {
+ int index = serverPath.find_last_of("/");
+ return serverPath.substr(0, index);
+ }
+
+private:
+ string args;
+ string serverPath;
+ string configFilePath;
+ LogPriority logLevel;
+ string shaPath;
+ int timeout;
+ vector<string> safeCompileFlags;
+};
+} // namespace PinClient
+#endif
\ No newline at end of file
diff --git a/include/PluginClient/PluginJson.h b/include/PluginClient/PluginJson.h
new file mode 100755
index 0000000..91bd925
--- /dev/null
+++ b/include/PluginClient/PluginJson.h
@@ -0,0 +1,70 @@
+/* Copyright (c) 2022-2022 Huawei Technologies Co., Ltd.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>.
+
+ Author: Mingchuan Wu and Yancheng Li
+ Create: 2022-08-18
+ Description:
+ This file contains the declaration of the PluginJson class.
+ 主要完成功能将operation、Decl、Type、Inter、string等类型数据序列化
+*/
+
+#ifndef PLUGIN_JSON_H
+#define PLUGIN_JSON_H
+
+#include <string>
+#include <vector>
+
+#include "Dialect/PluginDialect.h"
+#include "Dialect/PluginOps.h"
+#include "Dialect/PluginTypes.h"
+
+namespace PinClient {
+using std::string;
+using std::vector;
+
+class PluginJson {
+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 EdgesJsonSerialize(vector<std::pair<uint64_t, uint64_t> >&, string&);
+ void EdgeJsonSerialize(std::pair<uint64_t, uint64_t>&, string&);
+ void NopJsonSerialize(string&);
+ void FunctionOpJsonSerialize(vector<mlir::Plugin::FunctionOp>& data, string& out);
+ void LocalDeclsJsonSerialize(vector<mlir::Plugin::LocalDeclOp>& decls, string& out);
+ void GetPhiOpsJsonSerialize(vector<mlir::Plugin::PhiOp> phiOps, string& out);
+ Json::Value OperationJsonSerialize(mlir::Operation *, uint64_t&);
+ Json::Value CallOpJsonSerialize(mlir::Plugin::CallOp& data);
+ Json::Value CondOpJsonSerialize(mlir::Plugin::CondOp& data, uint64_t&);
+ Json::Value PhiOpJsonSerialize(mlir::Plugin::PhiOp& data);
+ Json::Value AssignOpJsonSerialize(mlir::Plugin::AssignOp& data);
+ Json::Value BaseOpJsonSerialize(mlir::Plugin::BaseOp data);
+ Json::Value FallThroughOpJsonSerialize(mlir::Plugin::FallThroughOp data, uint64_t&);
+ Json::Value RetOpJsonSerialize(mlir::Plugin::RetOp data, uint64_t&);
+ Json::Value ValueJsonSerialize(mlir::Value value);
+ Json::Value MemOpJsonSerialize(mlir::Plugin::MemOp& data);
+ Json::Value SSAOpJsonSerialize(mlir::Plugin::SSAOp& data);
+ /* 将Type类型数据序列化 */
+ Json::Value TypeJsonSerialize(PluginIR::PluginTypeBase& type);
+ PluginIR::PluginTypeBase TypeJsonDeSerialize(const string& data, mlir::MLIRContext &context);
+ /* 将整数型数据序列化 */
+ void IntegerSerialize(int64_t data, string& out);
+ /* 将字符串型数据序列化 */
+ void StringSerialize(const string& data, string& out);
+};
+} // namespace PinClient
+#endif
diff --git a/include/PluginClient/PluginLog.h b/include/PluginClient/PluginLog.h
index a91a1db..8fafa85 100644
--- a/include/PluginClient/PluginLog.h
+++ b/include/PluginClient/PluginLog.h
@@ -18,14 +18,14 @@
Create: 2022-08-18
Description:
This file contains the declaration of the Plugin_Log class.
+ 主要完成功能提供LOGE、LOGW、LOGI、LOGD四个log保存接口并提供SetLogPriority接口
+ 设置log级别
*/
#ifndef PLUGIN_LOG_H
#define PLUGIN_LOG_H
namespace PinClient {
-#define LOG_FILE_SIZE (10 * 1024 * 1024)
-
enum LogPriority : uint8_t {
PRIORITY_ERROR = 0,
PRIORITY_WARN,
@@ -33,12 +33,13 @@ enum LogPriority : uint8_t {
PRIORITY_DEBUG
};
void LogPrint(LogPriority priority, const char *tag, const char *fmt, ...);
-void CloseLog(void);
+void CloseLog();
bool SetLogPriority(LogPriority priority);
+void SetLogFileSize(unsigned int size); // 设置log文件大小默认为10M当日志超过10M后重新命名
#define LOGE(...) LogPrint(PRIORITY_ERROR, "ERROR:", __VA_ARGS__)
#define LOGW(...) LogPrint(PRIORITY_WARN, "WARN:", __VA_ARGS__)
-#define LOGI(...) LogPrint(PRIORITY_INFO, "", __VA_ARGS__)
+#define LOGI(...) LogPrint(PRIORITY_INFO, "INFO:", __VA_ARGS__)
#define LOGD(...) LogPrint(PRIORITY_DEBUG, "DEBUG:", __VA_ARGS__)
} // namespace PinClient
diff --git a/include/Translate/GimpleToPluginOps.h b/include/Translate/GimpleToPluginOps.h
index 689ece3..5f8bdf0 100644
--- a/include/Translate/GimpleToPluginOps.h
+++ b/include/Translate/GimpleToPluginOps.h
@@ -36,18 +36,24 @@
namespace PluginIR {
using std::vector;
+using std::string;
using namespace mlir::Plugin;
-namespace detail {
+namespace Detail {
class BlockFromGimpleTranslatorImpl;
// class BlockToPluginIRTranslatorImpl;
-} // namespace detail
+} // namespace Detail
class GimpleToPluginOps {
public:
GimpleToPluginOps (mlir::MLIRContext &);
~GimpleToPluginOps ();
+ string DeclSourceFile(uint64_t gccDataAddr);
+ string GetVariableName(uint64_t gccDataAddr);
+ string GetFuncName(uint64_t gccDataAddr);
+ int DeclSourceLine(uint64_t gccDataAddr);
+ int DeclSourceColumn(uint64_t gccDataAddr);
/* ToPluginInterface */
uint64_t CreateBlock(uint64_t, uint64_t);
void DeleteBlock(uint64_t, uint64_t);
@@ -107,7 +113,7 @@ private:
TypeToPluginIRTranslator pluginTypeTranslator;
// process basic_block
- std::unique_ptr<detail::BlockFromGimpleTranslatorImpl> bbTranslator;
+ std::unique_ptr<Detail::BlockFromGimpleTranslatorImpl> bbTranslator;
bool ProcessBasicBlock(intptr_t, Region&);
bool ProcessGimpleStmt(intptr_t, Region&);
};
diff --git a/include/Translate/ToPluginOpsInterface.h b/include/Translate/ToPluginOpsInterface.h
deleted file mode 100644
index 6d2b74b..0000000
--- a/include/Translate/ToPluginOpsInterface.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright (c) 2022-2022 Huawei Technologies Co., Ltd.
-
- This program is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by the
- Free Software Foundation; either version 3, or (at your option) any
- later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING3. If not see
- <http://www.gnu.org/licenses/>.
-
- Author: Mingchuan Wu and Yancheng Li
- Create: 2022-08-18
- Description:
- This file contains the declaration of the ToPluginInterface class
-*/
-
-#ifndef TO_PLUGINOPS_INTERFACE_H
-#define TO_PLUGINOPS_INTERFACE_H
-
-#include <vector>
-#include "Dialect/PluginOps.h"
-
-namespace PluginIR {
-using std::vector;
-using namespace mlir::Plugin;
-
-/* The ToPluginInterface class defines the plugin interfaces that different
- compilers need to implement. */
-class ToPluginOpsInterface {
-public:
- /* Operation. */
- virtual vector<FunctionOp> GetAllFunction() = 0;
- virtual vector<LocalDeclOp> GetAllDecls(uint64_t) = 0;
- virtual vector<LoopOp> GetAllLoops(uint64_t) = 0;
- virtual LoopOp GetLoop(uint64_t) = 0;
- virtual bool IsBlockInside(uint64_t, uint64_t) = 0;
- virtual vector<uint64_t> GetBlocksInLoop(uint64_t) = 0;
- virtual uint64_t AllocateNewLoop(void) = 0;
- virtual void DeleteLoop(uint64_t) = 0;
- virtual void AddLoop (uint64_t, uint64_t, uint64_t) = 0;
- virtual uint64_t GetHeader(uint64_t) = 0;
- virtual uint64_t GetLatch(uint64_t) = 0;
- virtual vector<std::pair<uint64_t, uint64_t> > GetLoopExits(uint64_t) = 0;
- virtual std::pair<uint64_t, uint64_t> GetLoopSingleExit(uint64_t) = 0;
- virtual LoopOp GetBlockLoopFather(uint64_t) = 0;
- virtual bool UpdateSSA() = 0;
- virtual vector<mlir::Plugin::PhiOp> GetPhiOpsInsideBlock(uint64_t) = 0;
- virtual bool IsDomInfoAvailable() = 0;
-
-};
-} // namespace PluginIR
-
-#endif // TO_PLUGINOPS_INTERFACE_H
\ No newline at end of file
diff --git a/include/Translate/TypeTranslation.h b/include/Translate/TypeTranslation.h
index 964305c..98d279c 100644
--- a/include/Translate/TypeTranslation.h
+++ b/include/Translate/TypeTranslation.h
@@ -36,10 +36,10 @@ namespace PluginIR {
using std::vector;
using namespace mlir;
-namespace detail {
+namespace Detail {
class TypeFromPluginIRTranslatorImpl;
class TypeToPluginIRTranslatorImpl;
-} // namespace detail
+} // namespace Detail
class TypeFromPluginIRTranslator {
public:
@@ -54,7 +54,7 @@ public:
uint64_t getBitWidth (PluginTypeBase type);
private:
- std::unique_ptr<detail::TypeFromPluginIRTranslatorImpl> impl;
+ std::unique_ptr<Detail::TypeFromPluginIRTranslatorImpl> impl;
};
class TypeToPluginIRTranslator {
@@ -65,7 +65,7 @@ public:
uintptr_t translateType (PluginTypeBase type);
private:
- std::unique_ptr<detail::TypeToPluginIRTranslatorImpl> impl;
+ std::unique_ptr<Detail::TypeToPluginIRTranslatorImpl> impl;
};
} // namespace PluginIR
diff --git a/include/IRTrans/IRTransPlugin.h b/include/gccPlugin/gccPlugin.h
similarity index 83%
rename from include/IRTrans/IRTransPlugin.h
rename to include/gccPlugin/gccPlugin.h
index 400e8e0..bb2e0d3 100755
--- a/include/IRTrans/IRTransPlugin.h
+++ b/include/gccPlugin/gccPlugin.h
@@ -18,6 +18,8 @@
Create: 2022-08-18
Description:
This file contains the declaration of the RegisterPluginEvent.
+ 主要完成功能提供RegisterPluginEvent和RegisterPassManagerSetup两个注册gcc
+ 回调点接口
*/
#ifndef IRTRANS_PLUGIN_H
@@ -26,6 +28,6 @@
#include "PluginClient/PluginClient.h"
int RegisterPluginEvent(PinClient::InjectPoint inject, const std::string& pluginName);
-int RegisterPassManagerSetup(PinClient::InjectPoint inject, const PinClient::ManagerSetupData& setupData,
+void RegisterPassManagerSetup(unsigned int index, const PinClient::ManagerSetupData& setupData,
const std::string& pluginName);
#endif
diff --git a/lib/Dialect/PluginDialect.cpp b/lib/Dialect/PluginDialect.cpp
index 7071e64..527c076 100644
--- a/lib/Dialect/PluginDialect.cpp
+++ b/lib/Dialect/PluginDialect.cpp
@@ -16,11 +16,11 @@
*/
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
//
// This file defines Plugin dialect.
//
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
#include "Dialect/PluginDialect.h"
#include "Dialect/PluginOps.h"
@@ -29,20 +29,21 @@
using namespace mlir;
using namespace mlir::Plugin;
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin dialect.
-//===----------------------------------------------------------------------===//
-
-void PluginDialect::initialize() {
- addTypes<PluginIR::PluginIntegerType,
- PluginIR::PluginFloatType,
- PluginIR::PluginPointerType,
- PluginIR::PluginBooleanType,
- PluginIR::PluginVoidType,
- PluginIR::PluginUndefType>();
-
- addOperations<
+// ===----------------------------------------------------------------------===//
+
+void PluginDialect::initialize()
+{
+ addTypes<PluginIR::PluginIntegerType,
+ PluginIR::PluginFloatType,
+ PluginIR::PluginPointerType,
+ PluginIR::PluginBooleanType,
+ PluginIR::PluginVoidType,
+ PluginIR::PluginUndefType>();
+
+ addOperations<
#define GET_OP_LIST
#include "Dialect/PluginOps.cpp.inc"
- >();
+ >();
}
\ No newline at end of file
diff --git a/lib/Dialect/PluginOps.cpp b/lib/Dialect/PluginOps.cpp
index ac2a4ee..052ebfd 100644
--- a/lib/Dialect/PluginOps.cpp
+++ b/lib/Dialect/PluginOps.cpp
@@ -16,11 +16,11 @@
*/
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
//
// This file defines operations in the Plugin dialect.
//
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
#include "Dialect/PluginDialect.h"
#include "Dialect/PluginOps.h"
@@ -33,7 +33,8 @@ using namespace mlir;
using namespace mlir::Plugin;
void FunctionOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
- uint64_t id, StringRef funcName, bool declaredInline) {
+ uint64_t id, StringRef funcName, bool declaredInline)
+{
FunctionOp::build(builder, state,
builder.getI64IntegerAttr(id),
builder.getStringAttr(funcName),
@@ -41,8 +42,8 @@ void FunctionOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
}
void LocalDeclOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
- uint64_t id, StringRef symName,
- int64_t typeID, uint64_t typeWidth) {
+ uint64_t id, StringRef symName, int64_t typeID, uint64_t typeWidth)
+{
LocalDeclOp::build(builder, state,
builder.getI64IntegerAttr(id),
builder.getStringAttr(symName),
@@ -51,8 +52,8 @@ void LocalDeclOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
}
void LoopOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
- uint64_t id, uint32_t index, uint64_t innerLoopId,
- uint64_t outerLoopId, uint32_t numBlock) {
+ uint64_t id, uint32_t index, uint64_t innerLoopId, uint64_t outerLoopId, uint32_t numBlock)
+{
LoopOp::build(builder, state,
builder.getI64IntegerAttr(id),
builder.getI32IntegerAttr(index),
@@ -61,12 +62,11 @@ void LoopOp::build(mlir::OpBuilder &builder, mlir::OperationState &state,
builder.getI32IntegerAttr(numBlock));
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// PlaceholderOp
void PlaceholderOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, IDefineCode defCode, bool readOnly,
- Type retType)
+ uint64_t id, IDefineCode defCode, bool readOnly, Type retType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("defCode",
@@ -75,12 +75,11 @@ void PlaceholderOp::build(OpBuilder &builder, OperationState &state,
state.addTypes(retType);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// MemOp
void MemOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, IDefineCode defCode, bool readOnly,
- Value addr, Value offset, Type retType)
+ uint64_t id, IDefineCode defCode, bool readOnly, Value addr, Value offset, Type retType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("readOnly", builder.getBoolAttr(readOnly));
@@ -90,13 +89,11 @@ void MemOp::build(OpBuilder &builder, OperationState &state,
if (retType) state.addTypes(retType);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// SSAOp
-void SSAOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
- IDefineCode defCode, bool readOnly, uint64_t nameVarId,
- uint64_t ssaParmDecl, uint64_t version,
- uint64_t definingId, Type retType)
+void SSAOp::build(OpBuilder &builder, OperationState &state, uint64_t id, IDefineCode defCode, bool readOnly,
+ uint64_t nameVarId, uint64_t ssaParmDecl, uint64_t version, uint64_t definingId, Type retType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("defCode",
@@ -105,16 +102,15 @@ void SSAOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
state.addAttribute("nameVarId", builder.getI64IntegerAttr(nameVarId));
state.addAttribute("ssaParmDecl", builder.getI64IntegerAttr(ssaParmDecl));
state.addAttribute("version", builder.getI64IntegerAttr(version));
- state.addAttribute("definingId", builder.getI64IntegerAttr(definingId));
+ state.addAttribute("definingId", builder.getI64IntegerAttr(definingId));
state.addTypes(retType);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// ConstOp
void ConstOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
- IDefineCode defCode, bool readOnly, Attribute init,
- Type retType)
+ IDefineCode defCode, bool readOnly, Attribute init, Type retType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("defCode",
@@ -124,12 +120,11 @@ void ConstOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
if (retType) state.addTypes(retType);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// PointerOp
void PointerOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
- IDefineCode defCode, bool readOnly, Type retType,
- bool pointeeReadOnly)
+ IDefineCode defCode, bool readOnly, Type retType, bool pointeeReadOnly)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("defCode",
@@ -139,12 +134,11 @@ void PointerOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
state.addAttribute("pointeeReadOnly", builder.getBoolAttr(pointeeReadOnly));
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// CallOp
void CallOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, StringRef callee,
- ArrayRef<Value> arguments, Type retType)
+ uint64_t id, StringRef callee, ArrayRef<Value> arguments, Type retType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addOperands(arguments);
@@ -154,21 +148,25 @@ void CallOp::build(OpBuilder &builder, OperationState &state,
/// Return the callee of the generic call operation, this is required by the
/// call interface.
-CallInterfaceCallable CallOp::getCallableForCallee() {
+CallInterfaceCallable CallOp::getCallableForCallee()
+{
return (*this)->getAttrOfType<SymbolRefAttr>("callee");
}
/// Get the argument operands to the called function, this is required by the
/// call interface.
-Operation::operand_range CallOp::getArgOperands() { return inputs(); }
+Operation::operand_range CallOp::getArgOperands()
+{
+ return inputs();
+}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// CondOp
-void CondOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, uint64_t address, IComparisonCode condCode,
- Value lhs, Value rhs, Block* tb, Block* fb, uint64_t tbaddr,
- uint64_t fbaddr, Value trueLabel, Value falseLabel) {
+void CondOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint64_t address,
+ IComparisonCode condCode, Value lhs, Value rhs, Block* tb, Block* fb, uint64_t tbaddr,
+ uint64_t fbaddr, Value trueLabel, Value falseLabel)
+{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("address", builder.getI64IntegerAttr(address));
state.addOperands({lhs, rhs});
@@ -182,29 +180,29 @@ void CondOp::build(OpBuilder &builder, OperationState &state,
if (falseLabel != nullptr) state.addOperands(falseLabel);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// PhiOp
-void PhiOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, uint32_t capacity, uint32_t nArgs,
- ArrayRef<Value> operands, Type resultType) {
+void PhiOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint32_t capacity,
+ uint32_t nArgs, ArrayRef<Value> operands, Type resultType)
+{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("capacity", builder.getI32IntegerAttr(capacity));
state.addAttribute("nArgs", builder.getI32IntegerAttr(nArgs));
state.addOperands(operands);
- if (resultType != nullptr) state.addTypes(resultType);
+ if (resultType != nullptr) {
+ state.addTypes(resultType);
+ }
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// AssignOp
-void AssignOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, IExprCode exprCode,
- ArrayRef<Value> operands, Type resultType)
+void AssignOp::build(OpBuilder &builder, OperationState &state, uint64_t id,
+ IExprCode exprCode, ArrayRef<Value> operands, Type resultType)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
- state.addAttribute("exprCode",
- builder.getI32IntegerAttr(static_cast<int32_t>(exprCode)));
+ state.addAttribute("exprCode", builder.getI32IntegerAttr(static_cast<int32_t>(exprCode)));
state.addOperands(operands);
if (resultType != nullptr) state.addTypes(resultType);
}
@@ -216,47 +214,46 @@ void AssignOp::build(OpBuilder &builder, OperationState &state,
/// or `false` on success. This allows for easily chaining together a set of
/// parser rules. These rules are used to populate an `mlir::OperationState`
/// similarly to the `build` methods described above.
-static mlir::ParseResult parseAssignOp(mlir::OpAsmParser &parser,
- mlir::OperationState &result) {
- mlir::DenseElementsAttr value;
- if (parser.parseOptionalAttrDict(result.attributes) ||
- parser.parseAttribute(value, "value", result.attributes))
- return failure();
-
- result.addTypes(value.getType());
- return success();
+static mlir::ParseResult parseAssignOp(mlir::OpAsmParser &parser, mlir::OperationState &result)
+{
+ mlir::DenseElementsAttr value;
+ if (parser.parseOptionalAttrDict(result.attributes) ||
+ parser.parseAttribute(value, "value", result.attributes)) {
+ return failure();
+ }
+
+ result.addTypes(value.getType());
+ return success();
}
/// The 'OpAsmPrinter' class is a stream that allows for formatting
/// strings, attributes, operands, types, etc.
-static void print(mlir::OpAsmPrinter &printer, AssignOp op) {
- printer << "assign ";
- printer.printType(op.getType());
-// printer << op.value();
+static void print(mlir::OpAsmPrinter &printer, AssignOp op)
+{
+ printer << "assign ";
+ printer.printType(op.getType());
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// BaseOp
-void BaseOp::build(OpBuilder &builder, OperationState &state,
- uint64_t id, StringRef opCode)
+void BaseOp::build(OpBuilder &builder, OperationState &state, uint64_t id, StringRef opCode)
{
state.addAttribute("id", builder.getI64IntegerAttr(id));
state.addAttribute("opCode", builder.getStringAttr(opCode));
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// FallThroughOp
-void FallThroughOp::build(OpBuilder &builder, OperationState &state,
- uint64_t address, Block* dest, uint64_t destaddr)
+void FallThroughOp::build(OpBuilder &builder, OperationState &state, uint64_t address, Block* dest, uint64_t destaddr)
{
state.addAttribute("address", builder.getI64IntegerAttr(address));
state.addAttribute("destaddr", builder.getI64IntegerAttr(destaddr));
state.addSuccessors(dest);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// RetOp
void RetOp::build(OpBuilder &builder, OperationState &state, uint64_t address)
@@ -264,9 +261,9 @@ void RetOp::build(OpBuilder &builder, OperationState &state, uint64_t address)
state.addAttribute("address", builder.getI64IntegerAttr(address));
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// TableGen'd op method definitions
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
#define GET_OP_CLASSES
#include "Dialect/PluginOps.cpp.inc"
\ No newline at end of file
diff --git a/lib/Dialect/PluginTypes.cpp b/lib/Dialect/PluginTypes.cpp
index edccdd5..396bf0f 100644
--- a/lib/Dialect/PluginTypes.cpp
+++ b/lib/Dialect/PluginTypes.cpp
@@ -28,7 +28,7 @@ using namespace mlir;
using namespace PluginIR;
namespace PluginIR {
-namespace detail {
+namespace Detail {
/// Integer Type Storage and Uniquing.
struct PluginIntegerTypeStorage : public TypeStorage {
PluginIntegerTypeStorage(unsigned width,
@@ -38,16 +38,18 @@ namespace detail {
/// The hash key used for uniquing.
using KeyTy = std::pair<unsigned, PluginIntegerType::SignednessSemantics>;
- static llvm::hash_code hashKey(const KeyTy &key) {
+ static llvm::hash_code hashKey(const KeyTy &key)
+ {
return llvm::hash_value(key);
}
- bool operator==(const KeyTy &key) const {
+ bool operator==(const KeyTy &key) const
+ {
return KeyTy(width, signedness) == key;
}
- static PluginIntegerTypeStorage *construct(TypeStorageAllocator &allocator,
- KeyTy key) {
+ static PluginIntegerTypeStorage *construct(TypeStorageAllocator &allocator, KeyTy key)
+ {
return new (allocator.allocate<PluginIntegerTypeStorage>())
PluginIntegerTypeStorage(key.first, key.second);
}
@@ -62,12 +64,13 @@ namespace detail {
/// The hash key used for uniquing.
using KeyTy = unsigned;
- bool operator==(const KeyTy &key) const {
+ bool operator==(const KeyTy &key) const
+ {
return KeyTy(width) == key;
}
- static PluginFloatTypeStorage *construct(TypeStorageAllocator &allocator,
- KeyTy key) {
+ static PluginFloatTypeStorage *construct(TypeStorageAllocator &allocator, KeyTy key)
+ {
return new (allocator.allocate<PluginFloatTypeStorage>())
PluginFloatTypeStorage(key);
}
@@ -81,26 +84,27 @@ namespace detail {
PluginPointerTypeStorage(const KeyTy &key)
: pointee(std::get<0>(key)), readOnlyPointee(std::get<1>(key)) {}
- static PluginPointerTypeStorage *construct(TypeStorageAllocator &allocator,
- KeyTy key) {
+ static PluginPointerTypeStorage *construct(TypeStorageAllocator &allocator, KeyTy key)
+ {
return new (allocator.allocate<PluginPointerTypeStorage>())
PluginPointerTypeStorage(key);
}
- bool operator==(const KeyTy &key) const {
+ bool operator==(const KeyTy &key) const
+ {
return std::make_tuple(pointee, readOnlyPointee) == key;
}
Type pointee;
unsigned readOnlyPointee;
};
-} // namespace detail
+} // namespace Detail
} // namespace PluginIR
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin TypeBase
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
PluginTypeID PluginTypeBase::getPluginTypeID ()
{
@@ -119,7 +123,7 @@ PluginTypeID PluginTypeBase::getPluginTypeID ()
if (auto Ty = dyn_cast<PluginIR::PluginPointerType>()) {
return Ty.getPluginTypeID ();
}
- return PluginTypeID::UndefTyID;
+ return PluginTypeID::UndefTyID;
}
unsigned PluginTypeBase::getPluginIntOrFloatBitWidth ()
@@ -159,9 +163,9 @@ unsigned PluginTypeBase::getTypeSize ()
return size;
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Integer Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
unsigned PluginIntegerType::getWidth() const
{
@@ -175,10 +179,8 @@ PluginIntegerType::SignednessSemantics PluginIntegerType::getSignedness() const
PluginTypeID PluginIntegerType::getPluginTypeID()
{
- if (isSigned())
- {
- switch (getWidth())
- {
+ if (isSigned()) {
+ switch (getWidth()) {
case 1:
return PluginTypeID::IntegerTy1ID;
case 8:
@@ -193,10 +195,8 @@ PluginTypeID PluginIntegerType::getPluginTypeID()
return PluginTypeID::UndefTyID;
}
}
- if (isUnsigned())
- {
- switch (getWidth())
- {
+ if (isUnsigned()) {
+ switch (getWidth()) {
case 1:
return PluginTypeID::UIntegerTy1ID;
case 8:
@@ -214,14 +214,15 @@ PluginTypeID PluginIntegerType::getPluginTypeID()
return PluginTypeID::UndefTyID;
}
-PluginIntegerType PluginIntegerType::get (MLIRContext *context, unsigned width, PluginIntegerType::SignednessSemantics signedness)
+PluginIntegerType PluginIntegerType::get (MLIRContext *context, unsigned width,
+ PluginIntegerType::SignednessSemantics signedness)
{
return Base::get(context, width, signedness);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Float Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
unsigned PluginFloatType::getWidth () const
{
@@ -230,10 +231,12 @@ unsigned PluginFloatType::getWidth () const
PluginTypeID PluginFloatType::getPluginTypeID()
{
- if (getWidth() == 32)
+ if (getWidth() == 32) {
return PluginTypeID::FloatTyID;
- if (getWidth() == 64)
+ }
+ if (getWidth() == 64) {
return PluginTypeID::DoubleTyID;
+ }
return PluginTypeID::UndefTyID;
}
@@ -242,36 +245,36 @@ PluginFloatType PluginFloatType::get (MLIRContext *context, unsigned width)
return Base::get(context, width);
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Boolean Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
PluginTypeID PluginBooleanType::getPluginTypeID()
{
return PluginTypeID::BooleanTyID;
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Void Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
PluginTypeID PluginVoidType::getPluginTypeID()
{
return PluginTypeID::VoidTyID;
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Undef Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
PluginTypeID PluginUndefType::getPluginTypeID()
{
return PluginTypeID::UndefTyID;
}
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
// Plugin Pointer Type
-//===----------------------------------------------------------------------===//
+// ===----------------------------------------------------------------------===//
PluginTypeID PluginPointerType::getPluginTypeID()
{
@@ -291,4 +294,4 @@ unsigned PluginPointerType::isReadOnlyElem()
PluginPointerType PluginPointerType::get (MLIRContext *context, Type pointee, unsigned readOnlyPointee)
{
return Base::get(context, pointee, readOnlyPointee);
-}
\ No newline at end of file
+}
diff --git a/lib/PluginAPI/PluginClientAPI.cpp b/lib/PluginAPI/PluginClientAPI.cpp
index 1c4dbf9..5e454d7 100644
--- a/lib/PluginAPI/PluginClientAPI.cpp
+++ b/lib/PluginAPI/PluginClientAPI.cpp
@@ -19,6 +19,32 @@
#include "PluginAPI/PluginClientAPI.h"
namespace PluginAPI {
+
+string PluginClientAPI::GetDeclSourceFile(uint64_t gccDataAddr)
+{
+ return gimpleConversion.DeclSourceFile(gccDataAddr);
+}
+
+string PluginClientAPI::VariableName(int64_t gccDataAddr)
+{
+ return gimpleConversion.GetVariableName(gccDataAddr);
+}
+
+string PluginClientAPI::FuncName(int64_t gccDataAddr)
+{
+ return gimpleConversion.GetFuncName(gccDataAddr);
+}
+
+int PluginClientAPI::GetDeclSourceLine(uint64_t gccDataAddr)
+{
+ return gimpleConversion.DeclSourceLine(gccDataAddr);
+}
+
+int PluginClientAPI::GetDeclSourceColumn(uint64_t gccDataAddr)
+{
+ return gimpleConversion.DeclSourceColumn(gccDataAddr);
+}
+
uint64_t PluginClientAPI::CreateBlock(uint64_t funcAddr, uint64_t bbAddr)
{
return gimpleConversion.CreateBlock(funcAddr, bbAddr);
@@ -142,20 +168,17 @@ bool PluginClientAPI::SetLhsInCallOp(uint64_t callId, uint64_t lhsId)
return gimpleConversion.SetGimpleCallLHS(callId, lhsId);
}
-uint32_t PluginClientAPI::AddArgInPhiOp(uint64_t phiId, uint64_t argId,
- uint64_t predId, uint64_t succId)
+uint32_t PluginClientAPI::AddArgInPhiOp(uint64_t phiId, uint64_t argId, uint64_t predId, uint64_t succId)
{
return gimpleConversion.AddPhiArg(phiId, argId, predId, succId);
}
-uint64_t PluginClientAPI::CreateCallOp(uint64_t blockId, uint64_t funcId,
- vector<uint64_t> &argIds)
+uint64_t PluginClientAPI::CreateCallOp(uint64_t blockId, uint64_t funcId, vector<uint64_t> &argIds)
{
return gimpleConversion.CreateGcallVec(blockId, funcId, argIds);
}
-uint64_t PluginClientAPI::CreateAssignOp(uint64_t blockId, IExprCode iCode,
- vector<uint64_t> &argIds)
+uint64_t PluginClientAPI::CreateAssignOp(uint64_t blockId, IExprCode iCode, vector<uint64_t> &argIds)
{
return gimpleConversion.CreateGassign(blockId, iCode, argIds);
}
@@ -170,8 +193,7 @@ mlir::Value PluginClientAPI::CreateConstOp(mlir::Attribute attr, mlir::Type type
}
uint64_t PluginClientAPI::CreateCondOp(uint64_t blockId, IComparisonCode iCode,
- uint64_t LHS, uint64_t RHS,
- uint64_t tbaddr, uint64_t fbaddr)
+ uint64_t LHS, uint64_t RHS, uint64_t tbaddr, uint64_t fbaddr)
{
return gimpleConversion.CreateGcond(blockId, iCode, LHS, RHS, tbaddr, fbaddr);
}
diff --git a/lib/PluginClient/PluginLog.cpp b/lib/PluginClient/PluginLog.cpp
index ad2b985..6cdf7af 100644
--- a/lib/PluginClient/PluginLog.cpp
+++ b/lib/PluginClient/PluginLog.cpp
@@ -36,6 +36,7 @@ constexpr int LOG_BUF_SIZE = 10240;
constexpr int BASE_DATE = 1900;
static LogPriority g_priority = PRIORITY_WARN; // log打印的级别控制
static std::mutex g_mutex; // 线程锁
+static unsigned int g_logFileSize = 10 * 1024 * 1024;
shared_ptr<fstream> g_fs;
static void LogWriteInit(const string& data);
@@ -44,16 +45,22 @@ static void (*g_writeToLog)(const string& data) = LogWriteInit;
static void GetLogFileName(string& fileName)
{
time_t nowTime = time(nullptr);
+ if (nowTime == -1) {
+ printf("%s fail\n", __func__);
+ }
struct tm *t = localtime(&nowTime);
char buf[100];
- sprintf(buf, "/tmp/pin_client%d_%4d%02d%02d_%02d_%02d_%02d.log", getpid(),
+ int ret = sprintf(buf, "/tmp/pin_client%d_%4d%02d%02d_%02d_%02d_%02d.log", getpid(),
t->tm_year + BASE_DATE, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec);
+ if (ret < 0) {
+ printf("%s sprintf fail\n", __func__);
+ }
fileName = buf;
}
static void LogWriteFile(const string& data)
{
- if (g_fs->tellg() > LOG_FILE_SIZE) {
+ if (g_fs->tellg() > g_logFileSize) {
g_fs->close();
string fileName;
GetLogFileName(fileName);
@@ -75,7 +82,7 @@ static void LogWriteInit(const string& data)
g_writeToLog(data);
}
-void CloseLog(void)
+void CloseLog()
{
if (g_fs) {
if (g_fs->is_open()) {
@@ -84,14 +91,24 @@ void CloseLog(void)
}
}
+void SetLogFileSize(unsigned int size)
+{
+ g_logFileSize = size;
+}
+
static void LogWrite(const char *tag, const char *msg)
{
time_t nowTime = time(nullptr);
+ if (nowTime == -1) {
+ printf("%s fail\n", __func__);
+ }
struct tm *t = localtime(&nowTime);
char buf[30];
- sprintf(buf, "%4d-%02d-%02d %02d:%02d:%02d ", t->tm_year + BASE_DATE, t->tm_mon + 1, t->tm_mday,
+ int ret = sprintf(buf, "%4d-%02d-%02d %02d:%02d:%02d ", t->tm_year + BASE_DATE, t->tm_mon + 1, t->tm_mday,
t->tm_hour, t->tm_min, t->tm_sec);
-
+ if (ret < 0) {
+ printf("%s sprintf fail\n", __func__);
+ }
string stag = tag;
string smsg = msg;
string data = buf + stag + smsg;
@@ -104,7 +121,10 @@ void LogPrint(LogPriority priority, const char *tag, const char *fmt, ...)
char buf[LOG_BUF_SIZE];
va_start(ap, fmt);
- vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+ int ret = vsnprintf(buf, LOG_BUF_SIZE, fmt, ap);
+ if (ret < 0) {
+ printf("%s vsnprintf fail\n", __func__);
+ }
va_end(ap);
if (priority <= g_priority) {
diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp
index 3a71ffe..b5974aa 100644
--- a/lib/Translate/GimpleToPluginOps.cpp
+++ b/lib/Translate/GimpleToPluginOps.cpp
@@ -53,7 +53,7 @@ namespace PluginIR {
using namespace mlir::Plugin;
using namespace mlir;
-namespace detail {
+namespace Detail {
class BlockFromGimpleTranslatorImpl {
public:
std::map<basic_block, Block*> blockMaps;
@@ -65,13 +65,13 @@ private:
mlir::MLIRContext &context;
};
-} // namespace detail
+} // namespace Detail
-GimpleToPluginOps::GimpleToPluginOps (mlir::MLIRContext &context) :
- builder(&context), typeTranslator(context), bbTranslator(new detail::BlockFromGimpleTranslatorImpl(context))
+GimpleToPluginOps::GimpleToPluginOps(mlir::MLIRContext &context) : builder(&context),
+ typeTranslator(context), bbTranslator(new Detail::BlockFromGimpleTranslatorImpl(context))
{}
-GimpleToPluginOps::~GimpleToPluginOps ()
+GimpleToPluginOps::~GimpleToPluginOps()
{}
static IComparisonCode TranslateCmpCode(enum tree_code ccode)
@@ -151,7 +151,6 @@ static IExprCode TranslateExprCode(enum tree_code ccode)
case NOP_EXPR:
return IExprCode::Nop;
default:
- // printf("tcc_binary: %d not suppoted!\n", ccode);
break;
}
return IExprCode::UNDEF;
@@ -185,7 +184,6 @@ static enum tree_code TranslateExprCodeToTreeCode(IExprCode ccode)
case IExprCode::Nop:
return NOP_EXPR;
default:
- // printf("tcc_binary: %d not suppoted!\n", ccode);
break;
}
// FIXME.
@@ -220,6 +218,40 @@ static StringRef GimpleCodeToOperationName(enum gimple_code tcode)
return ret;
}
+string GimpleToPluginOps::DeclSourceFile(uint64_t gccDataAddr)
+{
+ tree decl = (tree)gccDataAddr;
+ string sourceFile = DECL_SOURCE_FILE(decl);
+ return sourceFile;
+}
+
+string GimpleToPluginOps::GetVariableName(uint64_t gccDataAddr)
+{
+ tree decl = (tree)gccDataAddr;
+ string pointer = DECL_NAME(decl) != NULL_TREE ? IDENTIFIER_POINTER(DECL_NAME(decl)) : "<unamed>";
+ return pointer;
+}
+
+string GimpleToPluginOps::GetFuncName(uint64_t gccDataAddr)
+{
+ string funcName = function_name((function *)gccDataAddr);
+ return funcName;
+}
+
+int GimpleToPluginOps::DeclSourceLine(uint64_t gccDataAddr)
+{
+ tree decl = (tree)gccDataAddr;
+ int line = DECL_SOURCE_LINE(decl);
+ return line;
+}
+
+int GimpleToPluginOps::DeclSourceColumn(uint64_t gccDataAddr)
+{
+ tree decl = (tree)gccDataAddr;
+ int column = DECL_SOURCE_COLUMN(decl);
+ return column;
+}
+
uint64_t GimpleToPluginOps::CreateBlock(uint64_t funcAddr, uint64_t bbAddr)
{
basic_block address = reinterpret_cast<basic_block>(bbAddr);
@@ -484,7 +516,7 @@ void GimpleToPluginOps::RedirectFallthroughTarget(uint64_t src, uint64_t dest)
{
basic_block srcbb = reinterpret_cast<basic_block>(reinterpret_cast<void*>(src));
basic_block destbb = reinterpret_cast<basic_block>(reinterpret_cast<void*>(dest));
- assert(single_succ_p (srcbb));
+ assert(single_succ_p(srcbb));
redirect_edge_and_branch (single_succ_edge(srcbb), destbb);
}
@@ -537,7 +569,7 @@ Operation *GimpleToPluginOps::BuildOperation(uint64_t id)
break;
}
case GIMPLE_COND: {
- assert(EDGE_COUNT (stmt->bb->succs) == 2);
+ assert(EDGE_COUNT(stmt->bb->succs) == 2);
Block* trueBlock = bbTranslator->blockMaps[EDGE_SUCC(stmt->bb, 0)->dest];
Block* falseBlock = bbTranslator->blockMaps[EDGE_SUCC(stmt->bb, 1)->dest];
CondOp condOp = BuildCondOp(id, (uint64_t)stmt->bb,
@@ -644,15 +676,13 @@ uint64_t GimpleToPluginOps::CreateGcallVec(uint64_t blockId, uint64_t funcId,
gcall *ret = gimple_build_call_vec (fn, vargs);
basic_block bb = reinterpret_cast<basic_block>(blockId);
if (bb != nullptr) {
- gimple_stmt_iterator si;
- si = gsi_last_bb (bb);
+ gimple_stmt_iterator si = gsi_last_bb (bb);
gsi_insert_after (&si, ret, GSI_NEW_STMT);
}
return reinterpret_cast<uint64_t>(reinterpret_cast<void*>(ret));
}
-uint32_t GimpleToPluginOps::AddPhiArg(uint64_t phiId, uint64_t argId,
- uint64_t predId, uint64_t succId)
+uint32_t GimpleToPluginOps::AddPhiArg(uint64_t phiId, uint64_t argId, uint64_t predId, uint64_t succId)
{
gphi *phi = reinterpret_cast<gphi*>(phiId);
tree arg = reinterpret_cast<tree>(argId);
@@ -681,31 +711,25 @@ uint64_t GimpleToPluginOps::CreateGassign(uint64_t blockId, IExprCode iCode,
if (iCode == IExprCode::UNDEF) {
ret = gimple_build_assign(vargs[0], vargs[1]);
} else {
- ret = gimple_build_assign(vargs[0],
- TranslateExprCodeToTreeCode(iCode),
- vargs[1]);
+ ret = gimple_build_assign(vargs[0], TranslateExprCodeToTreeCode(iCode), vargs[1]);
}
} else if (vargs.size() == 3) {
- ret = gimple_build_assign(vargs[0], TranslateExprCodeToTreeCode(iCode),
- vargs[1], vargs[2]);
+ ret = gimple_build_assign(vargs[0], TranslateExprCodeToTreeCode(iCode), vargs[1], vargs[2]);
} else if (vargs.size() == 4) {
- ret = gimple_build_assign(vargs[0], TranslateExprCodeToTreeCode(iCode),
- vargs[1], vargs[2], vargs[3]);
+ ret = gimple_build_assign(vargs[0], TranslateExprCodeToTreeCode(iCode), vargs[1], vargs[2], vargs[3]);
} else {
printf("ERROR size: %ld.\n", vargs.size());
}
basic_block bb = reinterpret_cast<basic_block>(blockId);
if (bb != nullptr) {
- gimple_stmt_iterator si;
- si = gsi_last_bb (bb);
+ gimple_stmt_iterator si = gsi_last_bb (bb);
gsi_insert_after (&si, ret, GSI_NEW_STMT);
}
return reinterpret_cast<uint64_t>(reinterpret_cast<void*>(ret));
}
uint64_t GimpleToPluginOps::CreateGcond(uint64_t blockId, IComparisonCode iCode,
- uint64_t lhsId, uint64_t rhsId,
- uint64_t tbaddr, uint64_t fbaddr)
+ uint64_t lhsId, uint64_t rhsId, uint64_t tbaddr, uint64_t fbaddr)
{
tree lhs = reinterpret_cast<tree>(lhsId);
tree rhs = reinterpret_cast<tree>(rhsId);
@@ -713,14 +737,13 @@ uint64_t GimpleToPluginOps::CreateGcond(uint64_t blockId, IComparisonCode iCode,
lhs, rhs, NULL_TREE, NULL_TREE);
basic_block bb = reinterpret_cast<basic_block>(blockId);
if (bb != nullptr) {
- gimple_stmt_iterator si;
- si = gsi_last_bb (bb);
+ gimple_stmt_iterator si = gsi_last_bb (bb);
gsi_insert_after (&si, ret, GSI_NEW_STMT);
}
basic_block tb = reinterpret_cast<basic_block>(tbaddr);
basic_block fb = reinterpret_cast<basic_block>(fbaddr);
- assert(make_edge (bb, tb, EDGE_TRUE_VALUE));
- assert(make_edge (bb, fb, EDGE_FALSE_VALUE));
+ assert(make_edge(bb, tb, EDGE_TRUE_VALUE));
+ assert(make_edge(bb, fb, EDGE_FALSE_VALUE));
return reinterpret_cast<uint64_t>(reinterpret_cast<void*>(ret));
}
@@ -728,12 +751,11 @@ void GimpleToPluginOps::CreateFallthroughOp(uint64_t addr, uint64_t destaddr)
{
basic_block src = reinterpret_cast<basic_block>(addr);
basic_block dest = reinterpret_cast<basic_block>(destaddr);
- assert(make_single_succ_edge (src, dest, EDGE_FALLTHRU));
+ assert(make_single_succ_edge(src, dest, EDGE_FALLTHRU));
}
CondOp GimpleToPluginOps::BuildCondOp(uint64_t gcondId, uint64_t address,
- Block* b1, Block* b2, uint64_t tbaddr,
- uint64_t fbaddr)
+ Block* b1, Block* b2, uint64_t tbaddr, uint64_t fbaddr)
{
gcond *stmt = reinterpret_cast<gcond*>(gcondId);
tree lhsPtr = gimple_cond_lhs(stmt);
@@ -812,16 +834,9 @@ Value GimpleToPluginOps::TreeToValue(uint64_t treeId)
mlir::Value opValue;
switch (TREE_CODE(t)) {
case INTEGER_CST : {
- mlir::Attribute initAttr;
- if (tree_fits_shwi_p(t)) {
- signed HOST_WIDE_INT sinit = tree_to_shwi(t);
- initAttr = builder.getI64IntegerAttr(sinit);
- } else if (tree_fits_uhwi_p(t)) {
- unsigned HOST_WIDE_INT uinit = tree_to_uhwi(t);
- initAttr = builder.getI64IntegerAttr(uinit);
- } else {
- abort();
- }
+ unsigned HOST_WIDE_INT init = tree_to_uhwi(t);
+ // FIXME : AnyAttr!
+ mlir::Attribute initAttr = builder.getI64IntegerAttr(init);
opValue = builder.create<ConstOp>(
builder.getUnknownLoc(), treeId, IDefineCode::IntCST,
readOnly, initAttr, rPluginType);
@@ -863,11 +878,9 @@ Value GimpleToPluginOps::TreeToValue(uint64_t treeId)
void GimpleToPluginOps::DebugValue(uint64_t valId)
{
tree t = reinterpret_cast<tree>(valId);
- // debug_tree (t);
}
-mlir::Value GimpleToPluginOps::BuildMemRef(PluginIR::PluginTypeBase type,
- uint64_t baseId, uint64_t offsetId)
+mlir::Value GimpleToPluginOps::BuildMemRef(PluginIR::PluginTypeBase type, uint64_t baseId, uint64_t offsetId)
{
tree refType = (tree)pluginTypeTranslator.translateType(type);
tree base = (tree)baseId;
@@ -883,7 +896,7 @@ bool GimpleToPluginOps::ProcessGimpleStmt(intptr_t bbPtr, Region& rg)
for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si); gsi_next (&si)) {
gphi *p = si.phi ();
uint64_t id = reinterpret_cast<uint64_t>(reinterpret_cast<void*>(p));
- BuildPhiOp(id); // FIXME: Check result.
+ BuildPhiOp(id); // FIXME: Check result.
}
for (gimple_stmt_iterator si = gsi_start_bb (bb); !gsi_end_p (si); gsi_next (&si)) {
@@ -892,7 +905,7 @@ bool GimpleToPluginOps::ProcessGimpleStmt(intptr_t bbPtr, Region& rg)
if (BuildOperation(id) == nullptr) {
printf("ERROR: BuildOperation!");
}
- if(gimple_code(stmt) == GIMPLE_COND) {
+ if (gimple_code(stmt) == GIMPLE_COND) {
putTerminator = true;
}
}
@@ -907,7 +920,6 @@ bool GimpleToPluginOps::ProcessGimpleStmt(intptr_t bbPtr, Region& rg)
// Process other condition, such as return
builder.create<RetOp>(builder.getUnknownLoc(), (uint64_t)bb);
} else {
- // Should unreachable;
assert(false);
}
}
diff --git a/lib/Translate/TypeTranslation.cpp b/lib/Translate/TypeTranslation.cpp
index 66521a9..7c7cff4 100644
--- a/lib/Translate/TypeTranslation.cpp
+++ b/lib/Translate/TypeTranslation.cpp
@@ -49,7 +49,7 @@
using namespace mlir;
namespace PluginIR {
-namespace detail {
+namespace Detail {
/* Support for translating Plugin IR types to MLIR Plugin dialect types. */
class TypeFromPluginIRTranslatorImpl {
public:
@@ -82,7 +82,8 @@ private:
PluginTypeBase translatePrimitiveType (tree type)
{
if (TREE_CODE(type) == INTEGER_TYPE)
- return PluginIntegerType::get(&context, getBitWidth(type), isUnsigned(type) ? PluginIntegerType::Unsigned : PluginIntegerType::Signed);
+ return PluginIntegerType::get(&context, getBitWidth(type),
+ isUnsigned(type) ? PluginIntegerType::Unsigned : PluginIntegerType::Signed);
if (TREE_CODE(type) == REAL_TYPE)
return PluginFloatType::get(&context, getBitWidth(type));
if (TREE_CODE(type) == BOOLEAN_TYPE)
@@ -90,7 +91,8 @@ private:
if (TREE_CODE(type) == VOID_TYPE)
return PluginVoidType::get(&context);
if (TREE_CODE(type) == POINTER_TYPE)
- return PluginPointerType::get(&context, translatePrimitiveType(TREE_TYPE(type)), TYPE_READONLY(TREE_TYPE(type)) ? 1 : 0);
+ return PluginPointerType::get(&context, translatePrimitiveType(TREE_TYPE(type)),
+ TYPE_READONLY(TREE_TYPE(type)) ? 1 : 0);
return PluginUndefType::get(&context);
}
@@ -111,19 +113,20 @@ public:
}
private:
- unsigned getBitWidth (PluginIntegerType type)
+ unsigned getBitWidth(PluginIntegerType type)
{
return type.getWidth();
}
- bool isUnsigned (PluginIntegerType type)
+ bool isUnsigned(PluginIntegerType type)
{
- if(type.isUnsigned())
+ if (type.isUnsigned()) {
return true;
+ }
return false;
}
- tree translatePrimitiveType (PluginTypeBase type)
+ tree translatePrimitiveType(PluginTypeBase type)
{
if (auto Ty = type.dyn_cast<PluginIntegerType>()) {
if (isUnsigned(Ty)) {
@@ -178,14 +181,13 @@ private:
}
return NULL;
}
-
};
-} // namespace detail
+} // namespace Detail
} // namespace PluginIR
PluginIR::TypeFromPluginIRTranslator::TypeFromPluginIRTranslator(mlir::MLIRContext &context)
- : impl(new detail::TypeFromPluginIRTranslatorImpl(context)) {}
+ : impl(new Detail::TypeFromPluginIRTranslatorImpl(context)) {}
PluginIR::TypeFromPluginIRTranslator::~TypeFromPluginIRTranslator() {}
@@ -206,7 +208,7 @@ uint64_t PluginIR::TypeFromPluginIRTranslator::getBitWidth(PluginTypeBase type)
PluginIR::TypeToPluginIRTranslator::TypeToPluginIRTranslator()
- : impl(new detail::TypeToPluginIRTranslatorImpl()) {}
+ : impl(new Detail::TypeToPluginIRTranslatorImpl()) {}
PluginIR::TypeToPluginIRTranslator::~TypeToPluginIRTranslator() {}
diff --git a/lib/IRTrans/IRTransPlugin.cpp b/lib/gccPlugin/gccPlugin.cpp
old mode 100644
new mode 100755
similarity index 52%
rename from lib/IRTrans/IRTransPlugin.cpp
rename to lib/gccPlugin/gccPlugin.cpp
index 459cef0..103d709
--- a/lib/IRTrans/IRTransPlugin.cpp
+++ b/lib/gccPlugin/gccPlugin.cpp
@@ -17,78 +17,81 @@
Author: Mingchuan Wu and Yancheng Li
Create: 2022-08-18
Description:
- This file contains the declaration of the PluginAPI class.
+ This file contains the functions of gcc plugin callback and init.
+ 主要完成功能实现RegisterPluginEvent和RegisterPassManagerSetup功能完成gcc
+ 版本号检查当触发注册点对应事件时回调server注册的用户函数
+ plugin_init为整个程序入口函数
*/
-#include <map>
-#include <set>
-#include <vector>
#include <string>
-#include <json/json.h>
#include "PluginClient/PluginClient.h"
#include "plugin-version.h"
-#include "IRTrans/IRTransPlugin.h"
-#include "context.h"
#include "tree-pass.h"
#include "tree.h"
-#include "tree-cfg.h"
+#include "context.h"
+#include "gccPlugin/gccPlugin.h"
using namespace PinClient;
-using std::vector;
int plugin_is_GPL_compatible;
static pid_t g_serverPid;
-/* gcc插件end事件回调函数 */
-static void GccEnd(void *gccData, void *userData)
+/* gcc插件end事件回调函数,停止插件服务端,等待子进程结束,删除端口号 */
+void GccEnd(void *gccData, void *userData)
{
int status = 0;
- std::shared_ptr<PluginClient> client = PluginClient::GetInstance();
- if (client == nullptr) {
+ PluginClient *client = PluginClient::GetInstance();
+ if (!client->GetStartFlag()) {
return;
}
+
LOGI("gcc optimize has been done! now close server...\n");
client->ReceiveSendMsg("stop", "");
if (client->GetUserFuncState() != STATE_TIMEOUT) {
waitpid(g_serverPid, &status, 0);
} else {
- client->DeletePortFromLockFile(client->GetGrpcPort());
+ client->DeleteGrpcPort();
}
-
LOGI("client pid:%d quit\n", getpid());
}
+static void WaitIRTrans(void *gccData, PluginClient *client)
+{
+ while (1) {
+ UserFuncStateEnum state = client->GetUserFuncState();
+ /* server获取到client对应函数的执行结果后,向client回复已执行完,跳出循环执行下一个函数 */
+ if (state == STATE_END) {
+ client->SetUserFuncState(STATE_WAIT_BEGIN);
+ break;
+ } else if (state == STATE_TIMEOUT) {
+ break;
+ } else if (state == STATE_BEGIN) {
+ string funcName = client->GetPluginAPIName();
+ string param = client->GetPluginAPIParam();
+ if (funcName != "") {
+ client->SetUserFuncState(STATE_WAIT_IR);
+ client->GetIRTransResult(gccData, funcName, param);
+ }
+ }
+ }
+}
+
/* gcc插件回调函数,当注册的plugin_event触发时,进入此函数 */
-static void GccEventCallback(void *gccData, void *userData)
+void GccEventCallback(void *gccData, void *userData)
{
- std::shared_ptr<PluginClient> client = PluginClient::GetInstance();
+ PluginClient *client = PluginClient::GetInstance();
InjectPoint *inject = (InjectPoint *)userData;
vector<string> userFuncs = client->GetFuncNameByInject(*inject);
string key = "injectPoint";
string value;
+
for (auto &userFunc : userFuncs) {
if (client->GetUserFuncState() == STATE_TIMEOUT) {
break;
}
value = std::to_string(*inject) + ":" + userFunc;
client->ReceiveSendMsg(key, value);
- while (1) {
- UserFuncStateEnum state = client->GetUserFuncState();
- /* server获取到client对应函数的执行结果后,向client回复已执行完,跳出循环执行下一个函数 */
- if (state == STATE_END) {
- client->SetUserFuncState(STATE_WAIT_BEGIN);
- break;
- } else if (state == STATE_TIMEOUT) {
- break;
- } else if (state == STATE_BEGIN) {
- string funcName = client->GetPluginAPIName();
- string param = client->GetPluginAPIParam();
- if (funcName != "") {
- client->SetUserFuncState(STATE_WAIT_IR);
- client->IRTransBegin(funcName, param);
- }
- }
- }
+ WaitIRTrans(gccData, client);
}
LOGI("%s end!\n", __func__);
}
@@ -107,6 +110,7 @@ static InjectPoint g_event[] = {
HANDLE_AFTER_ALL_PASS,
HANDLE_COMPILE_END,
HANDLE_MANAGER_SETUP,
+ HANDLE_INCLUDE_FILE,
HANDLE_MAX
};
@@ -121,84 +125,67 @@ int RegisterPluginEvent(InjectPoint inject, const string& pluginName)
return 0;
}
-void ManagerSetupCallback(void)
+static void ManagerSetupCallback(unsigned int index, function *fun)
{
string key = "injectPoint";
InjectPoint inject = HANDLE_MANAGER_SETUP;
- std::shared_ptr<PluginClient> client = PluginClient::GetInstance();
+ PluginClient *client = PluginClient::GetInstance();
vector<string> userFuncs = client->GetFuncNameByInject(inject);
- for (auto &userFunc : userFuncs) {
- if (client->GetUserFuncState() == STATE_TIMEOUT) {
- break;
- }
- string value = std::to_string(inject) + ":" + userFunc;
+ if (index < userFuncs.size()) {
+ string name = userFuncs[index].substr(0, userFuncs[index].find_first_of(","));
+ string value = std::to_string(inject) + ":" + name + ",params:" + std::to_string((uintptr_t)fun);
client->ReceiveSendMsg(key, value);
- while (1) {
- UserFuncStateEnum state = client->GetUserFuncState();
- /* server获取到client对应函数的执行结果后,向client回复已执行完,跳出循环执行下一个函数 */
- if (state == STATE_END) {
- client->SetUserFuncState(STATE_WAIT_BEGIN);
- break;
- } else if (state == STATE_TIMEOUT) {
- break;
- } else if (state == STATE_BEGIN) {
- string funcName = client->GetPluginAPIName();
- string param = client->GetPluginAPIParam();
- if (funcName != "") {
- client->SetUserFuncState(STATE_WAIT_IR);
- client->IRTransBegin(funcName, param);
- }
- }
- }
+ WaitIRTrans(nullptr, client);
}
}
-struct RltPass: rtl_opt_pass {
+struct RtlPass: rtl_opt_pass {
public:
- RltPass(pass_data passData): rtl_opt_pass(passData, g)
+ RtlPass(pass_data passData, unsigned int indx): rtl_opt_pass(passData, g), index(indx)
{
}
- unsigned int execute(function *fun) override
+ /* unsigned int execute(function *fun) override
{
- ManagerSetupCallback();
+ ManagerSetupCallback(index, fun);
return 0;
- }
- RltPass* clone() override
- {
- return this;
- }
+ } */
+
+private:
+ unsigned int index;
};
struct SimpleIPAPass: simple_ipa_opt_pass {
public:
- SimpleIPAPass(pass_data passData): simple_ipa_opt_pass(passData, g)
+ SimpleIPAPass(pass_data passData, unsigned int indx): simple_ipa_opt_pass(passData, g), index(indx)
{
}
- unsigned int execute(function *fun) override
+ /* unsigned int execute(function *fun) override
{
- ManagerSetupCallback();
+ ManagerSetupCallback(index, fun);
return 0;
- }
- SimpleIPAPass* clone() override
- {
- return this;
- }
+ } */
+
+private:
+ unsigned int index;
};
struct GimplePass: gimple_opt_pass {
public:
- GimplePass(pass_data passData): gimple_opt_pass(passData, g)
+ GimplePass(pass_data passData, unsigned int indx): gimple_opt_pass(passData, g), index(indx)
{
}
unsigned int execute(function *fun) override
{
- ManagerSetupCallback();
+ ManagerSetupCallback(index, fun);
return 0;
}
GimplePass* clone() override
{
return this;
}
+
+private:
+ unsigned int index;
};
static std::map<RefPassName, string> g_refPassName {
@@ -208,16 +195,13 @@ static std::map<RefPassName, string> g_refPassName {
{PASS_LOOP, "loop"},
};
-int RegisterPassManagerSetup(InjectPoint inject, const ManagerSetupData& setupData, const string& pluginName)
+void RegisterPassManagerSetup(unsigned int index, const ManagerSetupData& setupData, const string& pluginName)
{
- if (inject != HANDLE_MANAGER_SETUP) {
- return -1;
- }
-
struct register_pass_info passInfo;
+ string passDataName = "managerSetupPass_" + g_refPassName[setupData.refPassName];
pass_data passData = {
.type = GIMPLE_PASS,
- .name = "managerSetupPass",
+ .name = passDataName.c_str(),
.optinfo_flags = OPTGROUP_NONE,
.tv_id = TV_NONE,
.properties_required = 0,
@@ -233,27 +217,28 @@ int RegisterPassManagerSetup(InjectPoint inject, const ManagerSetupData& setupDa
switch (setupData.refPassName) {
case PASS_CFG:
passData.type = GIMPLE_PASS;
- passInfo.pass = new GimplePass(passData);
+ passInfo.pass = new GimplePass(passData, index);
break;
case PASS_PHIOPT:
passData.type = GIMPLE_PASS;
- passInfo.pass = new GimplePass(passData);
+ passInfo.pass = new GimplePass(passData, index);
break;
case PASS_SSA:
passData.type = GIMPLE_PASS;
- passInfo.pass = new GimplePass(passData);
+ passInfo.pass = new GimplePass(passData, index);
break;
case PASS_LOOP:
passData.type = GIMPLE_PASS;
- passInfo.pass = new GimplePass(passData);
+ passInfo.pass = new GimplePass(passData, index);
break;
default:
- passInfo.pass = new GimplePass(passData);
+ passInfo.pass = new GimplePass(passData, index);
break;
}
- register_callback(pluginName.c_str(), PLUGIN_PASS_MANAGER_SETUP, NULL, &passInfo);
- return 0;
+ if (pluginName != "") {
+ register_callback(pluginName.c_str(), PLUGIN_PASS_MANAGER_SETUP, NULL, &passInfo);
+ }
}
static bool PluginVersionCheck(struct plugin_gcc_version *gccVersion, struct plugin_gcc_version *pluginVersion)
@@ -274,46 +259,14 @@ static bool PluginVersionCheck(struct plugin_gcc_version *gccVersion, struct plu
int plugin_init(struct plugin_name_args *pluginInfo, struct plugin_gcc_version *version)
{
+ if (!PluginVersionCheck(version, &gcc_version)) {
+ LOGE("incompatible gcc/plugin versions\n");
+ return 1;
+ }
string pluginName = pluginInfo->base_name;
register_callback(pluginName.c_str(), PLUGIN_FINISH, &GccEnd, NULL);
- int timeout = 200; // 默认超时时间200ms
- string shaPath;
- string serverPath = "";
- string arg = "";
- LogPriority logLevel = PRIORITY_WARN;
- PluginClient::GetArg(pluginInfo, serverPath, arg, logLevel);
- if (PluginClient::GetInitInfo(serverPath, shaPath, timeout) != 0) {
- LOGD("read default info from pin-gcc-client.json fail! use the default timeout=%dms\n", timeout);
- }
- if (serverPath == "") {
- LOGE("server path is NULL!\n");
- return 0;
- }
-
- if (PluginClient::CheckSHA256(shaPath) != 0) {
- LOGE("sha256 check sha256 file:%s fail!\n", shaPath.c_str());
- return 0;
- } else {
- LOGD("sha256 check success!\n");
- }
-
- string port;
- int status;
- if (ServerStart(timeout, serverPath, g_serverPid, port, logLevel) != 0) {
- return 0;
- }
- ClientStart(timeout, arg, pluginName, port);
- std::shared_ptr<PluginClient> client = PluginClient::GetInstance();
- while (1) {
- if ((client->GetInjectFlag()) || (client->GetUserFuncState() == STATE_TIMEOUT)) {
- break;
- }
- if (g_serverPid == waitpid(-1, &status, WNOHANG)) {
- PluginClient::DeletePortFromLockFile((unsigned short)atoi(port.c_str()));
- break;
- }
- }
+ PluginClient::GetInstance()->Init(pluginInfo, pluginName, g_serverPid);
return 0;
}
--
2.27.0.windows.1