diff --git a/Ghidra/Features/Decompiler/certification.manifest b/Ghidra/Features/Decompiler/certification.manifest index 1bf74fa054..58568e61c6 100644 --- a/Ghidra/Features/Decompiler/certification.manifest +++ b/Ghidra/Features/Decompiler/certification.manifest @@ -17,6 +17,7 @@ src/decompile/datatests/forloop_thruspecial.xml||GHIDRA||||END| src/decompile/datatests/forloop_varused.xml||GHIDRA||||END| src/decompile/datatests/forloop_withskip.xml||GHIDRA||||END| src/decompile/datatests/loopcomment.xml||GHIDRA||||END| +src/decompile/datatests/multiret.xml||GHIDRA||||END| src/decompile/datatests/namespace.xml||GHIDRA||||END| src/decompile/datatests/nestedoffset.xml||GHIDRA||||END| src/decompile/datatests/noforloop_alias.xml||GHIDRA||||END| diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc index bb40b24eef..e15ac703a5 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/fspec.cc @@ -3174,17 +3174,20 @@ void FuncProto::setOutputLock(bool val) store->getOutput()->setTypeLock(val); } -/// This value can be used as a hint as to how much of the return value is important and -/// is used to inform the dead code \e consume algorithm. -/// \param val is the estimated number of bytes or 0 -/// \return \b true if the value was changed +/// Provide a hint as to how many bytes of the return value are important. +/// The smallest hint is used to inform the dead-code removal algorithm. +/// \param val is the hint (number of bytes or 0 for all bytes) +/// \return \b true if the smallest hint has changed bool FuncProto::setReturnBytesConsumed(int4 val) { - int4 oldVal = returnBytesConsumed; - if (oldVal == 0 || val < oldVal) + if (val == 0) + return false; + if (returnBytesConsumed == 0 || val < returnBytesConsumed) { returnBytesConsumed = val; - return (oldVal != val); + return true; + } + return false; } /// \brief Assuming \b this prototype is locked, calculate the \e extrapop diff --git a/Ghidra/Features/Decompiler/src/decompile/datatests/multiret.xml b/Ghidra/Features/Decompiler/src/decompile/datatests/multiret.xml new file mode 100644 index 0000000000..b7e67d337b --- /dev/null +++ b/Ghidra/Features/Decompiler/src/decompile/datatests/multiret.xml @@ -0,0 +1,30 @@ + + + + +4883ec1864488b042528000000488944 +240831c083fe01744f83fe02742a897c +2404488d7c2404e8dc0f00008b442404 +488b542408644833142528000000753d +4883c418c3000000488d7c2404b8e903 +00006689442404e8ac0f00008b442404 +ebce000000000000488d7c2404c64424 +0461e8910f00008b442404ebb3e88e0f +0000 + + + +Stack20 = CONCAT31.*0x61 +Stack20 = CONCAT22.*0x3e9 +Stack20 = param_1 +