From e096fa7aa6161e1f5a74001185eb3873a684c48d Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Tue, 27 Jan 2015 16:57:20 +0100 Subject: ABI compatibility for struct/union function arguments passed by value. The passing of struct/union arguments by value implemented in the verified part of CompCert is not compatible with the ARM, PowerPC and x86 ABI. Here we enrich the StructReturn source-to-source emulation pass so that it implements the calling conventions defined in these ABIs. Plus: for x86, implement the returning of struct/union results by value in a way compatible with the ABI. --- test/regression/Results/interop1 | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 test/regression/Results/interop1 (limited to 'test/regression/Results/interop1') diff --git a/test/regression/Results/interop1 b/test/regression/Results/interop1 new file mode 100644 index 00000000..34ec8e6b --- /dev/null +++ b/test/regression/Results/interop1 @@ -0,0 +1,62 @@ +--- CompCert calling native: +s1 = { a = 'a' } +s2 = { a = 'x', b = 'y' } +s3 = { a = 'a', b = 'b', c = ' c' } +s4 = { a = 'p', b = 'q', c = ' r', d = 's' } +s5 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +s6 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +s7 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +s8 = "Hello, world!" +t1 = { a = 12 } +t2 = { a = 34, b = 56 } +t3 = { a = -1, b = -2, c = -3 } +t4 = { a = 11, b = 22, c = 33, d = 44 } +t4 = { a = 1, b = 2, c = 3, d = 4, e = 'x' } +u1 = { a = 12345678 } +u2 = { a = 1, b = -1 } +u3 = { a = -1, b = -2, c = -3 } +u4 = { a = 4, b = 3, c = 2, d = 1 } +u5 = { a = 123, b = 'z' } +u6 = { a = -12345678, b = 555 } +u7 = { a = 111111111, b = 2222, c = 'a' } +u8 = { a = 'u', b = 8 } +u9 = { a = 3.14159, b = -2.718 } +rs1 = { a = 'a' } +rs2 = { a = 'a', b = 'b' } +rs3 = { a = 'a', b = 'b', c = 'c' } +rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } +rs8 = { "Lorem ipsum" } +ru2 = { a = 12, b = -34 } +ru6 = { a = 12345678, b = -9999 } +ru9 = { a = 0.123400, b = -5678.900000 } +--- native calling CompCert: +s1 = { a = 'a' } +s2 = { a = 'x', b = 'y' } +s3 = { a = 'a', b = 'b', c = ' c' } +s4 = { a = 'p', b = 'q', c = ' r', d = 's' } +s5 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +s6 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +s7 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +s8 = "Hello, world!" +t1 = { a = 12 } +t2 = { a = 34, b = 56 } +t3 = { a = -1, b = -2, c = -3 } +t4 = { a = 11, b = 22, c = 33, d = 44 } +t4 = { a = 1, b = 2, c = 3, d = 4, e = 'x' } +u1 = { a = 12345678 } +u2 = { a = 1, b = -1 } +u3 = { a = -1, b = -2, c = -3 } +u4 = { a = 4, b = 3, c = 2, d = 1 } +u5 = { a = 123, b = 'z' } +u6 = { a = -12345678, b = 555 } +u7 = { a = 111111111, b = 2222, c = 'a' } +u8 = { a = 'u', b = 8 } +u9 = { a = 3.14159, b = -2.718 } +rs1 = { a = 'a' } +rs2 = { a = 'a', b = 'b' } +rs3 = { a = 'a', b = 'b', c = 'c' } +rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } +rs8 = { "Lorem ipsum" } +ru2 = { a = 12, b = -34 } +ru6 = { a = 12345678, b = -9999 } +ru9 = { a = 0.123400, b = -5678.900000 } -- cgit From 6f3ac9e1cef476ef0c5eaf7875af24543f66128a Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Wed, 28 Jan 2015 10:02:03 +0100 Subject: More interoperability tests. --- test/regression/Results/interop1 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'test/regression/Results/interop1') diff --git a/test/regression/Results/interop1 b/test/regression/Results/interop1 index 34ec8e6b..bac9aaab 100644 --- a/test/regression/Results/interop1 +++ b/test/regression/Results/interop1 @@ -20,7 +20,9 @@ u5 = { a = 123, b = 'z' } u6 = { a = -12345678, b = 555 } u7 = { a = 111111111, b = 2222, c = 'a' } u8 = { a = 'u', b = 8 } -u9 = { a = 3.14159, b = -2.718 } +u9 = { a = { 9, 8, 7, 6 } } +after ms4, x = { 's', 'a', 'm', 'e' } +after mu9, x = { a = { 11, 22, 33, 44 } } rs1 = { a = 'a' } rs2 = { a = 'a', b = 'b' } rs3 = { a = 'a', b = 'b', c = 'c' } @@ -28,7 +30,7 @@ rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } rs8 = { "Lorem ipsum" } ru2 = { a = 12, b = -34 } ru6 = { a = 12345678, b = -9999 } -ru9 = { a = 0.123400, b = -5678.900000 } +ru9 = { a = { 111, 222, 333, 444 } } --- native calling CompCert: s1 = { a = 'a' } s2 = { a = 'x', b = 'y' } @@ -51,7 +53,9 @@ u5 = { a = 123, b = 'z' } u6 = { a = -12345678, b = 555 } u7 = { a = 111111111, b = 2222, c = 'a' } u8 = { a = 'u', b = 8 } -u9 = { a = 3.14159, b = -2.718 } +u9 = { a = { 9, 8, 7, 6 } } +after ms4, x = { 's', 'a', 'm', 'e' } +after mu9, x = { a = { 11, 22, 33, 44 } } rs1 = { a = 'a' } rs2 = { a = 'a', b = 'b' } rs3 = { a = 'a', b = 'b', c = 'c' } @@ -59,4 +63,4 @@ rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } rs8 = { "Lorem ipsum" } ru2 = { a = 12, b = -34 } ru6 = { a = 12345678, b = -9999 } -ru9 = { a = 0.123400, b = -5678.900000 } +ru9 = { a = { 111, 222, 333, 444 } } -- cgit From cbf8434e44ebd6bc05022d1fbe0400267520184f Mon Sep 17 00:00:00 2001 From: Xavier Leroy Date: Fri, 20 Mar 2015 11:25:30 +0100 Subject: Improvements in the StructReturn transformation (ABI conformance for passing composites). - Implement the "1/2/4/8" composite return policy, used by IA32/MacOS X and IA32/BSD. - Move the default passing conventions from Machine.ml to compcert.ini, making it easier to test the various conventions. - More comprehensive interoperability test in regression/interop1.c. --- test/regression/Results/interop1 | 148 +++++++++++++++++++++++---------------- 1 file changed, 86 insertions(+), 62 deletions(-) (limited to 'test/regression/Results/interop1') diff --git a/test/regression/Results/interop1 b/test/regression/Results/interop1 index bac9aaab..990dfe9d 100644 --- a/test/regression/Results/interop1 +++ b/test/regression/Results/interop1 @@ -1,66 +1,90 @@ --- CompCert calling native: -s1 = { a = 'a' } -s2 = { a = 'x', b = 'y' } -s3 = { a = 'a', b = 'b', c = ' c' } -s4 = { a = 'p', b = 'q', c = ' r', d = 's' } -s5 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } -s6 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } -s7 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } -s8 = "Hello, world!" -t1 = { a = 12 } -t2 = { a = 34, b = 56 } -t3 = { a = -1, b = -2, c = -3 } -t4 = { a = 11, b = 22, c = 33, d = 44 } -t4 = { a = 1, b = 2, c = 3, d = 4, e = 'x' } -u1 = { a = 12345678 } -u2 = { a = 1, b = -1 } -u3 = { a = -1, b = -2, c = -3 } -u4 = { a = 4, b = 3, c = 2, d = 1 } -u5 = { a = 123, b = 'z' } -u6 = { a = -12345678, b = 555 } -u7 = { a = 111111111, b = 2222, c = 'a' } -u8 = { a = 'u', b = 8 } -u9 = { a = { 9, 8, 7, 6 } } +s1: { a = 'a' } +s2: { a = 'a', b = 'b' } +s3: { a = 'a', b = 'b', c = ' c' } +s4: { a = 'a', b = 'b', c = ' c', d = 'd' } +s5: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +s6: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +s7: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +s8: "Hello world!" +t1: { a = 123 } +t2: { a = 123, b = 456 } +t3: { a = 123, b = 456, c = 789 } +t4: { a = 123, b = 456, c = 789, d = -111 } +t5: { a = 123, b = 456, c = 789, d = -999, e = 'x' } +u1: { a = 12 } +u2: { a = 12, b = -34 } +u3: { a = 12, b = 34, c = -56 } +u4: { a = 12, b = 34, c = 56, d = -78 } +u5: { a = 1234, b = 'u' } +u6: { a = 55555, b = 666 } +u7: { a = -10001, b = -789, c = 'z' } +u8: { a = 'x', b = 12345 } after ms4, x = { 's', 'a', 'm', 'e' } -after mu9, x = { a = { 11, 22, 33, 44 } } -rs1 = { a = 'a' } -rs2 = { a = 'a', b = 'b' } -rs3 = { a = 'a', b = 'b', c = 'c' } -rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } -rs8 = { "Lorem ipsum" } -ru2 = { a = 12, b = -34 } -ru6 = { a = 12345678, b = -9999 } -ru9 = { a = { 111, 222, 333, 444 } } +after mu4, x = { a = { 11, 22, 33, 44 } } +rs1: { a = 'a' } +rs2: { a = 'a', b = 'b' } +rs3: { a = 'a', b = 'b', c = ' c' } +rs4: { a = 'a', b = 'b', c = ' c', d = 'd' } +rs5: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +rs6: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +rs7: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +rs8: "Hello world!" +rt1: { a = 123 } +rt2: { a = 123, b = 456 } +rt3: { a = 123, b = 456, c = 789 } +rt4: { a = 123, b = 456, c = 789, d = -111 } +rt5: { a = 123, b = 456, c = 789, d = -999, e = 'x' } +ru1: { a = 12 } +ru2: { a = 12, b = -34 } +ru3: { a = 12, b = 34, c = -56 } +ru4: { a = 12, b = 34, c = 56, d = -78 } +ru5: { a = 1234, b = 'u' } +ru6: { a = 55555, b = 666 } +ru7: { a = -10001, b = -789, c = 'z' } +ru8: { a = 'x', b = 12345 } --- native calling CompCert: -s1 = { a = 'a' } -s2 = { a = 'x', b = 'y' } -s3 = { a = 'a', b = 'b', c = ' c' } -s4 = { a = 'p', b = 'q', c = ' r', d = 's' } -s5 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } -s6 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } -s7 = { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } -s8 = "Hello, world!" -t1 = { a = 12 } -t2 = { a = 34, b = 56 } -t3 = { a = -1, b = -2, c = -3 } -t4 = { a = 11, b = 22, c = 33, d = 44 } -t4 = { a = 1, b = 2, c = 3, d = 4, e = 'x' } -u1 = { a = 12345678 } -u2 = { a = 1, b = -1 } -u3 = { a = -1, b = -2, c = -3 } -u4 = { a = 4, b = 3, c = 2, d = 1 } -u5 = { a = 123, b = 'z' } -u6 = { a = -12345678, b = 555 } -u7 = { a = 111111111, b = 2222, c = 'a' } -u8 = { a = 'u', b = 8 } -u9 = { a = { 9, 8, 7, 6 } } +s1: { a = 'a' } +s2: { a = 'a', b = 'b' } +s3: { a = 'a', b = 'b', c = ' c' } +s4: { a = 'a', b = 'b', c = ' c', d = 'd' } +s5: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +s6: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +s7: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +s8: "Hello world!" +t1: { a = 123 } +t2: { a = 123, b = 456 } +t3: { a = 123, b = 456, c = 789 } +t4: { a = 123, b = 456, c = 789, d = -111 } +t5: { a = 123, b = 456, c = 789, d = -999, e = 'x' } +u1: { a = 12 } +u2: { a = 12, b = -34 } +u3: { a = 12, b = 34, c = -56 } +u4: { a = 12, b = 34, c = 56, d = -78 } +u5: { a = 1234, b = 'u' } +u6: { a = 55555, b = 666 } +u7: { a = -10001, b = -789, c = 'z' } +u8: { a = 'x', b = 12345 } after ms4, x = { 's', 'a', 'm', 'e' } -after mu9, x = { a = { 11, 22, 33, 44 } } -rs1 = { a = 'a' } -rs2 = { a = 'a', b = 'b' } -rs3 = { a = 'a', b = 'b', c = 'c' } -rs4 = { a = 'a', b = 'b', c = 'c', d = 'd' } -rs8 = { "Lorem ipsum" } -ru2 = { a = 12, b = -34 } -ru6 = { a = 12345678, b = -9999 } -ru9 = { a = { 111, 222, 333, 444 } } +after mu4, x = { a = { 11, 22, 33, 44 } } +rs1: { a = 'a' } +rs2: { a = 'a', b = 'b' } +rs3: { a = 'a', b = 'b', c = ' c' } +rs4: { a = 'a', b = 'b', c = ' c', d = 'd' } +rs5: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e' } +rs6: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f' } +rs7: { a = 'a', b = 'b', c = ' c', d = 'd', e = 'e', f = 'f', g = 'g' } +rs8: "Hello world!" +rt1: { a = 123 } +rt2: { a = 123, b = 456 } +rt3: { a = 123, b = 456, c = 789 } +rt4: { a = 123, b = 456, c = 789, d = -111 } +rt5: { a = 123, b = 456, c = 789, d = -999, e = 'x' } +ru1: { a = 12 } +ru2: { a = 12, b = -34 } +ru3: { a = 12, b = 34, c = -56 } +ru4: { a = 12, b = 34, c = 56, d = -78 } +ru5: { a = 1234, b = 'u' } +ru6: { a = 55555, b = 666 } +ru7: { a = -10001, b = -789, c = 'z' } +ru8: { a = 'x', b = 12345 } -- cgit