pin-gcc-client/0002-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

2328 lines
95 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 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