Merge remote-tracking branch 'origin/GP-5989_ForceUnionException' into

Ghidra_12.0 (Closes #7466)
This commit is contained in:
Ryan Kurtz 2025-09-25 05:03:56 -04:00
commit bcd9130aee

View file

@ -128,10 +128,7 @@ public class ForceUnionAction extends AbstractDecompilerAction {
int opcode = accessOp.getOpcode(); int opcode = accessOp.getOpcode();
if (opcode == PcodeOp.PTRSUB) { if (opcode == PcodeOp.PTRSUB) {
parentDt = typeIsUnionRelated(accessOp.getInput(0)); parentDt = typeIsUnionRelated(accessOp.getInput(0));
if (parentDt == null) { if (parentDt != null) {
accessOp = null;
return;
}
accessVn = accessOp.getInput(0); accessVn = accessOp.getInput(0);
accessSlot = 0; accessSlot = 0;
if (accessOp.getInput(1).getOffset() == 0) { // Artificial op if (accessOp.getInput(1).getOffset() == 0) { // Artificial op
@ -148,8 +145,11 @@ public class ForceUnionAction extends AbstractDecompilerAction {
while (accessOp.getOpcode() == PcodeOp.PTRSUB && while (accessOp.getOpcode() == PcodeOp.PTRSUB &&
accessOp.getInput(1).getOffset() == 0); accessOp.getInput(1).getOffset() == 0);
} }
return;
}
} }
else { else {
parentDt = null;
for (accessSlot = 0; accessSlot < accessOp.getNumInputs(); ++accessSlot) { for (accessSlot = 0; accessSlot < accessOp.getNumInputs(); ++accessSlot) {
accessVn = accessOp.getInput(accessSlot); accessVn = accessOp.getInput(accessSlot);
parentDt = typeIsUnionRelated(accessVn); parentDt = typeIsUnionRelated(accessVn);
@ -157,23 +157,27 @@ public class ForceUnionAction extends AbstractDecompilerAction {
break; break;
} }
} }
if (accessSlot >= accessOp.getNumInputs()) { if (parentDt != null) {
accessSlot = -1; if (opcode == PcodeOp.SUBPIECE && accessSlot == 0 &&
accessVn = accessOp.getOutput(); !(parentDt instanceof Pointer)) {
parentDt = typeIsUnionRelated(accessVn);
if (parentDt == null) {
accessOp = null;
return; // Give up, could not find type associated with field
}
}
if (opcode == PcodeOp.SUBPIECE && accessSlot == 0 && !(parentDt instanceof Pointer)) {
// SUBPIECE acts directly as resolution operator // SUBPIECE acts directly as resolution operator
// Choose field based on output varnode, even though it isn't the union data-type // Choose field based on output varnode, even though it isn't the union data-type
accessSlot = -1; accessSlot = -1;
accessVn = accessOp.getOutput(); accessVn = accessOp.getOutput();
} }
return;
} }
} }
accessSlot = -1;
accessVn = accessOp.getOutput();
if (accessVn != null) {
parentDt = typeIsUnionRelated(accessVn);
if (parentDt != null) {
return;
}
}
accessOp = null; // Give up, could not find type associated with field
}
/** /**
* Build a list of all the union field names for the user to select from, when determining * Build a list of all the union field names for the user to select from, when determining