From 9dc1cc4cb0eeb114ac9b5daea3005f2caa1ccf5b Mon Sep 17 00:00:00 2001 From: benniaobufeijiushiji Date: Sun, 19 Feb 2023 14:41:49 +0800 Subject: [PATCH 7/9] [Pin-gcc-client] Add API for LTO judgement diff --git a/include/PluginAPI/BasicPluginOpsAPI.h b/include/PluginAPI/BasicPluginOpsAPI.h index 8c47c58..ca74588 100644 --- a/include/PluginAPI/BasicPluginOpsAPI.h +++ b/include/PluginAPI/BasicPluginOpsAPI.h @@ -95,6 +95,9 @@ public: virtual mlir::Value BuildMemRef(PluginTypeBase, uint64_t, uint64_t) = 0; virtual void RedirectFallthroughTarget(uint64_t, uint64_t) = 0; virtual void RemoveEdge(uint64_t, uint64_t) = 0; + + virtual bool IsLtoOptimize() = 0; + virtual bool IsWholeProgram() = 0; }; // class BasicPluginOpsAPI } // namespace PluginAPI diff --git a/include/PluginAPI/PluginClientAPI.h b/include/PluginAPI/PluginClientAPI.h index 07d6e52..727d329 100644 --- a/include/PluginAPI/PluginClientAPI.h +++ b/include/PluginAPI/PluginClientAPI.h @@ -95,6 +95,9 @@ public: void RedirectFallthroughTarget(uint64_t, uint64_t) override; void RemoveEdge(uint64_t, uint64_t) override; + + bool IsLtoOptimize() override; + bool IsWholeProgram() override; private: PluginIR::GimpleToPluginOps gimpleConversion; }; // class PluginClientAPI diff --git a/include/Translate/GimpleToPluginOps.h b/include/Translate/GimpleToPluginOps.h index 5f8bdf0..2ecf5ac 100644 --- a/include/Translate/GimpleToPluginOps.h +++ b/include/Translate/GimpleToPluginOps.h @@ -106,6 +106,10 @@ public: void RedirectFallthroughTarget(uint64_t, uint64_t); void RemoveEdge(uint64_t, uint64_t); + + bool IsLtoOptimize(); + bool IsWholeProgram(); + private: GimpleToPluginOps () = delete; mlir::OpBuilder builder; diff --git a/lib/PluginAPI/PluginClientAPI.cpp b/lib/PluginAPI/PluginClientAPI.cpp index 5e454d7..362ede1 100644 --- a/lib/PluginAPI/PluginClientAPI.cpp +++ b/lib/PluginAPI/PluginClientAPI.cpp @@ -280,4 +280,14 @@ void PluginClientAPI::RemoveEdge(uint64_t src, uint64_t dest) return gimpleConversion.RemoveEdge(src, dest); } +bool PluginClientAPI::IsLtoOptimize() +{ + return gimpleConversion.IsLtoOptimize(); +} + +bool PluginClientAPI::IsWholeProgram() +{ + return gimpleConversion.IsWholeProgram(); +} + } // namespace PluginAPI \ No newline at end of file diff --git a/lib/PluginClient/PluginClient.cpp b/lib/PluginClient/PluginClient.cpp index 18877c2..81b59c0 100644 --- a/lib/PluginClient/PluginClient.cpp +++ b/lib/PluginClient/PluginClient.cpp @@ -820,6 +820,24 @@ void DebugValueResult(PluginClient *client, Json::Value& root, string& result) client->ReceiveSendMsg("ValueResult", result); } +void IsLtoOptimizeResult(PluginClient *client, Json::Value& root, string& result) +{ + mlir::MLIRContext context; + context.getOrLoadDialect(); + PluginAPI::PluginClientAPI clientAPI(context); + bool lto = clientAPI.IsLtoOptimize(); + client->ReceiveSendMsg("BoolResult", std::to_string(lto)); +} + +void IsWholeProgramResult(PluginClient *client, Json::Value& root, string& result) +{ + mlir::MLIRContext context; + context.getOrLoadDialect(); + PluginAPI::PluginClientAPI clientAPI(context); + bool wholePR = clientAPI.IsWholeProgram(); + client->ReceiveSendMsg("BoolResult", std::to_string(wholePR)); +} + typedef std::function GetResultFunc; std::map g_getResultFunc = { {"GetAllFunc", GetAllFuncResult}, @@ -868,6 +886,8 @@ std::map g_getResultFunc = { {"ConfirmValue", ConfirmValueResult}, {"BuildMemRef", BuildMemRefResult}, {"DebugValue", DebugValueResult}, + {"IsLtoOptimize",IsLtoOptimizeResult}, + {"IsWholeProgram",IsWholeProgramResult}, }; void PluginClient::GetIRTransResult(void *gccData, const string& funcName, const string& param) diff --git a/lib/Translate/GimpleToPluginOps.cpp b/lib/Translate/GimpleToPluginOps.cpp index 5ecab75..c4e5611 100644 --- a/lib/Translate/GimpleToPluginOps.cpp +++ b/lib/Translate/GimpleToPluginOps.cpp @@ -529,6 +529,16 @@ void GimpleToPluginOps::RemoveEdge(uint64_t src, uint64_t dest) remove_edge(e); } +bool GimpleToPluginOps::IsLtoOptimize() +{ + return in_lto_p; +} + +bool GimpleToPluginOps::IsWholeProgram() +{ + return flag_whole_program; +} + FunctionOp GimpleToPluginOps::BuildFunctionOp(uint64_t functionId) { function *fn = reinterpret_cast(functionId); -- 2.27.0.windows.1