pin-gcc-client/0002-Refactoring-Code-refactoring-of-Communication-Subsys.patch

2328 lines
95 KiB
Diff
Raw Normal View History

From e5e442c4b900eff2023232b2000c7be4048c68cc Mon Sep 17 00:00:00 2001
From: dingguangya <dingguangya1@huawei.com>
Date: Tue, 7 Feb 2023 19:11:26 +0800
Subject: [PATCH 2/9] [Refactoring] Code refactoring of Communication Subsystem
[1/3]. Code refactoring of PluginClient.
diff --git a/lib/PluginClient/PluginClient.cpp b/lib/PluginClient/PluginClient.cpp
index de15140..18877c2 100644
--- a/lib/PluginClient/PluginClient.cpp
+++ b/lib/PluginClient/PluginClient.cpp
@@ -19,27 +19,16 @@
Description:
This file contains the implementation of the PluginClient class..
*/
+#include <semaphore.h>
+#include "gccPlugin/gccPlugin.h"
#include "Dialect/PluginDialect.h"
#include "Dialect/PluginTypes.h"
#include "PluginAPI/PluginClientAPI.h"
-#include "IRTrans/IRTransPlugin.h"
-
-#include <thread>
-#include <fstream>
-#include <iostream>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <unistd.h>
-#include <json/json.h>
namespace PinClient {
using namespace mlir::Plugin;
using namespace mlir;
-using std::ios;
-static std::shared_ptr<PluginClient> g_plugin = nullptr;
-const char *g_portFilePath = "/tmp/grpc_ports_pin_client.txt";
-static std::shared_ptr<Channel> g_grpcChannel = nullptr;
+static PluginClient g_plugin;
std::map<InjectPoint, plugin_event> g_injectPoint {
{HANDLE_PARSE_TYPE, PLUGIN_FINISH_TYPE},
@@ -56,15 +45,9 @@ std::map<InjectPoint, plugin_event> g_injectPoint {
{HANDLE_MANAGER_SETUP, PLUGIN_PASS_MANAGER_SETUP},
};
-std::shared_ptr<PluginClient> PluginClient::GetInstance(void)
-{
- return g_plugin;
-}
-
-static uintptr_t GetID(Json::Value node)
+PluginClient *PluginClient::GetInstance()
{
- string id = node.asString();
- return atol(id.c_str());
+ return &g_plugin;
}
int PluginClient::GetEvent(InjectPoint inject, plugin_event *event)
@@ -77,1138 +60,861 @@ int PluginClient::GetEvent(InjectPoint inject, plugin_event *event)
return -1;
}
-Json::Value PluginClient::TypeJsonSerialize (PluginIR::PluginTypeBase& type)
+void PluginClient::GetGccData(const string& funcName, const string& param, string& key, string& result)
{
- Json::Value root;
- Json::Value operationObj;
- Json::Value item;
-
- uint64_t ReTypeId;
- uint64_t ReTypeWidth;
-
- ReTypeId = static_cast<uint64_t>(type.getPluginTypeID());
- item["id"] = std::to_string(ReTypeId);
-
- if (auto elemTy = type.dyn_cast<PluginIR::PluginPointerType>()) {
- auto baseTy = elemTy.getElementType().dyn_cast<PluginIR::PluginTypeBase>();
- item["elementType"] = TypeJsonSerialize(baseTy);
- if (elemTy.isReadOnlyElem()) {
- item["elemConst"] = "1";
- }else {
- item["elemConst"] = "0";
- }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI pluginAPI(context);
+ uint64_t gccDataAddr = (uint64_t)atol(param.c_str());
+ if (gccDataAddr == 0) {
+ LOGE("%s gcc_data address is NULL!\n", __func__);
+ return;
}
-
- if (type.getPluginIntOrFloatBitWidth() != 0) {
- ReTypeWidth = type.getPluginIntOrFloatBitWidth();
- item["width"] = std::to_string(ReTypeWidth);
+ if (funcName == "GetDeclSourceFile") {
+ string sourceFile = pluginAPI.GetDeclSourceFile(gccDataAddr);
+ json.StringSerialize(sourceFile, result);
+ key = "StringResult";
+ } else if (funcName == "GetDeclSourceLine") {
+ int line = pluginAPI.GetDeclSourceLine(gccDataAddr);
+ json.IntegerSerialize(line, result);
+ key = "IntegerResult";
+ } else if (funcName == "GetDeclSourceColumn") {
+ int column = pluginAPI.GetDeclSourceColumn(gccDataAddr);
+ json.IntegerSerialize(column, result);
+ key = "IntegerResult";
+ } else if (funcName == "VariableName") {
+ string variableName = pluginAPI.VariableName(gccDataAddr);
+ json.StringSerialize(variableName, result);
+ key = "StringResult";
+ } else if (funcName == "FuncName") {
+ string funcName = pluginAPI.FuncName(gccDataAddr);
+ json.StringSerialize(funcName, result);
+ key = "StringResult";
+ } else {
+ LOGW("function: %s not found!\n", funcName.c_str());
}
+}
- if (type.isSignedPluginInteger()) {
- item["signed"] = "1";
- }
+void GetAllFuncResult(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<FunctionOp> allFuncOps = clientAPI.GetAllFunc();
+ PluginJson json = client->GetJson();
+ json.FunctionOpJsonSerialize(allFuncOps, result);
+ client->ReceiveSendMsg("FuncOpResult", result);
+}
- if (type.isUnsignedPluginInteger()) {
- item["signed"] = "0";
- }
+void GetLocalDeclsResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "funcId":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string funcIdKey = "funcId";
+ uint64_t funcID = atol(root[funcIdKey].asString().c_str());
+ vector<LocalDeclOp> decls = clientAPI.GetDecls(funcID);
+ PluginJson json = client->GetJson();
+ json.LocalDeclsJsonSerialize(decls, result);
+ client->ReceiveSendMsg("LocalDeclOpResult", result);
+}
- root["type"] = item;
- return root;
+void GetLoopsFromFuncResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "funcId":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string funcIdKey = "funcId";
+ uint64_t funcID = atol(root[funcIdKey].asString().c_str());
+ vector<LoopOp> irLoops = clientAPI.GetLoopsFromFunc(funcID);
+ PluginJson json = client->GetJson();
+ json.LoopOpsJsonSerialize(irLoops, result);
+ client->ReceiveSendMsg("LoopOpsResult", result);
}
-PluginIR::PluginTypeBase PluginClient::TypeJsonDeSerialize(const string& data, mlir::MLIRContext &context)
+void GetLoopByIdResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Reader reader;
- Json::Value node;
- reader.parse(data, root);
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ LoopOp irLoop = clientAPI.GetLoopById(loopId);
+ PluginJson json = client->GetJson();
+ json.LoopOpJsonSerialize(irLoop, result);
+ client->ReceiveSendMsg("LoopOpResult", result);
+}
- PluginIR::PluginTypeBase baseType;
+void IsBlockInsideResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// "blockId":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ std::string blockIdKey = "blockId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ uint64_t blockId = atol(root[blockIdKey].asString().c_str());
+ bool res = clientAPI.IsBlockInside(loopId, blockId);
+ client->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)res));
+}
- Json::Value type = root["type"];
- uint64_t id = GetID(type["id"]);
- PluginIR::PluginTypeID PluginTypeId = static_cast<PluginIR::PluginTypeID>(id);
+void AllocateNewLoopResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t newLoopId = clientAPI.AllocateNewLoop();
+ LoopOp newLoop = clientAPI.GetLoopById(newLoopId);
+ PluginJson json = client->GetJson();
+ json.LoopOpJsonSerialize(newLoop, result);
+ client->ReceiveSendMsg("LoopOpResult", result);
+}
- if (type["signed"] && (id >= static_cast<uint64_t>(PluginIR::UIntegerTy1ID)
- && id <= static_cast<uint64_t>(PluginIR::IntegerTy64ID))) {
- string s = type["signed"].asString();
- uint64_t width = GetID(type["width"]);
- if (s == "1") {
- baseType = PluginIR::PluginIntegerType::get(&context, width, PluginIR::PluginIntegerType::Signed);
- }
- else {
- baseType = PluginIR::PluginIntegerType::get(&context, width, PluginIR::PluginIntegerType::Unsigned);
- }
- }
- else if (type["width"] && (id == static_cast<uint64_t>(PluginIR::FloatTyID)
- || id == static_cast<uint64_t>(PluginIR::DoubleTyID)) ) {
- uint64_t width = GetID(type["width"]);
- baseType = PluginIR::PluginFloatType::get(&context, width);
- }else if (id == static_cast<uint64_t>(PluginIR::PointerTyID)) {
- mlir::Type elemTy = TypeJsonDeSerialize(type["elementType"].toStyledString(), context);
- baseType = PluginIR::PluginPointerType::get(&context, elemTy, type["elemConst"].asString() == "1" ? 1 : 0);
- }else {
- if (PluginTypeId == PluginIR::VoidTyID)
- baseType = PluginIR::PluginVoidType::get(&context);
- if (PluginTypeId == PluginIR::BooleanTyID)
- baseType = PluginIR::PluginBooleanType::get(&context);
- if (PluginTypeId == PluginIR::UndefTyID)
- baseType = PluginIR::PluginUndefType::get(&context);
- }
+void RedirectFallthroughTargetResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "src":"xxxx",
+ /// "dest":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string srcKey = "src";
+ uint64_t src = atol(root[srcKey].asString().c_str());
+ std::string destKey = "dest";
+ uint64_t dest = atol(root[destKey].asString().c_str());
+ clientAPI.RedirectFallthroughTarget(src, dest);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
+}
- return baseType;
+void DeleteLoopResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ clientAPI.DeleteLoop(loopId);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
}
-void PluginClient::FunctionOpJsonSerialize(vector<FunctionOp>& data, string& out)
+void AddBlockToLoopResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value operationObj;
- Json::Value item;
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// "blockId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ std::string blockIdKey = "blockId";
+ uint64_t blockId = atol(root[blockIdKey].asString().c_str());
+ clientAPI.AddBlockToLoop(blockId, loopId);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
+}
- int i = 0;
- string operation;
-
- for (auto& d: data) {
- item["id"] = std::to_string(d.idAttr().getInt());
- // item["opCode"] = OP_FUNCTION;
- if (d.declaredInlineAttr().getValue())
- item["attributes"]["declaredInline"] = "1";
- else
- item["attributes"]["declaredInline"] = "0";
- item["attributes"]["funcName"] = d.funcNameAttr().getValue().str().c_str();
- auto &region = d.getRegion();
- size_t bbIdx = 0;
- for (auto &b : region) {
- string blockStr = "block" + std::to_string(bbIdx++);
- uint64_t bbAddress = 0;
- size_t opIdx = 0;
- for (auto &inst : b) {
- if (isa<PlaceholderOp>(inst)) continue;
- else if (isa<SSAOp>(inst)) continue;
- else if (isa<MemOp>(inst)) continue;
- else if (isa<ConstOp>(inst)) continue;
- string opStr = "Operation" + std::to_string(opIdx++);
- item["region"][blockStr]["ops"][opStr] = OperationJsonSerialize(&inst, bbAddress);
- }
- assert(bbAddress != 0);
- item["region"][blockStr]["address"] = std::to_string(bbAddress);
- }
- operation = "FunctionOp" + std::to_string(i++);
- root[operation] = item;
- item.clear();
- }
- out = root.toStyledString();
+void AddLoopResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// "outerId":"xxxx"
+ /// "funcId":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ std::string outerIdKey = "outerId";
+ std::string funcIdKey = "funcId";
+ uint64_t loopID = atol(root[loopIdKey].asString().c_str());
+ uint64_t outerID = atol(root[outerIdKey].asString().c_str());
+ uint64_t funcID = atol(root[funcIdKey].asString().c_str());
+ clientAPI.AddLoop(loopID, outerID, funcID);
+ LoopOp irLoop = clientAPI.GetLoopById(loopID);
+ PluginJson json = client->GetJson();
+ json.LoopOpJsonSerialize(irLoop, result);
+ client->ReceiveSendMsg("LoopOpResult", result);
}
-Json::Value PluginClient::OperationJsonSerialize(mlir::Operation *operation,
- uint64_t &bbId)
+void GetBlocksInLoopResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- if (AssignOp op = llvm::dyn_cast<AssignOp>(operation)) {
- root = AssignOpJsonSerialize(op);
- } else if (CallOp op = llvm::dyn_cast<CallOp>(operation)) {
- root = CallOpJsonSerialize(op);
- } else if (CondOp op = llvm::dyn_cast<CondOp>(operation)) {
- root = CondOpJsonSerialize(op, bbId);
- } else if (PhiOp op = llvm::dyn_cast<PhiOp>(operation)) {
- root = PhiOpJsonSerialize(op);
- } else if (FallThroughOp op = llvm::dyn_cast<FallThroughOp>(operation)) {
- root = FallThroughOpJsonSerialize(op, bbId);
- } else if (RetOp op = llvm::dyn_cast<RetOp>(operation)) {
- root = RetOpJsonSerialize(op, bbId);
- } else if (BaseOp op = llvm::dyn_cast<BaseOp>(operation)) {
- root = BaseOpJsonSerialize(op);
- }
- root["OperationName"] = operation->getName().getStringRef().str();
- return root;
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ vector<uint64_t> blocks = clientAPI.GetBlocksInLoop(loopId);
+ PluginJson json = client->GetJson();
+ json.BlocksJsonSerialize(blocks, result);
+ client->ReceiveSendMsg("IdsResult", result);
}
-Json::Value PluginClient::BaseOpJsonSerialize(BaseOp data)
+void GetHeaderResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- root["id"] = std::to_string(data.idAttr().getInt());
- root["opCode"] = data.opCodeAttr().getValue().str().c_str();
- return root;
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ uint64_t blockId = clientAPI.GetHeader(loopId);
+ client->ReceiveSendMsg("IdResult", std::to_string(blockId));
}
-Json::Value PluginClient::RetOpJsonSerialize(RetOp data, uint64_t &bbId)
+void GetLatchResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- bbId = data.addressAttr().getInt();
- root["address"] = std::to_string(bbId);
- return root;
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ uint64_t blockId = clientAPI.GetLatch(loopId);
+ client->ReceiveSendMsg("IdResult", std::to_string(blockId));
}
-Json::Value PluginClient::FallThroughOpJsonSerialize(FallThroughOp data,
- uint64_t &bbId)
+void SetHeaderResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- bbId = data.addressAttr().getInt();
- root["address"] = std::to_string(bbId);
- root["destaddr"] = std::to_string(data.destaddrAttr().getInt());
- return root;
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// "blockId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ std::string blockIdKey = "blockId";
+ uint64_t blockId = atol(root[blockIdKey].asString().c_str());
+ clientAPI.SetHeader(loopId, blockId);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
}
-void PluginClient::LocalDeclsJsonSerialize(vector<LocalDeclOp>& decls, string& out)
+void SetLatchResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value operationObj;
- Json::Value item;
- int i = 0;
- string operation;
-
- for (auto& decl: decls) {
- item["id"] = std::to_string(decl.idAttr().getInt());
- item["attributes"]["symName"] = decl.symNameAttr().getValue().str().c_str();
- item["attributes"]["typeID"] = decl.typeIDAttr().getInt();
- item["attributes"]["typeWidth"] = decl.typeWidthAttr().getInt();
- operation = "localDecl" + std::to_string(i++);
- root[operation] = item;
- item.clear();
- }
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// "blockId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ std::string blockIdKey = "blockId";
+ uint64_t blockId = atol(root[blockIdKey].asString().c_str());
+ clientAPI.SetLatch(loopId, blockId);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
}
-void PluginClient::LoopOpsJsonSerialize(vector<mlir::Plugin::LoopOp>& loops, string& out)
+void GetLoopExitsResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value operationObj;
- Json::Value item;
- int i = 0;
- string operation;
-
- for (auto&loop: loops) {
- item["id"] = std::to_string(loop.idAttr().getInt());
- item["index"] = std::to_string(loop.indexAttr().getInt());
- item["attributes"]["innerLoopId"] = std::to_string(loop.innerLoopIdAttr().getInt());
- item["attributes"]["outerLoopId"] = std::to_string(loop.outerLoopIdAttr().getInt());
- item["attributes"]["numBlock"] = std::to_string(loop.numBlockAttr().getInt());
- operation = "loopOp" + std::to_string(i++);
- root[operation] = item;
- item.clear();
- }
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ vector<std::pair<uint64_t, uint64_t> > edges = clientAPI.GetLoopExits(loopId);
+ PluginJson json = client->GetJson();
+ json.EdgesJsonSerialize(edges, result);
+ client->ReceiveSendMsg("EdgesResult", result);
}
-void PluginClient::LoopOpJsonSerialize(mlir::Plugin::LoopOp& loop, string& out)
+void GetLoopSingleExitResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- root["id"] = std::to_string(loop.idAttr().getInt());
- root["index"] = std::to_string(loop.indexAttr().getInt());
- root["attributes"]["innerLoopId"] = std::to_string(loop.innerLoopIdAttr().getInt());
- root["attributes"]["outerLoopId"] = std::to_string(loop.outerLoopIdAttr().getInt());
- root["attributes"]["numBlock"] = std::to_string(loop.numBlockAttr().getInt());
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "loopId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string loopIdKey = "loopId";
+ uint64_t loopId = atol(root[loopIdKey].asString().c_str());
+ std::pair<uint64_t, uint64_t> edge = clientAPI.GetLoopSingleExit(loopId);
+ PluginJson json = client->GetJson();
+ json.EdgeJsonSerialize(edge, result);
+ client->ReceiveSendMsg("EdgeResult", result);
}
-void PluginClient::BlocksJsonSerialize(vector<uint64_t>& blocks, string& out)
+void GetBlockLoopFatherResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value item;
- int i = 0;
- string index;
+ /// Json格式
+ /// {
+ /// "blockId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string blockIdKey = "blockId";
+ uint64_t blockId = atol(root[blockIdKey].asString().c_str());
+ LoopOp loopFather = clientAPI.GetBlockLoopFather(blockId);
+ PluginJson json = client->GetJson();
+ json.LoopOpJsonSerialize(loopFather, result);
+ client->ReceiveSendMsg("LoopOpResult", result);
+}
- for(auto& block : blocks) {
- item["id"] = std::to_string(block);
- index = "block" + std::to_string(i++);
- root[index] = item;
- item.clear();
- }
- out = root.toStyledString();
+void CreateBlockResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "bbaddr":"xxxx",
+ /// "funcaddr":"xxxx"
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t blockAddr = atol(root["bbaddr"].asString().c_str());
+ uint64_t funcAddr = atol(root["funcaddr"].asString().c_str());
+ uint64_t newBBAddr = clientAPI.CreateBlock(funcAddr, blockAddr);
+ client->ReceiveSendMsg("IdResult", std::to_string(newBBAddr));
}
-void PluginClient::EdgesJsonSerialize(vector<pair<uint64_t, uint64_t> >& edges, string& out)
+void DeleteBlockResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value item;
- int i = 0;
- string index;
-
- for(auto& edge : edges) {
- item["src"] = std::to_string(edge.first);
- item["dest"] = std::to_string(edge.second);
- index = "edge" + std::to_string(i++);
- root[index] = item;
- item.clear();
- }
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "bbaddr":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string funcKey = "funcaddr";
+ std::string BlockIdKey = "bbaddr";
+ uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
+ uint64_t funcaddr = atol(root[funcKey].asString().c_str());
+ clientAPI.DeleteBlock(funcaddr, bbaddr);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
}
-void PluginClient::EdgeJsonSerialize(pair<uint64_t, uint64_t>& edge, string& out)
+void SetImmediateDominatorResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- root["src"] = std::to_string(edge.first);
- root["dest"] = std::to_string(edge.second);
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "dir":"xxxx",
+ /// "bbaddr":"xxxx",
+ /// "domiaddr":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string dirIdKey = "dir";
+ uint64_t dir = atol(root[dirIdKey].asString().c_str());
+ std::string BlockIdKey = "bbaddr";
+ uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
+ std::string domiIdKey = "domiaddr";
+ uint64_t domiaddr = atol(root[domiIdKey].asString().c_str());
+ clientAPI.SetImmediateDominator(dir, bbaddr, domiaddr);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
}
-// void类型的Json序列化
-void PluginClient::NopJsonSerialize(string& out)
+void GetImmediateDominatorResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "dir":"xxxx",
+ /// "bbaddr":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string dirIdKey = "dir";
+ uint64_t dir = atol(root[dirIdKey].asString().c_str());
+ std::string BlockIdKey = "bbaddr";
+ uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
+ uint64_t ret = clientAPI.GetImmediateDominator(dir, bbaddr);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-void PluginClient::GetPhiOpsJsonSerialize(vector<PhiOp> phiOps, string & out)
+void RecomputeDominatorResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Value item;
- int i = 0;
- string operation;
- uint64_t placeholder = 0;
- for (auto phi : phiOps) {
- item = OperationJsonSerialize(phi.getOperation(), placeholder);
- operation = "operation" + std::to_string(i++);
- root[operation] = item;
- item.clear();
- }
- out = root.toStyledString();
+ /// Json格式
+ /// {
+ /// "dir":"xxxx",
+ /// "bbaddr":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string dirIdKey = "dir";
+ uint64_t dir = atol(root[dirIdKey].asString().c_str());
+ std::string BlockIdKey = "bbaddr";
+ uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
+ uint64_t ret = clientAPI.RecomputeDominator(dir, bbaddr);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-Json::Value PluginClient::CallOpJsonSerialize(CallOp& data)
+void GetPhiOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value item;
- item["id"] = std::to_string(data.idAttr().getInt());
- item["callee"] = data.callee().str();
- item["OperationName"] = data.getOperation()->getName().getStringRef().str();
- size_t opIdx = 0;
- for (mlir::Value v : data.getArgOperands()) {
- string input = "input" + std::to_string(opIdx++);
- item["operands"][input] = ValueJsonSerialize(v);
- }
- // auto retTy = data.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- // item["retType"] = TypeJsonSerialize(retTy);
- return item;
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t id = atol(root[std::to_string(0)].asString().c_str());
+ PhiOp op = clientAPI.GetPhiOp(id);
+ PluginJson json = client->GetJson();
+ Json::Value phiOpResult = json.PhiOpJsonSerialize(op);
+ client->ReceiveSendMsg("OpsResult", phiOpResult.toStyledString());
}
-Json::Value PluginClient::CondOpJsonSerialize(CondOp& data, uint64_t &bbId)
+void GetCallOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value item;
- item["id"] = std::to_string(data.idAttr().getInt());
- item["condCode"] = std::to_string(data.condCodeAttr().getInt());
- item["lhs"] = ValueJsonSerialize(data.GetLHS());
- item["rhs"] = ValueJsonSerialize(data.GetRHS());
- bbId = data.addressAttr().getInt();
- item["address"] = std::to_string(bbId);
- item["tbaddr"] = std::to_string(data.tbaddrAttr().getInt());
- item["fbaddr"] = std::to_string(data.fbaddrAttr().getInt());
- return item;
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t id = atol(root[std::to_string(0)].asString().c_str());
+ CallOp op = clientAPI.GetCallOp(id);
+ PluginJson json = client->GetJson();
+ Json::Value opResult = json.CallOpJsonSerialize(op);
+ client->ReceiveSendMsg("OpsResult", opResult.toStyledString());
}
-Json::Value PluginClient::PhiOpJsonSerialize(PhiOp& data)
+void SetLhsInCallOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value item;
- item["id"] = std::to_string(data.idAttr().getInt());
- item["capacity"] = std::to_string(data.capacityAttr().getInt());
- item["nArgs"] = std::to_string(data.nArgsAttr().getInt());
- item["OperationName"] = data.getOperation()->getName().getStringRef().str();
- size_t opIdx = 0;
- for (mlir::Value v : data.operands()) {
- string input = "input" + std::to_string(opIdx++);
- item["operands"][input] = ValueJsonSerialize(v);
- }
- // auto retTy = data.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- // item["retType"] = TypeJsonSerialize(retTy);
- return item;
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t callId = atol(root["callId"].asString().c_str());
+ uint64_t lhsId = atol(root["lhsId"].asString().c_str());
+ bool ret = clientAPI.SetLhsInCallOp(callId, lhsId);
+ client->ReceiveSendMsg("BoolResult", std::to_string(ret));
}
-Json::Value PluginClient::SSAOpJsonSerialize(SSAOp& data)
+void AddArgInPhiOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value item;
- item["id"] = std::to_string(data.idAttr().getInt());
- item["defCode"] = std::to_string(data.defCodeAttr().getInt());
- item["readOnly"] = std::to_string(data.readOnlyAttr().getValue());
- item["nameVarId"] = std::to_string(data.nameVarIdAttr().getInt());
- item["ssaParmDecl"] = std::to_string(data.ssaParmDeclAttr().getInt());
- item["version"] = std::to_string(data.versionAttr().getInt());
- item["definingId"] = std::to_string(data.definingIdAttr().getInt());
- auto retTy = data.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- item["retType"] = TypeJsonSerialize(retTy);
- return item;
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t phiId = atol(root["phiId"].asString().c_str());
+ uint64_t argId = atol(root["argId"].asString().c_str());
+ uint64_t predId = atol(root["predId"].asString().c_str());
+ uint64_t succId = atol(root["succId"].asString().c_str());
+ uint32_t ret = clientAPI.AddArgInPhiOp(phiId, argId, predId, succId);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-Json::Value PluginClient::AssignOpJsonSerialize(AssignOp& data)
+void CreateCallOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value item;
- item["id"] = std::to_string(data.idAttr().getInt());
- item["exprCode"] = std::to_string(data.exprCodeAttr().getInt());
- item["OperationName"] = data.getOperation()->getName().getStringRef().str();
- size_t opIdx = 0;
- for (mlir::Value v : data.operands()) {
- string input = "input" + std::to_string(opIdx++);
- item["operands"][input] = ValueJsonSerialize(v);
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t blockId = atol(root["blockId"].asString().c_str());
+ uint64_t funcId = atol(root["funcId"].asString().c_str());
+ vector<uint64_t> argIds;
+ Json::Value argIdsJson = root["argIds"];
+ Json::Value::Members member = argIdsJson.getMemberNames();
+ for (Json::Value::Members::iterator opIter = member.begin(); opIter != member.end(); opIter++) {
+ string key = *opIter;
+ uint64_t id = atol(argIdsJson[key.c_str()].asString().c_str());
+ argIds.push_back(id);
}
- // auto retTy = data.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- // item["retType"] = TypeJsonSerialize(retTy);
- return item;
+ uint64_t ret = clientAPI.CreateCallOp(blockId, funcId, argIds);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-Json::Value PluginClient::ValueJsonSerialize(mlir::Value data)
+void CreateAssignOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- if (ConstOp cOp = data.getDefiningOp<ConstOp>()) {
- auto retTy = data.getType().dyn_cast<PluginIR::PluginTypeBase>();
- root["retType"] = TypeJsonSerialize(retTy);
- root["id"] = std::to_string(cOp.idAttr().getInt());
- root["defCode"] = std::to_string(
- static_cast<int32_t>(IDefineCode::IntCST));
- root["value"] = std::to_string(
- cOp.initAttr().cast<mlir::IntegerAttr>().getInt());
- } else if (MemOp mOp = data.getDefiningOp<MemOp>()) {
- root = MemOpJsonSerialize(mOp);
- } else if (SSAOp sOp = data.getDefiningOp<SSAOp>()) {
- root = SSAOpJsonSerialize(sOp);
- } else if (PlaceholderOp phOp = data.getDefiningOp<PlaceholderOp>()) {
- root["id"] = std::to_string(phOp.idAttr().getInt());
- root["defCode"] = std::to_string(phOp.defCodeAttr().getInt());
- auto retTy = phOp.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- root["retType"] = TypeJsonSerialize(retTy);
- } else {
- LOGE("ERROR: Can't Serialize!");
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t blockId = atol(root["blockId"].asString().c_str());
+ int condCode = atol(root["exprCode"].asString().c_str());
+ vector<uint64_t> argIds;
+ Json::Value argIdsJson = root["argIds"];
+ Json::Value::Members member = argIdsJson.getMemberNames();
+ for (Json::Value::Members::iterator opIter = member.begin(); opIter != member.end(); opIter++) {
+ string key = *opIter;
+ uint64_t id = atol(argIdsJson[key.c_str()].asString().c_str());
+ argIds.push_back(id);
}
- return root;
+ uint64_t ret = clientAPI.CreateAssignOp(blockId, IExprCode(condCode), argIds);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-Json::Value PluginClient::MemOpJsonSerialize(MemOp& data)
+void CreateCondOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- root["id"] = std::to_string(data.idAttr().getInt());
- root["defCode"] = std::to_string(data.defCodeAttr().getInt());
- root["readOnly"] = std::to_string(data.readOnlyAttr().getValue());
- mlir::Value base = data.GetBase();
- mlir::Value offset = data.GetOffset();
- root["base"] = ValueJsonSerialize(base);
- root["offset"] = ValueJsonSerialize(offset);
- auto retTy = data.getResultType().dyn_cast<PluginIR::PluginTypeBase>();
- root["retType"] = TypeJsonSerialize(retTy);
- return root;
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t blockId = atol(root["blockId"].asString().c_str());
+ int condCode = atol(root["condCode"].asString().c_str());
+ uint64_t lhsId = atol(root["lhsId"].asString().c_str());
+ uint64_t rhsId = atol(root["rhsId"].asString().c_str());
+ uint64_t tbaddr = atol(root["tbaddr"].asString().c_str());
+ uint64_t fbaddr = atol(root["fbaddr"].asString().c_str());
+ uint64_t ret = clientAPI.CreateCondOp(blockId, IComparisonCode(condCode), lhsId, rhsId, tbaddr, fbaddr);
+ client->ReceiveSendMsg("IdResult", std::to_string(ret));
}
-void PluginClient::IRTransBegin(const string& funcName, const string& param)
+void CreateFallthroughOpResult(PluginClient *client, Json::Value& root, string& result)
{
- string result;
-
- Json::Value root;
- Json::Reader reader;
- reader.parse(param, root);
- LOGD("%s func:%s,param:%s\n", __func__, funcName.c_str(), param.c_str());
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t address = atol(root["address"].asString().c_str());
+ uint64_t destaddr = atol(root["destaddr"].asString().c_str());
+ clientAPI.CreateFallthroughOp(address, destaddr);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
+}
- if (funcName == "GetAllFunc") {
- // Load our Dialect in this MLIR Context.
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- vector<FunctionOp> allFuncOps = clientAPI.GetAllFunc();
- FunctionOpJsonSerialize(allFuncOps, result);
- this->ReceiveSendMsg("FuncOpResult", result);
- } else if (funcName == "GetLocalDecls") {
- /// Json格式
- /// {
- /// "funcId":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string funcIdKey = "funcId";
- uint64_t funcID = atol(root[funcIdKey].asString().c_str());
- vector<LocalDeclOp> decls = clientAPI.GetDecls(funcID);
- LocalDeclsJsonSerialize(decls, result);
- this->ReceiveSendMsg("LocalDeclOpResult", result);
- } else if (funcName == "GetLoopsFromFunc") {
- /// Json格式
- /// {
- /// "funcId":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string funcIdKey = "funcId";
- uint64_t funcID = atol(root[funcIdKey].asString().c_str());
- vector<LoopOp> irLoops = clientAPI.GetLoopsFromFunc(funcID);
- LoopOpsJsonSerialize(irLoops, result);
- this->ReceiveSendMsg("LoopOpsResult", result);
- } else if (funcName == "GetLoopById") {
- /// Json格式
- /// {
- /// "loopId":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- LoopOp irLoop = clientAPI.GetLoopById(loopId);
- LoopOpJsonSerialize(irLoop, result);
- this->ReceiveSendMsg("LoopOpResult", result);
- } else if (funcName == "IsBlockInside") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// "blockId":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- std::string blockIdKey = "blockId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- uint64_t blockId = atol(root[blockIdKey].asString().c_str());
- bool res = clientAPI.IsBlockInside(loopId, blockId);
- this->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)res));
- } else if (funcName == "AllocateNewLoop") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t newLoopId = clientAPI.AllocateNewLoop();
- LoopOp newLoop = clientAPI.GetLoopById(newLoopId);
- LoopOpJsonSerialize(newLoop, result);
- this->ReceiveSendMsg("LoopOpResult", result);
- } else if (funcName == "RedirectFallthroughTarget") {
- /// Json格式
- /// {
- /// "src":"xxxx",
- /// "dest":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string srcKey = "src";
- uint64_t src = atol(root[srcKey].asString().c_str());
- std::string destKey = "dest";
- uint64_t dest = atol(root[destKey].asString().c_str());
- clientAPI.RedirectFallthroughTarget(src, dest);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "DeleteLoop") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- clientAPI.DeleteLoop(loopId);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "AddBlockToLoop") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// "blockId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- std::string blockIdKey = "blockId";
- uint64_t blockId = atol(root[blockIdKey].asString().c_str());
- clientAPI.AddBlockToLoop(blockId, loopId);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "AddLoop") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// "outerId":"xxxx"
- /// "funcId":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- std::string outerIdKey = "outerId";
- std::string funcIdKey = "funcId";
- uint64_t loopID = atol(root[loopIdKey].asString().c_str());
- uint64_t outerID = atol(root[outerIdKey].asString().c_str());
- uint64_t funcID = atol(root[funcIdKey].asString().c_str());
- clientAPI.AddLoop(loopID, outerID, funcID);
- LoopOp irLoop = clientAPI.GetLoopById(loopID);
- LoopOpJsonSerialize(irLoop, result);
- this->ReceiveSendMsg("LoopOpResult", result);
- } else if (funcName == "GetBlocksInLoop") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- vector<uint64_t> blocks = clientAPI.GetBlocksInLoop(loopId);
- BlocksJsonSerialize(blocks, result);
- this->ReceiveSendMsg("IdsResult", result);
- } else if (funcName == "GetHeader") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- uint64_t blockId = clientAPI.GetHeader(loopId);
- this->ReceiveSendMsg("IdResult", std::to_string(blockId));
- } else if (funcName == "GetLatch") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- uint64_t blockId = clientAPI.GetLatch(loopId);
- this->ReceiveSendMsg("IdResult", std::to_string(blockId));
- } else if (funcName == "SetHeader") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// "blockId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- std::string blockIdKey = "blockId";
- uint64_t blockId = atol(root[blockIdKey].asString().c_str());
- clientAPI.SetHeader(loopId, blockId);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "SetLatch") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// "blockId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- std::string blockIdKey = "blockId";
- uint64_t blockId = atol(root[blockIdKey].asString().c_str());
- clientAPI.SetLatch(loopId, blockId);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "GetLoopExits") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- vector<pair<uint64_t, uint64_t> > edges = clientAPI.GetLoopExits(loopId);
- EdgesJsonSerialize(edges, result);
- this->ReceiveSendMsg("EdgesResult", result);
- } else if (funcName == "GetLoopSingleExit") {
- /// Json格式
- /// {
- /// "loopId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string loopIdKey = "loopId";
- uint64_t loopId = atol(root[loopIdKey].asString().c_str());
- pair<uint64_t, uint64_t> edge = clientAPI.GetLoopSingleExit(loopId);
- EdgeJsonSerialize(edge, result);
- this->ReceiveSendMsg("EdgeResult", result);
- } else if (funcName == "GetBlockLoopFather") {
- /// Json格式
- /// {
- /// "blockId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string blockIdKey = "blockId";
- uint64_t blockId = atol(root[blockIdKey].asString().c_str());
- LoopOp loopFather = clientAPI.GetBlockLoopFather(blockId);
- LoopOpJsonSerialize(loopFather, result);
- this->ReceiveSendMsg("LoopOpResult", result);
- } else if (funcName == "CreateBlock") {
- /// Json格式
- /// {
- /// "bbaddr":"xxxx",
- /// "funcaddr":"xxxx"
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t blockAddr = atol(root["bbaddr"].asString().c_str());
- uint64_t funcAddr = atol(root["funcaddr"].asString().c_str());
- uint64_t newBBAddr = clientAPI.CreateBlock(funcAddr, blockAddr);
- this->ReceiveSendMsg("IdResult", std::to_string(newBBAddr));
- } else if (funcName == "DeleteBlock") {
- /// Json格式
- /// {
- /// "bbaddr":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string funcKey = "funcaddr";
- std::string BlockIdKey = "bbaddr";
- uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
- uint64_t funcaddr = atol(root[funcKey].asString().c_str());
- clientAPI.DeleteBlock(funcaddr, bbaddr);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "SetImmediateDominator") {
- /// Json格式
- /// {
- /// "dir":"xxxx",
- /// "bbaddr":"xxxx",
- /// "domiaddr":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string dirIdKey = "dir";
- uint64_t dir = atol(root[dirIdKey].asString().c_str());
- std::string BlockIdKey = "bbaddr";
- uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
- std::string domiIdKey = "domiaddr";
- uint64_t domiaddr = atol(root[domiIdKey].asString().c_str());
- clientAPI.SetImmediateDominator(dir, bbaddr, domiaddr);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "GetImmediateDominator") {
- /// Json格式
- /// {
- /// "dir":"xxxx",
- /// "bbaddr":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string dirIdKey = "dir";
- uint64_t dir = atol(root[dirIdKey].asString().c_str());
- std::string BlockIdKey = "bbaddr";
- uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
- uint64_t ret = clientAPI.GetImmediateDominator(dir, bbaddr);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "RecomputeDominator") {
- /// Json格式
- /// {
- /// "dir":"xxxx",
- /// "bbaddr":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string dirIdKey = "dir";
- uint64_t dir = atol(root[dirIdKey].asString().c_str());
- std::string BlockIdKey = "bbaddr";
- uint64_t bbaddr = atol(root[BlockIdKey].asString().c_str());
- uint64_t ret = clientAPI.RecomputeDominator(dir, bbaddr);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "GetPhiOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t id = atol(root[std::to_string(0)].asString().c_str());
- PhiOp op = clientAPI.GetPhiOp(id);
- Json::Value result = PhiOpJsonSerialize(op);
- this->ReceiveSendMsg("OpsResult", result.toStyledString());
- } else if (funcName == "GetCallOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t id = atol(root[std::to_string(0)].asString().c_str());
- CallOp op = clientAPI.GetCallOp(id);
- Json::Value result = CallOpJsonSerialize(op);
- this->ReceiveSendMsg("OpsResult", result.toStyledString());
- } else if (funcName == "SetLhsInCallOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t callId = atol(root["callId"].asString().c_str());
- uint64_t lhsId = atol(root["lhsId"].asString().c_str());
- bool ret = clientAPI.SetLhsInCallOp(callId, lhsId);
- this->ReceiveSendMsg("BoolResult", std::to_string(ret));
- } else if (funcName == "AddArgInPhiOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t phiId = atol(root["phiId"].asString().c_str());
- uint64_t argId = atol(root["argId"].asString().c_str());
- uint64_t predId = atol(root["predId"].asString().c_str());
- uint64_t succId = atol(root["succId"].asString().c_str());
- uint32_t ret = clientAPI.AddArgInPhiOp(phiId, argId, predId, succId);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "CreateCallOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t blockId = atol(root["blockId"].asString().c_str());
- uint64_t funcId = atol(root["funcId"].asString().c_str());
- vector<uint64_t> argIds;
- Json::Value argIdsJson = root["argIds"];
- Json::Value::Members member = argIdsJson.getMemberNames();
- for (Json::Value::Members::iterator opIter = member.begin();
- opIter != member.end(); opIter++) {
- string key = *opIter;
- uint64_t id = atol(argIdsJson[key.c_str()].asString().c_str());
- argIds.push_back(id);
- }
- uint64_t ret = clientAPI.CreateCallOp(blockId, funcId, argIds);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "CreateAssignOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t blockId = atol(root["blockId"].asString().c_str());
- int condCode = atol(root["exprCode"].asString().c_str());
- vector<uint64_t> argIds;
- Json::Value argIdsJson = root["argIds"];
- Json::Value::Members member = argIdsJson.getMemberNames();
- for (Json::Value::Members::iterator opIter = member.begin();
- opIter != member.end(); opIter++) {
- string key = *opIter;
- uint64_t id = atol(argIdsJson[key.c_str()].asString().c_str());
- argIds.push_back(id);
- }
- uint64_t ret = clientAPI.CreateAssignOp(
- blockId, IExprCode(condCode), argIds);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "CreateCondOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t blockId = atol(root["blockId"].asString().c_str());
- int condCode = atol(root["condCode"].asString().c_str());
- uint64_t lhsId = atol(root["lhsId"].asString().c_str());
- uint64_t rhsId = atol(root["rhsId"].asString().c_str());
- uint64_t tbaddr = atol(root["tbaddr"].asString().c_str());
- uint64_t fbaddr = atol(root["fbaddr"].asString().c_str());
- uint64_t ret = clientAPI.CreateCondOp(blockId, IComparisonCode(condCode),
- lhsId, rhsId, tbaddr, fbaddr);
- this->ReceiveSendMsg("IdResult", std::to_string(ret));
- } else if (funcName == "CreateFallthroughOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t address = atol(root["address"].asString().c_str());
- uint64_t destaddr = atol(root["destaddr"].asString().c_str());
- clientAPI.CreateFallthroughOp(address, destaddr);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "GetResultFromPhi") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t id = atol(root["id"].asString().c_str());
- mlir::Value ret = clientAPI.GetResultFromPhi(id);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "CreatePhiOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t argId = atol(root["argId"].asString().c_str());
- uint64_t blockId = atol(root["blockId"].asString().c_str());
- PhiOp op = clientAPI.CreatePhiOp(argId, blockId);
- Json::Value result = PhiOpJsonSerialize(op);
- this->ReceiveSendMsg("OpsResult", result.toStyledString());
- } else if (funcName == "CreateConstOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- PluginIR::PluginTypeBase type = TypeJsonDeSerialize(root.toStyledString(), context);
- uint64_t value = atol(root["value"].asString().c_str());
- mlir::OpBuilder opBuilder = mlir::OpBuilder(&context);
- mlir::Attribute attr = opBuilder.getI64IntegerAttr(value);
- mlir::Value ret = clientAPI.CreateConstOp(attr, type);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "UpdateSSA") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- bool ret = clientAPI.UpdateSSA();
- this->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
- } else if (funcName == "GetAllPhiOpInsideBlock") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t bb = atol(root["bbAddr"].asString().c_str());
- vector<PhiOp> phiOps = clientAPI.GetPhiOpsInsideBlock(bb);
- GetPhiOpsJsonSerialize(phiOps, result);
- this->ReceiveSendMsg("GetPhiOps", result);
- } else if (funcName == "IsDomInfoAvailable") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- bool ret = clientAPI.IsDomInfoAvailable();
- this->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
- } else if (funcName == "GetCurrentDefFromSSA") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- uint64_t varId = atol(root["varId"].asString().c_str());
- PluginAPI::PluginClientAPI clientAPI(context);
- mlir::Value ret = clientAPI.GetCurrentDefFromSSA(varId);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "SetCurrentDefInSSA") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- uint64_t varId = atol(root["varId"].asString().c_str());
- uint64_t defId = atol(root["defId"].asString().c_str());
- PluginAPI::PluginClientAPI clientAPI(context);
- bool ret = clientAPI.SetCurrentDefInSSA(varId, defId);
- this->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
- } else if (funcName == "CopySSAOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t id = atol(root["id"].asString().c_str());
- mlir::Value ret = clientAPI.CopySSAOp(id);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "CreateSSAOp") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- PluginIR::PluginTypeBase type = TypeJsonDeSerialize(root.toStyledString(), context);
- mlir::Value ret = clientAPI.CreateSSAOp(type);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "CreateNewDef") {
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- uint64_t opId = atol(root["opId"].asString().c_str());
- uint64_t valueId = atol(root["valueId"].asString().c_str());
- uint64_t defId = atol(root["defId"].asString().c_str());
- mlir::Value ret = clientAPI.CreateNewDef(valueId, opId, defId);
- this->ReceiveSendMsg("ValueResult",
- ValueJsonSerialize(ret).toStyledString());
- } else if (funcName == "RemoveEdge") {
- /// Json格式
- /// {
- /// "src":"xxxx",
- /// "dest":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string srcKey = "src";
- uint64_t src = atol(root[srcKey].asString().c_str());
- std::string destKey = "dest";
- uint64_t dest = atol(root[destKey].asString().c_str());
- clientAPI.RemoveEdge(src, dest);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("VoidResult", result);
- } else if (funcName == "ConfirmValue") {
- /// Json格式
- /// {
- /// "valId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string valIdKey = "valId";
- uint64_t valId = atol(root[valIdKey].asString().c_str());
- mlir::Value v = clientAPI.GetValue(valId);
- Json::Value valueJson = ValueJsonSerialize(v);
- result = valueJson.toStyledString();
- this->ReceiveSendMsg("ValueResult", result);
- } else if (funcName == "BuildMemRef") {
- /// Json格式
- /// {
- /// "baseId":"xxxx",
- /// "offsetId":"xxxx",
- /// "type":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string baseIdKey = "baseId";
- std::string offsetIdKey = "offsetId";
- std::string typeKey = "type";
- uint64_t baseId = atol(root[baseIdKey].asString().c_str());
- uint64_t offsetId = atol(root[offsetIdKey].asString().c_str());
- Json::Value type = root[typeKey];
- PluginIR::PluginTypeBase pType = TypeJsonDeSerialize(type.toStyledString(), context);
- mlir::Value v = clientAPI.BuildMemRef(pType, baseId, offsetId);
- Json::Value valueJson = ValueJsonSerialize(v);
- result = valueJson.toStyledString();
- this->ReceiveSendMsg("ValueResult", result);
- } else if (funcName == "DebugValue") {
- /// Json格式
- /// {
- /// "valId":"xxxx",
- /// }
- mlir::MLIRContext context;
- context.getOrLoadDialect<PluginDialect>();
- PluginAPI::PluginClientAPI clientAPI(context);
- std::string valIdKey = "valId";
- uint64_t valId = atol(root[valIdKey].asString().c_str());
- clientAPI.DebugValue(valId);
- NopJsonSerialize(result);
- this->ReceiveSendMsg("ValueResult", result);
- } else {
- LOGW("function: %s not found!\n", funcName.c_str());
- }
+void GetResultFromPhiResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t id = atol(root["id"].asString().c_str());
+ mlir::Value ret = clientAPI.GetResultFromPhi(id);
+ PluginJson json = client->GetJson();
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
+}
- LOGD("IR function: %s\n", funcName.c_str());
- this->SetPluginAPIName("");
- this->SetUserFuncState(STATE_RETURN);
- this->ReceiveSendMsg(funcName, "done");
+void CreatePhiOpResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t argId = atol(root["argId"].asString().c_str());
+ uint64_t blockId = atol(root["blockId"].asString().c_str());
+ PhiOp op = clientAPI.CreatePhiOp(argId, blockId);
+ PluginJson json = client->GetJson();
+ Json::Value opResult = json.PhiOpJsonSerialize(op);
+ client->ReceiveSendMsg("OpsResult", opResult.toStyledString());
}
-int PluginClient::GetInitInfo(string& serverPath, string& shaPath, int& timeout)
+void CreateConstOpResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- Json::Reader reader;
- std::ifstream ifs;
- string configFilePath;
- string serverDir;
- if (serverPath == "") {
- configFilePath = "/usr/local/bin/pin-gcc-client.json"; // server路径为空配置文件默认路径
- LOGW("input serverPath is NULL, read default:%s\n", configFilePath.c_str());
- } else {
- int index = serverPath.find_last_of("/");
- serverDir = serverPath.substr(0, index);
- configFilePath = serverDir + "/pin-gcc-client.json"; // 配置文件和server在同一目录
- }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ PluginJson json = client->GetJson();
+ PluginIR::PluginTypeBase type = json.TypeJsonDeSerialize(root.toStyledString(), context);
+ uint64_t value = atol(root["value"].asString().c_str());
+ mlir::OpBuilder opBuilder = mlir::OpBuilder(&context);
+ mlir::Attribute attr = opBuilder.getI64IntegerAttr(value);
+ mlir::Value ret = clientAPI.CreateConstOp(attr, type);
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
+}
- ifs.open(configFilePath.c_str());
- if (!ifs) {
- shaPath = serverDir + "/libpin_user.sha256"; // sha256文件默认和server在同一目录
- LOGW("open %s fail! use default sha256file:%s\n", configFilePath.c_str(), shaPath.c_str());
- return -1;
- }
- reader.parse(ifs, root);
- ifs.close();
+void UpdateSSAResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ bool ret = clientAPI.UpdateSSA();
+ client->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
+}
- if (serverPath == "") {
- if (!root["path"].isString()) {
- LOGE("path in config.json is not string\n");
- return 0;
- }
- serverPath = root["path"].asString();
- int index = serverPath.find_last_of("/");
- serverDir = serverPath.substr(0, index);
- }
- int timeoutJson = root["timeout"].asInt();
- if ((timeoutJson >= 50) && (timeoutJson <= 5000)) { // 不在50~5000ms范围内使用默认值
- timeout = timeoutJson;
- LOGI("the timeout is:%d\n", timeout);
- } else {
- LOGW("timeout read from %s is:%d,should be 50~5000,use default:%d\n",
- configFilePath.c_str(), timeoutJson, timeout);
- }
- shaPath = root["sha256file"].asString();
- int ret = access(shaPath.c_str(), F_OK);
- if ((shaPath == "") || (ret != 0)) {
- shaPath = serverDir + "/libpin_user.sha256"; // sha256文件默认和server在同一目录
- LOGW("sha256 file not found,use default:%s\n", shaPath.c_str());
- }
- return 0;
+void GetAllPhiOpInsideBlockResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t bb = atol(root["bbAddr"].asString().c_str());
+ vector<PhiOp> phiOps = clientAPI.GetPhiOpsInsideBlock(bb);
+ PluginJson json = client->GetJson();
+ json.GetPhiOpsJsonSerialize(phiOps, result);
+ client->ReceiveSendMsg("GetPhiOps", result);
}
-void PluginClient::GetArg(struct plugin_name_args *pluginInfo, string& serverPath,
- string& arg, LogPriority& logLevel)
+void IsDomInfoAvailableResult(PluginClient *client, Json::Value& root, string& result)
{
- Json::Value root;
- map<string, string> compileArgs;
- for (int i = 0; i < pluginInfo->argc; i++) {
- string key = pluginInfo->argv[i].key;
- if (key == "server_path") {
- serverPath = pluginInfo->argv[i].value;
- } else if (key == "log_level") {
- logLevel = (LogPriority)atoi(pluginInfo->argv[i].value);
- SetLogPriority(logLevel);
- } else {
- string value = pluginInfo->argv[i].value;
- compileArgs[key] = value;
- root[key] = value;
- }
- }
- arg = root.toStyledString();
- for (auto it = compileArgs.begin(); it != compileArgs.end(); it++) {
- CheckSafeCompileFlag(it->first, it->second);
- }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ bool ret = clientAPI.IsDomInfoAvailable();
+ client->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
}
-int PluginClient::CheckSHA256(const string& shaPath)
+void GetCurrentDefFromSSAResult(PluginClient *client, Json::Value& root, string& result)
{
- if (shaPath == "") {
- LOGE("sha256file Path is NULL,check:%s\n", shaPath.c_str());
- return -1;
- }
- int index = shaPath.find_last_of("/");
- string dir = shaPath.substr(0, index);
- string filename = shaPath.substr(index+1, -1);
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ uint64_t varId = atol(root["varId"].asString().c_str());
+ PluginAPI::PluginClientAPI clientAPI(context);
+ mlir::Value ret = clientAPI.GetCurrentDefFromSSA(varId);
+ PluginJson json = client->GetJson();
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
+}
- string cmd = "cd " + dir + " && " + "sha256sum -c " + filename + " --quiet";
- int ret = system(cmd.c_str());
- return ret;
+void SetCurrentDefInSSAResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ uint64_t varId = atol(root["varId"].asString().c_str());
+ uint64_t defId = atol(root["defId"].asString().c_str());
+ PluginAPI::PluginClientAPI clientAPI(context);
+ bool ret = clientAPI.SetCurrentDefInSSA(varId, defId);
+ client->ReceiveSendMsg("BoolResult", std::to_string((uint64_t)ret));
}
-void PluginClient::CheckSafeCompileFlag(const string& argName, const string& param)
+void CopySSAOpResult(PluginClient *client, Json::Value& root, string& result)
{
- vector<string> safeCompileFlags = {
- "-z noexecstack",
- "-fno-stack-protector",
- "-fstack-protector-all",
- "-D_FORTIFY_SOURCE",
- "-fPic",
- "-fPIE",
- "-fstack-protector-strong",
- "-fvisibility",
- "-ftrapv",
- "-fstack-check",
- };
-
- for (auto& v : safeCompileFlags) {
- if (param.find(v) != string::npos) {
- LOGW("%s:%s have safe compile parameter:%s !!!\n", argName.c_str(), param.c_str(), v.c_str());
- }
- }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t id = atol(root["id"].asString().c_str());
+ mlir::Value ret = clientAPI.CopySSAOp(id);
+ PluginJson json = client->GetJson();
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
}
-bool PluginClient::DeletePortFromLockFile(unsigned short port)
+void CreateSSAOpResult(PluginClient *client, Json::Value& root, string& result)
{
- int portFileFd = open(g_portFilePath, O_RDWR);
- if (portFileFd == -1) {
- LOGE("%s open file %s fail\n", __func__, g_portFilePath);
- return false;
- }
- LOGI("delete port:%d\n", port);
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ PluginJson json = client->GetJson();
+ PluginIR::PluginTypeBase type = json.TypeJsonDeSerialize(root.toStyledString(), context);
+ mlir::Value ret = clientAPI.CreateSSAOp(type);
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
+}
- flock(portFileFd, LOCK_EX);
- string grpcPorts = "";
- ReadPortsFromLockFile(portFileFd, grpcPorts);
+void CreateNewDefResult(PluginClient *client, Json::Value& root, string& result)
+{
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ uint64_t opId = atol(root["opId"].asString().c_str());
+ uint64_t valueId = atol(root["valueId"].asString().c_str());
+ uint64_t defId = atol(root["defId"].asString().c_str());
+ mlir::Value ret = clientAPI.CreateNewDef(valueId, opId, defId);
+ PluginJson json = client->GetJson();
+ client->ReceiveSendMsg("ValueResult", json.ValueJsonSerialize(ret).toStyledString());
+}
- string portStr = std::to_string(port) + "\n";
- string::size_type pos = grpcPorts.find(portStr);
- if (pos == string::npos) {
- close(portFileFd);
- return true;
- }
- grpcPorts = grpcPorts.erase(pos, portStr.size());
+void RemoveEdgeResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "src":"xxxx",
+ /// "dest":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string srcKey = "src";
+ uint64_t src = atol(root[srcKey].asString().c_str());
+ std::string destKey = "dest";
+ uint64_t dest = atol(root[destKey].asString().c_str());
+ clientAPI.RemoveEdge(src, dest);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("VoidResult", result);
+}
- ftruncate(portFileFd, 0);
- lseek(portFileFd, 0, SEEK_SET);
- write(portFileFd, grpcPorts.c_str(), grpcPorts.size());
- close(portFileFd);
+void ConfirmValueResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "valId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string valIdKey = "valId";
+ uint64_t valId = atol(root[valIdKey].asString().c_str());
+ mlir::Value v = clientAPI.GetValue(valId);
+ PluginJson json = client->GetJson();
+ Json::Value valueJson = json.ValueJsonSerialize(v);
+ result = valueJson.toStyledString();
+ client->ReceiveSendMsg("ValueResult", result);
+}
- return true;
+void BuildMemRefResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "baseId":"xxxx",
+ /// "offsetId":"xxxx",
+ /// "type":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string baseIdKey = "baseId";
+ std::string offsetIdKey = "offsetId";
+ std::string typeKey = "type";
+ uint64_t baseId = atol(root[baseIdKey].asString().c_str());
+ uint64_t offsetId = atol(root[offsetIdKey].asString().c_str());
+ Json::Value type = root[typeKey];
+ PluginJson json = client->GetJson();
+ PluginIR::PluginTypeBase pType = json.TypeJsonDeSerialize(type.toStyledString(), context);
+ mlir::Value v = clientAPI.BuildMemRef(pType, baseId, offsetId);
+ Json::Value valueJson = json.ValueJsonSerialize(v);
+ result = valueJson.toStyledString();
+ client->ReceiveSendMsg("ValueResult", result);
+}
+
+void DebugValueResult(PluginClient *client, Json::Value& root, string& result)
+{
+ /// Json格式
+ /// {
+ /// "valId":"xxxx",
+ /// }
+ mlir::MLIRContext context;
+ context.getOrLoadDialect<PluginDialect>();
+ PluginAPI::PluginClientAPI clientAPI(context);
+ std::string valIdKey = "valId";
+ uint64_t valId = atol(root[valIdKey].asString().c_str());
+ clientAPI.DebugValue(valId);
+ PluginJson json = client->GetJson();
+ json.NopJsonSerialize(result);
+ client->ReceiveSendMsg("ValueResult", result);
+}
+
+typedef std::function<void(PluginClient*, Json::Value&, string&)> GetResultFunc;
+std::map<string, GetResultFunc> g_getResultFunc = {
+ {"GetAllFunc", GetAllFuncResult},
+ {"GetLocalDecls", GetLocalDeclsResult},
+ {"GetLoopsFromFunc", GetLoopsFromFuncResult},
+ {"GetLoopById", GetLoopByIdResult},
+ {"IsBlockInside", IsBlockInsideResult},
+ {"AllocateNewLoop", AllocateNewLoopResult},
+ {"RedirectFallthroughTarget", RedirectFallthroughTargetResult},
+ {"DeleteLoop", DeleteLoopResult},
+ {"AddBlockToLoop", AddBlockToLoopResult},
+ {"AddLoop", AddLoopResult},
+ {"GetBlocksInLoop", GetBlocksInLoopResult},
+ {"GetHeader", GetHeaderResult},
+ {"GetLatch", GetLatchResult},
+ {"SetHeader", SetHeaderResult},
+ {"SetLatch", SetLatchResult},
+ {"GetLoopExits", GetLoopExitsResult},
+ {"GetLoopSingleExit", GetLoopSingleExitResult},
+ {"GetBlockLoopFather", GetBlockLoopFatherResult},
+ {"CreateBlock", CreateBlockResult},
+ {"DeleteBlock", DeleteBlockResult},
+ {"SetImmediateDominator", SetImmediateDominatorResult},
+ {"GetImmediateDominator", GetImmediateDominatorResult},
+ {"RecomputeDominator", RecomputeDominatorResult},
+ {"GetPhiOp", GetPhiOpResult},
+ {"GetCallOp", GetCallOpResult},
+ {"SetLhsInCallOp", SetLhsInCallOpResult},
+ {"AddArgInPhiOp", AddArgInPhiOpResult},
+ {"CreateCallOp", CreateCallOpResult},
+ {"CreateAssignOp", CreateAssignOpResult},
+ {"CreateCondOp", CreateCondOpResult},
+ {"CreateFallthroughOp", CreateFallthroughOpResult},
+ {"GetResultFromPhi", GetResultFromPhiResult},
+ {"CreatePhiOp", CreatePhiOpResult},
+ {"CreateConstOp", CreateConstOpResult},
+ {"UpdateSSA", UpdateSSAResult},
+ {"GetAllPhiOpInsideBlock", GetAllPhiOpInsideBlockResult},
+ {"IsDomInfoAvailable", IsDomInfoAvailableResult},
+ {"GetCurrentDefFromSSA", GetCurrentDefFromSSAResult},
+ {"SetCurrentDefInSSA", SetCurrentDefInSSAResult},
+ {"CopySSAOp", CopySSAOpResult},
+ {"CreateSSAOp", CreateSSAOpResult},
+ {"CreateNewDef", CreateNewDefResult},
+ {"RemoveEdge", RemoveEdgeResult},
+ {"ConfirmValue", ConfirmValueResult},
+ {"BuildMemRef", BuildMemRefResult},
+ {"DebugValue", DebugValueResult},
+};
+
+void PluginClient::GetIRTransResult(void *gccData, const string& funcName, const string& param)
+{
+ string result;
+ Json::Value root;
+ Json::Reader reader;
+ reader.parse(param, root);
+ LOGD("%s func:%s,param:%s\n", __func__, funcName.c_str(), param.c_str());
+
+ if (funcName == "GetInjectDataAddress") {
+ int64_t ptrAddress = (int64_t)gccData;
+ json.IntegerSerialize(ptrAddress, result);
+ this->ReceiveSendMsg("IntegerResult", result);
+ } else if (funcName == "GetIncludeFile") {
+ if (gccData != nullptr) {
+ string includeFile = (char *)gccData;
+ json.StringSerialize(includeFile, result);
+ this->ReceiveSendMsg("StringResult", result);
+ } else {
+ LOGE("%s gcc_data address is NULL!\n", __func__);
+ }
+ } else {
+ auto it = g_getResultFunc.find(funcName);
+ if (it != g_getResultFunc.end()) {
+ it->second(this, root, result);
+ } else {
+ string key = "";
+ GetGccData(funcName, param, key, result);
+ if (key != "") {
+ this->ReceiveSendMsg(key, result);
+ }
+ }
+ }
+
+ LOGD("IR function: %s\n", funcName.c_str());
+ this->SetPluginAPIName("");
+ this->SetUserFuncState(STATE_RETURN);
+ this->ReceiveSendMsg(funcName, "done");
}
+// attribute:value说明
+// start:ok 启动成功
+// stop:ok 关闭成功
+// userFunc:execution completed 函数执行完毕,执行下一个函数
+// injectPoit:xxxx 注册点xxxx是server传递过来的唯一值gcc回调时将xxxx返回server解析执行对应的函数
+// xxxx:yyyy 此类都认为是api函数xxxx为函数名yyyy为形参
void PluginClient::ReceiveSendMsg(const string& attribute, const string& value)
{
ClientContext context;
@@ -1219,31 +925,29 @@ void PluginClient::ReceiveSendMsg(const string& attribute, const string& value)
clientMsg.set_value(value);
stream->Write(clientMsg);
stream->WritesDone();
- TimerStart(timeout);
- if (g_grpcChannel->GetState(true) != GRPC_CHANNEL_READY) {
+ TimerStart(input.GetTimeout());
+
+ if (grpcChannel->GetState(true) != GRPC_CHANNEL_READY) {
LOGW("client pid:%d grpc channel not ready!\n", getpid());
return;
}
ServerMsg serverMsg;
while (stream->Read(&serverMsg)) {
- TimerStart(0);
- if (serverMsg.attribute() != "injectPoint") { // 日志不记录注册的函数名信息
+ TimerStart(0); // 定时值0关闭定时器
+ if (serverMsg.attribute() != grpckey[INJECT]) { // 日志不记录注册的函数名信息
LOGD("rec from server:%s,%s\n", serverMsg.attribute().c_str(), serverMsg.value().c_str());
}
- if ((serverMsg.attribute() == "start") && (serverMsg.value() == "ok")) {
+ if ((serverMsg.attribute() == grpckey[START]) && (serverMsg.value() == grpcValue[START_VALUE])) {
LOGI("server has been started!\n");
- if (!DeletePortFromLockFile(GetGrpcPort())) {
- LOGE("DeletePortFromLockFile fail\n");
- }
- } else if ((serverMsg.attribute() == "stop") && (serverMsg.value() == "ok")) {
+ DeleteGrpcPort();
+ } else if ((serverMsg.attribute() == grpckey[STOP]) && (serverMsg.value() == grpcValue[STOP_VALUE])) {
LOGI("server has been closed!\n");
Status status = stream->Finish();
if (!status.ok()) {
- LOGE("error code:%d,%s\n", status.error_code(), status.error_message().c_str());
- LOGE("RPC failed\n");
+ LOGE("RPC failed,error code:%d,%s\n", status.error_code(), status.error_message().c_str());
}
CloseLog();
- } else if ((serverMsg.attribute() == "userFunc") && (serverMsg.value() == "execution completed")) {
+ } else if ((serverMsg.attribute() == grpckey[USERFUNC]) && (serverMsg.value() == grpcValue[USERFUNC_VALUE])) {
SetUserFuncState(STATE_END); // server已接收到对应函数所需数据
} else {
ServerMsgProc(serverMsg.attribute(), serverMsg.value());
@@ -1258,9 +962,10 @@ int PluginClient::AddRegisteredUserFunc(const string& value)
string name = value.substr(index + 1, -1);
InjectPoint inject = (InjectPoint)atoi(point.c_str());
if (inject >= HANDLE_MAX) {
+ LOGE("AddRegisteredUserFunc %s err!\n", value.c_str());
return -1;
}
-
+
registeredUserFunc[inject].push_back(name);
return 0;
}
@@ -1270,63 +975,75 @@ ManagerSetupData GetPassInfoData(const string& data)
ManagerSetupData setupData;
Json::Value root;
Json::Reader reader;
- reader.parse(data, root);
+ string jsonData = data.substr(data.find_first_of(":") + 1, -1);
+ reader.parse(jsonData, root);
- setupData.refPassName = (RefPassName)root["refPassName"].asInt();
- setupData.passNum = root["passNum"].asInt();
- setupData.passPosition = (PassPosition)root["passPosition"].asInt();
+ if (root[passValue[PASS_NAME]].isInt()) {
+ setupData.refPassName = (RefPassName)root[passValue[PASS_NAME]].asInt();
+ }
+ if (root[passValue[PASS_NUM]].isInt()) {
+ setupData.passNum = root[passValue[PASS_NUM]].asInt();
+ }
+ if (root[passValue[PASS_POSITION]].isInt()) {
+ setupData.passPosition = (PassPosition)root[passValue[PASS_POSITION]].asInt();
+ }
+
return setupData;
}
+// attribute不为"injectPoint"时,attribute为"funcName",value为函数参数
+// attribute为"injectPoint"时, value为"inject:funcName+函数指针地址"
void PluginClient::ServerMsgProc(const string& attribute, const string& value)
{
- std::shared_ptr<PluginClient> client = PluginClient::GetInstance();
- if (attribute == "injectPoint") {
- if (value == "finished") {
- string pluginName = client->GetPluginName();
- InjectPoint inject;
- map<InjectPoint, vector<string>> userFuncs = client->GetRegisteredUserFunc();
- for (auto it = userFuncs.begin(); it != userFuncs.end(); it++) {
- inject = it->first;
- if (inject == HANDLE_MANAGER_SETUP) {
- string data = it->second.front();
- ManagerSetupData setupData = GetPassInfoData(data);
- RegisterPassManagerSetup(inject, setupData, pluginName);
- } else {
- RegisterPluginEvent(inject, pluginName); // 注册event
+ if (attribute != grpckey[INJECT]) {
+ SetPluginAPIParam(value);
+ SetPluginAPIName(attribute);
+ SetUserFuncState(STATE_BEGIN);
+ return;
+ }
+
+ if (value == grpcValue[FINISH_VALUE]) {
+ string pluginName = GetPluginName();
+ InjectPoint inject;
+ map<InjectPoint, vector<string>> userFuncs = GetRegisteredUserFunc();
+ for (auto it = userFuncs.begin(); it != userFuncs.end(); it++) {
+ inject = it->first; // first为注册点
+ if (inject == HANDLE_MANAGER_SETUP) {
+ for (unsigned int i = 0; i < it->second.size(); i++) {
+ ManagerSetupData setupData = GetPassInfoData(it->second[i]);
+ RegisterPassManagerSetup(i, setupData, pluginName);
}
+ } else {
+ RegisterPluginEvent(inject, pluginName); // 注册event
}
- client->SetInjectFlag(true);
- } else {
- client->AddRegisteredUserFunc(value);
}
+ SetInjectFlag(true);
} else {
- client->SetPluginAPIParam(value);
- client->SetPluginAPIName(attribute);
- client->SetUserFuncState(STATE_BEGIN);
+ AddRegisteredUserFunc(value);
}
}
void TimeoutFunc(union sigval sig)
{
LOGW("client pid:%d timeout!\n", getpid());
- g_plugin->SetUserFuncState(STATE_TIMEOUT);
+ PluginClient::GetInstance()->SetUserFuncState(STATE_TIMEOUT);
}
void PluginClient::TimerStart(int interval)
{
- int msTons = 1000000; // ms转ns倍数
- int msTos = 1000; // s转ms倍数
+ const int msTons = 1000000; // ms转ns倍数
+ const int msTos = 1000; // s转ms倍数
struct itimerspec time_value;
time_value.it_value.tv_sec = (interval / msTos);
time_value.it_value.tv_nsec = (interval % msTos) * msTons;
time_value.it_interval.tv_sec = 0;
time_value.it_interval.tv_nsec = 0;
-
- timer_settime(timerId, 0, &time_value, NULL);
+
+ const int timeFlag = 0; // 0 表示希望timer首次到期时的时间与启动timer的时间间隔
+ timer_settime(timerId, timeFlag, &time_value, NULL);
}
-bool PluginClient::TimerInit(void)
+bool PluginClient::TimerInit(clockid_t id)
{
struct sigevent evp;
int sival = 124; // 传递整型参数,可以自定义
@@ -1336,130 +1053,122 @@ bool PluginClient::TimerInit(void)
evp.sigev_notify = SIGEV_THREAD;
evp.sigev_notify_function = TimeoutFunc;
- if (timer_create(CLOCK_REALTIME, &evp, &timerId) == -1) {
+ if (timer_create(id, &evp, &timerId) == -1) {
LOGE("timer create fail\n");
return false;
}
return true;
}
-int PluginClient::OpenLockFile(const char *path)
+static bool WaitServer(const string& port)
{
- int portFileFd = -1;
- if (access(path, F_OK) == -1) {
- mode_t mask = umask(0);
- mode_t mode = 0666;
- portFileFd = open(path, O_CREAT | O_RDWR, mode);
- umask(mask);
- } else {
- portFileFd = open(path, O_RDWR);
- }
-
- if (portFileFd == -1) {
- LOGE("open file %s fail\n", path);
- }
- return portFileFd;
-}
-
-void PluginClient::ReadPortsFromLockFile(int fd, string& grpcPorts)
-{
- int fileLen = lseek(fd, 0, SEEK_END);
- lseek(fd, 0, SEEK_SET);
- char *buf = new char[fileLen + 1];
- read(fd, buf, fileLen);
- buf[fileLen] = '\0';
- grpcPorts = buf;
- delete[] buf;
-}
-
-unsigned short PluginClient::FindUnusedPort(void)
-{
- unsigned short basePort = 40000; // grpc通信端口号从40000开始
- unsigned short foundPort = 0; // 可以使用的端口号
- struct sockaddr_in serverAddr;
- memset(&serverAddr, 0, sizeof(serverAddr));
- serverAddr.sin_family = AF_INET;
- serverAddr.sin_addr.s_addr = inet_addr("0.0.0.0");
-
- int portFileFd = OpenLockFile(g_portFilePath);
- if (portFileFd == -1) {
- return 0;
- }
-
- flock(portFileFd, LOCK_EX);
- string grpcPorts = "";
- ReadPortsFromLockFile(portFileFd, grpcPorts);
-
- while (++basePort < UINT16_MAX) {
- int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- serverAddr.sin_port = htons(basePort);
- int ret = connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
- if (sock != -1) {
- close(sock);
- }
- if ((ret == -1) && (errno == ECONNREFUSED)) {
- string strPort = std::to_string(basePort) + "\n";
- if (grpcPorts.find(strPort) == grpcPorts.npos) {
- foundPort = basePort;
- LOGI("found port:%d\n", foundPort);
- lseek(portFileFd, 0, SEEK_END);
- write(portFileFd, strPort.c_str(), strPort.size());
- break;
- }
+ const int delay = 50;
+ const int cnt = 4000;
+ 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);
+ umask(mask);
+ int i = 0;
+ for (; i < cnt; i++) {
+ if (sem_trywait(sem) == 0) {
+ break;
+ } else {
+ usleep(delay);
}
}
-
- if (basePort == UINT16_MAX) {
- ftruncate(portFileFd, 0);
- lseek(portFileFd, 0, SEEK_SET);
+ sem_close(sem);
+ sem_unlink(semFile.c_str());
+ if (i >= cnt) {
+ return false;
}
-
- close(portFileFd); // 关闭文件fd会同时释放文件锁
- return foundPort;
+ return true;
}
-int ServerStart(int timeout, const string& serverPath, pid_t& pid, string& port, const LogPriority logLevel)
+int PluginClient::ServerStart(pid_t& pid)
{
- unsigned short portNum = PluginClient::FindUnusedPort();
- if (portNum == 0) {
+ if (!grpcPort.FindUnusedPort()) {
LOGE("cannot find port for grpc,port 40001-65535 all used!\n");
return -1;
}
+
int ret = 0;
- port = std::to_string(portNum);
+ unsigned short portNum = grpcPort.GetPort();
+ string port = std::to_string(portNum);
pid = vfork();
if (pid == 0) {
LOGI("start plugin server!\n");
- string paramTimeout = std::to_string(timeout);
- if (execl(serverPath.c_str(), paramTimeout.c_str(), port.c_str(),
- std::to_string(logLevel).c_str(), NULL) == -1) {
- PluginClient::DeletePortFromLockFile(portNum);
+ string serverPath = input.GetServerPath();
+ if (execl(serverPath.c_str(), port.c_str(), std::to_string(input.GetLogLevel()).c_str(), NULL) == -1) {
+ DeleteGrpcPort();
LOGE("server start fail! please check serverPath:%s\n", serverPath.c_str());
ret = -1;
_exit(0);
}
}
- int delay = 500000; // 500ms
- usleep(delay); // wait server start
+ if (!WaitServer(port)) {
+ ret = -1;
+ }
return ret;
}
-int ClientStart(int timeout, const string& arg, const string& pluginName, const string& port)
+int PluginClient::ClientStart()
{
- string serverPort = "localhost:" + port;
- g_grpcChannel = grpc::CreateChannel(serverPort, grpc::InsecureChannelCredentials());
- g_plugin = std::make_shared<PluginClient>(g_grpcChannel);
- g_plugin->SetInjectFlag(false);
- g_plugin->SetTimeout(timeout);
- g_plugin->SetUserFuncState(STATE_WAIT_BEGIN);
-
- if (!g_plugin->TimerInit()) {
- return 0;
+ setenv("no_grpc_proxy", "localhost", 1); // 关闭localhost的代理,因为server和client运行在同一个机器上需要通过localhost建立连接
+ string serverPort = "localhost:" + std::to_string(grpcPort.GetPort());
+ grpcChannel = grpc::CreateChannel(serverPort, grpc::InsecureChannelCredentials());
+ serviceStub = PluginService::NewStub(grpcChannel);
+ SetInjectFlag(false);
+ SetUserFuncState(STATE_WAIT_BEGIN);
+ SetStartFlag(true);
+ if (!TimerInit(CLOCK_REALTIME)) {
+ return -1;
}
- unsigned short grpcPort = (unsigned short)atoi(port.c_str());
- g_plugin->SetGrpcPort(grpcPort);
- g_plugin->ReceiveSendMsg("start", arg);
+ ReceiveSendMsg(grpckey[START], input.GetArgs());
return 0;
}
+
+void PluginClient::Init(struct plugin_name_args *pluginInfo, const string& pluginName, pid_t& serverPid)
+{
+ SetPluginName(pluginName);
+ SetStartFlag(false);
+
+ // inputCheck模块初始化,并对输入参数进行检查
+ input.GetInputArgs(pluginInfo);
+ if (input.GetInitInfo() != 0) {
+ LOGD("read default info from pin-gcc-client.json fail! use the default timeout=%dms\n", input.GetTimeout());
+ }
+ if (input.GetServerPath() == "") {
+ LOGE("server path is NULL!\n");
+ return;
+ }
+ if (input.CheckSHA256() != 0) {
+ LOGE("sha256 check sha256 file:%s fail!\n", input.GetShaPath().c_str());
+ return;
+ } else {
+ LOGI("sha256 check success!\n");
+ }
+
+ // 查找未使用的端口号并启动server和client
+ if (ServerStart(serverPid) != 0) {
+ DeleteGrpcPort();
+ return;
+ }
+ if (ClientStart() != 0) {
+ return;
+ }
+
+ // 等待用户完成注入点的注册或者server异常退出后再接着执行gcc编译
+ int status;
+ while (1) {
+ if ((GetInjectFlag()) || (GetUserFuncState() == STATE_TIMEOUT)) {
+ break;
+ }
+ if (serverPid == waitpid(-1, &status, WNOHANG)) {
+ DeleteGrpcPort();
+ break;
+ }
+ }
+}
} // namespace PinClient
--
2.27.0.windows.1