@@ -50,6 +50,16 @@ def StringConstantOp : SIR_Op<"string.constant"> {
5050 let assemblyFormat = "$value attr-dict `:` type($res)";
5151}
5252
53+ // ==========================================================================
54+ // Metadata
55+ // ==========================================================================
56+
57+ def ErrorDeclOp : SIR_Op<"error.decl", [NoMemoryEffect]> {
58+ let summary = "Error declaration metadata";
59+ let arguments = (ins StrAttr:$sym_name);
60+ let assemblyFormat = "attr-dict";
61+ }
62+
5363// ==========================================================================
5464// Arithmetic Operations (binary, word-wise)
5565// ==========================================================================
@@ -791,33 +801,62 @@ def StaticCallOp : SIR_Op<"staticcall"> {
791801// Return & termination ops.
792802// You already have a ReturnOp, we keep it and add stop/revert/invalid/selfdestruct.
793803
804+ // CFG ops.
805+
806+ def BrOp : SIR_Op<"br", [Terminator]> {
807+ let summary = "Unconditional branch";
808+ let arguments = (ins Variadic<AnyType>:$destOperands);
809+ let successors = (successor AnySuccessor:$dest);
810+ let assemblyFormat =
811+ "$dest (`(` $destOperands^ `:` type($destOperands) `)`)? attr-dict";
812+ }
813+
814+ def CondBrOp : SIR_Op<"cond_br", [Terminator, AttrSizedOperandSegments]> {
815+ let summary = "Conditional branch";
816+ let arguments = (ins SIR_U256:$cond,
817+ Variadic<AnyType>:$trueOperands,
818+ Variadic<AnyType>:$falseOperands);
819+ let successors = (successor AnySuccessor:$trueDest, AnySuccessor:$falseDest);
820+ let assemblyFormat =
821+ "$cond `:` type($cond) `,` $trueDest (`(` $trueOperands^ `:` type($trueOperands) `)`)? `,` "
822+ "$falseDest (`(` $falseOperands^ `:` type($falseOperands) `)`)? attr-dict";
823+ }
824+
825+ def SwitchOp : SIR_Op<"switch", [Terminator]> {
826+ let summary = "Switch on selector";
827+ let arguments = (ins SIR_U256:$selector, I64ArrayAttr:$caseValues);
828+ let successors = (successor AnySuccessor:$defaultDest, VariadicSuccessor<AnySuccessor>:$caseDests);
829+ let assemblyFormat =
830+ "$selector `:` type($selector) `,` `[` $caseValues `]` `,` $caseDests `,` $defaultDest attr-dict";
831+ }
832+
794833def ReturnOp : SIR_Op<"return", [Terminator]> {
795834 let summary = "Return a pointer + size";
796835 let arguments = (ins SIR_Ptr:$ptr, SIR_U256:$len);
797836 let assemblyFormat =
798837 "$ptr `:` type($ptr) `,` $len `:` type($len) attr-dict";
799838}
800839
801- def StopOp : SIR_Op<"stop"> {
840+ def StopOp : SIR_Op<"stop", [Terminator] > {
802841 let summary = "STOP";
803842 let arguments = (ins);
804843 let assemblyFormat = "attr-dict";
805844}
806845
807- def RevertOp : SIR_Op<"revert"> {
846+ def RevertOp : SIR_Op<"revert", [Terminator] > {
808847 let summary = "REVERT";
809848 let arguments = (ins SIR_Ptr:$ptr, SIR_U256:$len);
810849 let assemblyFormat =
811850 "$ptr `:` type($ptr) `,` $len `:` type($len) attr-dict";
812851}
813852
814- def InvalidOp : SIR_Op<"invalid"> {
853+ def InvalidOp : SIR_Op<"invalid", [Terminator] > {
815854 let summary = "INVALID";
816855 let arguments = (ins);
817856 let assemblyFormat = "attr-dict";
818857}
819858
820- def SelfDestructOp : SIR_Op<"selfdestruct"> {
859+ def SelfDestructOp : SIR_Op<"selfdestruct", [Terminator] > {
821860 let summary = "SELFDESTRUCT";
822861 let arguments = (ins SIR_U256:$beneficiary);
823862 let assemblyFormat =
@@ -870,7 +909,7 @@ def NoOpOp : SIR_Op<"noop"> {
870909// Internal Return
871910// ==========================================================================
872911
873- def IRetOp : SIR_Op<"iret"> {
912+ def IRetOp : SIR_Op<"iret", [Terminator] > {
874913 let summary = "Internal function return";
875914 let arguments = (ins Variadic<SIR_U256Type>:$values);
876915 let assemblyFormat =
0 commit comments