summaryrefslogtreecommitdiff
path: root/lang/c/pseudoc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lang/c/pseudoc.cpp')
-rw-r--r--lang/c/pseudoc.cpp40
1 files changed, 28 insertions, 12 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