2 * TCC - Tiny C Compiler
4 * Copyright (c) 2001-2004 Fabrice Bellard
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 void swap(int *p
, int *q
)
29 void vsetc(CType
*type
, int r
, CValue
*vc
)
33 if (vtop
>= vstack
+ (VSTACK_SIZE
- 1))
35 /* cannot let cpu flags if other instruction are generated. Also
36 avoid leaving VT_JMP anywhere except on the top of the stack
37 because it would complicate the code generator. */
39 v
= vtop
->r
& VT_VALMASK
;
40 if (v
== VT_CMP
|| (v
& ~1) == VT_JMP
)
50 /* push integer constant */
55 vsetc(&int_type
, VT_CONST
, &cval
);
58 /* push long long constant */
59 void vpushll(long long v
)
65 vsetc(&ctype
, VT_CONST
, &cval
);
68 /* Return a static symbol pointing to a section */
69 static Sym
*get_sym_ref(CType
*type
, Section
*sec
,
70 unsigned long offset
, unsigned long size
)
76 sym
= global_identifier_push(v
, type
->t
| VT_STATIC
, 0);
77 sym
->type
.ref
= type
->ref
;
78 sym
->r
= VT_CONST
| VT_SYM
;
79 put_extern_sym(sym
, sec
, offset
, size
);
83 /* push a reference to a section offset by adding a dummy symbol */
84 static void vpush_ref(CType
*type
, Section
*sec
, unsigned long offset
, unsigned long size
)
89 vsetc(type
, VT_CONST
| VT_SYM
, &cval
);
90 vtop
->sym
= get_sym_ref(type
, sec
, offset
, size
);
93 /* define a new external reference to a symbol 'v' of type 'u' */
94 static Sym
*external_global_sym(int v
, CType
*type
, int r
)
100 /* push forward reference */
101 s
= global_identifier_push(v
, type
->t
| VT_EXTERN
, 0);
102 s
->type
.ref
= type
->ref
;
103 s
->r
= r
| VT_CONST
| VT_SYM
;
108 /* define a new external reference to a symbol 'v' of type 'u' */
109 static Sym
*external_sym(int v
, CType
*type
, int r
)
115 /* push forward reference */
116 s
= sym_push(v
, type
, r
| VT_CONST
| VT_SYM
, 0);
117 s
->type
.t
|= VT_EXTERN
;
118 } else if (s
->type
.ref
== func_old_type
.ref
) {
119 s
->type
.ref
= type
->ref
;
120 s
->r
= r
| VT_CONST
| VT_SYM
;
121 s
->type
.t
|= VT_EXTERN
;
122 } else if (!is_compatible_types(&s
->type
, type
)) {
123 error("incompatible types for redefinition of '%s'",
124 get_tok_str(v
, NULL
));
129 /* push a reference to global symbol v */
130 static void vpush_global_sym(CType
*type
, int v
)
135 sym
= external_global_sym(v
, type
, 0);
137 vsetc(type
, VT_CONST
| VT_SYM
, &cval
);
141 void vset(CType
*type
, int r
, int v
)
146 vsetc(type
, r
, &cval
);
149 void vseti(int r
, int v
)
165 void vpushv(SValue
*v
)
167 if (vtop
>= vstack
+ (VSTACK_SIZE
- 1))
168 error("memory full");
178 /* save r to the memory stack, and mark it as being free */
181 int l
, saved
, size
, align
;
185 /* modify all stack values */
188 for(p
=vstack
;p
<=vtop
;p
++) {
189 if ((p
->r
& VT_VALMASK
) == r
||
190 ((p
->type
.t
& VT_BTYPE
) == VT_LLONG
&& (p
->r2
& VT_VALMASK
) == r
)) {
191 /* must save value on stack if not already done */
193 /* NOTE: must reload 'r' because r might be equal to r2 */
194 r
= p
->r
& VT_VALMASK
;
195 /* store register in the stack */
197 if ((p
->r
& VT_LVAL
) ||
198 (!is_float(type
->t
) && (type
->t
& VT_BTYPE
) != VT_LLONG
))
199 #ifdef TCC_TARGET_X86_64
200 type
= &char_pointer_type
;
204 size
= type_size(type
, &align
);
205 loc
= (loc
- size
) & -align
;
207 sv
.r
= VT_LOCAL
| VT_LVAL
;
210 #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)
211 /* x86 specific: need to pop fp register ST0 if saved */
213 o(0xd8dd); /* fstp %st(0) */
216 #ifndef TCC_TARGET_X86_64
217 /* special long long case */
218 if ((type
->t
& VT_BTYPE
) == VT_LLONG
) {
226 /* mark that stack entry as being saved on the stack */
227 if (p
->r
& VT_LVAL
) {
228 /* also clear the bounded flag because the
229 relocation address of the function was stored in
231 p
->r
= (p
->r
& ~(VT_VALMASK
| VT_BOUNDED
)) | VT_LLOCAL
;
233 p
->r
= lvalue_type(p
->type
.t
) | VT_LOCAL
;
241 /* find a register of class 'rc2' with at most one reference on stack.
242 * If none, call get_reg(rc) */
243 int get_reg_ex(int rc
, int rc2
)
248 for(r
=0;r
<NB_REGS
;r
++) {
249 if (reg_classes
[r
] & rc2
) {
252 for(p
= vstack
; p
<= vtop
; p
++) {
253 if ((p
->r
& VT_VALMASK
) == r
||
254 (p
->r2
& VT_VALMASK
) == r
)
264 /* find a free register of class 'rc'. If none, save one register */
270 /* find a free register */
271 for(r
=0;r
<NB_REGS
;r
++) {
272 if (reg_classes
[r
] & rc
) {
273 for(p
=vstack
;p
<=vtop
;p
++) {
274 if ((p
->r
& VT_VALMASK
) == r
||
275 (p
->r2
& VT_VALMASK
) == r
)
283 /* no register left : free the first one on the stack (VERY
284 IMPORTANT to start from the bottom to ensure that we don't
285 spill registers used in gen_opi()) */
286 for(p
=vstack
;p
<=vtop
;p
++) {
287 r
= p
->r
& VT_VALMASK
;
288 if (r
< VT_CONST
&& (reg_classes
[r
] & rc
))
290 /* also look at second register (if long long) */
291 r
= p
->r2
& VT_VALMASK
;
292 if (r
< VT_CONST
&& (reg_classes
[r
] & rc
)) {
298 /* Should never comes here */
302 /* save registers up to (vtop - n) stack entry */
303 void save_regs(int n
)
308 for(p
= vstack
;p
<= p1
; p
++) {
309 r
= p
->r
& VT_VALMASK
;
316 /* move register 's' to 'r', and flush previous value of r to memory
318 void move_reg(int r
, int s
)
331 /* get address of vtop (vtop MUST BE an lvalue) */
335 /* tricky: if saved lvalue, then we can go back to lvalue */
336 if ((vtop
->r
& VT_VALMASK
) == VT_LLOCAL
)
337 vtop
->r
= (vtop
->r
& ~(VT_VALMASK
| VT_LVAL_TYPE
)) | VT_LOCAL
| VT_LVAL
;
340 #ifdef CONFIG_TCC_BCHECK
341 /* generate lvalue bound code */
347 vtop
->r
&= ~VT_MUSTBOUND
;
348 /* if lvalue, then use checking code before dereferencing */
349 if (vtop
->r
& VT_LVAL
) {
350 /* if not VT_BOUNDED value, then make one */
351 if (!(vtop
->r
& VT_BOUNDED
)) {
352 lval_type
= vtop
->r
& (VT_LVAL_TYPE
| VT_LVAL
);
353 /* must save type because we must set it to int to get pointer */
355 vtop
->type
.t
= VT_INT
;
358 gen_bounded_ptr_add();
359 vtop
->r
|= lval_type
;
362 /* then check for dereferencing */
363 gen_bounded_ptr_deref();
368 /* store vtop a register belonging to class 'rc'. lvalues are
369 converted to values. Cannot be used if cannot be converted to
370 register value (such as structures). */
373 int r
, rc2
, bit_pos
, bit_size
, size
, align
, i
;
375 /* NOTE: get_reg can modify vstack[] */
376 if (vtop
->type
.t
& VT_BITFIELD
) {
379 bit_pos
= (vtop
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
380 bit_size
= (vtop
->type
.t
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f;
381 /* remove bit field info to avoid loops */
382 vtop
->type
.t
&= ~(VT_BITFIELD
| (-1 << VT_STRUCT_SHIFT
));
383 /* cast to int to propagate signedness in following ops */
384 if ((vtop
->type
.t
& VT_BTYPE
) == VT_LLONG
) {
389 if((vtop
->type
.t
& VT_UNSIGNED
) ||
390 (vtop
->type
.t
& VT_BTYPE
) == VT_BOOL
)
391 type
.t
|= VT_UNSIGNED
;
393 /* generate shifts */
394 vpushi(bits
- (bit_pos
+ bit_size
));
396 vpushi(bits
- bit_size
);
397 /* NOTE: transformed to SHR if unsigned */
401 if (is_float(vtop
->type
.t
) &&
402 (vtop
->r
& (VT_VALMASK
| VT_LVAL
)) == VT_CONST
) {
405 unsigned long offset
;
406 #if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)
410 /* XXX: unify with initializers handling ? */
411 /* CPUs usually cannot use float constants, so we store them
412 generically in data segment */
413 size
= type_size(&vtop
->type
, &align
);
414 offset
= (data_section
->data_offset
+ align
- 1) & -align
;
415 data_section
->data_offset
= offset
;
416 /* XXX: not portable yet */
417 #if defined(__i386__) || defined(__x86_64__)
418 /* Zero pad x87 tenbyte long doubles */
419 if (size
== LDOUBLE_SIZE
)
420 vtop
->c
.tab
[2] &= 0xffff;
422 ptr
= section_ptr_add(data_section
, size
);
424 #if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)
428 ptr
[i
] = vtop
->c
.tab
[size
-1-i
];
432 ptr
[i
] = vtop
->c
.tab
[i
];
433 sym
= get_sym_ref(&vtop
->type
, data_section
, offset
, size
<< 2);
434 vtop
->r
|= VT_LVAL
| VT_SYM
;
438 #ifdef CONFIG_TCC_BCHECK
439 if (vtop
->r
& VT_MUSTBOUND
)
443 r
= vtop
->r
& VT_VALMASK
;
447 /* need to reload if:
449 - lvalue (need to dereference pointer)
450 - already a register, but not in the right class */
452 (vtop
->r
& VT_LVAL
) ||
453 !(reg_classes
[r
] & rc
) ||
454 ((vtop
->type
.t
& VT_BTYPE
) == VT_LLONG
&&
455 !(reg_classes
[vtop
->r2
] & rc2
))) {
457 #ifndef TCC_TARGET_X86_64
458 if ((vtop
->type
.t
& VT_BTYPE
) == VT_LLONG
) {
460 unsigned long long ll
;
461 /* two register type load : expand to two words
463 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
)) == VT_CONST
) {
466 vtop
->c
.ui
= ll
; /* first word */
468 vtop
->r
= r
; /* save register value */
469 vpushi(ll
>> 32); /* second word */
470 } else if (r
>= VT_CONST
|| /* XXX: test to VT_CONST incorrect ? */
471 (vtop
->r
& VT_LVAL
)) {
472 /* We do not want to modifier the long long
473 pointer here, so the safest (and less
474 efficient) is to save all the other registers
475 in the stack. XXX: totally inefficient. */
477 /* load from memory */
480 vtop
[-1].r
= r
; /* save register value */
481 /* increment pointer to get second word */
482 vtop
->type
.t
= VT_INT
;
491 vtop
[-1].r
= r
; /* save register value */
492 vtop
->r
= vtop
[-1].r2
;
494 /* allocate second register */
498 /* write second register */
502 if ((vtop
->r
& VT_LVAL
) && !is_float(vtop
->type
.t
)) {
504 /* lvalue of scalar type : need to use lvalue type
505 because of possible cast */
508 /* compute memory access type */
509 if (vtop
->r
& VT_LVAL_BYTE
)
511 else if (vtop
->r
& VT_LVAL_SHORT
)
513 if (vtop
->r
& VT_LVAL_UNSIGNED
)
517 /* restore wanted type */
520 /* one register type load */
525 #ifdef TCC_TARGET_C67
526 /* uses register pairs for doubles */
527 if ((vtop
->type
.t
& VT_BTYPE
) == VT_DOUBLE
)
534 /* generate vtop[-1] and vtop[0] in resp. classes rc1 and rc2 */
535 void gv2(int rc1
, int rc2
)
539 /* generate more generic register first. But VT_JMP or VT_CMP
540 values must be generated first in all cases to avoid possible
542 v
= vtop
[0].r
& VT_VALMASK
;
543 if (v
!= VT_CMP
&& (v
& ~1) != VT_JMP
&& rc1
<= rc2
) {
548 /* test if reload is needed for first register */
549 if ((vtop
[-1].r
& VT_VALMASK
) >= VT_CONST
) {
559 /* test if reload is needed for first register */
560 if ((vtop
[0].r
& VT_VALMASK
) >= VT_CONST
) {
566 /* wrapper around RC_FRET to return a register by type */
569 #ifdef TCC_TARGET_X86_64
570 if (t
== VT_LDOUBLE
) {
577 /* wrapper around REG_FRET to return a register by type */
580 #ifdef TCC_TARGET_X86_64
581 if (t
== VT_LDOUBLE
) {
588 /* expand long long on stack in two int registers */
593 u
= vtop
->type
.t
& VT_UNSIGNED
;
596 vtop
[0].r
= vtop
[-1].r2
;
597 vtop
[0].r2
= VT_CONST
;
598 vtop
[-1].r2
= VT_CONST
;
599 vtop
[0].type
.t
= VT_INT
| u
;
600 vtop
[-1].type
.t
= VT_INT
| u
;
603 #ifdef TCC_TARGET_ARM
604 /* expand long long on stack */
605 void lexpand_nr(void)
609 u
= vtop
->type
.t
& VT_UNSIGNED
;
612 vtop
->type
.t
= VT_INT
| u
;
613 v
=vtop
[-1].r
& (VT_VALMASK
| VT_LVAL
);
615 vtop
[-1].c
.ui
= vtop
->c
.ull
;
616 vtop
->c
.ui
= vtop
->c
.ull
>> 32;
618 } else if (v
== (VT_LVAL
|VT_CONST
) || v
== (VT_LVAL
|VT_LOCAL
)) {
620 vtop
->r
= vtop
[-1].r
;
621 } else if (v
> VT_CONST
) {
625 vtop
->r
= vtop
[-1].r2
;
626 vtop
[-1].r2
= VT_CONST
;
627 vtop
[-1].type
.t
= VT_INT
| u
;
631 /* build a long long from two ints */
635 vtop
[-1].r2
= vtop
[0].r
;
640 /* rotate n first stack elements to the bottom
641 I1 ... In -> I2 ... In I1 [top is right]
654 /* rotate n first stack elements to the top
655 I1 ... In -> In I1 ... I(n-1) [top is right]
663 for(i
= 0;i
< n
- 1; i
++)
664 vtop
[-i
] = vtop
[-i
- 1];
668 #ifdef TCC_TARGET_ARM
669 /* like vrott but in other direction
670 In ... I1 -> I(n-1) ... I1 In [top is right]
678 for(i
= n
- 1; i
> 0; i
--)
679 vtop
[-i
] = vtop
[-i
+ 1];
684 /* pop stack value */
688 v
= vtop
->r
& VT_VALMASK
;
689 #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)
690 /* for x86, we need to pop the FP stack */
691 if (v
== TREG_ST0
&& !nocode_wanted
) {
692 o(0xd8dd); /* fstp %st(0) */
695 if (v
== VT_JMP
|| v
== VT_JMPI
) {
696 /* need to put correct jump if && or || without test */
702 /* convert stack entry to register and duplicate its value in another
710 if ((t
& VT_BTYPE
) == VT_LLONG
) {
717 /* stack: H L L1 H1 */
725 /* duplicate value */
730 #ifdef TCC_TARGET_X86_64
731 if ((t
& VT_BTYPE
) == VT_LDOUBLE
) {
741 load(r1
, &sv
); /* move r to r1 */
743 /* duplicates value */
749 #ifndef TCC_TARGET_X86_64
750 /* generate CPU independent (unsigned) long long operations */
753 int t
, a
, b
, op1
, c
, i
;
755 unsigned short reg_iret
= REG_IRET
;
756 unsigned short reg_lret
= REG_LRET
;
765 func
= TOK___udivdi3
;
771 func
= TOK___umoddi3
;
778 /* call generic long long function */
779 vpush_global_sym(&func_old_type
, func
);
797 /* stack: L1 H1 L2 H2 */
805 /* stack: H1 H2 L1 L2 */
811 /* stack: H1 H2 L1 L2 ML MH */
814 /* stack: ML MH H1 H2 L1 L2 */
818 /* stack: ML MH H1 L2 H2 L1 */
823 /* stack: ML MH M1 M2 */
826 } else if (op
== '+' || op
== '-') {
827 /* XXX: add non carry method too (for MIPS or alpha) */
833 /* stack: H1 H2 (L1 op L2) */
836 gen_op(op1
+ 1); /* TOK_xxxC2 */
839 /* stack: H1 H2 (L1 op L2) */
842 /* stack: (L1 op L2) H1 H2 */
844 /* stack: (L1 op L2) (H1 op H2) */
852 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
) {
857 /* stack: L H shift */
859 /* constant: simpler */
860 /* NOTE: all comments are for SHL. the other cases are
861 done by swaping words */
905 /* XXX: should provide a faster fallback on x86 ? */
908 func
= TOK___ashrdi3
;
911 func
= TOK___lshrdi3
;
914 func
= TOK___ashldi3
;
920 /* compare operations */
926 /* stack: L1 H1 L2 H2 */
930 /* stack: L1 L2 H1 H2 */
933 /* when values are equal, we need to compare low words. since
934 the jump is inverted, we invert the test too. */
937 else if (op1
== TOK_GT
)
939 else if (op1
== TOK_ULT
)
941 else if (op1
== TOK_UGT
)
950 /* generate non equal test */
951 /* XXX: NOT PORTABLE yet */
955 #if defined(TCC_TARGET_I386)
957 #elif defined(TCC_TARGET_ARM)
959 o(0x1A000000 | encbranch(ind
, 0, 1));
960 #elif defined(TCC_TARGET_C67)
961 error("not implemented");
967 /* compare low. Always unsigned */
971 else if (op1
== TOK_LE
)
973 else if (op1
== TOK_GT
)
975 else if (op1
== TOK_GE
)
986 /* handle integer constant optimizations and various machine
988 void gen_opic(int op
)
990 int c1
, c2
, t1
, t2
, n
;
993 typedef unsigned long long U
;
997 t1
= v1
->type
.t
& VT_BTYPE
;
998 t2
= v2
->type
.t
& VT_BTYPE
;
1002 else if (v1
->type
.t
& VT_UNSIGNED
)
1009 else if (v2
->type
.t
& VT_UNSIGNED
)
1014 /* currently, we cannot do computations with forward symbols */
1015 c1
= (v1
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1016 c2
= (v2
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1019 case '+': l1
+= l2
; break;
1020 case '-': l1
-= l2
; break;
1021 case '&': l1
&= l2
; break;
1022 case '^': l1
^= l2
; break;
1023 case '|': l1
|= l2
; break;
1024 case '*': l1
*= l2
; break;
1031 /* if division by zero, generate explicit division */
1034 error("division by zero in constant");
1038 default: l1
/= l2
; break;
1039 case '%': l1
%= l2
; break;
1040 case TOK_UDIV
: l1
= (U
)l1
/ l2
; break;
1041 case TOK_UMOD
: l1
= (U
)l1
% l2
; break;
1044 case TOK_SHL
: l1
<<= l2
; break;
1045 case TOK_SHR
: l1
= (U
)l1
>> l2
; break;
1046 case TOK_SAR
: l1
>>= l2
; break;
1048 case TOK_ULT
: l1
= (U
)l1
< (U
)l2
; break;
1049 case TOK_UGE
: l1
= (U
)l1
>= (U
)l2
; break;
1050 case TOK_EQ
: l1
= l1
== l2
; break;
1051 case TOK_NE
: l1
= l1
!= l2
; break;
1052 case TOK_ULE
: l1
= (U
)l1
<= (U
)l2
; break;
1053 case TOK_UGT
: l1
= (U
)l1
> (U
)l2
; break;
1054 case TOK_LT
: l1
= l1
< l2
; break;
1055 case TOK_GE
: l1
= l1
>= l2
; break;
1056 case TOK_LE
: l1
= l1
<= l2
; break;
1057 case TOK_GT
: l1
= l1
> l2
; break;
1059 case TOK_LAND
: l1
= l1
&& l2
; break;
1060 case TOK_LOR
: l1
= l1
|| l2
; break;
1067 /* if commutative ops, put c2 as constant */
1068 if (c1
&& (op
== '+' || op
== '&' || op
== '^' ||
1069 op
== '|' || op
== '*')) {
1071 c2
= c1
; //c = c1, c1 = c2, c2 = c;
1072 l2
= l1
; //l = l1, l1 = l2, l2 = l;
1074 /* Filter out NOP operations like x*1, x-0, x&-1... */
1075 if (c2
&& (((op
== '*' || op
== '/' || op
== TOK_UDIV
||
1078 ((op
== '+' || op
== '-' || op
== '|' || op
== '^' ||
1079 op
== TOK_SHL
|| op
== TOK_SHR
|| op
== TOK_SAR
) &&
1085 } else if (c2
&& (op
== '*' || op
== TOK_PDIV
|| op
== TOK_UDIV
)) {
1086 /* try to use shifts instead of muls or divs */
1087 if (l2
> 0 && (l2
& (l2
- 1)) == 0) {
1096 else if (op
== TOK_PDIV
)
1102 } else if (c2
&& (op
== '+' || op
== '-') &&
1103 ((vtop
[-1].r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) ==
1104 (VT_CONST
| VT_SYM
) ||
1105 (vtop
[-1].r
& (VT_VALMASK
| VT_LVAL
)) == VT_LOCAL
)) {
1106 /* symbol + constant case */
1113 if (!nocode_wanted
) {
1114 /* call low level op generator */
1115 if (t1
== VT_LLONG
|| t2
== VT_LLONG
)
1126 /* generate a floating point operation with constant propagation */
1127 void gen_opif(int op
)
1135 /* currently, we cannot do computations with forward symbols */
1136 c1
= (v1
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1137 c2
= (v2
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1139 if (v1
->type
.t
== VT_FLOAT
) {
1142 } else if (v1
->type
.t
== VT_DOUBLE
) {
1150 /* NOTE: we only do constant propagation if finite number (not
1151 NaN or infinity) (ANSI spec) */
1152 if (!ieee_finite(f1
) || !ieee_finite(f2
))
1156 case '+': f1
+= f2
; break;
1157 case '-': f1
-= f2
; break;
1158 case '*': f1
*= f2
; break;
1162 error("division by zero in constant");
1167 /* XXX: also handles tests ? */
1171 /* XXX: overflow test ? */
1172 if (v1
->type
.t
== VT_FLOAT
) {
1174 } else if (v1
->type
.t
== VT_DOUBLE
) {
1182 if (!nocode_wanted
) {
1190 static int pointed_size(CType
*type
)
1193 return type_size(pointed_type(type
), &align
);
1196 static inline int is_null_pointer(SValue
*p
)
1198 if ((p
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) != VT_CONST
)
1200 return ((p
->type
.t
& VT_BTYPE
) == VT_INT
&& p
->c
.i
== 0) ||
1201 ((p
->type
.t
& VT_BTYPE
) == VT_LLONG
&& p
->c
.ll
== 0);
1204 static inline int is_integer_btype(int bt
)
1206 return (bt
== VT_BYTE
|| bt
== VT_SHORT
||
1207 bt
== VT_INT
|| bt
== VT_LLONG
);
1210 /* check types for comparison or substraction of pointers */
1211 static void check_comparison_pointer_types(SValue
*p1
, SValue
*p2
, int op
)
1213 CType
*type1
, *type2
, tmp_type1
, tmp_type2
;
1216 /* null pointers are accepted for all comparisons as gcc */
1217 if (is_null_pointer(p1
) || is_null_pointer(p2
))
1221 bt1
= type1
->t
& VT_BTYPE
;
1222 bt2
= type2
->t
& VT_BTYPE
;
1223 /* accept comparison between pointer and integer with a warning */
1224 if ((is_integer_btype(bt1
) || is_integer_btype(bt2
)) && op
!= '-') {
1225 if (op
!= TOK_LOR
&& op
!= TOK_LAND
)
1226 warning("comparison between pointer and integer");
1230 /* both must be pointers or implicit function pointers */
1231 if (bt1
== VT_PTR
) {
1232 type1
= pointed_type(type1
);
1233 } else if (bt1
!= VT_FUNC
)
1234 goto invalid_operands
;
1236 if (bt2
== VT_PTR
) {
1237 type2
= pointed_type(type2
);
1238 } else if (bt2
!= VT_FUNC
) {
1240 error("invalid operands to binary %s", get_tok_str(op
, NULL
));
1242 if ((type1
->t
& VT_BTYPE
) == VT_VOID
||
1243 (type2
->t
& VT_BTYPE
) == VT_VOID
)
1247 tmp_type1
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1248 tmp_type2
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1249 if (!is_compatible_types(&tmp_type1
, &tmp_type2
)) {
1250 /* gcc-like error if '-' is used */
1252 goto invalid_operands
;
1254 warning("comparison of distinct pointer types lacks a cast");
1258 /* generic gen_op: handles types problems */
1261 int u
, t1
, t2
, bt1
, bt2
, t
;
1264 t1
= vtop
[-1].type
.t
;
1265 t2
= vtop
[0].type
.t
;
1266 bt1
= t1
& VT_BTYPE
;
1267 bt2
= t2
& VT_BTYPE
;
1269 if (bt1
== VT_PTR
|| bt2
== VT_PTR
) {
1270 /* at least one operand is a pointer */
1271 /* relationnal op: must be both pointers */
1272 if (op
>= TOK_ULT
&& op
<= TOK_LOR
) {
1273 check_comparison_pointer_types(vtop
- 1, vtop
, op
);
1274 /* pointers are handled are unsigned */
1275 #ifdef TCC_TARGET_X86_64
1276 t
= VT_LLONG
| VT_UNSIGNED
;
1278 t
= VT_INT
| VT_UNSIGNED
;
1282 /* if both pointers, then it must be the '-' op */
1283 if (bt1
== VT_PTR
&& bt2
== VT_PTR
) {
1285 error("cannot use pointers here");
1286 check_comparison_pointer_types(vtop
- 1, vtop
, op
);
1287 /* XXX: check that types are compatible */
1288 u
= pointed_size(&vtop
[-1].type
);
1290 /* set to integer type */
1291 #ifdef TCC_TARGET_X86_64
1292 vtop
->type
.t
= VT_LLONG
;
1294 vtop
->type
.t
= VT_INT
;
1299 /* exactly one pointer : must be '+' or '-'. */
1300 if (op
!= '-' && op
!= '+')
1301 error("cannot use pointers here");
1302 /* Put pointer as first operand */
1303 if (bt2
== VT_PTR
) {
1307 type1
= vtop
[-1].type
;
1308 #ifdef TCC_TARGET_X86_64
1309 vpushll(pointed_size(&vtop
[-1].type
));
1311 /* XXX: cast to int ? (long long case) */
1312 vpushi(pointed_size(&vtop
[-1].type
));
1315 #ifdef CONFIG_TCC_BCHECK
1316 /* if evaluating constant expression, no code should be
1317 generated, so no bound check */
1318 if (tcc_state
->do_bounds_check
&& !const_wanted
) {
1319 /* if bounded pointers, we generate a special code to
1326 gen_bounded_ptr_add();
1332 /* put again type if gen_opic() swaped operands */
1335 } else if (is_float(bt1
) || is_float(bt2
)) {
1336 /* compute bigger type and do implicit casts */
1337 if (bt1
== VT_LDOUBLE
|| bt2
== VT_LDOUBLE
) {
1339 } else if (bt1
== VT_DOUBLE
|| bt2
== VT_DOUBLE
) {
1344 /* floats can only be used for a few operations */
1345 if (op
!= '+' && op
!= '-' && op
!= '*' && op
!= '/' &&
1346 (op
< TOK_ULT
|| op
> TOK_GT
))
1347 error("invalid operands for binary operation");
1349 } else if (bt1
== VT_LLONG
|| bt2
== VT_LLONG
) {
1350 /* cast to biggest op */
1352 /* convert to unsigned if it does not fit in a long long */
1353 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
) ||
1354 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
))
1358 /* integer operations */
1360 /* convert to unsigned if it does not fit in an integer */
1361 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
) ||
1362 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
))
1365 /* XXX: currently, some unsigned operations are explicit, so
1366 we modify them here */
1367 if (t
& VT_UNSIGNED
) {
1374 else if (op
== TOK_LT
)
1376 else if (op
== TOK_GT
)
1378 else if (op
== TOK_LE
)
1380 else if (op
== TOK_GE
)
1387 /* special case for shifts and long long: we keep the shift as
1389 if (op
== TOK_SHR
|| op
== TOK_SAR
|| op
== TOK_SHL
)
1396 if (op
>= TOK_ULT
&& op
<= TOK_GT
) {
1397 /* relationnal op: the result is an int */
1398 vtop
->type
.t
= VT_INT
;
1405 #ifndef TCC_TARGET_ARM
1406 /* generic itof for unsigned long long case */
1407 void gen_cvt_itof1(int t
)
1409 if ((vtop
->type
.t
& (VT_BTYPE
| VT_UNSIGNED
)) ==
1410 (VT_LLONG
| VT_UNSIGNED
)) {
1413 vpush_global_sym(&func_old_type
, TOK___floatundisf
);
1414 #if LDOUBLE_SIZE != 8
1415 else if (t
== VT_LDOUBLE
)
1416 vpush_global_sym(&func_old_type
, TOK___floatundixf
);
1419 vpush_global_sym(&func_old_type
, TOK___floatundidf
);
1423 vtop
->r
= reg_fret(t
);
1430 /* generic ftoi for unsigned long long case */
1431 void gen_cvt_ftoi1(int t
)
1435 if (t
== (VT_LLONG
| VT_UNSIGNED
)) {
1436 /* not handled natively */
1437 st
= vtop
->type
.t
& VT_BTYPE
;
1439 vpush_global_sym(&func_old_type
, TOK___fixunssfdi
);
1440 #if LDOUBLE_SIZE != 8
1441 else if (st
== VT_LDOUBLE
)
1442 vpush_global_sym(&func_old_type
, TOK___fixunsxfdi
);
1445 vpush_global_sym(&func_old_type
, TOK___fixunsdfdi
);
1450 vtop
->r2
= REG_LRET
;
1456 /* force char or short cast */
1457 void force_charshort_cast(int t
)
1461 /* XXX: add optimization if lvalue : just change type and offset */
1466 if (t
& VT_UNSIGNED
) {
1467 vpushi((1 << bits
) - 1);
1473 /* result must be signed or the SAR is converted to an SHL
1474 This was not the case when "t" was a signed short
1475 and the last value on the stack was an unsigned int */
1476 vtop
->type
.t
&= ~VT_UNSIGNED
;
1482 /* cast 'vtop' to 'type'. Casting to bitfields is forbidden. */
1483 static void gen_cast(CType
*type
)
1485 int sbt
, dbt
, sf
, df
, c
, p
;
1487 /* special delayed cast for char/short */
1488 /* XXX: in some cases (multiple cascaded casts), it may still
1490 if (vtop
->r
& VT_MUSTCAST
) {
1491 vtop
->r
&= ~VT_MUSTCAST
;
1492 force_charshort_cast(vtop
->type
.t
);
1495 /* bitfields first get cast to ints */
1496 if (vtop
->type
.t
& VT_BITFIELD
) {
1500 dbt
= type
->t
& (VT_BTYPE
| VT_UNSIGNED
);
1501 sbt
= vtop
->type
.t
& (VT_BTYPE
| VT_UNSIGNED
);
1506 c
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1507 p
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == (VT_CONST
| VT_SYM
);
1509 /* constant case: we can do it now */
1510 /* XXX: in ISOC, cannot do it if error in convert */
1511 if (sbt
== VT_FLOAT
)
1512 vtop
->c
.ld
= vtop
->c
.f
;
1513 else if (sbt
== VT_DOUBLE
)
1514 vtop
->c
.ld
= vtop
->c
.d
;
1517 if ((sbt
& VT_BTYPE
) == VT_LLONG
) {
1518 if (sbt
& VT_UNSIGNED
)
1519 vtop
->c
.ld
= vtop
->c
.ull
;
1521 vtop
->c
.ld
= vtop
->c
.ll
;
1523 if (sbt
& VT_UNSIGNED
)
1524 vtop
->c
.ld
= vtop
->c
.ui
;
1526 vtop
->c
.ld
= vtop
->c
.i
;
1529 if (dbt
== VT_FLOAT
)
1530 vtop
->c
.f
= (float)vtop
->c
.ld
;
1531 else if (dbt
== VT_DOUBLE
)
1532 vtop
->c
.d
= (double)vtop
->c
.ld
;
1533 } else if (sf
&& dbt
== (VT_LLONG
|VT_UNSIGNED
)) {
1534 vtop
->c
.ull
= (unsigned long long)vtop
->c
.ld
;
1535 } else if (sf
&& dbt
== VT_BOOL
) {
1536 vtop
->c
.i
= (vtop
->c
.ld
!= 0);
1539 vtop
->c
.ll
= (long long)vtop
->c
.ld
;
1540 else if (sbt
== (VT_LLONG
|VT_UNSIGNED
))
1541 vtop
->c
.ll
= vtop
->c
.ull
;
1542 else if (sbt
& VT_UNSIGNED
)
1543 vtop
->c
.ll
= vtop
->c
.ui
;
1544 else if (sbt
!= VT_LLONG
)
1545 vtop
->c
.ll
= vtop
->c
.i
;
1547 if (dbt
== (VT_LLONG
|VT_UNSIGNED
))
1548 vtop
->c
.ull
= vtop
->c
.ll
;
1549 else if (dbt
== VT_BOOL
)
1550 vtop
->c
.i
= (vtop
->c
.ll
!= 0);
1551 else if (dbt
!= VT_LLONG
) {
1553 if ((dbt
& VT_BTYPE
) == VT_BYTE
)
1555 else if ((dbt
& VT_BTYPE
) == VT_SHORT
)
1558 if(dbt
& VT_UNSIGNED
)
1559 vtop
->c
.ui
= ((unsigned int)vtop
->c
.ll
<< s
) >> s
;
1561 vtop
->c
.i
= ((int)vtop
->c
.ll
<< s
) >> s
;
1564 } else if (p
&& dbt
== VT_BOOL
) {
1567 } else if (!nocode_wanted
) {
1568 /* non constant case: generate code */
1570 /* convert from fp to fp */
1573 /* convert int to fp */
1576 /* convert fp to int */
1577 if (dbt
== VT_BOOL
) {
1581 /* we handle char/short/etc... with generic code */
1582 if (dbt
!= (VT_INT
| VT_UNSIGNED
) &&
1583 dbt
!= (VT_LLONG
| VT_UNSIGNED
) &&
1587 if (dbt
== VT_INT
&& (type
->t
& (VT_BTYPE
| VT_UNSIGNED
)) != dbt
) {
1588 /* additional cast for char/short... */
1593 #ifndef TCC_TARGET_X86_64
1594 } else if ((dbt
& VT_BTYPE
) == VT_LLONG
) {
1595 if ((sbt
& VT_BTYPE
) != VT_LLONG
) {
1596 /* scalar to long long */
1597 /* machine independent conversion */
1599 /* generate high word */
1600 if (sbt
== (VT_INT
| VT_UNSIGNED
)) {
1604 if (sbt
== VT_PTR
) {
1605 /* cast from pointer to int before we apply
1606 shift operation, which pointers don't support*/
1607 gen_cast(&int_type
);
1613 /* patch second register */
1614 vtop
[-1].r2
= vtop
->r
;
1618 } else if ((dbt
& VT_BTYPE
) == VT_LLONG
||
1619 (dbt
& VT_BTYPE
) == VT_PTR
) {
1620 /* XXX: not sure if this is perfect... need more tests */
1621 if ((sbt
& VT_BTYPE
) != VT_LLONG
) {
1623 if (sbt
!= (VT_INT
| VT_UNSIGNED
) &&
1624 sbt
!= VT_PTR
&& sbt
!= VT_FUNC
) {
1625 /* x86_64 specific: movslq */
1627 o(0xc0 + (REG_VALUE(r
) << 3) + REG_VALUE(r
));
1631 } else if (dbt
== VT_BOOL
) {
1632 /* scalar to bool */
1635 } else if ((dbt
& VT_BTYPE
) == VT_BYTE
||
1636 (dbt
& VT_BTYPE
) == VT_SHORT
) {
1637 if (sbt
== VT_PTR
) {
1638 vtop
->type
.t
= VT_INT
;
1639 warning("nonportable conversion from pointer to char/short");
1641 force_charshort_cast(dbt
);
1642 } else if ((dbt
& VT_BTYPE
) == VT_INT
) {
1644 if (sbt
== VT_LLONG
) {
1645 /* from long long: just take low order word */
1649 /* if lvalue and single word type, nothing to do because
1650 the lvalue already contains the real type size (see
1651 VT_LVAL_xxx constants) */
1654 } else if ((dbt
& VT_BTYPE
) == VT_PTR
&& !(vtop
->r
& VT_LVAL
)) {
1655 /* if we are casting between pointer types,
1656 we must update the VT_LVAL_xxx size */
1657 vtop
->r
= (vtop
->r
& ~VT_LVAL_TYPE
)
1658 | (lvalue_type(type
->ref
->type
.t
) & VT_LVAL_TYPE
);
1663 /* return type size. Put alignment at 'a' */
1664 static int type_size(CType
*type
, int *a
)
1669 bt
= type
->t
& VT_BTYPE
;
1670 if (bt
== VT_STRUCT
) {
1675 } else if (bt
== VT_PTR
) {
1676 if (type
->t
& VT_ARRAY
) {
1680 ts
= type_size(&s
->type
, a
);
1682 if (ts
< 0 && s
->c
< 0)
1690 } else if (bt
== VT_LDOUBLE
) {
1692 return LDOUBLE_SIZE
;
1693 } else if (bt
== VT_DOUBLE
|| bt
== VT_LLONG
) {
1694 #ifdef TCC_TARGET_I386
1695 #ifdef TCC_TARGET_PE
1700 #elif defined(TCC_TARGET_ARM)
1710 } else if (bt
== VT_INT
|| bt
== VT_ENUM
|| bt
== VT_FLOAT
) {
1713 } else if (bt
== VT_SHORT
) {
1717 /* char, void, function, _Bool */
1723 /* return the pointed type of t */
1724 static inline CType
*pointed_type(CType
*type
)
1726 return &type
->ref
->type
;
1729 /* modify type so that its it is a pointer to type. */
1730 static void mk_pointer(CType
*type
)
1733 s
= sym_push(SYM_FIELD
, type
, 0, -1);
1734 type
->t
= VT_PTR
| (type
->t
& ~VT_TYPE
);
1738 /* compare function types. OLD functions match any new functions */
1739 static int is_compatible_func(CType
*type1
, CType
*type2
)
1745 if (!is_compatible_types(&s1
->type
, &s2
->type
))
1747 /* check func_call */
1748 if (FUNC_CALL(s1
->r
) != FUNC_CALL(s2
->r
))
1750 /* XXX: not complete */
1751 if (s1
->c
== FUNC_OLD
|| s2
->c
== FUNC_OLD
)
1755 while (s1
!= NULL
) {
1758 if (!is_compatible_parameter_types(&s1
->type
, &s2
->type
))
1768 /* return true if type1 and type2 are the same. If unqualified is
1769 true, qualifiers on the types are ignored.
1771 - enums are not checked as gcc __builtin_types_compatible_p ()
1773 static int compare_types(CType
*type1
, CType
*type2
, int unqualified
)
1777 t1
= type1
->t
& VT_TYPE
;
1778 t2
= type2
->t
& VT_TYPE
;
1780 /* strip qualifiers before comparing */
1781 t1
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1782 t2
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1784 /* XXX: bitfields ? */
1787 /* test more complicated cases */
1788 bt1
= t1
& VT_BTYPE
;
1789 if (bt1
== VT_PTR
) {
1790 type1
= pointed_type(type1
);
1791 type2
= pointed_type(type2
);
1792 return is_compatible_types(type1
, type2
);
1793 } else if (bt1
== VT_STRUCT
) {
1794 return (type1
->ref
== type2
->ref
);
1795 } else if (bt1
== VT_FUNC
) {
1796 return is_compatible_func(type1
, type2
);
1802 /* return true if type1 and type2 are exactly the same (including
1805 static int is_compatible_types(CType
*type1
, CType
*type2
)
1807 return compare_types(type1
,type2
,0);
1810 /* return true if type1 and type2 are the same (ignoring qualifiers).
1812 static int is_compatible_parameter_types(CType
*type1
, CType
*type2
)
1814 return compare_types(type1
,type2
,1);
1817 /* print a type. If 'varstr' is not NULL, then the variable is also
1818 printed in the type */
1820 /* XXX: add array and function pointers */
1821 void type_to_str(char *buf
, int buf_size
,
1822 CType
*type
, const char *varstr
)
1829 t
= type
->t
& VT_TYPE
;
1832 if (t
& VT_CONSTANT
)
1833 pstrcat(buf
, buf_size
, "const ");
1834 if (t
& VT_VOLATILE
)
1835 pstrcat(buf
, buf_size
, "volatile ");
1836 if (t
& VT_UNSIGNED
)
1837 pstrcat(buf
, buf_size
, "unsigned ");
1867 tstr
= "long double";
1869 pstrcat(buf
, buf_size
, tstr
);
1873 if (bt
== VT_STRUCT
)
1877 pstrcat(buf
, buf_size
, tstr
);
1878 v
= type
->ref
->v
& ~SYM_STRUCT
;
1879 if (v
>= SYM_FIRST_ANOM
)
1880 pstrcat(buf
, buf_size
, "<anonymous>");
1882 pstrcat(buf
, buf_size
, get_tok_str(v
, NULL
));
1886 type_to_str(buf
, buf_size
, &s
->type
, varstr
);
1887 pstrcat(buf
, buf_size
, "(");
1889 while (sa
!= NULL
) {
1890 type_to_str(buf1
, sizeof(buf1
), &sa
->type
, NULL
);
1891 pstrcat(buf
, buf_size
, buf1
);
1894 pstrcat(buf
, buf_size
, ", ");
1896 pstrcat(buf
, buf_size
, ")");
1900 pstrcpy(buf1
, sizeof(buf1
), "*");
1902 pstrcat(buf1
, sizeof(buf1
), varstr
);
1903 type_to_str(buf
, buf_size
, &s
->type
, buf1
);
1907 pstrcat(buf
, buf_size
, " ");
1908 pstrcat(buf
, buf_size
, varstr
);
1913 /* verify type compatibility to store vtop in 'dt' type, and generate
1915 static void gen_assign_cast(CType
*dt
)
1917 CType
*st
, *type1
, *type2
, tmp_type1
, tmp_type2
;
1918 char buf1
[256], buf2
[256];
1921 st
= &vtop
->type
; /* source type */
1922 dbt
= dt
->t
& VT_BTYPE
;
1923 sbt
= st
->t
& VT_BTYPE
;
1924 if (dt
->t
& VT_CONSTANT
)
1925 warning("assignment of read-only location");
1928 /* special cases for pointers */
1929 /* '0' can also be a pointer */
1930 if (is_null_pointer(vtop
))
1932 /* accept implicit pointer to integer cast with warning */
1933 if (is_integer_btype(sbt
)) {
1934 warning("assignment makes pointer from integer without a cast");
1937 type1
= pointed_type(dt
);
1938 /* a function is implicitely a function pointer */
1939 if (sbt
== VT_FUNC
) {
1940 if ((type1
->t
& VT_BTYPE
) != VT_VOID
&&
1941 !is_compatible_types(pointed_type(dt
), st
))
1942 warning("assignment from incompatible pointer type");
1947 type2
= pointed_type(st
);
1948 if ((type1
->t
& VT_BTYPE
) == VT_VOID
||
1949 (type2
->t
& VT_BTYPE
) == VT_VOID
) {
1950 /* void * can match anything */
1952 /* exact type match, except for unsigned */
1955 tmp_type1
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1956 tmp_type2
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1957 if (!is_compatible_types(&tmp_type1
, &tmp_type2
))
1958 warning("assignment from incompatible pointer type");
1960 /* check const and volatile */
1961 if ((!(type1
->t
& VT_CONSTANT
) && (type2
->t
& VT_CONSTANT
)) ||
1962 (!(type1
->t
& VT_VOLATILE
) && (type2
->t
& VT_VOLATILE
)))
1963 warning("assignment discards qualifiers from pointer target type");
1969 if (sbt
== VT_PTR
|| sbt
== VT_FUNC
) {
1970 warning("assignment makes integer from pointer without a cast");
1972 /* XXX: more tests */
1977 tmp_type1
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1978 tmp_type2
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1979 if (!is_compatible_types(&tmp_type1
, &tmp_type2
)) {
1981 type_to_str(buf1
, sizeof(buf1
), st
, NULL
);
1982 type_to_str(buf2
, sizeof(buf2
), dt
, NULL
);
1983 error("cannot cast '%s' to '%s'", buf1
, buf2
);
1991 /* store vtop in lvalue pushed on stack */
1994 int sbt
, dbt
, ft
, r
, t
, size
, align
, bit_size
, bit_pos
, rc
, delayed_cast
;
1996 ft
= vtop
[-1].type
.t
;
1997 sbt
= vtop
->type
.t
& VT_BTYPE
;
1998 dbt
= ft
& VT_BTYPE
;
1999 if (((sbt
== VT_INT
|| sbt
== VT_SHORT
) && dbt
== VT_BYTE
) ||
2000 (sbt
== VT_INT
&& dbt
== VT_SHORT
)) {
2001 /* optimize char/short casts */
2002 delayed_cast
= VT_MUSTCAST
;
2003 vtop
->type
.t
= ft
& (VT_TYPE
& ~(VT_BITFIELD
| (-1 << VT_STRUCT_SHIFT
)));
2004 /* XXX: factorize */
2005 if (ft
& VT_CONSTANT
)
2006 warning("assignment of read-only location");
2009 if (!(ft
& VT_BITFIELD
))
2010 gen_assign_cast(&vtop
[-1].type
);
2013 if (sbt
== VT_STRUCT
) {
2014 /* if structure, only generate pointer */
2015 /* structure assignment : generate memcpy */
2016 /* XXX: optimize if small size */
2017 if (!nocode_wanted
) {
2018 size
= type_size(&vtop
->type
, &align
);
2022 vpush_global_sym(&func_old_type
, TOK_memcpy8
);
2023 else if(!(align
& 3))
2024 vpush_global_sym(&func_old_type
, TOK_memcpy4
);
2027 vpush_global_sym(&func_old_type
, TOK_memcpy
);
2031 vtop
->type
.t
= VT_PTR
;
2035 vtop
->type
.t
= VT_PTR
;
2047 /* leave source on stack */
2048 } else if (ft
& VT_BITFIELD
) {
2049 /* bitfield store handling */
2050 bit_pos
= (ft
>> VT_STRUCT_SHIFT
) & 0x3f;
2051 bit_size
= (ft
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f;
2052 /* remove bit field info to avoid loops */
2053 vtop
[-1].type
.t
= ft
& ~(VT_BITFIELD
| (-1 << VT_STRUCT_SHIFT
));
2055 /* duplicate source into other register */
2060 if((ft
& VT_BTYPE
) == VT_BOOL
) {
2061 gen_cast(&vtop
[-1].type
);
2062 vtop
[-1].type
.t
= (vtop
[-1].type
.t
& ~VT_BTYPE
) | (VT_BYTE
| VT_UNSIGNED
);
2065 /* duplicate destination */
2067 vtop
[-1] = vtop
[-2];
2069 /* mask and shift source */
2070 if((ft
& VT_BTYPE
) != VT_BOOL
) {
2071 if((ft
& VT_BTYPE
) == VT_LLONG
) {
2072 vpushll((1ULL << bit_size
) - 1ULL);
2074 vpushi((1 << bit_size
) - 1);
2080 /* load destination, mask and or with source */
2082 if((ft
& VT_BTYPE
) == VT_LLONG
) {
2083 vpushll(~(((1ULL << bit_size
) - 1ULL) << bit_pos
));
2085 vpushi(~(((1 << bit_size
) - 1) << bit_pos
));
2092 /* pop off shifted source from "duplicate source..." above */
2096 #ifdef CONFIG_TCC_BCHECK
2097 /* bound check case */
2098 if (vtop
[-1].r
& VT_MUSTBOUND
) {
2104 if (!nocode_wanted
) {
2108 #ifdef TCC_TARGET_X86_64
2109 if ((ft
& VT_BTYPE
) == VT_LDOUBLE
) {
2114 r
= gv(rc
); /* generate value */
2115 /* if lvalue was saved on stack, must read it */
2116 if ((vtop
[-1].r
& VT_VALMASK
) == VT_LLOCAL
) {
2118 t
= get_reg(RC_INT
);
2119 #ifdef TCC_TARGET_X86_64
2124 sv
.r
= VT_LOCAL
| VT_LVAL
;
2125 sv
.c
.ul
= vtop
[-1].c
.ul
;
2127 vtop
[-1].r
= t
| VT_LVAL
;
2130 #ifndef TCC_TARGET_X86_64
2131 /* two word case handling : store second register at word + 4 */
2132 if ((ft
& VT_BTYPE
) == VT_LLONG
) {
2134 /* convert to int to increment easily */
2135 vtop
->type
.t
= VT_INT
;
2141 /* XXX: it works because r2 is spilled last ! */
2142 store(vtop
->r2
, vtop
- 1);
2147 vtop
--; /* NOT vpop() because on x86 it would flush the fp stack */
2148 vtop
->r
|= delayed_cast
;
2152 /* post defines POST/PRE add. c is the token ++ or -- */
2153 void inc(int post
, int c
)
2156 vdup(); /* save lvalue */
2158 gv_dup(); /* duplicate value */
2163 vpushi(c
- TOK_MID
);
2165 vstore(); /* store value */
2167 vpop(); /* if post op, return saved value */
2170 /* Parse GNUC __attribute__ extension. Currently, the following
2171 extensions are recognized:
2172 - aligned(n) : set data/function alignment.
2173 - packed : force data alignment to 1
2174 - section(x) : generate data/code in this section.
2175 - unused : currently ignored, but may be used someday.
2176 - regparm(n) : pass function parameters in registers (i386 only)
2178 static void parse_attribute(AttributeDef
*ad
)
2182 while (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
) {
2186 while (tok
!= ')') {
2187 if (tok
< TOK_IDENT
)
2188 expect("attribute name");
2196 expect("section name");
2197 ad
->section
= find_section(tcc_state
, (char *)tokc
.cstr
->data
);
2206 if (n
<= 0 || (n
& (n
- 1)) != 0)
2207 error("alignment must be a positive power of two");
2220 /* currently, no need to handle it because tcc does not
2221 track unused objects */
2225 /* currently, no need to handle it because tcc does not
2226 track unused objects */
2231 FUNC_CALL(ad
->func_attr
) = FUNC_CDECL
;
2236 FUNC_CALL(ad
->func_attr
) = FUNC_STDCALL
;
2238 #ifdef TCC_TARGET_I386
2248 FUNC_CALL(ad
->func_attr
) = FUNC_FASTCALL1
+ n
- 1;
2254 FUNC_CALL(ad
->func_attr
) = FUNC_FASTCALLW
;
2258 FUNC_EXPORT(ad
->func_attr
) = 1;
2261 if (tcc_state
->warn_unsupported
)
2262 warning("'%s' attribute ignored", get_tok_str(t
, NULL
));
2263 /* skip parameters */
2265 int parenthesis
= 0;
2269 else if (tok
== ')')
2272 } while (parenthesis
&& tok
!= -1);
2285 /* enum/struct/union declaration. u is either VT_ENUM or VT_STRUCT */
2286 static void struct_decl(CType
*type
, int u
)
2288 int a
, v
, size
, align
, maxalign
, c
, offset
;
2289 int bit_size
, bit_pos
, bsize
, bt
, lbit_pos
, prevbt
;
2290 Sym
*s
, *ss
, *ass
, **ps
;
2294 a
= tok
; /* save decl type */
2299 /* struct already defined ? return it */
2301 expect("struct/union/enum name");
2305 error("invalid type");
2312 /* we put an undefined size for struct/union */
2313 s
= sym_push(v
| SYM_STRUCT
, &type1
, 0, -1);
2314 s
->r
= 0; /* default alignment is zero as gcc */
2315 /* put struct/union/enum name in type */
2323 error("struct/union/enum already defined");
2324 /* cannot be empty */
2326 /* non empty enums are not allowed */
2327 if (a
== TOK_ENUM
) {
2331 expect("identifier");
2337 /* enum symbols have static storage */
2338 ss
= sym_push(v
, &int_type
, VT_CONST
, c
);
2339 ss
->type
.t
|= VT_STATIC
;
2344 /* NOTE: we accept a trailing comma */
2355 while (tok
!= '}') {
2356 parse_btype(&btype
, &ad
);
2362 type_decl(&type1
, &ad
, &v
, TYPE_DIRECT
| TYPE_ABSTRACT
);
2363 if (v
== 0 && (type1
.t
& VT_BTYPE
) != VT_STRUCT
)
2364 expect("identifier");
2365 if ((type1
.t
& VT_BTYPE
) == VT_FUNC
||
2366 (type1
.t
& (VT_TYPEDEF
| VT_STATIC
| VT_EXTERN
| VT_INLINE
)))
2367 error("invalid type for '%s'",
2368 get_tok_str(v
, NULL
));
2372 bit_size
= expr_const();
2373 /* XXX: handle v = 0 case for messages */
2375 error("negative width in bit-field '%s'",
2376 get_tok_str(v
, NULL
));
2377 if (v
&& bit_size
== 0)
2378 error("zero width for bit-field '%s'",
2379 get_tok_str(v
, NULL
));
2381 size
= type_size(&type1
, &align
);
2383 if (align
< ad
.aligned
)
2385 } else if (ad
.packed
) {
2387 } else if (*tcc_state
->pack_stack_ptr
) {
2388 if (align
> *tcc_state
->pack_stack_ptr
)
2389 align
= *tcc_state
->pack_stack_ptr
;
2392 if (bit_size
>= 0) {
2393 bt
= type1
.t
& VT_BTYPE
;
2400 error("bitfields must have scalar type");
2402 if (bit_size
> bsize
) {
2403 error("width of '%s' exceeds its type",
2404 get_tok_str(v
, NULL
));
2405 } else if (bit_size
== bsize
) {
2406 /* no need for bit fields */
2408 } else if (bit_size
== 0) {
2409 /* XXX: what to do if only padding in a
2411 /* zero size: means to pad */
2414 /* we do not have enough room ?
2415 did the type change?
2417 if ((bit_pos
+ bit_size
) > bsize
||
2418 bt
!= prevbt
|| a
== TOK_UNION
)
2421 /* XXX: handle LSB first */
2422 type1
.t
|= VT_BITFIELD
|
2423 (bit_pos
<< VT_STRUCT_SHIFT
) |
2424 (bit_size
<< (VT_STRUCT_SHIFT
+ 6));
2425 bit_pos
+= bit_size
;
2431 if (v
!= 0 || (type1
.t
& VT_BTYPE
) == VT_STRUCT
) {
2432 /* add new memory data only if starting
2434 if (lbit_pos
== 0) {
2435 if (a
== TOK_STRUCT
) {
2436 c
= (c
+ align
- 1) & -align
;
2445 if (align
> maxalign
)
2449 printf("add field %s offset=%d",
2450 get_tok_str(v
, NULL
), offset
);
2451 if (type1
.t
& VT_BITFIELD
) {
2452 printf(" pos=%d size=%d",
2453 (type1
.t
>> VT_STRUCT_SHIFT
) & 0x3f,
2454 (type1
.t
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f);
2459 if (v
== 0 && (type1
.t
& VT_BTYPE
) == VT_STRUCT
) {
2461 while ((ass
= ass
->next
) != NULL
) {
2462 ss
= sym_push(ass
->v
, &ass
->type
, 0, offset
+ ass
->c
);
2467 ss
= sym_push(v
| SYM_FIELD
, &type1
, 0, offset
);
2471 if (tok
== ';' || tok
== TOK_EOF
)
2478 /* store size and alignment */
2479 s
->c
= (c
+ maxalign
- 1) & -maxalign
;
2485 /* return 0 if no type declaration. otherwise, return the basic type
2488 static int parse_btype(CType
*type
, AttributeDef
*ad
)
2490 int t
, u
, type_found
, typespec_found
, typedef_found
;
2494 memset(ad
, 0, sizeof(AttributeDef
));
2502 /* currently, we really ignore extension */
2512 if ((t
& VT_BTYPE
) != 0)
2513 error("too many basic types");
2529 if ((t
& VT_BTYPE
) == VT_DOUBLE
) {
2530 t
= (t
& ~VT_BTYPE
) | VT_LDOUBLE
;
2531 } else if ((t
& VT_BTYPE
) == VT_LONG
) {
2532 t
= (t
& ~VT_BTYPE
) | VT_LLONG
;
2546 if ((t
& VT_BTYPE
) == VT_LONG
) {
2547 t
= (t
& ~VT_BTYPE
) | VT_LDOUBLE
;
2554 struct_decl(&type1
, VT_ENUM
);
2557 type
->ref
= type1
.ref
;
2561 struct_decl(&type1
, VT_STRUCT
);
2564 /* type modifiers */
2617 /* GNUC attribute */
2618 case TOK_ATTRIBUTE1
:
2619 case TOK_ATTRIBUTE2
:
2620 parse_attribute(ad
);
2627 parse_expr_type(&type1
);
2630 if (typespec_found
|| typedef_found
)
2633 if (!s
|| !(s
->type
.t
& VT_TYPEDEF
))
2636 t
|= (s
->type
.t
& ~VT_TYPEDEF
);
2637 type
->ref
= s
->type
.ref
;
2645 if ((t
& (VT_SIGNED
|VT_UNSIGNED
)) == (VT_SIGNED
|VT_UNSIGNED
))
2646 error("signed and unsigned modifier");
2647 if (tcc_state
->char_is_unsigned
) {
2648 if ((t
& (VT_SIGNED
|VT_UNSIGNED
|VT_BTYPE
)) == VT_BYTE
)
2653 /* long is never used as type */
2654 if ((t
& VT_BTYPE
) == VT_LONG
)
2655 #if !defined TCC_TARGET_X86_64 || defined TCC_TARGET_PE
2656 t
= (t
& ~VT_BTYPE
) | VT_INT
;
2658 t
= (t
& ~VT_BTYPE
) | VT_LLONG
;
2664 /* convert a function parameter type (array to pointer and function to
2665 function pointer) */
2666 static inline void convert_parameter_type(CType
*pt
)
2668 /* remove const and volatile qualifiers (XXX: const could be used
2669 to indicate a const function parameter */
2670 pt
->t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
2671 /* array must be transformed to pointer according to ANSI C */
2673 if ((pt
->t
& VT_BTYPE
) == VT_FUNC
) {
2678 static void post_type(CType
*type
, AttributeDef
*ad
)
2680 int n
, l
, t1
, arg_size
, align
;
2681 Sym
**plast
, *s
, *first
;
2686 /* function declaration */
2694 /* read param name and compute offset */
2695 if (l
!= FUNC_OLD
) {
2696 if (!parse_btype(&pt
, &ad1
)) {
2698 error("invalid type");
2705 if ((pt
.t
& VT_BTYPE
) == VT_VOID
&& tok
== ')')
2707 type_decl(&pt
, &ad1
, &n
, TYPE_DIRECT
| TYPE_ABSTRACT
);
2708 if ((pt
.t
& VT_BTYPE
) == VT_VOID
)
2709 error("parameter declared as void");
2710 arg_size
+= (type_size(&pt
, &align
) + 3) & ~3;
2715 expect("identifier");
2719 convert_parameter_type(&pt
);
2720 s
= sym_push(n
| SYM_FIELD
, &pt
, 0, 0);
2726 if (l
== FUNC_NEW
&& tok
== TOK_DOTS
) {
2733 /* if no parameters, then old type prototype */
2737 t1
= type
->t
& VT_STORAGE
;
2738 /* NOTE: const is ignored in returned type as it has a special
2739 meaning in gcc / C++ */
2740 type
->t
&= ~(VT_STORAGE
| VT_CONSTANT
);
2741 post_type(type
, ad
);
2742 /* we push a anonymous symbol which will contain the function prototype */
2743 FUNC_ARGS(ad
->func_attr
) = arg_size
;
2744 s
= sym_push(SYM_FIELD
, type
, ad
->func_attr
, l
);
2746 type
->t
= t1
| VT_FUNC
;
2748 } else if (tok
== '[') {
2749 /* array definition */
2751 if (tok
== TOK_RESTRICT1
)
2757 error("invalid array size");
2760 /* parse next post type */
2761 t1
= type
->t
& VT_STORAGE
;
2762 type
->t
&= ~VT_STORAGE
;
2763 post_type(type
, ad
);
2765 /* we push a anonymous symbol which will contain the array
2767 s
= sym_push(SYM_FIELD
, type
, 0, n
);
2768 type
->t
= t1
| VT_ARRAY
| VT_PTR
;
2773 /* Parse a type declaration (except basic type), and return the type
2774 in 'type'. 'td' is a bitmask indicating which kind of type decl is
2775 expected. 'type' should contain the basic type. 'ad' is the
2776 attribute definition of the basic type. It can be modified by
2779 static void type_decl(CType
*type
, AttributeDef
*ad
, int *v
, int td
)
2782 CType type1
, *type2
;
2785 while (tok
== '*') {
2793 qualifiers
|= VT_CONSTANT
;
2798 qualifiers
|= VT_VOLATILE
;
2806 type
->t
|= qualifiers
;
2809 /* XXX: clarify attribute handling */
2810 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2811 parse_attribute(ad
);
2813 /* recursive type */
2814 /* XXX: incorrect if abstract type for functions (e.g. 'int ()') */
2815 type1
.t
= 0; /* XXX: same as int */
2818 /* XXX: this is not correct to modify 'ad' at this point, but
2819 the syntax is not clear */
2820 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2821 parse_attribute(ad
);
2822 type_decl(&type1
, ad
, v
, td
);
2825 /* type identifier */
2826 if (tok
>= TOK_IDENT
&& (td
& TYPE_DIRECT
)) {
2830 if (!(td
& TYPE_ABSTRACT
))
2831 expect("identifier");
2835 post_type(type
, ad
);
2836 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2837 parse_attribute(ad
);
2840 /* append type at the end of type1 */
2853 /* compute the lvalue VT_LVAL_xxx needed to match type t. */
2854 static int lvalue_type(int t
)
2859 if (bt
== VT_BYTE
|| bt
== VT_BOOL
)
2861 else if (bt
== VT_SHORT
)
2865 if (t
& VT_UNSIGNED
)
2866 r
|= VT_LVAL_UNSIGNED
;
2870 /* indirection with full error checking and bound check */
2871 static void indir(void)
2873 if ((vtop
->type
.t
& VT_BTYPE
) != VT_PTR
) {
2874 if ((vtop
->type
.t
& VT_BTYPE
) == VT_FUNC
)
2878 if ((vtop
->r
& VT_LVAL
) && !nocode_wanted
)
2880 vtop
->type
= *pointed_type(&vtop
->type
);
2881 /* Arrays and functions are never lvalues */
2882 if (!(vtop
->type
.t
& VT_ARRAY
)
2883 && (vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
) {
2884 vtop
->r
|= lvalue_type(vtop
->type
.t
);
2885 /* if bound checking, the referenced pointer must be checked */
2886 if (tcc_state
->do_bounds_check
)
2887 vtop
->r
|= VT_MUSTBOUND
;
2891 /* pass a parameter to a function and do type checking and casting */
2892 static void gfunc_param_typed(Sym
*func
, Sym
*arg
)
2897 func_type
= func
->c
;
2898 if (func_type
== FUNC_OLD
||
2899 (func_type
== FUNC_ELLIPSIS
&& arg
== NULL
)) {
2900 /* default casting : only need to convert float to double */
2901 if ((vtop
->type
.t
& VT_BTYPE
) == VT_FLOAT
) {
2905 } else if (arg
== NULL
) {
2906 error("too many arguments to function");
2909 type
.t
&= ~VT_CONSTANT
; /* need to do that to avoid false warning */
2910 gen_assign_cast(&type
);
2914 /* parse an expression of the form '(type)' or '(expr)' and return its
2916 static void parse_expr_type(CType
*type
)
2922 if (parse_btype(type
, &ad
)) {
2923 type_decl(type
, &ad
, &n
, TYPE_ABSTRACT
);
2930 static void parse_type(CType
*type
)
2935 if (!parse_btype(type
, &ad
)) {
2938 type_decl(type
, &ad
, &n
, TYPE_ABSTRACT
);
2941 static void vpush_tokc(int t
)
2945 vsetc(&type
, VT_CONST
, &tokc
);
2948 static void unary(void)
2950 int n
, t
, align
, size
, r
;
2955 /* XXX: GCC 2.95.3 does not generate a table although it should be
2969 vpush_tokc(VT_INT
| VT_UNSIGNED
);
2973 vpush_tokc(VT_LLONG
);
2977 vpush_tokc(VT_LLONG
| VT_UNSIGNED
);
2981 vpush_tokc(VT_FLOAT
);
2985 vpush_tokc(VT_DOUBLE
);
2989 vpush_tokc(VT_LDOUBLE
);
2992 case TOK___FUNCTION__
:
2994 goto tok_identifier
;
3000 /* special function name identifier */
3001 len
= strlen(funcname
) + 1;
3002 /* generate char[len] type */
3007 vpush_ref(&type
, data_section
, data_section
->data_offset
, len
);
3008 ptr
= section_ptr_add(data_section
, len
);
3009 memcpy(ptr
, funcname
, len
);
3014 #ifdef TCC_TARGET_PE
3015 t
= VT_SHORT
| VT_UNSIGNED
;
3021 /* string parsing */
3024 if (tcc_state
->warn_write_strings
)
3029 memset(&ad
, 0, sizeof(AttributeDef
));
3030 decl_initializer_alloc(&type
, &ad
, VT_CONST
, 2, 0, 0);
3035 if (parse_btype(&type
, &ad
)) {
3036 type_decl(&type
, &ad
, &n
, TYPE_ABSTRACT
);
3038 /* check ISOC99 compound literal */
3040 /* data is allocated locally by default */
3045 /* all except arrays are lvalues */
3046 if (!(type
.t
& VT_ARRAY
))
3047 r
|= lvalue_type(type
.t
);
3048 memset(&ad
, 0, sizeof(AttributeDef
));
3049 decl_initializer_alloc(&type
, &ad
, r
, 1, 0, 0);
3054 } else if (tok
== '{') {
3055 /* save all registers */
3057 /* statement expression : we do not accept break/continue
3058 inside as GCC does */
3059 block(NULL
, NULL
, NULL
, NULL
, 0, 1);
3074 /* functions names must be treated as function pointers,
3075 except for unary '&' and sizeof. Since we consider that
3076 functions are not lvalues, we only have to handle it
3077 there and in function calls. */
3078 /* arrays can also be used although they are not lvalues */
3079 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
&&
3080 !(vtop
->type
.t
& VT_ARRAY
) && !(vtop
->type
.t
& VT_LLOCAL
))
3082 mk_pointer(&vtop
->type
);
3088 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
) {
3090 boolean
.t
= VT_BOOL
;
3092 vtop
->c
.i
= !vtop
->c
.i
;
3093 } else if ((vtop
->r
& VT_VALMASK
) == VT_CMP
)
3094 vtop
->c
.i
= vtop
->c
.i
^ 1;
3097 vseti(VT_JMP
, gtst(1, 0));
3108 /* in order to force cast, we add zero */
3110 if ((vtop
->type
.t
& VT_BTYPE
) == VT_PTR
)
3111 error("pointer not accepted for unary plus");
3121 parse_expr_type(&type
);
3125 size
= type_size(&type
, &align
);
3126 if (t
== TOK_SIZEOF
) {
3128 error("sizeof applied to an incomplete type");
3133 vtop
->type
.t
|= VT_UNSIGNED
;
3136 case TOK_builtin_types_compatible_p
:
3145 type1
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
3146 type2
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
3147 vpushi(is_compatible_types(&type1
, &type2
));
3150 case TOK_builtin_constant_p
:
3152 int saved_nocode_wanted
, res
;
3155 saved_nocode_wanted
= nocode_wanted
;
3158 res
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
3160 nocode_wanted
= saved_nocode_wanted
;
3165 case TOK_builtin_frame_address
:
3170 if (tok
!= TOK_CINT
) {
3171 error("__builtin_frame_address only takes integers");
3174 error("TCC only supports __builtin_frame_address(0)");
3180 vset(&type
, VT_LOCAL
, 0);
3183 #ifdef TCC_TARGET_X86_64
3184 case TOK_builtin_malloc
:
3186 goto tok_identifier
;
3187 case TOK_builtin_free
:
3189 goto tok_identifier
;
3206 goto tok_identifier
;
3208 /* allow to take the address of a label */
3209 if (tok
< TOK_UIDENT
)
3210 expect("label identifier");
3211 s
= label_find(tok
);
3213 s
= label_push(&global_label_stack
, tok
, LABEL_FORWARD
);
3215 if (s
->r
== LABEL_DECLARED
)
3216 s
->r
= LABEL_FORWARD
;
3219 s
->type
.t
= VT_VOID
;
3220 mk_pointer(&s
->type
);
3221 s
->type
.t
|= VT_STATIC
;
3223 vset(&s
->type
, VT_CONST
| VT_SYM
, 0);
3232 expect("identifier");
3236 error("'%s' undeclared", get_tok_str(t
, NULL
));
3237 /* for simple function calls, we tolerate undeclared
3238 external reference to int() function */
3239 if (tcc_state
->warn_implicit_function_declaration
)
3240 warning("implicit declaration of function '%s'",
3241 get_tok_str(t
, NULL
));
3242 s
= external_global_sym(t
, &func_old_type
, 0);
3244 if ((s
->type
.t
& (VT_STATIC
| VT_INLINE
| VT_BTYPE
)) ==
3245 (VT_STATIC
| VT_INLINE
| VT_FUNC
)) {
3246 /* if referencing an inline function, then we generate a
3247 symbol to it if not already done. It will have the
3248 effect to generate code for it at the end of the
3249 compilation unit. Inline function as always
3250 generated in the text section. */
3252 put_extern_sym(s
, text_section
, 0, 0);
3253 r
= VT_SYM
| VT_CONST
;
3257 vset(&s
->type
, r
, s
->c
);
3258 /* if forward reference, we must point to s */
3259 if (vtop
->r
& VT_SYM
) {
3266 /* post operations */
3268 if (tok
== TOK_INC
|| tok
== TOK_DEC
) {
3271 } else if (tok
== '.' || tok
== TOK_ARROW
) {
3274 if (tok
== TOK_ARROW
)
3276 qualifiers
= vtop
->type
.t
& (VT_CONSTANT
| VT_VOLATILE
);
3280 /* expect pointer on structure */
3281 if ((vtop
->type
.t
& VT_BTYPE
) != VT_STRUCT
)
3282 expect("struct or union");
3286 while ((s
= s
->next
) != NULL
) {
3291 error("field not found: %s", get_tok_str(tok
& ~SYM_FIELD
, NULL
));
3292 /* add field offset to pointer */
3293 vtop
->type
= char_pointer_type
; /* change type to 'char *' */
3296 /* change type to field type, and set to lvalue */
3297 vtop
->type
= s
->type
;
3298 vtop
->type
.t
|= qualifiers
;
3299 /* an array is never an lvalue */
3300 if (!(vtop
->type
.t
& VT_ARRAY
)) {
3301 vtop
->r
|= lvalue_type(vtop
->type
.t
);
3302 /* if bound checking, the referenced pointer must be checked */
3303 if (tcc_state
->do_bounds_check
)
3304 vtop
->r
|= VT_MUSTBOUND
;
3307 } else if (tok
== '[') {
3313 } else if (tok
== '(') {
3319 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
) {
3320 /* pointer test (no array accepted) */
3321 if ((vtop
->type
.t
& (VT_BTYPE
| VT_ARRAY
)) == VT_PTR
) {
3322 vtop
->type
= *pointed_type(&vtop
->type
);
3323 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
)
3327 expect("function pointer");
3330 vtop
->r
&= ~VT_LVAL
; /* no lvalue */
3332 /* get return type */
3335 sa
= s
->next
; /* first parameter */
3338 /* compute first implicit argument if a structure is returned */
3339 if ((s
->type
.t
& VT_BTYPE
) == VT_STRUCT
) {
3340 /* get some space for the returned structure */
3341 size
= type_size(&s
->type
, &align
);
3342 loc
= (loc
- size
) & -align
;
3344 ret
.r
= VT_LOCAL
| VT_LVAL
;
3345 /* pass it as 'int' to avoid structure arg passing
3347 vseti(VT_LOCAL
, loc
);
3352 /* return in register */
3353 if (is_float(ret
.type
.t
)) {
3354 ret
.r
= reg_fret(ret
.type
.t
);
3356 if ((ret
.type
.t
& VT_BTYPE
) == VT_LLONG
)
3365 gfunc_param_typed(s
, sa
);
3375 error("too few arguments to function");
3377 if (!nocode_wanted
) {
3378 gfunc_call(nb_args
);
3380 vtop
-= (nb_args
+ 1);
3383 vsetc(&ret
.type
, ret
.r
, &ret
.c
);
3391 static void uneq(void)
3397 (tok
>= TOK_A_MOD
&& tok
<= TOK_A_DIV
) ||
3398 tok
== TOK_A_XOR
|| tok
== TOK_A_OR
||
3399 tok
== TOK_A_SHL
|| tok
== TOK_A_SAR
) {
3414 static void expr_prod(void)
3419 while (tok
== '*' || tok
== '/' || tok
== '%') {
3427 static void expr_sum(void)
3432 while (tok
== '+' || tok
== '-') {
3440 static void expr_shift(void)
3445 while (tok
== TOK_SHL
|| tok
== TOK_SAR
) {
3453 static void expr_cmp(void)
3458 while ((tok
>= TOK_ULE
&& tok
<= TOK_GT
) ||
3459 tok
== TOK_ULT
|| tok
== TOK_UGE
) {
3467 static void expr_cmpeq(void)
3472 while (tok
== TOK_EQ
|| tok
== TOK_NE
) {
3480 static void expr_and(void)
3483 while (tok
== '&') {
3490 static void expr_xor(void)
3493 while (tok
== '^') {
3500 static void expr_or(void)
3503 while (tok
== '|') {
3510 /* XXX: fix this mess */
3511 static void expr_land_const(void)
3514 while (tok
== TOK_LAND
) {
3521 /* XXX: fix this mess */
3522 static void expr_lor_const(void)
3525 while (tok
== TOK_LOR
) {
3532 /* only used if non constant */
3533 static void expr_land(void)
3538 if (tok
== TOK_LAND
) {
3543 if (tok
!= TOK_LAND
) {
3553 static void expr_lor(void)
3558 if (tok
== TOK_LOR
) {
3563 if (tok
!= TOK_LOR
) {
3573 /* XXX: better constant handling */
3574 static void expr_eq(void)
3576 int tt
, u
, r1
, r2
, rc
, t1
, t2
, bt1
, bt2
;
3578 CType type
, type1
, type2
;
3585 boolean
.t
= VT_BOOL
;
3591 if (tok
!= ':' || !gnu_ext
) {
3606 if (vtop
!= vstack
) {
3607 /* needed to avoid having different registers saved in
3609 if (is_float(vtop
->type
.t
)) {
3611 #ifdef TCC_TARGET_X86_64
3612 if ((vtop
->type
.t
& VT_BTYPE
) == VT_LDOUBLE
) {
3622 if (tok
== ':' && gnu_ext
) {
3630 sv
= *vtop
; /* save value to handle it later */
3631 vtop
--; /* no vpop so that FP stack is not flushed */
3639 bt1
= t1
& VT_BTYPE
;
3641 bt2
= t2
& VT_BTYPE
;
3642 /* cast operands to correct type according to ISOC rules */
3643 if (is_float(bt1
) || is_float(bt2
)) {
3644 if (bt1
== VT_LDOUBLE
|| bt2
== VT_LDOUBLE
) {
3645 type
.t
= VT_LDOUBLE
;
3646 } else if (bt1
== VT_DOUBLE
|| bt2
== VT_DOUBLE
) {
3651 } else if (bt1
== VT_LLONG
|| bt2
== VT_LLONG
) {
3652 /* cast to biggest op */
3654 /* convert to unsigned if it does not fit in a long long */
3655 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
) ||
3656 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
))
3657 type
.t
|= VT_UNSIGNED
;
3658 } else if (bt1
== VT_PTR
|| bt2
== VT_PTR
) {
3659 /* XXX: test pointer compatibility */
3661 } else if (bt1
== VT_FUNC
|| bt2
== VT_FUNC
) {
3662 /* XXX: test function pointer compatibility */
3664 } else if (bt1
== VT_STRUCT
|| bt2
== VT_STRUCT
) {
3665 /* XXX: test structure compatibility */
3667 } else if (bt1
== VT_VOID
|| bt2
== VT_VOID
) {
3668 /* NOTE: as an extension, we accept void on only one side */
3671 /* integer operations */
3673 /* convert to unsigned if it does not fit in an integer */
3674 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
) ||
3675 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
))
3676 type
.t
|= VT_UNSIGNED
;
3679 /* now we convert second operand */
3681 if (VT_STRUCT
== (vtop
->type
.t
& VT_BTYPE
))
3684 if (is_float(type
.t
)) {
3686 #ifdef TCC_TARGET_X86_64
3687 if ((type
.t
& VT_BTYPE
) == VT_LDOUBLE
) {
3691 } else if ((type
.t
& VT_BTYPE
) == VT_LLONG
) {
3692 /* for long longs, we use fixed registers to avoid having
3693 to handle a complicated move */
3698 /* this is horrible, but we must also convert first
3702 /* put again first value and cast it */
3705 if (VT_STRUCT
== (vtop
->type
.t
& VT_BTYPE
))
3715 static void gexpr(void)
3726 /* parse an expression and return its type without any side effect. */
3727 static void expr_type(CType
*type
)
3729 int saved_nocode_wanted
;
3731 saved_nocode_wanted
= nocode_wanted
;
3736 nocode_wanted
= saved_nocode_wanted
;
3739 /* parse a unary expression and return its type without any side
3741 static void unary_type(CType
*type
)
3753 /* parse a constant expression and return value in vtop. */
3754 static void expr_const1(void)
3763 /* parse an integer constant and return its value. */
3764 static int expr_const(void)
3768 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) != VT_CONST
)
3769 expect("constant expression");
3775 /* return the label token if current token is a label, otherwise
3777 static int is_label(void)
3781 /* fast test first */
3782 if (tok
< TOK_UIDENT
)
3784 /* no need to save tokc because tok is an identifier */
3791 unget_tok(last_tok
);
3796 static void block(int *bsym
, int *csym
, int *case_sym
, int *def_sym
,
3797 int case_reg
, int is_expr
)
3802 /* generate line number info */
3803 if (tcc_state
->do_debug
&&
3804 (last_line_num
!= file
->line_num
|| last_ind
!= ind
)) {
3805 put_stabn(N_SLINE
, 0, file
->line_num
, ind
- func_ind
);
3807 last_line_num
= file
->line_num
;
3811 /* default return value is (void) */
3813 vtop
->type
.t
= VT_VOID
;
3816 if (tok
== TOK_IF
) {
3823 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, 0);
3825 if (c
== TOK_ELSE
) {
3829 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, 0);
3830 gsym(d
); /* patch else jmp */
3833 } else if (tok
== TOK_WHILE
) {
3841 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
3845 } else if (tok
== '{') {
3849 /* record local declaration stack position */
3851 llabel
= local_label_stack
;
3852 /* handle local labels declarations */
3853 if (tok
== TOK_LABEL
) {
3856 if (tok
< TOK_UIDENT
)
3857 expect("label identifier");
3858 label_push(&local_label_stack
, tok
, LABEL_DECLARED
);
3868 while (tok
!= '}') {
3873 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, is_expr
);
3876 /* pop locally defined labels */
3877 label_pop(&local_label_stack
, llabel
);
3878 /* pop locally defined symbols */
3880 /* XXX: this solution makes only valgrind happy...
3881 triggered by gcc.c-torture/execute/20000917-1.c */
3883 switch(vtop
->type
.t
& VT_BTYPE
) {
3888 for(p
=vtop
->type
.ref
;p
;p
=p
->prev
)
3890 error("unsupported expression type");
3893 sym_pop(&local_stack
, s
);
3895 } else if (tok
== TOK_RETURN
) {
3899 gen_assign_cast(&func_vt
);
3900 if ((func_vt
.t
& VT_BTYPE
) == VT_STRUCT
) {
3902 /* if returning structure, must copy it to implicit
3903 first pointer arg location */
3906 size
= type_size(&func_vt
,&align
);
3909 if((vtop
->r
!= (VT_LOCAL
| VT_LVAL
) || (vtop
->c
.i
& 3))
3913 loc
= (loc
- size
) & -4;
3916 vset(&type
, VT_LOCAL
| VT_LVAL
, addr
);
3919 vset(&int_type
, VT_LOCAL
| VT_LVAL
, addr
);
3921 vtop
->type
= int_type
;
3927 vset(&type
, VT_LOCAL
| VT_LVAL
, func_vc
);
3930 /* copy structure value to pointer */
3935 } else if (is_float(func_vt
.t
)) {
3936 gv(rc_fret(func_vt
.t
));
3940 vtop
--; /* NOT vpop() because on x86 it would flush the fp stack */
3943 rsym
= gjmp(rsym
); /* jmp */
3944 } else if (tok
== TOK_BREAK
) {
3947 error("cannot break");
3948 *bsym
= gjmp(*bsym
);
3951 } else if (tok
== TOK_CONTINUE
) {
3954 error("cannot continue");
3955 *csym
= gjmp(*csym
);
3958 } else if (tok
== TOK_FOR
) {
3985 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
3990 if (tok
== TOK_DO
) {
3995 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
4006 if (tok
== TOK_SWITCH
) {
4010 /* XXX: other types than integer */
4011 case_reg
= gv(RC_INT
);
4015 b
= gjmp(0); /* jump to first case */
4017 block(&a
, csym
, &b
, &c
, case_reg
, 0);
4018 /* if no default, jmp after switch */
4026 if (tok
== TOK_CASE
) {
4033 if (gnu_ext
&& tok
== TOK_DOTS
) {
4037 warning("empty case range");
4039 /* since a case is like a label, we must skip it with a jmp */
4046 *case_sym
= gtst(1, 0);
4049 *case_sym
= gtst(1, 0);
4053 *case_sym
= gtst(1, *case_sym
);
4058 goto block_after_label
;
4060 if (tok
== TOK_DEFAULT
) {
4066 error("too many 'default'");
4069 goto block_after_label
;
4071 if (tok
== TOK_GOTO
) {
4073 if (tok
== '*' && gnu_ext
) {
4077 if ((vtop
->type
.t
& VT_BTYPE
) != VT_PTR
)
4080 } else if (tok
>= TOK_UIDENT
) {
4081 s
= label_find(tok
);
4082 /* put forward definition if needed */
4084 s
= label_push(&global_label_stack
, tok
, LABEL_FORWARD
);
4086 if (s
->r
== LABEL_DECLARED
)
4087 s
->r
= LABEL_FORWARD
;
4089 /* label already defined */
4090 if (s
->r
& LABEL_FORWARD
)
4091 s
->jnext
= gjmp(s
->jnext
);
4093 gjmp_addr(s
->jnext
);
4096 expect("label identifier");
4099 } else if (tok
== TOK_ASM1
|| tok
== TOK_ASM2
|| tok
== TOK_ASM3
) {
4107 if (s
->r
== LABEL_DEFINED
)
4108 error("duplicate label '%s'", get_tok_str(s
->v
, NULL
));
4110 s
->r
= LABEL_DEFINED
;
4112 s
= label_push(&global_label_stack
, b
, LABEL_DEFINED
);
4115 /* we accept this, but it is a mistake */
4118 warning("deprecated use of label at end of compound statement");
4122 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, is_expr
);
4125 /* expression case */
4140 /* t is the array or struct type. c is the array or struct
4141 address. cur_index/cur_field is the pointer to the current
4142 value. 'size_only' is true if only size info is needed (only used
4144 static void decl_designator(CType
*type
, Section
*sec
, unsigned long c
,
4145 int *cur_index
, Sym
**cur_field
,
4149 int notfirst
, index
, index_last
, align
, l
, nb_elems
, elem_size
;
4155 if (gnu_ext
&& (l
= is_label()) != 0)
4157 while (tok
== '[' || tok
== '.') {
4159 if (!(type
->t
& VT_ARRAY
))
4160 expect("array type");
4163 index
= expr_const();
4164 if (index
< 0 || (s
->c
>= 0 && index
>= s
->c
))
4165 expect("invalid index");
4166 if (tok
== TOK_DOTS
&& gnu_ext
) {
4168 index_last
= expr_const();
4169 if (index_last
< 0 ||
4170 (s
->c
>= 0 && index_last
>= s
->c
) ||
4172 expect("invalid index");
4178 *cur_index
= index_last
;
4179 type
= pointed_type(type
);
4180 elem_size
= type_size(type
, &align
);
4181 c
+= index
* elem_size
;
4182 /* NOTE: we only support ranges for last designator */
4183 nb_elems
= index_last
- index
+ 1;
4184 if (nb_elems
!= 1) {
4193 if ((type
->t
& VT_BTYPE
) != VT_STRUCT
)
4194 expect("struct/union type");
4207 /* XXX: fix this mess by using explicit storage field */
4209 type1
.t
|= (type
->t
& ~VT_TYPE
);
4223 if (type
->t
& VT_ARRAY
) {
4225 type
= pointed_type(type
);
4226 c
+= index
* type_size(type
, &align
);
4230 error("too many field init");
4231 /* XXX: fix this mess by using explicit storage field */
4233 type1
.t
|= (type
->t
& ~VT_TYPE
);
4238 decl_initializer(type
, sec
, c
, 0, size_only
);
4240 /* XXX: make it more general */
4241 if (!size_only
&& nb_elems
> 1) {
4242 unsigned long c_end
;
4247 error("range init not supported yet for dynamic storage");
4248 c_end
= c
+ nb_elems
* elem_size
;
4249 if (c_end
> sec
->data_allocated
)
4250 section_realloc(sec
, c_end
);
4251 src
= sec
->data
+ c
;
4253 for(i
= 1; i
< nb_elems
; i
++) {
4255 memcpy(dst
, src
, elem_size
);
4261 #define EXPR_CONST 1
4264 /* store a value or an expression directly in global data or in local array */
4265 static void init_putv(CType
*type
, Section
*sec
, unsigned long c
,
4266 int v
, int expr_type
)
4268 int saved_global_expr
, bt
, bit_pos
, bit_size
;
4270 unsigned long long bit_mask
;
4278 /* compound literals must be allocated globally in this case */
4279 saved_global_expr
= global_expr
;
4282 global_expr
= saved_global_expr
;
4283 /* NOTE: symbols are accepted */
4284 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
)) != VT_CONST
)
4285 error("initializer element is not constant");
4293 dtype
.t
&= ~VT_CONSTANT
; /* need to do that to avoid false warning */
4296 /* XXX: not portable */
4297 /* XXX: generate error if incorrect relocation */
4298 gen_assign_cast(&dtype
);
4299 bt
= type
->t
& VT_BTYPE
;
4300 /* we'll write at most 12 bytes */
4301 if (c
+ 12 > sec
->data_allocated
) {
4302 section_realloc(sec
, c
+ 12);
4304 ptr
= sec
->data
+ c
;
4305 /* XXX: make code faster ? */
4306 if (!(type
->t
& VT_BITFIELD
)) {
4311 bit_pos
= (vtop
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4312 bit_size
= (vtop
->type
.t
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f;
4313 bit_mask
= (1LL << bit_size
) - 1;
4315 if ((vtop
->r
& VT_SYM
) &&
4321 (bt
== VT_INT
&& bit_size
!= 32)))
4322 error("initializer element is not computable at load time");
4325 vtop
->c
.i
= (vtop
->c
.i
!= 0);
4327 *(char *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4330 *(short *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4333 *(double *)ptr
= vtop
->c
.d
;
4336 *(long double *)ptr
= vtop
->c
.ld
;
4339 *(long long *)ptr
|= (vtop
->c
.ll
& bit_mask
) << bit_pos
;
4342 if (vtop
->r
& VT_SYM
) {
4343 greloc(sec
, vtop
->sym
, c
, R_DATA_32
);
4345 *(int *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4350 vset(&dtype
, VT_LOCAL
|VT_LVAL
, c
);
4357 /* put zeros for variable based init */
4358 static void init_putz(CType
*t
, Section
*sec
, unsigned long c
, int size
)
4361 /* nothing to do because globals are already set to zero */
4363 vpush_global_sym(&func_old_type
, TOK_memset
);
4371 /* 't' contains the type and storage info. 'c' is the offset of the
4372 object in section 'sec'. If 'sec' is NULL, it means stack based
4373 allocation. 'first' is true if array '{' must be read (multi
4374 dimension implicit array init handling). 'size_only' is true if
4375 size only evaluation is wanted (only for arrays). */
4376 static void decl_initializer(CType
*type
, Section
*sec
, unsigned long c
,
4377 int first
, int size_only
)
4379 int index
, array_length
, n
, no_oblock
, nb
, parlevel
, i
;
4380 int size1
, align1
, expr_type
;
4384 if (type
->t
& VT_ARRAY
) {
4388 t1
= pointed_type(type
);
4389 size1
= type_size(t1
, &align1
);
4392 if ((first
&& tok
!= TOK_LSTR
&& tok
!= TOK_STR
) ||
4398 /* only parse strings here if correct type (otherwise: handle
4399 them as ((w)char *) expressions */
4400 if ((tok
== TOK_LSTR
&&
4401 #ifdef TCC_TARGET_PE
4402 (t1
->t
& VT_BTYPE
) == VT_SHORT
&& (t1
->t
& VT_UNSIGNED
)
4404 (t1
->t
& VT_BTYPE
) == VT_INT
4406 ) || (tok
== TOK_STR
&& (t1
->t
& VT_BTYPE
) == VT_BYTE
)) {
4407 while (tok
== TOK_STR
|| tok
== TOK_LSTR
) {
4412 /* compute maximum number of chars wanted */
4414 cstr_len
= cstr
->size
;
4416 cstr_len
= cstr
->size
/ sizeof(nwchar_t
);
4419 if (n
>= 0 && nb
> (n
- array_length
))
4420 nb
= n
- array_length
;
4423 warning("initializer-string for array is too long");
4424 /* in order to go faster for common case (char
4425 string in global variable, we handle it
4427 if (sec
&& tok
== TOK_STR
&& size1
== 1) {
4428 memcpy(sec
->data
+ c
+ array_length
, cstr
->data
, nb
);
4432 ch
= ((unsigned char *)cstr
->data
)[i
];
4434 ch
= ((nwchar_t
*)cstr
->data
)[i
];
4435 init_putv(t1
, sec
, c
+ (array_length
+ i
) * size1
,
4443 /* only add trailing zero if enough storage (no
4444 warning in this case since it is standard) */
4445 if (n
< 0 || array_length
< n
) {
4447 init_putv(t1
, sec
, c
+ (array_length
* size1
), 0, EXPR_VAL
);
4453 while (tok
!= '}') {
4454 decl_designator(type
, sec
, c
, &index
, NULL
, size_only
);
4455 if (n
>= 0 && index
>= n
)
4456 error("index too large");
4457 /* must put zero in holes (note that doing it that way
4458 ensures that it even works with designators) */
4459 if (!size_only
&& array_length
< index
) {
4460 init_putz(t1
, sec
, c
+ array_length
* size1
,
4461 (index
- array_length
) * size1
);
4464 if (index
> array_length
)
4465 array_length
= index
;
4466 /* special test for multi dimensional arrays (may not
4467 be strictly correct if designators are used at the
4469 if (index
>= n
&& no_oblock
)
4478 /* put zeros at the end */
4479 if (!size_only
&& n
>= 0 && array_length
< n
) {
4480 init_putz(t1
, sec
, c
+ array_length
* size1
,
4481 (n
- array_length
) * size1
);
4483 /* patch type size if needed */
4485 s
->c
= array_length
;
4486 } else if ((type
->t
& VT_BTYPE
) == VT_STRUCT
&&
4487 (sec
|| !first
|| tok
== '{')) {
4490 /* NOTE: the previous test is a specific case for automatic
4491 struct/union init */
4492 /* XXX: union needs only one init */
4494 /* XXX: this test is incorrect for local initializers
4495 beginning with ( without {. It would be much more difficult
4496 to do it correctly (ideally, the expression parser should
4497 be used in all cases) */
4503 while (tok
== '(') {
4507 if (!parse_btype(&type1
, &ad1
))
4509 type_decl(&type1
, &ad1
, &n
, TYPE_ABSTRACT
);
4511 if (!is_assignable_types(type
, &type1
))
4512 error("invalid type for cast");
4517 if (first
|| tok
== '{') {
4526 while (tok
!= '}') {
4527 decl_designator(type
, sec
, c
, NULL
, &f
, size_only
);
4529 if (!size_only
&& array_length
< index
) {
4530 init_putz(type
, sec
, c
+ array_length
,
4531 index
- array_length
);
4533 index
= index
+ type_size(&f
->type
, &align1
);
4534 if (index
> array_length
)
4535 array_length
= index
;
4537 /* gr: skip fields from same union - ugly. */
4539 ///printf("index: %2d %08x -- %2d %08x\n", f->c, f->type.t, f->next->c, f->next->type.t);
4540 /* test for same offset */
4541 if (f
->next
->c
!= f
->c
)
4543 /* if yes, test for bitfield shift */
4544 if ((f
->type
.t
& VT_BITFIELD
) && (f
->next
->type
.t
& VT_BITFIELD
)) {
4545 int bit_pos_1
= (f
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4546 int bit_pos_2
= (f
->next
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4547 //printf("bitfield %d %d\n", bit_pos_1, bit_pos_2);
4548 if (bit_pos_1
!= bit_pos_2
)
4555 if (no_oblock
&& f
== NULL
)
4561 /* put zeros at the end */
4562 if (!size_only
&& array_length
< n
) {
4563 init_putz(type
, sec
, c
+ array_length
,
4572 } else if (tok
== '{') {
4574 decl_initializer(type
, sec
, c
, first
, size_only
);
4576 } else if (size_only
) {
4577 /* just skip expression */
4579 while ((parlevel
> 0 || (tok
!= '}' && tok
!= ',')) &&
4583 else if (tok
== ')')
4588 /* currently, we always use constant expression for globals
4589 (may change for scripting case) */
4590 expr_type
= EXPR_CONST
;
4592 expr_type
= EXPR_ANY
;
4593 init_putv(type
, sec
, c
, 0, expr_type
);
4597 /* parse an initializer for type 't' if 'has_init' is non zero, and
4598 allocate space in local or global data space ('r' is either
4599 VT_LOCAL or VT_CONST). If 'v' is non zero, then an associated
4600 variable 'v' of scope 'scope' is declared before initializers are
4601 parsed. If 'v' is zero, then a reference to the new object is put
4602 in the value stack. If 'has_init' is 2, a special parsing is done
4603 to handle string constants. */
4604 static void decl_initializer_alloc(CType
*type
, AttributeDef
*ad
, int r
,
4605 int has_init
, int v
, int scope
)
4607 int size
, align
, addr
, data_offset
;
4609 ParseState saved_parse_state
= {0};
4610 TokenString init_str
;
4613 size
= type_size(type
, &align
);
4614 /* If unknown size, we must evaluate it before
4615 evaluating initializers because
4616 initializers can generate global data too
4617 (e.g. string pointers or ISOC99 compound
4618 literals). It also simplifies local
4619 initializers handling */
4620 tok_str_new(&init_str
);
4623 error("unknown type size");
4624 /* get all init string */
4625 if (has_init
== 2) {
4626 /* only get strings */
4627 while (tok
== TOK_STR
|| tok
== TOK_LSTR
) {
4628 tok_str_add_tok(&init_str
);
4633 while (level
> 0 || (tok
!= ',' && tok
!= ';')) {
4635 error("unexpected end of file in initializer");
4636 tok_str_add_tok(&init_str
);
4639 else if (tok
== '}') {
4649 tok_str_add(&init_str
, -1);
4650 tok_str_add(&init_str
, 0);
4653 save_parse_state(&saved_parse_state
);
4655 macro_ptr
= init_str
.str
;
4657 decl_initializer(type
, NULL
, 0, 1, 1);
4658 /* prepare second initializer parsing */
4659 macro_ptr
= init_str
.str
;
4662 /* if still unknown size, error */
4663 size
= type_size(type
, &align
);
4665 error("unknown type size");
4667 /* take into account specified alignment if bigger */
4669 if (ad
->aligned
> align
)
4670 align
= ad
->aligned
;
4671 } else if (ad
->packed
) {
4674 if ((r
& VT_VALMASK
) == VT_LOCAL
) {
4676 if (tcc_state
->do_bounds_check
&& (type
->t
& VT_ARRAY
))
4678 loc
= (loc
- size
) & -align
;
4680 /* handles bounds */
4681 /* XXX: currently, since we do only one pass, we cannot track
4682 '&' operators, so we add only arrays */
4683 if (tcc_state
->do_bounds_check
&& (type
->t
& VT_ARRAY
)) {
4684 unsigned long *bounds_ptr
;
4685 /* add padding between regions */
4687 /* then add local bound info */
4688 bounds_ptr
= section_ptr_add(lbounds_section
, 2 * sizeof(unsigned long));
4689 bounds_ptr
[0] = addr
;
4690 bounds_ptr
[1] = size
;
4693 /* local variable */
4694 sym_push(v
, type
, r
, addr
);
4696 /* push local reference */
4697 vset(type
, r
, addr
);
4703 if (v
&& scope
== VT_CONST
) {
4704 /* see if the symbol was already defined */
4707 if (!is_compatible_types(&sym
->type
, type
))
4708 error("incompatible types for redefinition of '%s'",
4709 get_tok_str(v
, NULL
));
4710 if (sym
->type
.t
& VT_EXTERN
) {
4711 /* if the variable is extern, it was not allocated */
4712 sym
->type
.t
&= ~VT_EXTERN
;
4713 /* set array size if it was ommited in extern
4715 if ((sym
->type
.t
& VT_ARRAY
) &&
4716 sym
->type
.ref
->c
< 0 &&
4718 sym
->type
.ref
->c
= type
->ref
->c
;
4720 /* we accept several definitions of the same
4721 global variable. this is tricky, because we
4722 must play with the SHN_COMMON type of the symbol */
4723 /* XXX: should check if the variable was already
4724 initialized. It is incorrect to initialized it
4726 /* no init data, we won't add more to the symbol */
4733 /* allocate symbol in corresponding section */
4738 else if (tcc_state
->nocommon
)
4742 data_offset
= sec
->data_offset
;
4743 data_offset
= (data_offset
+ align
- 1) & -align
;
4745 /* very important to increment global pointer at this time
4746 because initializers themselves can create new initializers */
4747 data_offset
+= size
;
4748 /* add padding if bound check */
4749 if (tcc_state
->do_bounds_check
)
4751 sec
->data_offset
= data_offset
;
4752 /* allocate section space to put the data */
4753 if (sec
->sh_type
!= SHT_NOBITS
&&
4754 data_offset
> sec
->data_allocated
)
4755 section_realloc(sec
, data_offset
);
4756 /* align section if needed */
4757 if (align
> sec
->sh_addralign
)
4758 sec
->sh_addralign
= align
;
4760 addr
= 0; /* avoid warning */
4764 if (scope
!= VT_CONST
|| !sym
) {
4765 sym
= sym_push(v
, type
, r
| VT_SYM
, 0);
4767 /* update symbol definition */
4769 put_extern_sym(sym
, sec
, addr
, size
);
4772 /* put a common area */
4773 put_extern_sym(sym
, NULL
, align
, size
);
4774 /* XXX: find a nicer way */
4775 esym
= &((ElfW(Sym
) *)symtab_section
->data
)[sym
->c
];
4776 esym
->st_shndx
= SHN_COMMON
;
4781 /* push global reference */
4782 sym
= get_sym_ref(type
, sec
, addr
, size
);
4784 vsetc(type
, VT_CONST
| VT_SYM
, &cval
);
4788 /* handles bounds now because the symbol must be defined
4789 before for the relocation */
4790 if (tcc_state
->do_bounds_check
) {
4791 unsigned long *bounds_ptr
;
4793 greloc(bounds_section
, sym
, bounds_section
->data_offset
, R_DATA_32
);
4794 /* then add global bound info */
4795 bounds_ptr
= section_ptr_add(bounds_section
, 2 * sizeof(long));
4796 bounds_ptr
[0] = 0; /* relocated */
4797 bounds_ptr
[1] = size
;
4801 decl_initializer(type
, sec
, addr
, 1, 0);
4802 /* restore parse state if needed */
4804 tok_str_free(init_str
.str
);
4805 restore_parse_state(&saved_parse_state
);
4811 void put_func_debug(Sym
*sym
)
4816 /* XXX: we put here a dummy type */
4817 snprintf(buf
, sizeof(buf
), "%s:%c1",
4818 funcname
, sym
->type
.t
& VT_STATIC
? 'f' : 'F');
4819 put_stabs_r(buf
, N_FUN
, 0, file
->line_num
, 0,
4820 cur_text_section
, sym
->c
);
4821 /* //gr gdb wants a line at the function */
4822 put_stabn(N_SLINE
, 0, file
->line_num
, 0);
4827 /* parse an old style function declaration list */
4828 /* XXX: check multiple parameter */
4829 static void func_decl_list(Sym
*func_sym
)
4836 /* parse each declaration */
4837 while (tok
!= '{' && tok
!= ';' && tok
!= ',' && tok
!= TOK_EOF
) {
4838 if (!parse_btype(&btype
, &ad
))
4839 expect("declaration list");
4840 if (((btype
.t
& VT_BTYPE
) == VT_ENUM
||
4841 (btype
.t
& VT_BTYPE
) == VT_STRUCT
) &&
4843 /* we accept no variable after */
4847 type_decl(&type
, &ad
, &v
, TYPE_DIRECT
);
4848 /* find parameter in function parameter list */
4851 if ((s
->v
& ~SYM_FIELD
) == v
)
4855 error("declaration for parameter '%s' but no such parameter",
4856 get_tok_str(v
, NULL
));
4858 /* check that no storage specifier except 'register' was given */
4859 if (type
.t
& VT_STORAGE
)
4860 error("storage class specified for '%s'", get_tok_str(v
, NULL
));
4861 convert_parameter_type(&type
);
4862 /* we can add the type (NOTE: it could be local to the function) */
4864 /* accept other parameters */
4875 /* parse a function defined by symbol 'sym' and generate its code in
4876 'cur_text_section' */
4877 static void gen_function(Sym
*sym
)
4879 int saved_nocode_wanted
= nocode_wanted
;
4881 ind
= cur_text_section
->data_offset
;
4882 /* NOTE: we patch the symbol size later */
4883 put_extern_sym(sym
, cur_text_section
, ind
, 0);
4884 funcname
= get_tok_str(sym
->v
, NULL
);
4886 /* put debug symbol */
4887 if (tcc_state
->do_debug
)
4888 put_func_debug(sym
);
4889 /* push a dummy symbol to enable local sym storage */
4890 sym_push2(&local_stack
, SYM_FIELD
, 0, 0);
4891 gfunc_prolog(&sym
->type
);
4893 block(NULL
, NULL
, NULL
, NULL
, 0, 0);
4896 cur_text_section
->data_offset
= ind
;
4897 label_pop(&global_label_stack
, NULL
);
4898 sym_pop(&local_stack
, NULL
); /* reset local stack */
4899 /* end of function */
4900 /* patch symbol size */
4901 ((ElfW(Sym
) *)symtab_section
->data
)[sym
->c
].st_size
=
4903 if (tcc_state
->do_debug
) {
4904 put_stabn(N_FUN
, 0, 0, ind
- func_ind
);
4906 /* It's better to crash than to generate wrong code */
4907 cur_text_section
= NULL
;
4908 funcname
= ""; /* for safety */
4909 func_vt
.t
= VT_VOID
; /* for safety */
4910 ind
= 0; /* for safety */
4911 nocode_wanted
= saved_nocode_wanted
;
4914 static void gen_inline_functions(void)
4917 int *str
, inline_generated
, i
;
4918 struct InlineFunc
*fn
;
4920 /* iterate while inline function are referenced */
4922 inline_generated
= 0;
4923 for (i
= 0; i
< tcc_state
->nb_inline_fns
; ++i
) {
4924 fn
= tcc_state
->inline_fns
[i
];
4926 if (sym
&& sym
->c
) {
4927 /* the function was used: generate its code and
4928 convert it to a normal function */
4929 str
= fn
->token_str
;
4932 strcpy(file
->filename
, fn
->filename
);
4933 sym
->r
= VT_SYM
| VT_CONST
;
4934 sym
->type
.t
&= ~VT_INLINE
;
4938 cur_text_section
= text_section
;
4940 macro_ptr
= NULL
; /* fail safe */
4943 inline_generated
= 1;
4946 if (!inline_generated
)
4949 dynarray_reset(&tcc_state
->inline_fns
, &tcc_state
->nb_inline_fns
);
4952 /* 'l' is VT_LOCAL or VT_CONST to define default storage type */
4953 static void decl(int l
)
4961 if (!parse_btype(&btype
, &ad
)) {
4962 /* skip redundant ';' */
4963 /* XXX: find more elegant solution */
4968 if (l
== VT_CONST
&&
4969 (tok
== TOK_ASM1
|| tok
== TOK_ASM2
|| tok
== TOK_ASM3
)) {
4970 /* global asm block */
4974 /* special test for old K&R protos without explicit int
4975 type. Only accepted when defining global data */
4976 if (l
== VT_LOCAL
|| tok
< TOK_DEFINE
)
4980 if (((btype
.t
& VT_BTYPE
) == VT_ENUM
||
4981 (btype
.t
& VT_BTYPE
) == VT_STRUCT
) &&
4983 /* we accept no variable after */
4987 while (1) { /* iterate thru each declaration */
4989 type_decl(&type
, &ad
, &v
, TYPE_DIRECT
);
4993 type_to_str(buf
, sizeof(buf
), t
, get_tok_str(v
, NULL
));
4994 printf("type = '%s'\n", buf
);
4997 if ((type
.t
& VT_BTYPE
) == VT_FUNC
) {
4998 /* if old style function prototype, we accept a
5001 if (sym
->c
== FUNC_OLD
)
5002 func_decl_list(sym
);
5007 error("cannot use local functions");
5008 if ((type
.t
& VT_BTYPE
) != VT_FUNC
)
5009 expect("function definition");
5011 /* reject abstract declarators in function definition */
5013 while ((sym
= sym
->next
) != NULL
)
5014 if (!(sym
->v
& ~SYM_FIELD
))
5015 expect("identifier");
5017 /* XXX: cannot do better now: convert extern line to static inline */
5018 if ((type
.t
& (VT_EXTERN
| VT_INLINE
)) == (VT_EXTERN
| VT_INLINE
))
5019 type
.t
= (type
.t
& ~VT_EXTERN
) | VT_STATIC
;
5023 if ((sym
->type
.t
& VT_BTYPE
) != VT_FUNC
)
5026 r
= sym
->type
.ref
->r
;
5027 /* use func_call from prototype if not defined */
5028 if (FUNC_CALL(r
) != FUNC_CDECL
5029 && FUNC_CALL(type
.ref
->r
) == FUNC_CDECL
)
5030 FUNC_CALL(type
.ref
->r
) = FUNC_CALL(r
);
5032 /* use export from prototype */
5034 FUNC_EXPORT(type
.ref
->r
) = 1;
5036 /* use static from prototype */
5037 if (sym
->type
.t
& VT_STATIC
)
5038 type
.t
= (type
.t
& ~VT_EXTERN
) | VT_STATIC
;
5040 if (!is_compatible_types(&sym
->type
, &type
)) {
5042 error("incompatible types for redefinition of '%s'",
5043 get_tok_str(v
, NULL
));
5045 /* if symbol is already defined, then put complete type */
5048 /* put function symbol */
5049 sym
= global_identifier_push(v
, type
.t
, 0);
5050 sym
->type
.ref
= type
.ref
;
5053 /* static inline functions are just recorded as a kind
5054 of macro. Their code will be emitted at the end of
5055 the compilation unit only if they are used */
5056 if ((type
.t
& (VT_INLINE
| VT_STATIC
)) ==
5057 (VT_INLINE
| VT_STATIC
)) {
5058 TokenString func_str
;
5060 struct InlineFunc
*fn
;
5061 const char *filename
;
5063 tok_str_new(&func_str
);
5069 error("unexpected end of file");
5070 tok_str_add_tok(&func_str
);
5075 } else if (t
== '}') {
5077 if (block_level
== 0)
5081 tok_str_add(&func_str
, -1);
5082 tok_str_add(&func_str
, 0);
5083 filename
= file
? file
->filename
: "";
5084 fn
= tcc_malloc(sizeof *fn
+ strlen(filename
));
5085 strcpy(fn
->filename
, filename
);
5087 fn
->token_str
= func_str
.str
;
5088 dynarray_add((void ***)&tcc_state
->inline_fns
, &tcc_state
->nb_inline_fns
, fn
);
5091 /* compute text section */
5092 cur_text_section
= ad
.section
;
5093 if (!cur_text_section
)
5094 cur_text_section
= text_section
;
5095 sym
->r
= VT_SYM
| VT_CONST
;
5100 if (btype
.t
& VT_TYPEDEF
) {
5101 /* save typedefed type */
5102 /* XXX: test storage specifiers ? */
5103 sym
= sym_push(v
, &type
, 0, 0);
5104 sym
->type
.t
|= VT_TYPEDEF
;
5105 } else if ((type
.t
& VT_BTYPE
) == VT_FUNC
) {
5106 /* external function definition */
5107 /* specific case for func_call attribute */
5109 type
.ref
->r
= ad
.func_attr
;
5110 external_sym(v
, &type
, 0);
5112 /* not lvalue if array */
5114 if (!(type
.t
& VT_ARRAY
))
5115 r
|= lvalue_type(type
.t
);
5116 has_init
= (tok
== '=');
5117 if ((btype
.t
& VT_EXTERN
) ||
5118 ((type
.t
& VT_ARRAY
) && (type
.t
& VT_STATIC
) &&
5119 !has_init
&& l
== VT_CONST
&& type
.ref
->c
< 0)) {
5120 /* external variable */
5121 /* NOTE: as GCC, uninitialized global static
5122 arrays of null size are considered as
5124 external_sym(v
, &type
, r
);
5126 type
.t
|= (btype
.t
& VT_STATIC
); /* Retain "static". */
5127 if (type
.t
& VT_STATIC
)
5133 decl_initializer_alloc(&type
, &ad
, r
,