Skip to content

Commit 3569806

Browse files
author
Matthias Güdemann
committed
Introduce temporary stack variables for dup_2, dup2_x1, dup2_x2
1 parent 75b770b commit 3569806

File tree

1 file changed

+68
-3
lines changed

1 file changed

+68
-3
lines changed

src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 68 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,33 +1781,98 @@ codet java_bytecode_convert_methodt::convert_instructions(
17811781
assert(!stack.empty() && results.empty());
17821782

17831783
if(get_bytecode_type_width(stack.back().type())==32)
1784-
op=pop(2);
1784+
{
1785+
op=pop(2); // op0 is value1 op1 is value2
1786+
const exprt tmp_var1=
1787+
tmp_variable("stack_dup2_1", op[0].type());
1788+
const exprt tmp_var2=
1789+
tmp_variable("stack_dup2_2", op[1].type());
1790+
c=code_blockt();
1791+
c.copy_to_operands(
1792+
code_assignt(tmp_var1, java_bytecode_promotion(op[0])));
1793+
c.copy_to_operands(
1794+
code_assignt(tmp_var2, java_bytecode_promotion(op[1])));
1795+
results.push_back(tmp_var1);
1796+
results.push_back(tmp_var2);
1797+
}
17851798
else
1799+
{
17861800
op=pop(1);
1801+
const exprt tmp_var=
1802+
tmp_variable("stack_dup2", op[0].type());
1803+
c=code_assignt(tmp_var, java_bytecode_promotion(op[0]));
1804+
results.push_back(tmp_var);
1805+
}
17871806

17881807
results.insert(results.end(), op.begin(), op.end());
1789-
results.insert(results.end(), op.begin(), op.end());
17901808
}
17911809
else if(statement=="dup2_x1")
17921810
{
17931811
assert(!stack.empty() && results.empty());
17941812

17951813
if(get_bytecode_type_width(stack.back().type())==32)
1814+
{
17961815
op=pop(3);
1816+
const exprt tmp_var1=
1817+
tmp_variable("stack_dup2_x1_1", op[2].type());
1818+
const exprt tmp_var2=
1819+
tmp_variable("stack_dup2_x1_2", op[1].type());
1820+
c=code_blockt();
1821+
c.copy_to_operands(
1822+
code_assignt(tmp_var1, java_bytecode_promotion(op[2])));
1823+
c.copy_to_operands(
1824+
code_assignt(tmp_var2, java_bytecode_promotion(op[1])));
1825+
results.push_back(tmp_var2);
1826+
results.push_back(tmp_var1);
1827+
c=code_blockt();
1828+
c.copy_to_operands(
1829+
code_assignt(tmp_var1, java_bytecode_promotion(op[2])));
1830+
c.copy_to_operands(
1831+
code_assignt(tmp_var2, java_bytecode_promotion(op[1])));
1832+
}
17971833
else
1834+
{
17981835
op=pop(2);
1836+
const exprt tmp_var=
1837+
tmp_variable("stack_dup2_x1", op[1].type());
1838+
results.push_back(tmp_var);
1839+
c=code_assignt(tmp_var, java_bytecode_promotion(op[1]));
1840+
}
17991841

1800-
results.insert(results.end(), op.begin()+1, op.end());
18011842
results.insert(results.end(), op.begin(), op.end());
18021843
}
18031844
else if(statement=="dup2_x2")
18041845
{
18051846
assert(!stack.empty() && results.empty());
18061847

18071848
if(get_bytecode_type_width(stack.back().type())==32)
1849+
{
18081850
op=pop(2);
1851+
const exprt tmp_var1=
1852+
tmp_variable("stack_dup2_x2_1", op[1].type());
1853+
const exprt tmp_var2=
1854+
tmp_variable("stack_dup2_x2_2", op[0].type());
1855+
c=code_blockt();
1856+
c.copy_to_operands(
1857+
code_assignt(tmp_var1, java_bytecode_promotion(op[1])));
1858+
c.copy_to_operands(
1859+
code_assignt(tmp_var2, java_bytecode_promotion(op[0])));
1860+
results.push_back(tmp_var2);
1861+
results.push_back(tmp_var1);
1862+
c=code_blockt();
1863+
c.copy_to_operands(
1864+
code_assignt(tmp_var1, java_bytecode_promotion(op[1])));
1865+
c.copy_to_operands(
1866+
code_assignt(tmp_var2, java_bytecode_promotion(op[0])));
1867+
}
18091868
else
1869+
{
18101870
op=pop(1);
1871+
const exprt tmp_var=
1872+
tmp_variable("stack_dup2_x2", op[0].type());
1873+
c=code_assignt(tmp_var, java_bytecode_promotion(op[0]));
1874+
results.push_back(tmp_var);
1875+
}
18111876

18121877
assert(!stack.empty());
18131878
exprt::operandst op2;

0 commit comments

Comments
 (0)