From f842953925d02ec2879101e73b5844f1cf47affc Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 02:32:40 +0200 Subject: [PATCH 1/6] Added support for `align_(pri|alt)` OPcodes --- src/main/java/lysis/builder/MethodParser.java | 7 ++++++ src/main/java/lysis/instructions/LAlign.java | 24 +++++++++++++++++++ src/main/java/lysis/instructions/Opcode.java | 2 +- src/main/java/lysis/nodes/NodeBuilder.java | 10 ++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/main/java/lysis/instructions/LAlign.java diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index 0744fe8..4d329e2 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -684,6 +684,13 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { pc_ += num - 8; // skip dbgname return new LDebugBreak(); } + + case align_pri: + case align_alt: + { + Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; + return new LStackAddress(trackStack(readInt32()), reg); + } default: throw new Exception("Unrecognized opcode: " + op); diff --git a/src/main/java/lysis/instructions/LAlign.java b/src/main/java/lysis/instructions/LAlign.java new file mode 100644 index 0000000..aef05bb --- /dev/null +++ b/src/main/java/lysis/instructions/LAlign.java @@ -0,0 +1,24 @@ +package lysis.instructions; + +import java.io.DataOutputStream; +import java.io.IOException; + +import lysis.lstructure.Register; + +public class LAlign extends LInstructionReg { + + public LAlign(Register reg) { + super(reg); + } + + @Override + public Opcode op() { + return Opcode.Align; + } + + @Override + public void print(DataOutputStream tw) throws IOException { + tw.writeBytes("align." + RegisterName(reg()) + ", " + + (reg() == Register.Pri ? RegisterName(Register.Alt) : RegisterName(Register.Pri))); + } +} \ No newline at end of file diff --git a/src/main/java/lysis/instructions/Opcode.java b/src/main/java/lysis/instructions/Opcode.java index 0788c59..c302064 100644 --- a/src/main/java/lysis/instructions/Opcode.java +++ b/src/main/java/lysis/instructions/Opcode.java @@ -1,5 +1,5 @@ package lysis.instructions; public enum Opcode { - LoadLocal, StoreLocal, LoadLocalRef, StoreLocalRef, Load, Constant, StackAddress, Store, IndexAddress, Move, PushReg, PushConstant, Pop, Stack, Return, Jump, JumpCondition, AddConstant, MulConstant, ZeroGlobal, IncGlobal, DecGlobal, IncLocal, DecLocal, IncI, IncReg, DecI, DecReg, Fill, Bounds, SysReq, Swap, PushStackAddress, DebugBreak, Goto, PushLocal, Exchange, Binary, ShiftLeftConstant, PushGlobal, StoreGlobal, LoadGlobal, Call, EqualConstant, LoadIndex, Unary, StoreGlobalConstant, StoreLocalConstant, ZeroLocal, Heap, MemCopy, Switch, GenArray, StackAdjust, LoadCtrl, StoreCtrl, InitArray + LoadLocal, StoreLocal, LoadLocalRef, StoreLocalRef, Load, Constant, StackAddress, Store, IndexAddress, Move, PushReg, PushConstant, Pop, Stack, Return, Jump, JumpCondition, AddConstant, MulConstant, ZeroGlobal, IncGlobal, DecGlobal, IncLocal, DecLocal, IncI, IncReg, DecI, DecReg, Fill, Bounds, SysReq, Swap, PushStackAddress, DebugBreak, Goto, PushLocal, Exchange, Binary, ShiftLeftConstant, PushGlobal, StoreGlobal, LoadGlobal, Call, EqualConstant, LoadIndex, Unary, StoreGlobalConstant, StoreLocalConstant, ZeroLocal, Heap, MemCopy, Switch, GenArray, StackAdjust, LoadCtrl, StoreCtrl, InitArray, Align } diff --git a/src/main/java/lysis/nodes/NodeBuilder.java b/src/main/java/lysis/nodes/NodeBuilder.java index f768c6c..583cf81 100644 --- a/src/main/java/lysis/nodes/NodeBuilder.java +++ b/src/main/java/lysis/nodes/NodeBuilder.java @@ -58,6 +58,7 @@ import lysis.instructions.LUnary; import lysis.instructions.LZeroGlobal; import lysis.instructions.LZeroLocal; +import lysis.instructions.LAlign; import lysis.instructions.Opcode; import lysis.lstructure.Function; import lysis.lstructure.LBlock; @@ -791,6 +792,15 @@ public void traverse(NodeBlock block) throws Exception { block.add(new DLabel(ins.pc())); break; } + + case Align: { + LAlign ins = (LAlign) uins; + if (ins.reg() == Register.Pri) + block.stack().set(Register.Pri, block.stack().alt()); + else + block.stack().set(Register.Alt, block.stack().pri()); + break; + } default: throw new Exception("unhandled opcode " + uins.op()); From aa41773f876728cdeb84a3f83f6203b651965104 Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 03:10:19 +0200 Subject: [PATCH 2/6] Update MethodParser.java --- src/main/java/lysis/builder/MethodParser.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index 4d329e2..df69445 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -72,6 +72,7 @@ import lysis.instructions.LZeroGlobal; import lysis.instructions.LZeroLocal; import lysis.instructions.SwitchCase; +import lysis.instructions.LAlign; import lysis.lstructure.Function; import lysis.lstructure.LBlock; import lysis.lstructure.LGraph; @@ -227,6 +228,13 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { case idxaddr_b: return new LIndexAddress(readInt32()); + case align_pri: + case align_alt: + { + Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; + return new LAlign(reg); + } + case move_pri: case move_alt: { Register reg = (op == SPOpcode.move_pri) ? Register.Pri : Register.Alt; @@ -684,13 +692,6 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { pc_ += num - 8; // skip dbgname return new LDebugBreak(); } - - case align_pri: - case align_alt: - { - Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; - return new LStackAddress(trackStack(readInt32()), reg); - } default: throw new Exception("Unrecognized opcode: " + op); From 7b61bb5e4a3db6fe336d3c38e767a1ba798dfa88 Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 03:30:09 +0200 Subject: [PATCH 3/6] Fixed the implementation --- src/main/java/lysis/builder/MethodParser.java | 15 +++++++-------- src/main/java/lysis/instructions/LAlign.java | 12 +++++++++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index df69445..ea15dca 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -72,7 +72,6 @@ import lysis.instructions.LZeroGlobal; import lysis.instructions.LZeroLocal; import lysis.instructions.SwitchCase; -import lysis.instructions.LAlign; import lysis.lstructure.Function; import lysis.lstructure.LBlock; import lysis.lstructure.LGraph; @@ -228,13 +227,6 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { case idxaddr_b: return new LIndexAddress(readInt32()); - case align_pri: - case align_alt: - { - Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; - return new LAlign(reg); - } - case move_pri: case move_alt: { Register reg = (op == SPOpcode.move_pri) ? Register.Pri : Register.Alt; @@ -692,6 +684,13 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { pc_ += num - 8; // skip dbgname return new LDebugBreak(); } + + case align_pri: + case align_alt: + { + Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; + return new LAlign(trackGlobal(readInt32()), reg); + } default: throw new Exception("Unrecognized opcode: " + op); diff --git a/src/main/java/lysis/instructions/LAlign.java b/src/main/java/lysis/instructions/LAlign.java index aef05bb..a56ef53 100644 --- a/src/main/java/lysis/instructions/LAlign.java +++ b/src/main/java/lysis/instructions/LAlign.java @@ -6,9 +6,15 @@ import lysis.lstructure.Register; public class LAlign extends LInstructionReg { + + private long offset_; - public LAlign(Register reg) { - super(reg); + public long offset() { + return offset_; + } + public LAlign(long offset, Register reg) { + super(reg); + offset_ = offset; } @Override @@ -19,6 +25,6 @@ public Opcode op() { @Override public void print(DataOutputStream tw) throws IOException { tw.writeBytes("align." + RegisterName(reg()) + ", " - + (reg() == Register.Pri ? RegisterName(Register.Alt) : RegisterName(Register.Pri))); + + (reg() == Register.Pri ? RegisterName(Register.Alt) : RegisterName(Register.Pri)) + offset()); } } \ No newline at end of file From 2504487cd7fb160d807d00496e743570155729f7 Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 13:29:55 +0200 Subject: [PATCH 4/6] Fixed build --- src/main/java/lysis/builder/MethodParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index ea15dca..9b2bb65 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -72,6 +72,7 @@ import lysis.instructions.LZeroGlobal; import lysis.instructions.LZeroLocal; import lysis.instructions.SwitchCase; +import lysis.instructions.LAlign; import lysis.lstructure.Function; import lysis.lstructure.LBlock; import lysis.lstructure.LGraph; From 7b3167664f98231eb80b85f7558dbe5bd0d90ed6 Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 14:32:56 +0200 Subject: [PATCH 5/6] Improved align.(pri|alt) read --- src/main/java/lysis/BitConverter.java | 9 ++++++++ src/main/java/lysis/builder/MethodParser.java | 19 ++++++++++------- src/main/java/lysis/instructions/LAlign.java | 21 +++++++++---------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/main/java/lysis/BitConverter.java b/src/main/java/lysis/BitConverter.java index 8d5982f..8aa0d2b 100644 --- a/src/main/java/lysis/BitConverter.java +++ b/src/main/java/lysis/BitConverter.java @@ -23,6 +23,15 @@ public static int ToInt32(byte[] bytes, int offset) { return result; } + public static int ToInt32LittleEndian(byte[] bytes, int offset) { + int result = (int) bytes[offset + 3] & 0xff; + result |= ((int) bytes[offset + 2] & 0xff) << 8; + result |= ((int) bytes[offset + 1] & 0xff) << 16; + result |= ((int) bytes[offset] & 0xff) << 24; + return result; + } + + public static long ToUInt32(byte[] bytes, int offset) { long result = (int) bytes[offset] & 0xff; result |= ((int) bytes[offset + 1] & 0xff) << 8; diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index 9b2bb65..15e5833 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -118,6 +118,11 @@ private long readUInt32() { return BitConverter.ToUInt32(file_.code().bytes(), (int) pc_ - 4); } + private int readInt32LittleEndian() { + pc_ += 4; + return BitConverter.ToInt32LittleEndian(file_.code().bytes(), (int) pc_ - 4); + } + private SPOpcode readOp() { return SPOpcode.values()[(int) readUInt32()]; } @@ -228,6 +233,13 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { case idxaddr_b: return new LIndexAddress(readInt32()); + case align_pri: + case align_alt: + { + Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; + return new LAlign(trackGlobal(readInt32LittleEndian()), reg); + } + case move_pri: case move_alt: { Register reg = (op == SPOpcode.move_pri) ? Register.Pri : Register.Alt; @@ -685,13 +697,6 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { pc_ += num - 8; // skip dbgname return new LDebugBreak(); } - - case align_pri: - case align_alt: - { - Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; - return new LAlign(trackGlobal(readInt32()), reg); - } default: throw new Exception("Unrecognized opcode: " + op); diff --git a/src/main/java/lysis/instructions/LAlign.java b/src/main/java/lysis/instructions/LAlign.java index a56ef53..e32db74 100644 --- a/src/main/java/lysis/instructions/LAlign.java +++ b/src/main/java/lysis/instructions/LAlign.java @@ -5,16 +5,16 @@ import lysis.lstructure.Register; -public class LAlign extends LInstructionReg { - - private long offset_; +public class LAlign extends LInstructionRegStack { + + private long number_; - public long offset() { - return offset_; - } - public LAlign(long offset, Register reg) { - super(reg); - offset_ = offset; + public long number() { + return number_; + } + public LAlign(long number, Register reg) { + super(reg, number); + number_ = number; } @Override @@ -24,7 +24,6 @@ public Opcode op() { @Override public void print(DataOutputStream tw) throws IOException { - tw.writeBytes("align." + RegisterName(reg()) + ", " - + (reg() == Register.Pri ? RegisterName(Register.Alt) : RegisterName(Register.Pri)) + offset()); + tw.writeBytes("align." + (reg() == Register.Pri ? RegisterName(Register.Pri) : RegisterName(Register.Alt)) + number()); } } \ No newline at end of file From 897054036d82c284d75870efe86b7e9b457eca65 Mon Sep 17 00:00:00 2001 From: Adrian Cirstea <54354938+ShadowsAdi@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:01:34 +0200 Subject: [PATCH 6/6] Implemented `Align` node --- src/main/java/lysis/builder/MethodParser.java | 2 +- .../java/lysis/builder/SourceBuilder.java | 12 +++++++ src/main/java/lysis/nodes/NodeBuilder.java | 19 ++++++----- src/main/java/lysis/nodes/NodeRewriter.java | 5 +++ src/main/java/lysis/nodes/NodeType.java | 2 +- src/main/java/lysis/nodes/NodeVisitor.java | 4 +++ src/main/java/lysis/nodes/types/DAlign.java | 33 +++++++++++++++++++ .../lysis/types/BackwardTypePropagation.java | 4 +++ .../lysis/types/ForwardTypePropagation.java | 5 +++ 9 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 src/main/java/lysis/nodes/types/DAlign.java diff --git a/src/main/java/lysis/builder/MethodParser.java b/src/main/java/lysis/builder/MethodParser.java index 15e5833..e4d6d99 100644 --- a/src/main/java/lysis/builder/MethodParser.java +++ b/src/main/java/lysis/builder/MethodParser.java @@ -236,7 +236,7 @@ private LInstruction readInstruction(SPOpcode op) throws Exception { case align_pri: case align_alt: { - Register reg = (op == SPOpcode.addr_pri) ? Register.Pri : Register.Alt; + Register reg = (op == SPOpcode.align_pri) ? Register.Pri : Register.Alt; return new LAlign(trackGlobal(readInt32LittleEndian()), reg); } diff --git a/src/main/java/lysis/builder/SourceBuilder.java b/src/main/java/lysis/builder/SourceBuilder.java index 5d969ef..57a591d 100644 --- a/src/main/java/lysis/builder/SourceBuilder.java +++ b/src/main/java/lysis/builder/SourceBuilder.java @@ -26,6 +26,7 @@ import lysis.nodes.NodeBlock; import lysis.nodes.NodeList; import lysis.nodes.NodeType; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoolean; @@ -410,6 +411,10 @@ private String buildLoadStoreRef(DNode node) throws Exception { case Unary: { return buildUnary((DUnary) node) + "/* ERROR unknown load Unary */"; } + + case Align: { + return buildAlign((DAlign) node); + } default: throw new Exception("unknown load " + node.type()); @@ -419,6 +424,10 @@ private String buildLoadStoreRef(DNode node) throws Exception { private String buildLoad(DLoad load) throws Exception { return buildLoadStoreRef(load.getOperand(0)); } + + private String buildAlign(DAlign alg) throws Exception { + return buildLoadStoreRef(alg.getOperand(0)); + } private String buildSysReq(DSysReq sysreq) throws Exception { String args = ""; @@ -813,6 +822,9 @@ private void writeStatement(DNode node) throws Exception { case Label: writeLabel((DLabel) node); break; + + case Align: + break; default: throw new Exception("unknown op (" + node.type() + ")"); diff --git a/src/main/java/lysis/nodes/NodeBuilder.java b/src/main/java/lysis/nodes/NodeBuilder.java index 583cf81..b853d2c 100644 --- a/src/main/java/lysis/nodes/NodeBuilder.java +++ b/src/main/java/lysis/nodes/NodeBuilder.java @@ -66,6 +66,7 @@ import lysis.lstructure.Register; import lysis.lstructure.Scope; import lysis.lstructure.Variable; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoundsCheck; @@ -387,6 +388,15 @@ public void traverse(NodeBlock block) throws Exception { block.add(node); break; } + + case Align: { + LAlign ins = (LAlign) uins; + DAlign node = new DAlign((ins.reg() == Register.Pri) ? block.stack().pri() : block.stack().alt(), ins.number()); + + block.stack().set((ins.reg() == Register.Pri) ? Register.Pri : Register.Alt, node); + block.add(node); + break; + } case Move: { LMove ins = (LMove) uins; @@ -792,15 +802,6 @@ public void traverse(NodeBlock block) throws Exception { block.add(new DLabel(ins.pc())); break; } - - case Align: { - LAlign ins = (LAlign) uins; - if (ins.reg() == Register.Pri) - block.stack().set(Register.Pri, block.stack().alt()); - else - block.stack().set(Register.Alt, block.stack().pri()); - break; - } default: throw new Exception("unhandled opcode " + uins.op()); diff --git a/src/main/java/lysis/nodes/NodeRewriter.java b/src/main/java/lysis/nodes/NodeRewriter.java index a10a912..acc6a22 100644 --- a/src/main/java/lysis/nodes/NodeRewriter.java +++ b/src/main/java/lysis/nodes/NodeRewriter.java @@ -1,5 +1,6 @@ package lysis.nodes; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoundsCheck; @@ -291,6 +292,10 @@ public void visit(DCall call) throws Exception { throw new Exception("unknown spop"); } } + + @Override + public void visit(DAlign check) { + } private void rewriteBlock(NodeBlock block) throws Exception { current_ = block; diff --git a/src/main/java/lysis/nodes/NodeType.java b/src/main/java/lysis/nodes/NodeType.java index 83ee077..d406522 100644 --- a/src/main/java/lysis/nodes/NodeType.java +++ b/src/main/java/lysis/nodes/NodeType.java @@ -1,5 +1,5 @@ package lysis.nodes; public enum NodeType { - Sentinel, Constant, DeclareLocal, DeclareStatic, LocalRef, Jump, JumpCondition, SysReq, Binary, BoundsCheck, ArrayRef, Store, Load, Return, Global, String, Boolean, Float, Function, Character, Call, TempName, Phi, Unary, IncDec, Heap, MemCopy, InlineArray, Switch, GenArray, Label + Sentinel, Constant, DeclareLocal, DeclareStatic, LocalRef, Jump, JumpCondition, SysReq, Binary, BoundsCheck, ArrayRef, Store, Load, Return, Global, String, Boolean, Float, Function, Character, Call, TempName, Phi, Unary, IncDec, Heap, MemCopy, InlineArray, Switch, GenArray, Label, Align } diff --git a/src/main/java/lysis/nodes/NodeVisitor.java b/src/main/java/lysis/nodes/NodeVisitor.java index 38e55ab..fb878b6 100644 --- a/src/main/java/lysis/nodes/NodeVisitor.java +++ b/src/main/java/lysis/nodes/NodeVisitor.java @@ -1,5 +1,6 @@ package lysis.nodes; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoolean; @@ -117,4 +118,7 @@ public void visit(DGenArray genarray) throws Exception { public void visit(DLabel gototarget) { } + + public void visit(DAlign number) { + } } diff --git a/src/main/java/lysis/nodes/types/DAlign.java b/src/main/java/lysis/nodes/types/DAlign.java new file mode 100644 index 0000000..c614ad1 --- /dev/null +++ b/src/main/java/lysis/nodes/types/DAlign.java @@ -0,0 +1,33 @@ +package lysis.nodes.types; + +import lysis.nodes.NodeType; +import lysis.nodes.NodeVisitor; + +public class DAlign extends DUnaryNode { + + private long amount_; + + public DAlign(DNode index, long amount) throws Exception { + super(index); + amount_ = amount; + } + + public long amount() { + return amount_; + } + + @Override + public NodeType type() { + return NodeType.Align; + } + + @Override + public void accept(NodeVisitor visitor) { + visitor.visit(this); + } + + @Override + public boolean guard() { + return true; + } +} diff --git a/src/main/java/lysis/types/BackwardTypePropagation.java b/src/main/java/lysis/types/BackwardTypePropagation.java index 192b92c..0778f3d 100644 --- a/src/main/java/lysis/types/BackwardTypePropagation.java +++ b/src/main/java/lysis/types/BackwardTypePropagation.java @@ -15,6 +15,7 @@ import lysis.nodes.NodeList; import lysis.nodes.NodeType; import lysis.nodes.NodeVisitor; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoolean; @@ -401,4 +402,7 @@ public void visit(DGenArray genarray) throws Exception { genarray.getOperand(i).accept(this); } } + + public void visit(DAlign check) { + } } diff --git a/src/main/java/lysis/types/ForwardTypePropagation.java b/src/main/java/lysis/types/ForwardTypePropagation.java index 490c213..526d505 100644 --- a/src/main/java/lysis/types/ForwardTypePropagation.java +++ b/src/main/java/lysis/types/ForwardTypePropagation.java @@ -9,6 +9,7 @@ import lysis.nodes.NodeList; import lysis.nodes.NodeType; import lysis.nodes.NodeVisitor; +import lysis.nodes.types.DAlign; import lysis.nodes.types.DArrayRef; import lysis.nodes.types.DBinary; import lysis.nodes.types.DBoundsCheck; @@ -293,4 +294,8 @@ public void visit(DGenArray genarray) throws Exception { genarray.addType(new TypeUnit(tu)); } } + + @Override + public void visit(DAlign node) { + } }