加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0011-Pin-server-Add-NopOp-EHElseOp-AsmOp-SwitchOp-LabelOp.patch 39.51 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
From 190a1e5f5278f4966eb3bcdbdcee950560092216 Mon Sep 17 00:00:00 2001
From: huitailangzju <804544223@qq.com>
Date: Wed, 22 Feb 2023 11:54:28 +0800
Subject: [PATCH 11/23] =?UTF-8?q?[Pin-server]=20Add=20NopOp=E3=80=81EHElse?=
=?UTF-8?q?Op=E3=80=81AsmOp=E3=80=81SwitchOp=E3=80=81LabelOp=E3=80=81EHMnt?=
=?UTF-8?q?Op=E3=80=81BindOp=E3=80=81TryOp=E3=80=81CatchOp=E3=80=81GotoOp?=
=?UTF-8?q?=E3=80=81TransactionOp=E3=80=81ResxOp=E3=80=81EHDispatchOp.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
diff --git a/include/Dialect/PluginDialect.td b/include/Dialect/PluginDialect.td
index 98a84d0..b618b59 100644
--- a/include/Dialect/PluginDialect.td
+++ b/include/Dialect/PluginDialect.td
@@ -68,7 +68,7 @@ def IComparisonAttr : I32EnumAttr<
def IDefineCodeMemRef : I32EnumAttrCase<"MemRef", 0>;
def IDefineCodeIntCST : I32EnumAttrCase<"IntCST", 1>;
def IDefineCodeSSA : I32EnumAttrCase<"SSA", 2>;
-def IDefineCodeTREELIST : I32EnumAttrCase<"TREELIST", 3>;
+def IDefineCodeLIST : I32EnumAttrCase<"LIST", 3>;
def IDefineCodeStrCST : I32EnumAttrCase<"StrCST", 4>;
def IDefineCodeArrayRef : I32EnumAttrCase<"ArrayRef", 5>;
def IDefineCodeDecl : I32EnumAttrCase<"Decl", 6>;
@@ -81,7 +81,7 @@ def IDefineCodeCOMPONENT : I32EnumAttrCase<"COMPONENT", 12>;
def IDefineCodeUNDEF : I32EnumAttrCase<"UNDEF", 13>;
def IDefineCodeAttr : I32EnumAttr<
"IDefineCode", "plugin define code",
- [IDefineCodeMemRef, IDefineCodeIntCST, IDefineCodeSSA, IDefineCodeTREELIST,
+ [IDefineCodeMemRef, IDefineCodeIntCST, IDefineCodeSSA, IDefineCodeLIST,
IDefineCodeStrCST, IDefineCodeArrayRef, IDefineCodeDecl, IDefineCodeFieldDecl, IDefineCodeAddrExp,
IDefineCodeConstructor, IDefineCodeVec, IDefineCodeBLOCK, IDefineCodeCOMPONENT, IDefineCodeUNDEF]>{
let cppNamespace = "::mlir::Plugin";
diff --git a/include/Dialect/PluginOps.td b/include/Dialect/PluginOps.td
index 4967e91..52c3ceb 100644
--- a/include/Dialect/PluginOps.td
+++ b/include/Dialect/PluginOps.td
@@ -166,6 +166,25 @@ def AssignOp : Plugin_Op<"assign", [NoSideEffect]> {
}];
}
+def NopOp : Plugin_Op<"nop", [NoSideEffect]> {
+ let summary = "nop";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id);
+ let results = (outs AnyType);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id)>,
+ ];
+}
+
+def EHElseOp : Plugin_Op<"eh_else", [NoSideEffect]> {
+ let summary = "EHElseOP";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, ArrayAttr:$nBody, ArrayAttr:$eBody);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "ArrayRef<uint64_t>":$nBody, "ArrayRef<uint64_t>":$eBody)>,
+ ];
+}
+
class Placeholder<string mnemonic> : Plugin_Op<mnemonic, [SameVariadicOperandSize]> {
dag commonArgs = (ins UI64Attr:$id,
OptionalAttr<IDefineCodeAttr>:$defCode,
@@ -300,7 +319,7 @@ def BlockOp : BLOCK<"block"> {
}];
}
-def VecOp : Vec<"treevector"> {
+def VecOp : Vec<"vector"> {
let summary = "VectorOp";
let description = [{TODO}];
let builders = [
@@ -425,8 +444,8 @@ def ConstOp : Constant<"constant value"> {
}];
}
-def ListOp : List<"tree list"> {
- let summary = "tree list";
+def ListOp : List<"list"> {
+ let summary = "ListOp";
let description = [{TODO}];
let builders = [
OpBuilderDAG<(ins "uint64_t":$id, "IDefineCode":$defCode, "bool":$readOnly,
@@ -480,7 +499,113 @@ def DebugOp : Plugin_Op<"debug", [NoSideEffect]> {
OpBuilderDAG<(ins "uint64_t":$id)>
];
}
+def AsmOp : Plugin_Op<"asm", [NoSideEffect]> {
+ let summary = "asm Op";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, StrAttr:$statement, UI32Attr:$nInputs, UI32Attr:$nOutputs, UI32Attr:$nClobbers,
+ Variadic<AnyType>:$operands);
+ let results = (outs AnyType:$result);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "StringRef":$statement, "uint32_t":$nInputs, "uint32_t":$nOutputs,
+ "uint32_t":$nClobbers, "ArrayRef<Value>":$operands)>
+ ];
+
+ let extraClassDeclaration = [{
+ unsigned GetNInputs() { return this->nInputsAttr().getInt(); };
+ unsigned GetNoutputs() { return this->nOutputsAttr().getInt(); };
+ unsigned GetNClobbers() { return this->nClobbersAttr().getInt(); };
+ Value GetInputOp(unsigned index) { return getOperand(index); };
+ Value GetOutputOp(unsigned index) { return getOperand(this->nInputsAttr().getInt() + index); };
+ Value GetCkobberOp(unsigned index) {
+ return getOperand(this->nInputsAttr().getInt() + this->nOutputsAttr().getInt() + index); };
+ }];
+}
+
+def SwitchOp : Plugin_Op<"switch", [NoSideEffect]> {
+ let summary = "switch op.";
+ let description = [{TODO}];
+ let successors = (successor
+ AnySuccessor:$defaultDestination,
+ VariadicSuccessor<AnySuccessor>:$caseDestinations
+ );
+ let arguments = (ins UI64Attr:$id, AnyType:$index, UI64Attr:$address, AnyType:$defaultLabel, Variadic<AnyType>:$operands,
+ UI64Attr:$defaultaddr, ArrayAttr:$caseaddrs);
+ let results = (outs AnyType:$result);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "Value":$index, "uint64_t":$address, "Value":$defaultLabel,
+ "ArrayRef<Value>":$operands, "Block*":$defaultDestination, "uint64_t":$defaultaddr,
+ "ArrayRef<Block*>":$caseDestinations, "ArrayRef<uint64_t>":$caseaddrs)>
+ ];
+
+ let extraClassDeclaration = [{
+ unsigned GetNumLabels() { return getNumOperands() - 2; };
+ Block* GetDefautDest() { return defaultDestination();}
+ SmallVector<mlir::Block*> GetCaseDest() { return caseDestinations(); };
+ }];
+}
+
+def LabelOp : Plugin_Op<"label", [NoSideEffect]> {
+ let summary = "Label op.";
+ let description = [{TODO}];
+ let results = (outs AnyType:$result);
+ let arguments = (ins UI64Attr:$id, AnyType:$index);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "Value":$index)>
+ ];
+ let extraClassDeclaration = [{
+ Value GetLabelLabel() { return this->getOperation()->getOperand(0); };
+ }];
+}
+
+def EHMntOp : Plugin_Op<"eh_mnt", [NoSideEffect]> {
+ let summary = "EH_MUST_NOT_THROW op.";
+ let description = [{TODO}];
+ let results = (outs AnyType:$result);
+ let arguments = (ins UI64Attr:$id, AnyType:$decl);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "Value":$decl)>
+ ];
+ let extraClassDeclaration = [{
+ Value Getfndecl() { return decl(); };
+ }];
+}
+
+def BindOp : Plugin_Op<"Bind", [NoSideEffect]> {
+ let summary = "BindOp";
+ let description = [{TODO}];
+ let results = (outs AnyType:$result);
+ let arguments = (ins UI64Attr:$id, AnyType:$vars, ArrayAttr:$body, AnyType:$block);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "Value":$vars, "ArrayRef<uint64_t>":$body, "Value":$block)>
+ ];
+ let extraClassDeclaration = [{
+ Value GetVars() { return vars(); };
+ Value GetBlock() { return block(); };
+ }];
+}
+def TryOp : Plugin_Op<"try", [NoSideEffect]> {
+ let summary = "TryOp";
+ let description = [{TODO}];
+ let results = (outs AnyType:$result);
+ let arguments = (ins UI64Attr:$id, ArrayAttr:$eval, ArrayAttr:$cleanup, UI64Attr:$kind);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "ArrayRef<uint64_t>":$eval, "ArrayRef<uint64_t>":$cleanup, "uint64_t":$kind)>
+ ];
+}
+
+def CatchOp : Plugin_Op<"catch", [NoSideEffect]> {
+ let summary = "CatchOp";
+ let description = [{TODO}];
+ let results = (outs AnyType:$result);
+ let arguments = (ins UI64Attr:$id, AnyType:$types, ArrayAttr:$handler);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "Value":$types, "ArrayRef<uint64_t>":$handler)>
+ ];
+ let extraClassDeclaration = [{
+ Value GetTypes() { return types(); };
+ }];
+}
// Terminators
// Opaque builder used for terminator operations that contain successors.
@@ -538,4 +663,66 @@ def RetOp : Plugin_TerminatorOp<"ret", [NoSideEffect]> {
];
}
+def GotoOp : Plugin_TerminatorOp<"goto", [NoSideEffect]> {
+ let summary = "GotoOp";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, UI64Attr:$address, AnyType:$dest, UI64Attr:$successaddr);
+ let results = (outs AnyType);
+ let successors = (successor AnySuccessor:$success);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "uint64_t":$address, "Value":$dest, "Block*":$success, "uint64_t":$successaddr)>
+ ];
+
+ let extraClassDeclaration = [{
+ Value GetLabel() { return this->getOperation()->getOperand(0); }
+ }];
+}
+
+def TransactionOp : Plugin_TerminatorOp<"transaction", [NoSideEffect]> {
+ let summary = "TransactionOp";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, UI64Attr:$address, ArrayAttr:$stmtaddr, AnyType:$labelNorm,
+ AnyType:$labelUninst, AnyType:$labelOver, UI64Attr:$fallthroughaddr, UI64Attr:$abortaddr);
+ let results = (outs AnyType);
+ let successors = (successor AnySuccessor:$fallthrough, AnySuccessor:$abort);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "uint64_t":$address, "ArrayRef<uint64_t>":$stmtaddr, "Value":$labelNorm,
+ "Value":$labelUninst, "Value":$labelOver, "Block*":$fallthrough, "uint64_t":$fallthroughaddr,
+ "Block*":$abort, "uint64_t":$abortaddr)>
+ ];
+
+ let extraClassDeclaration = [{
+ Value GetTransactionNormal() { return labelNorm(); }
+ Value GetTransactionUinst() { return labelUninst(); }
+ Value GetTransactionOver() { return labelOver(); }
+ }];
+}
+
+def ResxOp : Plugin_TerminatorOp<"resx", [NoSideEffect]> {
+ let summary = "ResxOp";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, UI64Attr:$address, UI64Attr:$region);
+ let results = (outs AnyType);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "uint64_t":$address, "uint64_t":$region)>
+ ];
+ let extraClassDeclaration = [{
+ uint64_t GetTransactionNormal() { return region(); }
+ }];
+}
+
+def EHDispatchOp : Plugin_TerminatorOp<"dispatch", [NoSideEffect]> {
+ let summary = "EHDispatchOp";
+ let description = [{TODO}];
+ let arguments = (ins UI64Attr:$id, UI64Attr:$address, UI64Attr:$region, ArrayAttr:$ehHandlersaddrs);
+ let results = (outs AnyType);
+ let successors = (successor VariadicSuccessor<AnySuccessor>:$ehHandlers);
+ let builders = [
+ OpBuilderDAG<(ins "uint64_t":$id, "uint64_t":$address, "uint64_t":$region, "ArrayRef<Block*>":$ehHandlers,
+ "ArrayRef<uint64_t>":$ehHandlersaddrs)>
+ ];
+ let extraClassDeclaration = [{
+ uint64_t GetTransactionNormal() { return region(); }
+ }];
+}
#endif // PLUGIN_OPS_TD
\ No newline at end of file
diff --git a/include/PluginServer/PluginJson.h b/include/PluginServer/PluginJson.h
index 4be2ae2..db264f6 100755
--- a/include/PluginServer/PluginJson.h
+++ b/include/PluginServer/PluginJson.h
@@ -50,6 +50,19 @@ public:
void GetPhiOpsJsonDeSerialize(const string&, vector<mlir::Operation *>&);
mlir::Value SSAOpJsonDeSerialize(const string& data);
mlir::Plugin::LoopOp LoopOpJsonDeSerialize(const string& data);
+ mlir::Operation *GotoOpJsonDeSerialize(const string& data);
+ mlir::Operation *TransactionOpJsonDeSerialize(const string& data);
+ mlir::Operation *LabelOpJsonDeSerialize(const string& data);
+ mlir::Operation *NopOpJsonDeSerialize(const string& data);
+ mlir::Operation *EHElseOpJsonDeSerialize(const string& data);
+ mlir::Operation *AsmOpJsonDeserialize(const string& data);
+ mlir::Operation *SwitchOpJsonDeserialize(const string &data);
+ mlir::Operation *ResxOpJsonDeSerialize(const string& data);
+ mlir::Operation *EHDispatchOpJsonDeSerialize(const string& data);
+ mlir::Operation *EHMntOpJsonDeSerialize(const string& data);
+ mlir::Operation *BindOpJsonDeSerialize(const string& data);
+ mlir::Operation *TryOpJsonDeSerialize(const string& data);
+ mlir::Operation *CatchOpJsonDeSerialize(const string& data);
mlir::Value ListOpDeSerialize(const string& data);
mlir::Value StrOpJsonDeSerialize(const string& data);
mlir::Value ArrayOpJsonDeSerialize(const string& data);
diff --git a/lib/Dialect/PluginOps.cpp b/lib/Dialect/PluginOps.cpp
index c8714f6..bb2debe 100644
--- a/lib/Dialect/PluginOps.cpp
+++ b/lib/Dialect/PluginOps.cpp
@@ -78,6 +78,10 @@ static uint64_t getBlockAddress(mlir::Block* b)
return oops.addressAttr().getInt();
} else if (mlir::Plugin::RetOp oops = dyn_cast<mlir::Plugin::RetOp>(b->back())) {
return oops.addressAttr().getInt();
+ } else if (mlir::Plugin::GotoOp oops = dyn_cast<mlir::Plugin::GotoOp>(b->back())) {
+ return oops.addressAttr().getInt();
+ } else if (mlir::Plugin::TransactionOp oops = dyn_cast<mlir::Plugin::TransactionOp>(b->back())) {
+ return oops.addressAttr().getInt();
} else {
assert(false);
}
@@ -743,7 +747,31 @@ void AssignOp::build(OpBuilder &builder, OperationState &state,
state.addOperands(operands);
}
-// ===----------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
+// NopOp
+void NopOp::build(OpBuilder &builder, OperationState &state, uint64_t id)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+}
+
+//===----------------------------------------------------------------------===//
+// EHElseOp
+void EHElseOp::build(OpBuilder &builder, OperationState &state, uint64_t id, ArrayRef<uint64_t> nBody,
+ ArrayRef<uint64_t> eBody)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ llvm::SmallVector<mlir::Attribute, 4> nbodyattrs, ebodyattrs;
+ for (auto item : nBody) {
+ nbodyattrs.push_back(builder.getI64IntegerAttr(item));
+ }
+ for (auto item : eBody) {
+ ebodyattrs.push_back(builder.getI64IntegerAttr(item));
+ }
+ state.addAttribute("nBody", builder.getArrayAttr(nbodyattrs));
+ state.addAttribute("eBody", builder.getArrayAttr(ebodyattrs));
+}
+
+//===----------------------------------------------------------------------===//
// BaseOp
void BaseOp::build(OpBuilder &builder, OperationState &state,
@@ -763,6 +791,39 @@ void DebugOp::build(OpBuilder &builder, OperationState &state,
}
// ===----------------------------------------------------------------------===//
+// AsmOp
+void AsmOp::build(OpBuilder &builder, OperationState &state,
+ uint64_t id, StringRef statement, uint32_t nInputs, uint32_t nOutputs,
+ uint32_t nClobbers, ArrayRef<Value> operands)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("statement", builder.getSymbolRefAttr(statement));
+ state.addAttribute("nInputs", builder.getI32IntegerAttr(nInputs));
+ state.addAttribute("nOutputs", builder.getI32IntegerAttr(nOutputs));
+ state.addAttribute("nClobbers", builder.getI32IntegerAttr(nClobbers));
+ state.addOperands(operands);
+}
+
+//===----------------------------------------------------------------------===//
+// SwitchOp
+void SwitchOp::build(OpBuilder &builder, OperationState &state,
+ uint64_t id, Value index, uint64_t address, Value defaultLabel, ArrayRef<Value> operands,
+ Block* defaultDest, uint64_t defaultaddr, ArrayRef<Block*> caseDest, ArrayRef<uint64_t> caseaddr)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("address", builder.getI64IntegerAttr(address));
+ state.addAttribute("defaultaddr", builder.getI64IntegerAttr(defaultaddr));
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < caseaddr.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(caseaddr[i]));
+ }
+ state.addAttribute("caseaddrs", builder.getArrayAttr(attributes));
+ state.addOperands(index);
+ state.addOperands(defaultLabel);
+ state.addOperands(operands);
+ state.addSuccessors(defaultDest);
+ state.addSuccessors(caseDest);
+}
// FallThroughOp
void FallThroughOp::build(OpBuilder &builder, OperationState &state,
@@ -794,7 +855,130 @@ void RetOp::build(OpBuilder &builder, OperationState &state, uint64_t address)
state.addAttribute("address", builder.getI64IntegerAttr(address));
}
-// ===----------------------------------------------------------------------===//
+//===----------------------------------------------------------------------===//
+// GotoOp
+
+void GotoOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint64_t address,
+Value dest, Block* success, uint64_t successaddr)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("address", builder.getI64IntegerAttr(address));
+ state.addAttribute("successaddr", builder.getI64IntegerAttr(successaddr));
+ state.addOperands(dest);
+ state.addSuccessors(success);
+}
+
+//===----------------------------------------------------------------------===//
+// LabelOp
+void LabelOp::build(OpBuilder &builder, OperationState &state, uint64_t id, Value label)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addOperands(label);
+}
+
+//==-----------------------------------------------------------------------===//
+// TransactionOp
+void TransactionOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint64_t address,
+ ArrayRef<uint64_t> stmtaddr, Value labelNorm, Value labelUninst, Value labelOver, Block* fallthrough,
+ uint64_t fallthroughaddr, Block* abort, uint64_t abortaddr)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("address", builder.getI64IntegerAttr(address));
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < stmtaddr.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(stmtaddr[i]));
+ }
+ state.addAttribute("stmtaddr", builder.getArrayAttr(attributes));
+ state.addOperands({labelNorm, labelUninst, labelOver});
+ state.addSuccessors(fallthrough);
+ state.addAttribute("fallthroughaddr", builder.getI64IntegerAttr(fallthroughaddr));
+ state.addSuccessors(abort);
+ state.addAttribute("abortaddr", builder.getI64IntegerAttr(abortaddr));
+}
+
+//===----------------------------------------------------------------------===//
+// ResxOp
+
+void ResxOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint64_t address, uint64_t region)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("address", builder.getI64IntegerAttr(address));
+ state.addAttribute("region", builder.getI64IntegerAttr(region));
+}
+
+//===----------------------------------------------------------------------===//
+// EHMntOp
+void EHMntOp::build(OpBuilder &builder, OperationState &state, uint64_t id, Value decl)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addOperands(decl);
+}
+
+//===----------------------------------------------------------------------===//
+// EHDispatchOp
+
+void EHDispatchOp::build(OpBuilder &builder, OperationState &state, uint64_t id, uint64_t address, uint64_t region,
+ ArrayRef<Block*> ehHandlers, ArrayRef<uint64_t> ehHandlersaddrs)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addAttribute("address", builder.getI64IntegerAttr(address));
+ state.addAttribute("region", builder.getI64IntegerAttr(region));
+ state.addSuccessors(ehHandlers);
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < ehHandlersaddrs.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(ehHandlersaddrs[i]));
+ }
+ state.addAttribute("ehHandlersaddrs", builder.getArrayAttr(attributes));
+}
+//===----------------------------------------------------------------------===//
+// BindOp
+
+void BindOp::build(OpBuilder &builder, OperationState &state, uint64_t id, Value vars, ArrayRef<uint64_t> body,
+ Value block)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addOperands({vars, block});
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < body.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(body[i]));
+ }
+ state.addAttribute("body", builder.getArrayAttr(attributes));
+}
+
+//===----------------------------------------------------------------------===//
+// TryOp
+
+void TryOp::build(OpBuilder &builder, OperationState &state, uint64_t id, ArrayRef<uint64_t> eval,
+ ArrayRef<uint64_t> cleanup, uint64_t kind)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < eval.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(eval[i]));
+ }
+ state.addAttribute("eval", builder.getArrayAttr(attributes));
+ attributes.clear();
+ for (int i = 0; i < cleanup.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(cleanup[i]));
+ }
+ state.addAttribute("cleanup", builder.getArrayAttr(attributes));
+ state.addAttribute("kind", builder.getI64IntegerAttr(kind));
+}
+
+//===----------------------------------------------------------------------===//
+// CatchOp
+
+void CatchOp::build(OpBuilder &builder, OperationState &state, uint64_t id, Value types, ArrayRef<uint64_t> handler)
+{
+ state.addAttribute("id", builder.getI64IntegerAttr(id));
+ state.addOperands(types);
+ llvm::SmallVector<mlir::Attribute, 4> attributes;
+ for (int i = 0; i < handler.size(); ++i) {
+ attributes.push_back(builder.getI64IntegerAttr(handler[i]));
+ }
+ state.addAttribute("handler", builder.getArrayAttr(attributes));
+}
+//===----------------------------------------------------------------------===//
// TableGen'd op method definitions
// ===----------------------------------------------------------------------===//
diff --git a/lib/PluginAPI/ControlFlowAPI.cpp b/lib/PluginAPI/ControlFlowAPI.cpp
index b2ed38d..720bac5 100644
--- a/lib/PluginAPI/ControlFlowAPI.cpp
+++ b/lib/PluginAPI/ControlFlowAPI.cpp
@@ -63,8 +63,13 @@ static uint64_t getBlockAddress(mlir::Block* b)
return oops.addressAttr().getInt();
} else if (mlir::Plugin::RetOp oops = llvm::dyn_cast<mlir::Plugin::RetOp>(b->back())) {
return oops.addressAttr().getInt();
+ } else if (mlir::Plugin::GotoOp oops = llvm::dyn_cast<mlir::Plugin::GotoOp>(b->back())) {
+ return oops.addressAttr().getInt();
+ } else if (mlir::Plugin::TransactionOp oops = llvm::dyn_cast<mlir::Plugin::TransactionOp>(b->back())) {
+ return oops.addressAttr().getInt();
+ } else {
+ abort();
}
- abort();
}
bool ControlFlowAPI::UpdateSSA(void)
diff --git a/lib/PluginServer/PluginJson.cpp b/lib/PluginServer/PluginJson.cpp
index c5e302f..b849cf9 100755
--- a/lib/PluginServer/PluginJson.cpp
+++ b/lib/PluginServer/PluginJson.cpp
@@ -242,6 +242,33 @@ bool PluginJson::ProcessBlock(mlir::Block* block, mlir::Region& rg, const Json::
} else if (opCode == BaseOp::getOperationName().str()) {
uint64_t opID = GetID(opJson["id"]);
opBuilder->create<BaseOp>(opBuilder->getUnknownLoc(), opID, opCode);
+ } else if (opCode == AsmOp::getOperationName().str()) {
+ AsmOpJsonDeserialize(opJson.toStyledString());
+ } else if (opCode == SwitchOp::getOperationName().str()) {
+ printf("switch op deserialize\n");
+ SwitchOpJsonDeserialize(opJson.toStyledString());
+ } else if (opCode == GotoOp::getOperationName().str()) {
+ GotoOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == LabelOp::getOperationName().str()) {
+ LabelOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == TransactionOp::getOperationName().str()) {
+ TransactionOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == ResxOp::getOperationName().str()) {
+ ResxOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == EHDispatchOp::getOperationName().str()) {
+ EHDispatchOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == EHMntOp::getOperationName().str()) {
+ EHMntOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == BindOp::getOperationName().str()) {
+ BindOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == TryOp::getOperationName().str()) {
+ TryOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == CatchOp::getOperationName().str()) {
+ CatchOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == NopOp::getOperationName().str()) {
+ NopOpJsonDeSerialize(opJson.toStyledString());
+ } else if (opCode == EHElseOp::getOperationName().str()) {
+ EHElseOpJsonDeSerialize(opJson.toStyledString());
}
}
return true;
@@ -650,7 +677,7 @@ mlir::Value PluginJson::ListOpDeSerialize(const string& data)
mlir::Type retType = TypeJsonDeSerialize(root["retType"].toStyledString().c_str());
mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
mlir::Value trrelist = opBuilder->create<ListOp>(opBuilder->getUnknownLoc(), id,
- IDefineCode::TREELIST, readOnly, hasPurpose, ops, retType);
+ IDefineCode::LIST, readOnly, hasPurpose, ops, retType);
return trrelist;
}
@@ -840,6 +867,298 @@ mlir::Value PluginJson::ComponentOpJsonDeSerialize(const string& data)
opBuilder->getUnknownLoc(), id, IDefineCode::COMPONENT, readOnly, component, field, retType);
return componentOp;
}
+
+mlir::Operation *PluginJson::GotoOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ int64_t address = GetID(node["address"]);
+ mlir::Value dest = ValueJsonDeSerialize(node["dest"]);
+ int64_t successaddr = GetID(node["successaddr"]);
+ mlir::Block* success = PluginServer::GetInstance()->FindBlock(successaddr);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ GotoOp op = opBuilder->create<GotoOp>(opBuilder->getUnknownLoc(), id, address, dest, success, successaddr);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::TransactionOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ int64_t address = GetID(node["address"]);
+ mlir::Value labelNorm = ValueJsonDeSerialize(node["labelNorm"]);
+ mlir::Value labelUninst = ValueJsonDeSerialize(node["labelUninst"]);
+ mlir::Value labelOver = ValueJsonDeSerialize(node["labelOver"]);
+ int64_t fallthroughaddr = GetID(node["fallthroughaddr"]);
+ int64_t abortaddr = GetID(node["abortaddr"]);
+ mlir::Block* fallthrough = PluginServer::GetInstance()->FindBlock(fallthroughaddr);
+ mlir::Block* abort = PluginServer::GetInstance()->FindBlock(abortaddr);
+ llvm::SmallVector<uint64_t, 4> stmtaddr;
+ Json::Value stmtaddrJson = node["stmtaddr"];
+ for (size_t index = 0; index < stmtaddrJson.getMemberNames().size(); index++) {
+ string key = std::to_string(index);
+ uint64_t addr = GetID(stmtaddrJson[key.c_str()]);
+ stmtaddr.push_back(addr);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ TransactionOp op = opBuilder->create<TransactionOp>(opBuilder->getUnknownLoc(), id, address, stmtaddr, labelNorm,
+ labelUninst, labelOver, fallthrough, fallthroughaddr, abort, abortaddr);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::ResxOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ int64_t address = GetID(node["address"]);
+ int64_t region = GetID(node["region"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ ResxOp op = opBuilder->create<ResxOp>(opBuilder->getUnknownLoc(),
+ id, address, region);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::EHMntOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ mlir::Value decl = ValueJsonDeSerialize(node["decl"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ EHMntOp op = opBuilder->create<EHMntOp>(opBuilder->getUnknownLoc(), id, decl);
+ return op.getOperation();
+}
+
+
+mlir::Operation *PluginJson::EHDispatchOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ int64_t address = GetID(node["address"]);
+ int64_t region = GetID(node["region"]);
+ llvm::SmallVector<mlir::Block*, 4> ehHandlers;
+ llvm::SmallVector<uint64_t, 4> ehHandlersaddrs;
+ Json::Value ehHandlersJson = node["ehHandlersaddrs"];
+ Json::Value::Members ehHandlersMember = ehHandlersJson.getMemberNames();
+ for (size_t iter = 0; iter < ehHandlersMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t ehaddr = GetID(ehHandlersJson[key.c_str()]);
+ mlir::Block* succ = PluginServer::GetInstance()->FindBlock(ehaddr);
+ ehHandlers.push_back(succ);
+ ehHandlersaddrs.push_back(ehaddr);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ EHDispatchOp op = opBuilder->create<EHDispatchOp>(opBuilder->getUnknownLoc(),
+ id, address, region, ehHandlers, ehHandlersaddrs);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::LabelOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ mlir::Value label = ValueJsonDeSerialize(node["label"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ LabelOp op = opBuilder->create<LabelOp>(opBuilder->getUnknownLoc(), id, label);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::BindOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ mlir::Value vars = ValueJsonDeSerialize(node["vars"]);
+ mlir::Value block = ValueJsonDeSerialize(node["block"]);
+
+ Json::Value bodyJson = node["body"];
+ Json::Value::Members bodyMember = bodyJson.getMemberNames();
+ llvm::SmallVector<uint64_t, 4> bodyaddrs;
+ for (size_t iter = 0; iter < bodyMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(bodyJson[key.c_str()]);
+ bodyaddrs.push_back(addr);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ BindOp op = opBuilder->create<BindOp>(opBuilder->getUnknownLoc(), id, vars, bodyaddrs, block);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::TryOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ Json::Value evalJson = node["eval"];
+ Json::Value::Members evalMember = evalJson.getMemberNames();
+ llvm::SmallVector<uint64_t, 4> evaladdrs, cleanupaddrs;
+ for (size_t iter = 0; iter < evalMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(evalJson[key.c_str()]);
+ evaladdrs.push_back(addr);
+ }
+ Json::Value cleanupJson = node["cleanup"];
+ Json::Value::Members cleanupMember = cleanupJson.getMemberNames();
+ for (size_t iter = 0; iter < cleanupMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(cleanupJson[key.c_str()]);
+ cleanupaddrs.push_back(addr);
+ }
+
+ int64_t kind = GetID(node["kind"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ TryOp op = opBuilder->create<TryOp>(opBuilder->getUnknownLoc(), id, evaladdrs, cleanupaddrs, kind);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::CatchOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ int64_t id = GetID(node["id"]);
+ mlir::Value types = ValueJsonDeSerialize(node["types"]);
+
+ Json::Value handlerJson = node["handler"];
+ Json::Value::Members handlerMember = handlerJson.getMemberNames();
+ llvm::SmallVector<uint64_t, 4> handleraddrs;
+ for (size_t iter = 0; iter < handlerMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(handlerJson[key.c_str()]);
+ handleraddrs.push_back(addr);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ CatchOp op = opBuilder->create<CatchOp>(opBuilder->getUnknownLoc(), id, types, handleraddrs);
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::NopOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ uint64_t id = GetID(node["id"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ NopOp op = opBuilder->create<NopOp>(opBuilder->getUnknownLoc(), id);
+ PluginServer::GetInstance()->InsertDefOperation(id, op.getOperation());
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::EHElseOpJsonDeSerialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ uint64_t id = GetID(node["id"]);
+
+ llvm::SmallVector<uint64_t, 4> nbody, ebody;
+
+ Json::Value nbodyJson = node["nbody"];
+ Json::Value::Members nbodyMember = nbodyJson.getMemberNames();
+
+ for (size_t iter = 0; iter < nbodyMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(nbodyJson[key.c_str()]);
+ nbody.push_back(addr);
+ }
+
+ Json::Value ebodyJson = node["ebody"];
+ Json::Value::Members ebodyMember = ebodyJson.getMemberNames();
+
+ for (size_t iter = 0; iter < ebodyMember.size(); iter++) {
+ string key = std::to_string(iter);
+ uint64_t addr = GetID(ebodyJson[key.c_str()]);
+ ebody.push_back(addr);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ EHElseOp op = opBuilder->create<EHElseOp>(opBuilder->getUnknownLoc(), id, nbody, ebody);
+ PluginServer::GetInstance()->InsertDefOperation(id, op.getOperation());
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::AsmOpJsonDeserialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ Json::Value operandJson = node["operands"];
+ Json::Value::Members operandMember = operandJson.getMemberNames();
+ llvm::SmallVector<mlir::Value, 4> ops;
+ for (size_t opIter = 0; opIter < operandMember.size(); opIter++) {
+ string key = std::to_string(opIter);
+ mlir::Value opValue = ValueJsonDeSerialize(operandJson[key.c_str()]);
+ ops.push_back(opValue);
+ }
+ uint64_t id = GetID(node["id"]);
+ mlir::StringRef statement(node["statement"].asString());
+ uint32_t nInputs = GetID(node["nInputs"]);
+ uint32_t nOutputs = GetID(node["nOutputs"]);
+ uint32_t nClobbers = GetID(node["nClobbers"]);
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ AsmOp op = opBuilder->create<AsmOp>(opBuilder->getUnknownLoc(), id, statement, nInputs, nOutputs,
+ nClobbers, ops);
+ PluginServer::GetInstance()->InsertDefOperation(id, op.getOperation());
+ return op.getOperation();
+}
+
+mlir::Operation *PluginJson::SwitchOpJsonDeserialize(const string& data)
+{
+ Json::Value node;
+ Json::Reader reader;
+ reader.parse(data, node);
+ uint64_t id = GetID(node["id"]);
+ uint64_t address = GetID(node["address"]);
+ uint64_t defaultDestAddr = GetID(node["defaultaddr"]);
+ mlir::Block* defaultDest = PluginServer::GetInstance()->FindBlock(defaultDestAddr);
+
+
+ Json::Value operandJson = node["operands"];
+ Json::Value::Members operandMember = operandJson.getMemberNames();
+ llvm::SmallVector<mlir::Value, 4> ops;
+ mlir::Value index, defaultLabel;
+ for (size_t opIter = 0; opIter < operandMember.size(); opIter++) {
+ string key = std::to_string(opIter);
+ mlir::Value opValue = ValueJsonDeSerialize(operandJson[key.c_str()]);
+ if (opIter == 0) {
+ index = opValue;
+ continue;
+ } else if (opIter == 1) {
+ defaultLabel = opValue;
+ continue;
+ }
+ ops.push_back(opValue);
+ }
+
+ Json::Value caseaddrJson = node["case"];
+ llvm::SmallVector<uint64_t, 4> caseaddr;
+ llvm::SmallVector<mlir::Block*, 4> caseDest;
+ for (size_t index = 0; index < caseaddrJson.getMemberNames().size(); index++) {
+ string key = std::to_string(index);
+ uint64_t addr = GetID(caseaddrJson[key.c_str()]);
+ mlir::Block* casebb = PluginServer::GetInstance()->FindBlock(addr);
+ caseaddr.push_back(addr);
+ caseDest.push_back(casebb);
+ }
+ mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
+ SwitchOp op = opBuilder->create<SwitchOp>(opBuilder->getUnknownLoc(), id, index, address, defaultLabel, ops, defaultDest,
+ defaultDestAddr, caseDest, caseaddr);
+ PluginServer::GetInstance()->InsertDefOperation(id, op.getOperation());
+ return op.getOperation();
+}
+
void PluginJson::OpJsonDeSerialize(
const string& data, vector<mlir::Operation *>& opData)
{
@@ -868,6 +1187,32 @@ void PluginJson::OpJsonDeSerialize(
uint64_t opID = GetID(opJson["id"]);
mlir::OpBuilder *opBuilder = PluginServer::GetInstance()->GetOpBuilder();
opBuilder->create<BaseOp>(opBuilder->getUnknownLoc(), opID, opCode);
+ } else if (opCode == AsmOp::getOperationName().str()) {
+ opData.push_back(AsmOpJsonDeserialize(opJson.toStyledString()));
+ } else if (opCode == SwitchOp::getOperationName().str()) {
+ opData.push_back(SwitchOpJsonDeserialize(opJson.toStyledString()));
+ } else if (opCode == GotoOp::getOperationName().str()) {
+ opData.push_back(GotoOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == LabelOp::getOperationName().str()) {
+ opData.push_back(LabelOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == TransactionOp::getOperationName().str()) {
+ opData.push_back(TransactionOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == ResxOp::getOperationName().str()) {
+ opData.push_back(ResxOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == EHDispatchOp::getOperationName().str()) {
+ opData.push_back(EHDispatchOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == EHMntOp::getOperationName().str()) {
+ opData.push_back(EHMntOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == BindOp::getOperationName().str()) {
+ opData.push_back(BindOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == TryOp::getOperationName().str()) {
+ opData.push_back(TryOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == CatchOp::getOperationName().str()) {
+ opData.push_back(CatchOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == NopOp::getOperationName().str()) {
+ opData.push_back(NopOpJsonDeSerialize(opJson.toStyledString()));
+ } else if (opCode == EHElseOp::getOperationName().str()) {
+ opData.push_back(EHElseOpJsonDeSerialize(opJson.toStyledString()));
}
}
} // namespace PinJson
\ No newline at end of file
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化