diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/regression/Makefile | 9 | ||||
-rw-r--r-- | test/regression/Results/interop1 | 90 | ||||
-rw-r--r-- | test/regression/Results/varargs2 | 4 | ||||
-rw-r--r-- | test/regression/interop1.c | 286 | ||||
-rw-r--r-- | test/regression/varargs2.c | 16 |
5 files changed, 402 insertions, 3 deletions
diff --git a/test/regression/Makefile b/test/regression/Makefile index 5c601211..206670b5 100644 --- a/test/regression/Makefile +++ b/test/regression/Makefile @@ -17,7 +17,7 @@ TESTS=int32 int64 floats floats-basics \ volatile1 volatile2 volatile3 \ funct3 expr5 struct7 struct8 struct11 casts1 casts2 char1 \ sizeof1 sizeof2 binops bool for1 switch switch2 compound \ - decl1 + decl1 interop1 # Can run, but only in compiled mode, and have reference output in Results @@ -45,6 +45,13 @@ all: $(TESTS:%=%.compcert) $(TESTS_COMP:%=%.compcert) $(TESTS_DIFF:%=%.compcert) all_s: $(TESTS:%=%.s) $(TESTS_COMP:%=%.s) $(TESTS_DIFF:%=%.s) $(EXTRAS:%=%.s) +interop1.compcert: interop1.c $(CCOMP) + $(CC) -DCC_SIDE -c -o interop1n.o interop1.c + $(CCOMP) $(CCOMPFLAGS) -DCOMPCERT_SIDE -o interop1.compcert interop1.c interop1n.o $(LIBS) + +interop1.s: interop1.c $(CCOMP) + $(CCOMP) $(CCOMPFLAGS) -S interop1.c + %.compcert: %.c $(CCOMP) $(CCOMP) $(CCOMPFLAGS) -o $*.compcert $*.c $(LIBS) diff --git a/test/regression/Results/interop1 b/test/regression/Results/interop1 new file mode 100644 index 00000000..990dfe9d --- /dev/null +++ b/test/regression/Results/interop1 @@ -0,0 +1,90 @@ +--- CompCert calling native: +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 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 = '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 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 } diff --git a/test/regression/Results/varargs2 b/test/regression/Results/varargs2 index f954927e..96ee9d63 100644 --- a/test/regression/Results/varargs2 +++ b/test/regression/Results/varargs2 @@ -2,7 +2,9 @@ An int: 42 A long long: 123456789012345 A string: Hello world A double: 3.141592654 -A mixture: x & Hello, world! & 42 & 123456789012345 & 3.141592654 & 2.718281746 +A small struct: x12 +A bigger struct: (123,456,789) +A mixture: x & Hello, world! & y2 & 42 & 123456789012345 & 3.141592654 & 2.718281746 Twice: -1 1.23 Twice: -1 1.23 With va_copy: -1 1.23 diff --git a/test/regression/interop1.c b/test/regression/interop1.c new file mode 100644 index 00000000..a39f449c --- /dev/null +++ b/test/regression/interop1.c @@ -0,0 +1,286 @@ +#if defined(COMPCERT_SIDE) +#define US(x) compcert_##x +#define THEM(x) native_##x +#elif defined(CC_SIDE) +#define US(x) native_##x +#define THEM(x) compcert_##x +#else +#define US(x) x +#define THEM(x) x +#endif + +#include <stdio.h> + +/* Alignment 1 */ + +struct S1 { char a; }; +static struct S1 init_S1 = { 'a' }; +#define print_S1(x) printf("{ a = '%c' }\n", x.a) + +struct S2 { char a, b; }; +static struct S2 init_S2 = { 'a', 'b' }; +#define print_S2(x) printf("{ a = '%c', b = '%c' }\n", x.a, x.b) + +struct S3 { char a, b, c; }; +static struct S3 init_S3 = { 'a', 'b', 'c' }; +#define print_S3(x) \ + printf("{ a = '%c', b = '%c', c = ' %c' }\n", x.a, x.b, x.c) + +struct S4 { char a, b, c, d; }; +static struct S4 init_S4 = { 'a', 'b', 'c', 'd' }; +#define print_S4(x) \ + printf("{ a = '%c', b = '%c', c = ' %c', d = '%c' }\n", \ + x.a, x.b, x.c, x.d); + +struct S5 { char a, b, c, d, e; }; +static struct S5 init_S5 = { 'a', 'b', 'c', 'd', 'e' }; +#define print_S5(x) \ + printf("{ a = '%c', b = '%c', c = ' %c', d = '%c', e = '%c' }\n", \ + x.a, x.b, x.c, x.d, x.e) + +struct S6 { char a, b, c, d, e, f; }; +static struct S6 init_S6 = { 'a', 'b', 'c', 'd', 'e', 'f' }; +#define print_S6(x) \ + printf("{ a = '%c', b = '%c', c = ' %c', d = '%c', e = '%c', f = '%c' }\n", \ + x.a, x.b, x.c, x.d, x.e, x.f) + +struct S7 { char a, b, c, d, e, f, g; }; +static struct S7 init_S7 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; +#define print_S7(x) \ + printf("{ a = '%c', b = '%c', c = ' %c', d = '%c', e = '%c', f = '%c', g = '%c' }\n", \ + x.a, x.b, x.c, x.d, x.e, x.f, x.g) + +struct S8 { char a[32]; }; +static struct S8 init_S8 = { "Hello world!" }; +/* Do not use printf("%s") to avoid undefined behavior in the + reference interpreter */ +#define print_S8(x) \ + { char * p; \ + printf("\""); \ + for (p = x.a; *p != 0; p++) printf("%c", *p); \ + printf("\"\n"); \ + } + +/* Alignment 2 */ + +struct T1 { short a; }; +static struct T1 init_T1 = { 123 }; +#define print_T1(x) printf("{ a = %d }\n", x.a) + +struct T2 { short a, b; }; +static struct T2 init_T2 = { 123, 456 }; +#define print_T2(x) printf("{ a = %d, b = %d }\n", x.a, x.b) + +struct T3 { short a, b, c; }; +static struct T3 init_T3 = { 123, 456, 789 }; +#define print_T3(x) printf("{ a = %d, b = %d, c = %d }\n", x.a, x.b, x.c) + +struct T4 { short a, b, c, d; }; +static struct T4 init_T4 = { 123, 456, 789, -111 }; +#define print_T4(x) \ + printf("{ a = %d, b = %d, c = %d, d = %d }\n", x.a, x.b, x.c, x.d) + +struct T5 { short a, b, c, d; char e; }; +static struct T5 init_T5 = { 123, 456, 789, -999, 'x' }; +#define print_T5(x) \ + printf("{ a = %d, b = %d, c = %d, d = %d, e = '%c' }\n", \ + x.a, x.b, x.c, x.d, x.e) + +/* Alignment >= 4 */ + +struct U1 { int a; }; +static struct U1 init_U1 = { 12 }; +#define print_U1(x) printf("{ a = %d }\n", x.a) + +struct U2 { int a, b; }; +static struct U2 init_U2 = { 12, -34 }; +#define print_U2(x) printf("{ a = %d, b = %d }\n", x.a, x.b) + +struct U3 { int a, b, c; }; +static struct U3 init_U3 = { 12, 34, -56}; +#define print_U3(x) printf("{ a = %d, b = %d, c = %d }\n", x.a, x.b, x.c) + +struct U4 { int a, b, c, d; }; +static struct U4 init_U4 = { 12, 34, 56, -78 }; +#define print_U4(x) \ + printf("{ a = %d, b = %d, c = %d, d = %d }\n", x.a, x.b, x.c, x.d) + +struct U5 { int a; char b; }; +static struct U5 init_U5 = { 1234, 'u' }; +#define print_U5(x) \ + printf("{ a = %d, b = '%c' }\n", x.a, x.b) + +struct U6 { int a; short b; }; +static struct U6 init_U6 = { 55555, 666 }; +#define print_U6(x) \ + printf("{ a = %d, b = %d }\n", x.a, x.b) + +struct U7 { int a; short b; char c; }; +static struct U7 init_U7 = { -10001, -789, 'z' }; +#define print_U7(x) \ + printf("{ a = %d, b = %d, c = '%c' }\n", x.a, x.b, x.c) + +struct U8 { char a; int b; }; +static struct U8 init_U8 = { 'x', 12345 }; +#define print_U8(x) \ + printf("{ a = '%c', b = %d }\n", x.a, x.b) + +/* Struct passing */ + +#define PRINT(name,ty,print) \ +extern void THEM(name) (struct ty x); \ +void US(name) (struct ty x) { print(x); } + +PRINT(s1,S1,print_S1) +PRINT(s2,S2,print_S2) +PRINT(s3,S3,print_S3) +PRINT(s4,S4,print_S4) +PRINT(s5,S5,print_S5) +PRINT(s6,S6,print_S6) +PRINT(s7,S7,print_S7) +PRINT(s8,S8,print_S8) +PRINT(t1,T1,print_T1) +PRINT(t2,T2,print_T2) +PRINT(t3,T3,print_T3) +PRINT(t4,T4,print_T4) +PRINT(t5,T5,print_T5) +PRINT(u1,U1,print_U1) +PRINT(u2,U2,print_U2) +PRINT(u3,U3,print_U3) +PRINT(u4,U4,print_U4) +PRINT(u5,U5,print_U5) +PRINT(u6,U6,print_U6) +PRINT(u7,U7,print_U7) +PRINT(u8,U8,print_U8) + +/* Struct passing with modification in the callee */ + +extern void THEM (ms4) (struct S4 x); +void US (ms4) (struct S4 x) +{ + x.a += 1; x.d -= 1; +} + +extern void THEM (mu4) (struct U4 x); +void US (mu4) (struct U4 x) +{ + x.a = 1; x.b = 2; +} + +/* Struct return */ + +#define RETURN(name,ty,init) \ +extern struct ty THEM(name)(void); \ +struct ty US(name)(void) { return init; } + +RETURN(rs1,S1,init_S1) +RETURN(rs2,S2,init_S2) +RETURN(rs3,S3,init_S3) +RETURN(rs4,S4,init_S4) +RETURN(rs5,S5,init_S5) +RETURN(rs6,S6,init_S6) +RETURN(rs7,S7,init_S7) +RETURN(rs8,S8,init_S8) +RETURN(rt1,T1,init_T1) +RETURN(rt2,T2,init_T2) +RETURN(rt3,T3,init_T3) +RETURN(rt4,T4,init_T4) +RETURN(rt5,T5,init_T5) +RETURN(ru1,U1,init_U1) +RETURN(ru2,U2,init_U2) +RETURN(ru3,U3,init_U3) +RETURN(ru4,U4,init_U4) +RETURN(ru5,U5,init_U5) +RETURN(ru6,U6,init_U6) +RETURN(ru7,U7,init_U7) +RETURN(ru8,U8,init_U8) + +/* Test function, calling the functions compiled by the other compiler */ + +#define CALLPRINT(name,ty,init) \ + printf(#name": "); THEM(name)(init); + +#define CALLRETURN(name,ty,print) \ + { struct ty x = THEM(name)(); \ + printf(#name": "); print(x); } + +extern void THEM(test) (void); +void US(test) (void) +{ + CALLPRINT(s1,S1,init_S1) + CALLPRINT(s2,S2,init_S2) + CALLPRINT(s3,S3,init_S3) + CALLPRINT(s4,S4,init_S4) + CALLPRINT(s5,S5,init_S5) + CALLPRINT(s6,S6,init_S6) + CALLPRINT(s7,S7,init_S7) + CALLPRINT(s8,S8,init_S8) + CALLPRINT(t1,T1,init_T1) + CALLPRINT(t2,T2,init_T2) + CALLPRINT(t3,T3,init_T3) + CALLPRINT(t4,T4,init_T4) + CALLPRINT(t5,T5,init_T5) + CALLPRINT(u1,U1,init_U1) + CALLPRINT(u2,U2,init_U2) + CALLPRINT(u3,U3,init_U3) + CALLPRINT(u4,U4,init_U4) + CALLPRINT(u5,U5,init_U5) + CALLPRINT(u6,U6,init_U6) + CALLPRINT(u7,U7,init_U7) + CALLPRINT(u8,U8,init_U8) + + { struct S4 x = { 's', 'a', 'm', 'e' }; + THEM(ms4)(x); + printf("after ms4, x = { '%c', '%c', '%c', '%c' }\n", x.a, x.b, x.c, x.d); } + { struct U4 x = { 11, 22, 33, 44 }; + THEM(mu4)(x); + printf("after mu4, x = { a = { %d, %d, %d, %d } }\n", x.a, x.b, x.c, x.d); } + + CALLRETURN(rs1,S1,print_S1) + CALLRETURN(rs2,S2,print_S2) + CALLRETURN(rs3,S3,print_S3) + CALLRETURN(rs4,S4,print_S4) + CALLRETURN(rs5,S5,print_S5) + CALLRETURN(rs6,S6,print_S6) + CALLRETURN(rs7,S7,print_S7) + CALLRETURN(rs8,S8,print_S8) + CALLRETURN(rt1,T1,print_T1) + CALLRETURN(rt2,T2,print_T2) + CALLRETURN(rt3,T3,print_T3) + CALLRETURN(rt4,T4,print_T4) + CALLRETURN(rt5,T5,print_T5) + CALLRETURN(ru1,U1,print_U1) + CALLRETURN(ru2,U2,print_U2) + CALLRETURN(ru3,U3,print_U3) + CALLRETURN(ru4,U4,print_U4) + CALLRETURN(ru5,U5,print_U5) + CALLRETURN(ru6,U6,print_U6) + CALLRETURN(ru7,U7,print_U7) + CALLRETURN(ru8,U8,print_U8) +} + +#if defined(COMPCERT_SIDE) + +int main() +{ + printf("--- CompCert calling native:\n"); + compcert_test(); + printf("--- native calling CompCert:\n"); + native_test(); + return 0; +} + +#elif !defined(CC_SIDE) + +int main() +{ + printf("--- CompCert calling native:\n"); + test(); + printf("--- native calling CompCert:\n"); + test(); + return 0; +} + +#endif + + diff --git a/test/regression/varargs2.c b/test/regression/varargs2.c index 6c091d8b..b96d1940 100644 --- a/test/regression/varargs2.c +++ b/test/regression/varargs2.c @@ -1,6 +1,9 @@ #include <stdarg.h> #include <stdio.h> +struct Y { char kind; unsigned char num; }; +struct Z { int x, y, z; }; + void minivprintf(const char * fmt, va_list ap) { char c; @@ -32,6 +35,14 @@ void minivprintf(const char * fmt, va_list ap) case 'f': printf("%.10g", (float) va_arg(ap, double)); break; + case 'y': + { struct Y s = va_arg(ap, struct Y); + printf("%c%d", s.kind, s.num); + break; } + case 'z': + { struct Z s = va_arg(ap, struct Z); + printf("(%d,%d,%d)", s.x, s.y, s.z); + break; } default: puts("<bad format>"); return; @@ -111,9 +122,12 @@ int main() miniprintf("A long long: %l\n", 123456789012345LL); miniprintf("A string: %s\n", "Hello world"); miniprintf("A double: %e\n", 3.141592654); - miniprintf("A mixture: %c & %s & %d & %l & %e & %f\n", + miniprintf("A small struct: %y\n", (struct Y) { 'x', 12 }); + miniprintf("A bigger struct: %z\n", (struct Z) { 123, 456, 789 }); + miniprintf("A mixture: %c & %s & %y & %d & %l & %e & %f\n", 'x', "Hello, world!", + (struct Y) { 'y', 2 }, 42, 123456789012345LL, 3.141592654, |