diff --git a/Ghidra/Features/Decompiler/src/decompile/cpp/subflow.cc b/Ghidra/Features/Decompiler/src/decompile/cpp/subflow.cc index 42d185d7c8..c88d3bdf49 100644 --- a/Ghidra/Features/Decompiler/src/decompile/cpp/subflow.cc +++ b/Ghidra/Features/Decompiler/src/decompile/cpp/subflow.cc @@ -731,10 +731,15 @@ bool SubvariableFlow::traceBackward(ReplaceVarnode *rvn) addNewConstant(rop,0,(uintb)0); return true; } - if ((newmask<mask) - break; // subvariable is truncated by shift - rop = createOp(CPUI_COPY,1,rvn); - if (!createLink(rop,newmask,0,op->getIn(0))) return false; + if ((newmask<mask) { + rop = createOp(CPUI_COPY,1,rvn); + if (!createLink(rop,newmask,0,op->getIn(0))) return false; + return true; + } + if ((rvn->mask & 1)==0) return false; // Can't assume zeroes are shifted into least sig bits + rop = createOp(CPUI_INT_LEFT,2,rvn); + if (!createLink(rop,rvn->mask,0,op->getIn(0))) return false; + addConstant(rop,calc_mask(op->getIn(1)->getSize()),1,op->getIn(1)); // Preserve the shift amount return true; case CPUI_INT_RIGHT: if (!op->getIn(1)->isConstant()) break; // Dynamic shift diff --git a/Ghidra/Framework/SoftwareModeling/data/languages/compiler_spec.rxg b/Ghidra/Framework/SoftwareModeling/data/languages/compiler_spec.rxg index 37d7842e45..8ba5b316b6 100644 --- a/Ghidra/Framework/SoftwareModeling/data/languages/compiler_spec.rxg +++ b/Ghidra/Framework/SoftwareModeling/data/languages/compiler_spec.rxg @@ -406,6 +406,11 @@ + + + + + diff --git a/Ghidra/Processors/ARM/data/languages/ARM.cspec b/Ghidra/Processors/ARM/data/languages/ARM.cspec index a7fcff8138..c116a64d37 100644 --- a/Ghidra/Processors/ARM/data/languages/ARM.cspec +++ b/Ghidra/Processors/ARM/data/languages/ARM.cspec @@ -58,6 +58,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -73,17 +97,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + @@ -103,9 +202,15 @@ + + + + + + @@ -117,6 +222,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/ARM/data/languages/ARM_win.cspec b/Ghidra/Processors/ARM/data/languages/ARM_win.cspec index 79e4532da5..c9e0c331df 100644 --- a/Ghidra/Processors/ARM/data/languages/ARM_win.cspec +++ b/Ghidra/Processors/ARM/data/languages/ARM_win.cspec @@ -37,7 +37,105 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -68,26 +166,26 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +