shithub: scc

Download patch

ref: 1b4f88745ddce9a4870c4cf1c9c2877486c2c4bb
parent: 60a0cff60f2c11945afc0026c2f6ed532dc60e87
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Mon Jan 25 12:08:44 EST 2016

[cc1] Print information about size, aligment and offset in structs

This informatio mut be calculated in the frontend (sizeof and _Alignof),
and it is a bit stupid that the backend must recalculate it again, so
the best option is to print it to the IR.

--- a/cc1/code.c
+++ b/cc1/code.c
@@ -264,9 +264,13 @@
 		for (sp = tp->p.fields; n-- > 0; ++sp)
 			emittype((*sp)->type);
 		emitletter(tp);
-		if ((tag = tp->tag->name) != NULL)
-			printf("\t%s", tag);
-		putchar('\n');
+		tag = tp->tag->name;
+		printf("\t\"%s\t#%c%llX\t#%c%llX\n",
+		       (tag) ? tag : "",
+		       sizettype->letter,
+		       (unsigned long long) tp->size,
+		       sizettype->letter,
+		       (unsigned long long) tp->align);
 		n = tp->n.elem;
 		for (sp = tp->p.fields; n-- > 0; ++sp)
 			emit(ODECL, *sp);
@@ -378,6 +382,8 @@
 	putchar('\t');
 	emitletter(sym->type);
 	printf("\t\"%s", (sym->name) ? sym->name : "");
+	if (sym->flags & ISFIELD)
+		printf("\t#%c%llX", sizettype->letter, sym->u.i);
 	putchar('\n');
 	sym->flags |= ISEMITTED;
 }
--- a/cc1/tests/test002.c
+++ b/cc1/tests/test002.c
@@ -7,9 +7,9 @@
 G8	F	"main
 {
 \
-S2	S
-M5	I	"i
-M6	P	"next
+S2	"S	#NC	#N2
+M5	I	"i	#N0
+M6	P	"next	#N2
 A9	S2	"y
 A10	P	"p
 A11	N	"n
--- a/cc1/tests/test015.c
+++ b/cc1/tests/test015.c
@@ -4,13 +4,13 @@
 error:
 test015.c:52: error: label 's' already defined
 output:
-S8	s2
-M9	I	"s
-S5	s1
-M6	I	"s
-M10	S8	"s1
-S2	s
-M11	S5	"s
+S8	"s2	#N2	#N1
+M9	I	"s	#N0
+S5	"s1	#N4	#N1
+M6	I	"s	#N0
+M10	S8	"s1	#N2
+S2	"s	#N4	#N1
+M11	S5	"s	#N0
 G12	S2	"s2
 G14	F	"main
 {
--- a/cc1/tests/test017.c
+++ b/cc1/tests/test017.c
@@ -6,12 +6,12 @@
 G10	F	"main
 {
 \
-S2	s1
-M3	I	"y
-M4	I	"z
+S2	"s1	#N4	#N1
+M3	I	"y	#N0
+M4	I	"z	#N2
 A11	S2	"nested
-S6	s2
-M8	P	"p
+S6	"s2	#N4	#N2
+M8	P	"p	#N0
 A12	S6	"v
 	A12	M8	.P	A11	'P	:P
 	A12	M8	.P	@S2	M3	.I	#I1	:I
--- a/cc1/tests/test030.c
+++ b/cc1/tests/test030.c
@@ -6,12 +6,12 @@
 output:
 G14	F	"f1
 {
-S2	foo
-M3	I	"i
-M4	I	"j
-M5	I	"k
-M7	P	"p
-M8	J	"v
+S2	"foo	#N24	#N2
+M3	I	"i	#N0
+M4	I	"j	#N2
+M5	I	"k	#N4
+M7	P	"p	#N6
+M8	J	"v	#NE
 A9	S2	"f
 A11	P	"p
 A12	I	"n
--- a/cc1/tests/test040.c
+++ b/cc1/tests/test040.c
@@ -6,10 +6,10 @@
 G9	F	"main
 {
 \
-S2	List
-M4	I	"len
-M6	P	"head
-M7	P	"back
+S2	"List	#N1C	#N2
+M4	I	"len	#N0
+M6	P	"head	#N2
+M7	P	"back	#N6
 A10	S2	"List
 	r	A10	M4	.I
 }
--- a/cc1/tests/test041.c
+++ b/cc1/tests/test041.c
@@ -16,8 +16,8 @@
 A5	P	"q
 A7	P	"s
 A8	P	"p
-S10	foo
-M11	I	"i
+S10	"foo	#N2	#N1
+M11	I	"i	#N0
 A12	S10	"foo
 	A3	A3	#I0	!I	#W0	#W0	?W	gI	:I
 	A8	A3	#I0	!I	#P0	#P0	?P	:P
--- a/cc1/tests/test043.c
+++ b/cc1/tests/test043.c
@@ -3,9 +3,9 @@
 description: Test for double typedef (taken from plan9 kernel)
 error:
 output:
-S2	Clock0link
-M6	P	"clock
-M8	P	"link
+S2	"Clock0link	#NC	#N2
+M6	P	"clock	#N0
+M8	P	"link	#N2
 G9	S2	"cl0
 G11	F	"main
 {
--- a/cc1/tests/test047.c
+++ b/cc1/tests/test047.c
@@ -3,10 +3,10 @@
 description: Basic test for initializer
 error:
 output:
-S2	S
-M3	I	"a
-M4	I	"b
-M5	I	"c
+S2	"S	#N6	#N1
+M3	I	"a	#N0
+M4	I	"b	#N2
+M5	I	"c	#N4
 G6	S2	"x
 (
 	#I1
--- a/cc1/tests/test048.c
+++ b/cc1/tests/test048.c
@@ -3,9 +3,9 @@
 description: Basic test for initializer
 error:
 output:
-S2	S
-M3	I	"a
-M4	I	"b
+S2	"S	#N4	#N1
+M3	I	"a	#N0
+M4	I	"b	#N2
 V5	S2	#N1
 G6	V5	"x
 (
--- a/cc1/tests/test052.c
+++ b/cc1/tests/test052.c
@@ -3,9 +3,9 @@
 description: Basic test for initializer
 error:
 output:
-S2	S
-M3	I	"a
-M4	I	"b
+S2	"S	#N4	#N1
+M3	I	"a	#N0
+M4	I	"b	#N2
 V5	S2	#N2
 G6	V5	"arr
 (
--- a/cc1/tests/test053.c
+++ b/cc1/tests/test053.c
@@ -3,9 +3,9 @@
 description: Basic test for initializer
 error:
 output:
-S2	S
-M3	I	"a
-M4	I	"b
+S2	"S	#N4	#N1
+M3	I	"a	#N0
+M4	I	"b	#N2
 G5	S2	"s
 (
 	#I1
--- a/cc1/tests/test056.c
+++ b/cc1/tests/test056.c
@@ -4,12 +4,12 @@
 error:
 output:
 V6	K	#N3
-S2	S
-M3	I	"a
-M4	I	"b
-M5	I	"c
-M7	V6	"d
-M8	I	"e
+S2	"S	#NB	#N1
+M3	I	"a	#N0
+M4	I	"b	#N2
+M5	I	"c	#N4
+M7	V6	"d	#N6
+M8	I	"e	#N9
 G9	S2	"s
 (
 	#I1