diff --git a/Ghidra/Features/SystemEmulation/ghidra_scripts/DemoPcodeUseropLibrary.java b/Ghidra/Features/SystemEmulation/ghidra_scripts/DemoPcodeUseropLibrary.java index 8b9d673da5..1314f40d14 100644 --- a/Ghidra/Features/SystemEmulation/ghidra_scripts/DemoPcodeUseropLibrary.java +++ b/Ghidra/Features/SystemEmulation/ghidra_scripts/DemoPcodeUseropLibrary.java @@ -99,7 +99,7 @@ public class DemoPcodeUseropLibrary extends AnnotatedPcodeUseropLibrary */ public class DemoStructuredPart extends StructuredSleigh { final Var RAX = lang("RAX", type("long")); - final Var RCX = lang("RAX", type("byte *")); + final Var RCX = lang("RCX", type("byte *")); final UseropDecl emu_swi = userop(type("void"), "emu_swi", List.of()); protected DemoStructuredPart(CompilerSpec cs) { diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/AssignStmt.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/AssignStmt.java index 6dd4153c5f..e374d79495 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/AssignStmt.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/AssignStmt.java @@ -22,7 +22,7 @@ import ghidra.program.model.data.DataType; * An assignment statement */ class AssignStmt extends AbstractStmt implements RValInternal, StmtWithVal { - private final LValInternal lhs; + final LValInternal lhs; private final RValInternal rhs; private final DataType type; @@ -51,9 +51,9 @@ class AssignStmt extends AbstractStmt implements RValInternal, StmtWithVal { @Override protected StringTree generate(Label next, Label fall) { StringTree st = new StringTree(); - st.append(lhs.generate()); + st.append(lhs.generate(this)); st.append(" = "); - st.append(rhs.generate()); + st.append(rhs.generate(this)); st.append(";\n"); st.append(next.genGoto(fall)); return st; @@ -65,7 +65,7 @@ class AssignStmt extends AbstractStmt implements RValInternal, StmtWithVal { } @Override - public String generate() { - return lhs.generate(); + public StringTree generate(RValInternal parent) { + return lhs.generate(this); } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/BinExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/BinExpr.java index d41c22155f..47185be9e2 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/BinExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/BinExpr.java @@ -41,7 +41,15 @@ class BinExpr extends Expr { } @Override - public String generate() { - return "(" + lhs.generate() + " " + op + " " + rhs.generate() + ")"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + st.append("("); + st.append(lhs.generate(this)); + st.append(" "); + st.append(op); + st.append(" "); + st.append(rhs.generate(this)); + st.append(")"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/CallExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/CallExpr.java index 97000bf5cb..37164c5ae1 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/CallExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/CallExpr.java @@ -64,8 +64,21 @@ public class CallExpr extends Expr { } @Override - public String generate() { - return userop.getName() + "(" + - args.stream().map(a -> a.generate()).collect(Collectors.joining(",")) + ")"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + st.append(userop.getName()); + st.append("("); + boolean first = false; + for (RValInternal a : args) { + if (!first) { + first = true; + } + else { + st.append(","); + } + st.append(a.generate(this)); + } + st.append(")"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DefaultVar.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DefaultVar.java index 4eea8953ad..5eac1b6d3c 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DefaultVar.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DefaultVar.java @@ -114,7 +114,7 @@ class DefaultVar implements LValInternal, Var { } @Override - public String generate() { - return name; + public StringTree generate(RValInternal parent) { + return StringTree.single(name); } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DerefExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DerefExpr.java index 73c0997810..877f96d7ca 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DerefExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/DerefExpr.java @@ -45,10 +45,29 @@ class DerefExpr extends Expr implements LValInternal { } @Override - public String generate() { - String spacePiece = - ctx.language.getDefaultSpace() == space ? "" : ("[" + space.getName() + "]"); - String sizePiece = type.getLength() == 0 ? "" : (":" + type.getLength()); - return "(*" + spacePiece + sizePiece + " " + addr.generate() + ")"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + boolean useParens = !(parent instanceof AssignStmt as && as.lhs == this); + if (useParens) { + st.append("(*"); + } + else { + st.append("*"); + } + if (ctx.language.getDefaultSpace() != space) { + st.append("["); + st.append(space.getName()); + st.append("]"); + } + if (type.getLength() != 0) { + st.append(":"); + st.append(Integer.toString(type.getLength())); + } + st.append(" "); + st.append(addr.generate(this)); + if (useParens) { + st.append(")"); + } + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/FieldExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/FieldExpr.java index 5c6fdb8e81..d1aaa51179 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/FieldExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/FieldExpr.java @@ -19,12 +19,12 @@ import ghidra.pcode.struct.StructuredSleigh.LVal; import ghidra.program.model.data.*; class FieldExpr extends Expr implements LValInternal { - private final RValInternal parent; + private final RValInternal composite; private final int offset; - private FieldExpr(StructuredSleigh ctx, RValInternal parent, int offset, DataType type) { + private FieldExpr(StructuredSleigh ctx, RValInternal composite, int offset, DataType type) { super(ctx, type); - this.parent = parent; + this.composite = composite; this.offset = offset; } @@ -38,16 +38,22 @@ class FieldExpr extends Expr implements LValInternal { @Override public LVal cast(DataType type) { - return new FieldExpr(ctx, parent, offset, type); + return new FieldExpr(ctx, composite, offset, type); } @Override public String toString() { - return ""; + return ""; } @Override - public String generate() { - return "(" + parent.generate() + " + " + offset + ")"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + st.append("("); + st.append(composite.generate(this)); + st.append(" + "); + st.append(Integer.toString(offset)); + st.append(")"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/GotoStmt.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/GotoStmt.java index 335fe2ff30..6936cea9c0 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/GotoStmt.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/GotoStmt.java @@ -19,7 +19,6 @@ import ghidra.pcode.struct.StructuredSleigh.Label; import ghidra.pcode.struct.StructuredSleigh.RVal; public class GotoStmt extends AbstractStmt { - private final RValInternal target; protected GotoStmt(StructuredSleigh ctx, RVal target) { @@ -31,9 +30,8 @@ public class GotoStmt extends AbstractStmt { protected StringTree generate(Label next, Label fall) { StringTree st = new StringTree(); st.append("goto ["); - st.append(target.generate()); + st.append(target.generate(null)); st.append("];\n"); return st; } - } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/IndexExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/IndexExpr.java index b5681bdbc1..3fc473f0aa 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/IndexExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/IndexExpr.java @@ -46,7 +46,15 @@ class IndexExpr extends Expr implements LValInternal { } @Override - public String generate() { - return "(" + base.generate() + " + (" + index.generate() + "*" + elemLen + "))"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + st.append("("); + st.append(base.generate(this)); + st.append(" + ("); + st.append(index.generate(this)); + st.append("*"); + st.append(Integer.toString(elemLen)); + st.append("))"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/LiteralExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/LiteralExpr.java index e4c05f1321..f281175d03 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/LiteralExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/LiteralExpr.java @@ -39,7 +39,7 @@ class LiteralExpr extends Expr { } @Override - public String generate() { - return "0x" + Long.toHexString(val) + ":" + size; + public StringTree generate(RValInternal parent) { + return StringTree.single(String.format("0x%x:%d", val, size)); } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RValInternal.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RValInternal.java index 1c532db041..4ee0879751 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RValInternal.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RValInternal.java @@ -26,7 +26,7 @@ interface RValInternal extends RVal { @Override DataType getType(); - String generate(); + StringTree generate(RValInternal parent); @Override default LVal deref() { diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RawExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RawExpr.java index d9a6f7cea5..cdb9345333 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RawExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/RawExpr.java @@ -37,7 +37,14 @@ public class RawExpr extends Expr { } @Override - public String generate() { - return "(" + expr + ")"; + public StringTree generate(RValInternal parent) { + if (parent instanceof AssignStmt as && as.lhs == this) { + return StringTree.single(expr); + } + StringTree st = new StringTree(); + st.append("("); + st.append(expr); + st.append(")"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ResultStmt.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ResultStmt.java index 30761784b8..17be304db5 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ResultStmt.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ResultStmt.java @@ -40,7 +40,7 @@ class ResultStmt extends AbstractStmt { StringTree st = new StringTree(); st.append(SleighPcodeUseropDefinition.OUT_SYMBOL_NAME); st.append(" = "); - st.append(result.generate()); + st.append(result.generate(null)); st.append(";\n"); st.append(routine.lReturn.genGoto(fall)); return st; diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ReturnStmt.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ReturnStmt.java index d064b92c73..bfe5084c3f 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ReturnStmt.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/ReturnStmt.java @@ -30,7 +30,7 @@ class ReturnStmt extends AbstractStmt { protected StringTree generate(Label next, Label fall) { StringTree st = new StringTree(); st.append("return ["); - st.append(target.generate()); + st.append(target.generate(null)); st.append("];\n"); return st; } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/StructuredSleigh.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/StructuredSleigh.java index 470e63f809..7882a48ffb 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/StructuredSleigh.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/StructuredSleigh.java @@ -94,7 +94,7 @@ import utilities.util.AnnotationUtilities; * } * }; * - * SleighPcodeUseropDefinition myUserop = ss.generate().get("my_userop"); + * SleighPcodeUseropDefinition<Object> myUserop = ss.generate().get("my_userop"); * // To print source * myUserop.getLines().forEach(System.out::print); * @@ -1081,7 +1081,7 @@ public class StructuredSleigh { } StringTree st = new StringTree(); st.append("if "); - st.append(((RValInternal) cond).generate()); + st.append(((RValInternal) cond).generate(null)); st.append(" "); st.append(genGoto(fall)); return st; diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/UnExpr.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/UnExpr.java index 5973bc3cd9..b801fbb187 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/UnExpr.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/UnExpr.java @@ -39,7 +39,12 @@ class UnExpr extends Expr { } @Override - public String generate() { - return "(" + op + u.generate() + ")"; + public StringTree generate(RValInternal parent) { + StringTree st = new StringTree(); + st.append("("); + st.append(op); + st.append(u.generate(this)); + st.append(")"); + return st; } } diff --git a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/VoidExprStmt.java b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/VoidExprStmt.java index dd1dc5cd9a..5fd8906164 100644 --- a/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/VoidExprStmt.java +++ b/Ghidra/Features/SystemEmulation/src/main/java/ghidra/pcode/struct/VoidExprStmt.java @@ -45,7 +45,7 @@ class VoidExprStmt extends AbstractStmt implements RValInternal, StmtWithVal { @Override protected StringTree generate(Label next, Label fall) { StringTree st = new StringTree(); - st.append(expr.generate()); + st.append(expr.generate(this)); st.append(";\n"); st.append(next.genGoto(fall)); return st; @@ -57,7 +57,7 @@ class VoidExprStmt extends AbstractStmt implements RValInternal, StmtWithVal { } @Override - public String generate() { - return ctx.nil.generate(); + public StringTree generate(RValInternal parent) { + return ctx.nil.generate(this); } } diff --git a/Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java b/Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java index 9a0d908116..c4b28e6dce 100644 --- a/Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java +++ b/Ghidra/Framework/Emulation/src/main/java/ghidra/pcode/emu/DefaultPcodeThread.java @@ -355,7 +355,10 @@ public class DefaultPcodeThread implements PcodeThread { @Override public void overrideContextWithDefault() { if (contextreg != Register.NO_CONTEXT) { - overrideContext(defaultContext.getDefaultValue(contextreg, counter)); + RegisterValue defaultValue = defaultContext.getDefaultValue(contextreg, counter); + if (defaultValue != null) { + overrideContext(defaultValue); + } } }