summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
Diffstat (limited to 'lang')
-rw-r--r--lang/c/pseudoc.cpp40
-rw-r--r--lang/c/pseudoc.h2
-rw-r--r--lang/rust/pseudorust.cpp40
-rw-r--r--lang/rust/pseudorust.h2
4 files changed, 60 insertions, 24 deletions
diff --git a/lang/c/pseudoc.cpp b/lang/c/pseudoc.cpp
index 55a3c2c1..8ab07a75 100644
--- a/lang/c/pseudoc.cpp
+++ b/lang/c/pseudoc.cpp
@@ -235,9 +235,15 @@ void PseudoCFunction::AppendComparison(const string& comparison, const HighLevel
const auto leftExpr = instr.GetLeftExpr();
const auto rightExpr = instr.GetRightExpr();
- GetExprTextInternal(leftExpr, emitter, settings, precedence, false, signedHint);
+ if (leftExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(leftExpr, emitter, settings, precedence);
+ else
+ GetExprTextInternal(leftExpr, emitter, settings, precedence, false, signedHint);
emitter.Append(OperationToken, comparison);
- GetExprTextInternal(rightExpr, emitter, settings, precedence, false, signedHint);
+ if (rightExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(rightExpr, emitter, settings, precedence);
+ else
+ GetExprTextInternal(rightExpr, emitter, settings, precedence, false, signedHint);
}
@@ -436,6 +442,25 @@ PseudoCFunction::FieldDisplayType PseudoCFunction::GetFieldDisplayType(
}
+void PseudoCFunction::AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr,
+ BinaryNinja::HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNOperatorPrecedence precedence)
+{
+ const auto high = instr.GetHighExpr<HLIL_SPLIT>();
+ const auto low = instr.GetLowExpr<HLIL_SPLIT>();
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendOpenParen();
+ tokens.AppendOpenParen();
+ GetExprTextInternal(high, tokens, settings, precedence);
+ tokens.Append(OperationToken, " << ");
+ tokens.Append(IntegerToken, std::to_string(low.size * 8));
+ tokens.AppendCloseParen();
+ tokens.Append(OperationToken, " | ");
+ GetExprTextInternal(low, tokens, settings, precedence);
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendCloseParen();
+}
+
+
void PseudoCFunction::AppendFieldTextTokens(const HighLevelILInstruction& var, uint64_t offset,
size_t memberIndex, size_t size, HighLevelILTokenEmitter& tokens, bool deref, bool displayDeref)
{
@@ -1330,19 +1355,10 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H
}
else if (srcExpr.operation == HLIL_SPLIT)
{
- const auto high = srcExpr.GetHighExpr<HLIL_SPLIT>();
- const auto low = srcExpr.GetLowExpr<HLIL_SPLIT>();
GetExprTextInternal(destExpr, tokens, settings, precedence);
tokens.Append(OperationToken, " = ");
- tokens.AppendOpenParen();
- GetExprTextInternal(high, tokens, settings, precedence);
- tokens.Append(OperationToken, " << ");
- tokens.Append(IntegerToken, std::to_string(low.size * 8));
- tokens.AppendCloseParen();
- tokens.Append(OperationToken, " | ");
- GetExprTextInternal(low, tokens, settings, precedence);
+ AppendDefaultSplitExpr(srcExpr, tokens, settings, precedence);
tokens.AppendSemicolon();
- tokens.NewLine();
return;
}
else
diff --git a/lang/c/pseudoc.h b/lang/c/pseudoc.h
index feb64552..a3b03a88 100644
--- a/lang/c/pseudoc.h
+++ b/lang/c/pseudoc.h
@@ -35,6 +35,8 @@ class PseudoCFunction: public BinaryNinja::LanguageRepresentationFunction
BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings);
void AppendFieldTextTokens(const BinaryNinja::HighLevelILInstruction& var, uint64_t offset, size_t memberIndex, size_t size,
BinaryNinja::HighLevelILTokenEmitter& tokens, bool deref, bool displayDeref = true);
+ void AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens,
+ BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence);
void GetExprTextInternal(const BinaryNinja::HighLevelILInstruction& instr,
BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings,
BNOperatorPrecedence precedence = TopLevelOperatorPrecedence, bool statement = false,
diff --git a/lang/rust/pseudorust.cpp b/lang/rust/pseudorust.cpp
index e3f661fa..1aeae158 100644
--- a/lang/rust/pseudorust.cpp
+++ b/lang/rust/pseudorust.cpp
@@ -258,9 +258,15 @@ void PseudoRustFunction::AppendComparison(const string& comparison, const HighLe
const auto leftExpr = instr.GetLeftExpr();
const auto rightExpr = instr.GetRightExpr();
- GetExprText(leftExpr, emitter, settings, precedence, InnerExpression, signedHint);
+ if (leftExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(leftExpr, emitter, settings, precedence);
+ else
+ GetExprText(leftExpr, emitter, settings, precedence, InnerExpression, signedHint);
emitter.Append(OperationToken, comparison);
- GetExprText(rightExpr, emitter, settings, precedence, InnerExpression, signedHint);
+ if (rightExpr.operation == HLIL_SPLIT)
+ AppendDefaultSplitExpr(rightExpr, emitter, settings, precedence);
+ else
+ GetExprText(rightExpr, emitter, settings, precedence, InnerExpression, signedHint);
}
@@ -551,6 +557,25 @@ void PseudoRustFunction::AppendFieldTextTokens(const HighLevelILInstruction& var
}
+void PseudoRustFunction::AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr,
+ BinaryNinja::HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNOperatorPrecedence precedence)
+{
+ const auto high = instr.GetHighExpr<HLIL_SPLIT>();
+ const auto low = instr.GetLowExpr<HLIL_SPLIT>();
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendOpenParen();
+ tokens.AppendOpenParen();
+ GetExprText(high, tokens, settings, precedence);
+ tokens.Append(OperationToken, " << ");
+ tokens.Append(IntegerToken, std::to_string(low.size * 8));
+ tokens.AppendCloseParen();
+ tokens.Append(OperationToken, " | ");
+ GetExprText(low, tokens, settings, precedence);
+ if (precedence == EqualityOperatorPrecedence)
+ tokens.AppendCloseParen();
+}
+
+
bool PseudoRustFunction::IsMutable(const Variable& var) const
{
for (auto i : GetHighLevelILFunction()->GetVariableDefinitions(var))
@@ -1391,19 +1416,10 @@ void PseudoRustFunction::GetExprText(const HighLevelILInstruction& instr, HighLe
}
else if (srcExpr.operation == HLIL_SPLIT)
{
- const auto high = srcExpr.GetHighExpr<HLIL_SPLIT>();
- const auto low = srcExpr.GetLowExpr<HLIL_SPLIT>();
GetExprText(destExpr, tokens, settings, precedence);
tokens.Append(OperationToken, " = ");
- tokens.AppendOpenParen();
- GetExprText(high, tokens, settings, precedence);
- tokens.Append(OperationToken, " << ");
- tokens.Append(IntegerToken, std::to_string(low.size * 8));
- tokens.AppendCloseParen();
- tokens.Append(OperationToken, " | ");
- GetExprText(low, tokens, settings, precedence);
+ AppendDefaultSplitExpr(srcExpr, tokens, settings, precedence);
tokens.AppendSemicolon();
- tokens.NewLine();
return;
}
else
diff --git a/lang/rust/pseudorust.h b/lang/rust/pseudorust.h
index 96e656c2..33794a3c 100644
--- a/lang/rust/pseudorust.h
+++ b/lang/rust/pseudorust.h
@@ -44,6 +44,8 @@ class PseudoRustFunction: public BinaryNinja::LanguageRepresentationFunction
BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings);
void AppendFieldTextTokens(const BinaryNinja::HighLevelILInstruction& var, uint64_t offset, size_t memberIndex, size_t size,
BinaryNinja::HighLevelILTokenEmitter& tokens, bool deref);
+ void AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens,
+ BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence);
bool IsMutable(const BinaryNinja::Variable& var) const;
void GetExprText(const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens,