+ floating point support + better 64-bit arithmetics support (instruction pairs are recognized better) + new analysis: live ranges of stack variables; reused slots are detected and properly handled (if not aliased) + __usercall with ellipsis is supported NITPICKY DETAILS
+ slightly modified attachment of block comments. the new method is slightly better but the existing block comments on multiline binary operations may move from one operand to another: + decompiler distinguishes alisable and restricted (non-aliasable memory) + delphi overflow and range checks are hidden from the output + the "reset types" command can reset local or global types + slightly more aggressive stkvar elimination; unfortunately we can not eliminate unused stkvars completely in the presence of unknown or guessed function calls - if a function argument list is detected incorrectly, we risk deleting useful code + added rule: x=y,x => (x=y) != 0 + decompiler generates less partial types + added parsing of function prototype line + local variable declarations are sorted: first are register variables sorted by basic blocks, then stack variables sorted by frame offets + added FOR-2 rule to create more for-loops + improved handling of 64bit operations + improved the decompiler engine to eliminate common subexpressions in some special cases + more aggressive cast removal: if the result of add/sub and similar operations is finally truncated, remove truncation casts for operands + added COERCE_... helper functions to convert int/float types when regular cast operations are not enough + better handling of 64-bit values in vararg arguments + better type casts for object references (decompiler was resolving types when it was not really necessary and replacing, e.g. LPSTR by char *) FIXES
BUGFIX: WHILE-5 rule could duplicate a label and then interr BUGFIX: tail calls to noreturn function were not marked as such BUGFIX: right-clicking on the very first { could crash the decompiler BUGFIX: "create new struct type" could create a type with void fields BUGFIX: jo/jno instructions could hide some code from the listing BUGFIX: decompiler would interr on too wide enums (>128bits) BUGFIX: jo/jno instruction could hide executable code; added special handling for them and for delphi overflow checks BUGFIX: decompiler could interr trying to create a variable of va_list type BUGFIX: wrong decompilation output could be generated in some rare cases BUGFIX: some sign-extension casts were missing BUGFIX: array[(uchar)i8] could erroneously be represented as array[i8] BUGFIX: decompiler was considering everything after any // in the output as comments BUGFIX: rule19 to recognize 64bit multiplications could occasionally create wrong code and interr BUGFIX: control flow after memset/memcpy could be rendered incorrectly BUGFIX: decompiler could create a function that returns a value in edx register without returning anything in eax register BUGFIX: decompiler could crash on some inputs