changeset 0:e0a26cc60a20 default tip

Test for solaris cc bug with bit-fields. With "cc -fast" (or, rather, "cc -xalias_level=basic -xO3", implied by "cc -fast") solaris cc compiles incorrect code for bit-field accesses, notably not rechecking data after functions calls in some situations. Using "-xalias_level=any" resolves the problem (as well as using any non-bit-field type). Tested cc version is "Sun C 5.9 SunOS_i386 2007/05/03" (Sun Studio 12).
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 16 Aug 2011 22:09:57 +0400
parents
children
files Makefile t.c t.h t2.c
diffstat 4 files changed, 79 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile	Tue Aug 16 22:09:57 2011 +0400
@@ -0,0 +1,21 @@
+
+FAST=	-fast
+#FAST=	-xalias_level=basic -xO3
+
+# no bug seen with:
+#FAST=	-fast -xalias_level=any
+
+test: t
+	./t
+
+clean:
+	rm t *.o
+
+t: t.o t2.o
+	cc -o t t.o t2.o ${FAST}
+
+t.o: t.c t.h
+	cc -c t.c ${FAST}
+
+t2.o: t2.c t.h
+	cc -c t2.c ${FAST}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/t.c	Tue Aug 16 22:09:57 2011 +0400
@@ -0,0 +1,19 @@
+
+#include <stdio.h>
+#include "t.h"
+
+int
+main(void)
+{
+    test  t;
+
+    doinstall();
+
+    if (dotest(&t) == 0) {
+        printf("ok\n");
+        return 0;
+    }
+
+    printf("not ok\n");
+    return 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/t.h	Tue Aug 16 22:09:57 2011 +0400
@@ -0,0 +1,7 @@
+
+typedef struct {
+    unsigned bit:1;
+} test;
+
+void doinstall();
+int dotest(test *t);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/t2.c	Tue Aug 16 22:09:57 2011 +0400
@@ -0,0 +1,32 @@
+
+#include "t.h"
+
+
+void (*x)(test *t);
+
+
+void
+dosomething(test *t)
+{
+    t->bit = 1;
+}
+
+void
+doinstall()
+{
+    x = dosomething;
+}
+
+int
+dotest(test *t)
+{
+    t->bit = 0;
+
+    x(t);
+
+    if (t->bit) {
+        return 0;
+    }
+
+    return 1;
+}