Projects
Eulaceura:Factory
pin-server
_service:obs_scm:0023-Pin-server-Add-StructReor...
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0023-Pin-server-Add-StructReorderPASS-demo.patch of Package pin-server
From 959277b19b4a1a8991d05e2db4bdd5374e6c308e Mon Sep 17 00:00:00 2001 From: d00573793 <dingguangya1@huawei.com> Date: Mon, 6 Mar 2023 23:01:18 +0800 Subject: [PATCH 23/23] [Pin-server] Add StructReorderPASS demo diff --git a/include/PluginAPI/BasicPluginOpsAPI.h b/include/PluginAPI/BasicPluginOpsAPI.h index d659662..d9f348d 100644 --- a/include/PluginAPI/BasicPluginOpsAPI.h +++ b/include/PluginAPI/BasicPluginOpsAPI.h @@ -72,6 +72,7 @@ public: virtual void SetTypeFields(uint64_t declId, uint64_t fieldId) = 0; virtual void LayoutType(uint64_t declId) = 0; virtual void LayoutDecl(uint64_t declId) = 0; + virtual PluginIR::PluginTypeBase GetDeclType(uint64_t declId) = 0; virtual vector<LocalDeclOp> GetDecls(uint64_t) = 0; virtual LoopOp AllocateNewLoop(uint64_t) = 0; diff --git a/include/PluginAPI/PluginServerAPI.h b/include/PluginAPI/PluginServerAPI.h index 239dd23..c18bba9 100644 --- a/include/PluginAPI/PluginServerAPI.h +++ b/include/PluginAPI/PluginServerAPI.h @@ -65,6 +65,7 @@ public: void SetTypeFields(uint64_t declId, uint64_t fieldId) override; void LayoutType(uint64_t declId) override; void LayoutDecl(uint64_t declId) override; + PluginIR::PluginTypeBase GetDeclType(uint64_t declId) override; vector<LocalDeclOp> GetDecls(uint64_t) override; PhiOp GetPhiOp(uint64_t) override; diff --git a/include/PluginServer/PluginCom.h b/include/PluginServer/PluginCom.h index af819ad..7deb615 100755 --- a/include/PluginServer/PluginCom.h +++ b/include/PluginServer/PluginCom.h @@ -60,6 +60,7 @@ public: vector<mlir::Plugin::DeclBaseOp> GetFuncDeclsResult(void); llvm::SmallVector<mlir::Plugin::FieldDeclOp> GetFieldsResult(void); mlir::Plugin::DeclBaseOp GetBuildDeclResult(void); + PluginIR::PluginTypeBase GetDeclTypeResult(void); mlir::Plugin::FieldDeclOp GetMakeNodeResult(void); @@ -93,6 +94,7 @@ private: uint64_t idResult; vector<uint64_t> idsResult; mlir::Value valueResult; + PluginIR::PluginTypeBase pTypeResult; mlir::Plugin::DeclBaseOp declOp; mlir::Plugin::FieldDeclOp fielddeclOp; llvm::SmallVector<mlir::Plugin::FieldDeclOp> fieldsOps; diff --git a/include/PluginServer/PluginServer.h b/include/PluginServer/PluginServer.h index 29a790b..81f92e9 100644 --- a/include/PluginServer/PluginServer.h +++ b/include/PluginServer/PluginServer.h @@ -183,6 +183,12 @@ public: return pluginCom.GetBuildDeclResult(); } + PluginIR::PluginTypeBase GetDeclTypeResult(const string& funName, const string& params) + { + RemoteCallClientWithAPI(funName, params); + return pluginCom.GetDeclTypeResult(); + } + vector<mlir::Plugin::LocalDeclOp> GetLocalDeclResult(const string& funName, const string& params) { RemoteCallClientWithAPI(funName, params); diff --git a/lib/PluginAPI/PluginServerAPI.cpp b/lib/PluginAPI/PluginServerAPI.cpp index 537d389..e8a1f4c 100644 --- a/lib/PluginAPI/PluginServerAPI.cpp +++ b/lib/PluginAPI/PluginServerAPI.cpp @@ -613,6 +613,15 @@ void PluginServerAPI::LayoutType(uint64_t declId) PluginServer::GetInstance()->RemoteCallClientWithAPI(funName, params); } +PluginIR::PluginTypeBase PluginServerAPI::GetDeclType(uint64_t declId) +{ + Json::Value root; + string funName = __func__; + root["declId"] = std::to_string(declId); + string params = root.toStyledString(); + return PluginServer::GetInstance()->GetDeclTypeResult(funName, params); +} + void PluginServerAPI::LayoutDecl(uint64_t declId) { Json::Value root; diff --git a/lib/PluginServer/PluginCom.cpp b/lib/PluginServer/PluginCom.cpp index 573de13..aaf4ba8 100755 --- a/lib/PluginServer/PluginCom.cpp +++ b/lib/PluginServer/PluginCom.cpp @@ -91,6 +91,12 @@ mlir::Plugin::DeclBaseOp PluginCom::GetBuildDeclResult(void) return retOp; } +PluginIR::PluginTypeBase PluginCom::GetDeclTypeResult(void) +{ + PluginIR::PluginTypeBase retType = pTypeResult; + return retType; +} + vector<mlir::Plugin::LoopOp> PluginCom::LoopOpsResult(void) { vector<mlir::Plugin::LoopOp> retLoops = loops; @@ -161,6 +167,14 @@ void PluginCom::JsonDeSerialize(const string& key, const string& data) this->cgnode = json.CGnodeOpJsonDeSerialize(data); } else if (key == "LocalDeclOpResult") { json.LocalDeclOpJsonDeSerialize(data, this->decls); + } else if (key == "FuncDeclsOpResult") { + json.FuncDeclsOpJsonDeSerialize(data, this->declOps); + } else if (key == "MakeNodeResult") { + Json::Value node; + Json::Reader reader; + reader.parse(data, node); + mlir::Value v = json.ValueJsonDeSerialize(node); + this->fielddeclOp = llvm::dyn_cast<mlir::Plugin::FieldDeclOp>(v.getDefiningOp()); } else if (key == "LoopOpResult") { this->loop = json.LoopOpJsonDeSerialize (data); } else if (key == "LoopOpsResult") { @@ -180,9 +194,6 @@ void PluginCom::JsonDeSerialize(const string& key, const string& data) } else if (key == "DeclOpResult") { mlir::Value decl = json.DeclBaseOpJsonDeSerialize(data); this->declOp = llvm::dyn_cast<mlir::Plugin::DeclBaseOp>(decl.getDefiningOp()); - printf("server 164 declop ----------------\n"); - printf("server 164 declop code %d\n", this->declOp.defCodeAttr().getInt()); - printf("server 165 declop ----------------\n"); } else if (key == "GetFieldsOpResult") { json.FieldOpsJsonDeSerialize(data, this->fieldsOps); } else if (key == "OpsResult") { @@ -192,6 +203,8 @@ void PluginCom::JsonDeSerialize(const string& key, const string& data) Json::Reader reader; reader.parse(data, node); this->valueResult = json.ValueJsonDeSerialize(node); + } else if (key == "PluginTypeResult") { + this->pTypeResult = json.TypeJsonDeSerialize(data); } else if (key == "GetPhiOps") { json.GetPhiOpsJsonDeSerialize(data, this->opData); } else if (key == "IntegerResult") { diff --git a/lib/PluginServer/PluginJson.cpp b/lib/PluginServer/PluginJson.cpp index 7c2abbe..c7ce788 100755 --- a/lib/PluginServer/PluginJson.cpp +++ b/lib/PluginServer/PluginJson.cpp @@ -333,7 +333,6 @@ CGnodeOp PluginJson::CGnodeOpJsonDeSerialize(const string& data) Json::Value root; Json::Reader reader; reader.parse(data, root); - fprintf(stderr, "dgy server cgnode json %s\n", root.toStyledString().c_str()); mlir::OpBuilder builder(PluginServer::GetInstance()->GetContext()); uint64_t id = GetID(root["id"]); diff --git a/user/InlineFunctionPass.cpp b/user/InlineFunctionPass.cpp index d982d44..a51e6fe 100755 --- a/user/InlineFunctionPass.cpp +++ b/user/InlineFunctionPass.cpp @@ -33,7 +33,7 @@ static void UserOptimizeFunc(void) if (allFunction[i].declaredInlineAttr().getValue()) count++; } - printf("declaredInline have %d functions were declared.\n", count); + fprintf(stderr, "declaredInline have %d functions were declared.\n", count); } int InlineFunctionPass::DoOptimize() diff --git a/user/LocalVarSummeryPass.cpp b/user/LocalVarSummeryPass.cpp index ccee9f7..c22bad4 100755 --- a/user/LocalVarSummeryPass.cpp +++ b/user/LocalVarSummeryPass.cpp @@ -51,10 +51,6 @@ static void LocalVarSummery(void) std::string tyName = stTy.getName(); printf(" struct name is : %s\n", tyName.c_str()); - llvm::ArrayRef<mlir::Type> paramsType = stTy.getBody(); - for (auto tty :paramsType) { - printf("\n struct arg id : %d\n", tty.dyn_cast<PluginIR::PluginTypeBase>().getPluginTypeID()); - } llvm::ArrayRef<std::string> paramsNames = stTy.getElementNames(); for (auto name :paramsNames) { std::string pName = name; diff --git a/user/StructReorder.cpp b/user/StructReorder.cpp index 612a093..f4e824e 100644 --- a/user/StructReorder.cpp +++ b/user/StructReorder.cpp @@ -44,6 +44,138 @@ mlir::OpBuilder* opBuilder = nullptr; std::map<Block*, Value> defs_map; std::map<uint64_t, std::string> opNameMap; +static void dump_structtype(PluginIR::PluginTypeBase type) +{ + if (auto stTy = type.dyn_cast<PluginIR::PluginStructType>()) { + std::string tyName = stTy.getName(); + fprintf(stderr, " struct name is : %s\n", tyName.c_str()); + + llvm::ArrayRef<std::string> paramsNames = stTy.getElementNames(); + for (auto name :paramsNames) { + std::string pName = name; + fprintf(stderr, "\n struct argname is : %s\n", pName.c_str()); + } + } +} + + +static void reorder_fields(FieldDeclOp& field, FieldDeclOp& newfield) +{ + if (!field) { + field = newfield; + unsigned size = newfield.GetTypeSize(); + } else { + FieldDeclOp tmp = field; + // unsigned size = tmp.getResultType().dyn_cast<PluginIR::PluginTypeBase>().getPluginTypeID(); + unsigned size = newfield.GetTypeSize(); + if (newfield.GetTypeSize() > tmp.GetTypeSize()) { + newfield.SetDeclChain(tmp); + field = newfield; + } + } +} + +static void create_new_fields(mlir::Plugin::DeclBaseOp& decl, llvm::SmallVector<mlir::Plugin::FieldDeclOp> recordfields) +{ + PluginAPI::PluginServerAPI pluginAPI; + FieldDeclOp fd; + for (auto &fielddecl : recordfields) { + FieldDeclOp field = pluginAPI.MakeNode(IDefineCode::FieldDecl); + field.SetName(fielddecl); + field.SetType(fielddecl); + field.SetDeclAlign(fielddecl); + + field.SetSourceLocation(fielddecl); + field.SetUserAlign(fielddecl); + field.SetAddressable(fielddecl); + field.SetNonAddressablep(fielddecl); + field.SetVolatile(fielddecl); + field.SetDeclContext(decl.idAttr().getInt()); + + reorder_fields(fd, field); + + } + pluginAPI.SetTypeFields(decl.idAttr().getInt(), fd.idAttr().getInt()); + pluginAPI.LayoutType(decl.idAttr().getInt()); + pluginAPI.LayoutDecl(decl.idAttr().getInt()); + fprintf(stderr, "reorder struct type after :>>>\n"); + dump_structtype(pluginAPI.GetDeclType(decl.idAttr().getInt())); +} + +static void create_new_type(mlir::Plugin::DeclBaseOp& decl, llvm::SmallVector<mlir::Plugin::FieldDeclOp> recordfields) +{ + create_new_fields(decl, recordfields); +} + +static void create_new_types(llvm::SmallVector<PluginIR::PluginTypeBase> recordTypes, + llvm::SmallVector<DeclBaseOp> recordDecls, llvm::SmallVector<mlir::Plugin::FieldDeclOp> recordFields) +{ + for (int i = 0; i < recordTypes.size(); i++) { + + auto type = recordTypes[i].dyn_cast<PluginIR::PluginStructType>(); + mlir::MLIRContext m_context; + m_context.getOrLoadDialect<PluginDialect>(); + PluginIR::PluginTypeBase rPluginType = PluginIR::PluginUndefType::get(&m_context); + StringRef name = type.getName(); + StringRef newName = name.str() + ".reorg." + to_string(i); + PluginAPI::PluginServerAPI pluginAPI; + DeclBaseOp decl = pluginAPI.BuildDecl(IDefineCode::TYPEDECL, newName, rPluginType); + + create_new_type(decl, recordFields); + + } + +} + +static void record_decl(mlir::Plugin::DeclBaseOp decl, llvm::SmallVector<mlir::Plugin::DeclBaseOp>& recordDecls) +{ + if (llvm::find(recordDecls, decl) == recordDecls.end()) + { + recordDecls.push_back(decl); + } +} + +static void record_fields(DeclBaseOp decl, llvm::SmallVector<mlir::Plugin::FieldDeclOp>& recordFields) +{ + PluginAPI::PluginServerAPI pluginAPI; + llvm::SmallVector<mlir::Plugin::FieldDeclOp> fields = pluginAPI.GetFields(decl.idAttr().getInt()); + recordFields.insert(recordFields.end(), fields.begin(), fields.end()); +} + +static PluginIR::PluginTypeBase record_type(PluginIR::PluginTypeBase type, llvm::SmallVector<PluginIR::PluginTypeBase>& recordTypes, + DeclBaseOp decl, llvm::SmallVector<mlir::Plugin::FieldDeclOp>& recordFields) +{ + if (llvm::find(recordTypes, type) == recordTypes.end()) + { + recordTypes.push_back(type); + } + record_fields(decl, recordFields); + return type; +} + +static PluginIR::PluginTypeBase inner_type(PluginIR::PluginTypeBase type) +{ + while(type.isa<PluginIR::PluginPointerType>() || type.isa<PluginIR::PluginArrayType>()) { + if (auto t = type.dyn_cast<PluginIR::PluginPointerType>()) { + type = t.getElementType().dyn_cast<PluginIR::PluginTypeBase>(); + } else if (auto t = type.dyn_cast<PluginIR::PluginArrayType>()) { + type = t.getElementType().dyn_cast<PluginIR::PluginTypeBase>(); + } + } + return type; +} + + +static bool handle_type(PluginIR::PluginTypeBase type) +{ + type = inner_type(type); + if (type.isa<PluginIR::PluginStructType>()) { + fprintf(stderr, "handle struct type :>>>\n"); + dump_structtype(type); + return true; + } + return false; +} static void ProcessStructReorder(uint64_t *fun) { @@ -57,14 +189,15 @@ static void ProcessStructReorder(uint64_t *fun) mlir::OpBuilder opBuilder_temp = mlir::OpBuilder(context); opBuilder = &opBuilder_temp; string name = nodeOp.symbolNameAttr().getValue().str(); - fprintf(stderr, "Now process symbol : %s \n", name.c_str()); uint32_t order = nodeOp.orderAttr().getInt(); - fprintf(stderr, "Now process order : %d \n", order); if (nodeOp.IsRealSymbol()) - fprintf(stderr, "Now process IsRealSymbol \n"); + fprintf(stderr, "process RealSymbol : %s/%d \n", name.c_str(), order); } vector<FunctionOp> allFunction = pluginAPI.GetAllFunc(); + llvm::SmallVector<PluginIR::PluginTypeBase> recordTypes; + llvm::SmallVector<mlir::Plugin::DeclBaseOp> recordDecls; + llvm::SmallVector<mlir::Plugin::FieldDeclOp> recordFields; fprintf(stderr, "allfun size is %d\n", allFunction.size()); for (auto &funcOp : allFunction) { context = funcOp.getOperation()->getContext(); @@ -72,6 +205,19 @@ static void ProcessStructReorder(uint64_t *fun) opBuilder = &opBuilder_temp; string name = funcOp.funcNameAttr().getValue().str(); fprintf(stderr, "Now process func : %s \n", name.c_str()); + uint64_t funcID = funcOp.idAttr().getValue().getZExtValue(); + + vector<mlir::Plugin::DeclBaseOp> decls = pluginAPI.GetFuncDecls(funcID); + + for (auto &decl : decls) { + auto type = decl.getResultType().dyn_cast<PluginIR::PluginTypeBase>(); + if (!handle_type(type)) continue; + type = record_type(inner_type(type), recordTypes, decl, recordFields); + + record_decl(decl, recordDecls); + } + + create_new_types(recordTypes, recordDecls, recordFields); } } diff --git a/user/user.cpp b/user/user.cpp index ee2031a..6bfa524 100644 --- a/user/user.cpp +++ b/user/user.cpp @@ -27,10 +27,10 @@ void RegisterCallbacks(void) { PinServer::PluginServer *pluginServer = PinServer::PluginServer::GetInstance(); - // pluginServer->RegisterOpt(std::make_shared<PluginOpt::InlineFunctionPass>(PluginOpt::HANDLE_BEFORE_IPA)); - // pluginServer->RegisterOpt(std::make_shared<PluginOpt::LocalVarSummeryPass>(PluginOpt::HANDLE_BEFORE_IPA)); + pluginServer->RegisterOpt(std::make_shared<PluginOpt::InlineFunctionPass>(PluginOpt::HANDLE_BEFORE_IPA)); + pluginServer->RegisterOpt(std::make_shared<PluginOpt::LocalVarSummeryPass>(PluginOpt::HANDLE_BEFORE_IPA)); // PluginOpt::ManagerSetup setupData(PluginOpt::PASS_PHIOPT, 1, PluginOpt::PASS_INSERT_AFTER); // pluginServer->RegisterPassManagerOpt(setupData, std::make_shared<PluginOpt::ArrayWidenPass>()); - PluginOpt::ManagerSetup setupData(PluginOpt::PASS_MAC, 1, PluginOpt::PASS_INSERT_AFTER); - pluginServer->RegisterPassManagerOpt(setupData, std::make_shared<PluginOpt::StructReorderPass>()); + // PluginOpt::ManagerSetup setupData(PluginOpt::PASS_MAC, 1, PluginOpt::PASS_INSERT_AFTER); + // pluginServer->RegisterPassManagerOpt(setupData, std::make_shared<PluginOpt::StructReorderPass>()); } -- 2.33.0
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2