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
)) == (VT_CONST
| VT_SYM
)
1104 && !(vtop
[-1].sym
->type
.t
& VT_IMPORT
))
1106 (vtop
[-1].r
& (VT_VALMASK
| VT_LVAL
)) == VT_LOCAL
)) {
1107 /* symbol + constant case */
1114 if (!nocode_wanted
) {
1115 /* call low level op generator */
1116 if (t1
== VT_LLONG
|| t2
== VT_LLONG
)
1127 /* generate a floating point operation with constant propagation */
1128 void gen_opif(int op
)
1136 /* currently, we cannot do computations with forward symbols */
1137 c1
= (v1
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1138 c2
= (v2
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1140 if (v1
->type
.t
== VT_FLOAT
) {
1143 } else if (v1
->type
.t
== VT_DOUBLE
) {
1151 /* NOTE: we only do constant propagation if finite number (not
1152 NaN or infinity) (ANSI spec) */
1153 if (!ieee_finite(f1
) || !ieee_finite(f2
))
1157 case '+': f1
+= f2
; break;
1158 case '-': f1
-= f2
; break;
1159 case '*': f1
*= f2
; break;
1163 error("division by zero in constant");
1168 /* XXX: also handles tests ? */
1172 /* XXX: overflow test ? */
1173 if (v1
->type
.t
== VT_FLOAT
) {
1175 } else if (v1
->type
.t
== VT_DOUBLE
) {
1183 if (!nocode_wanted
) {
1191 static int pointed_size(CType
*type
)
1194 return type_size(pointed_type(type
), &align
);
1197 static inline int is_null_pointer(SValue
*p
)
1199 if ((p
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) != VT_CONST
)
1201 return ((p
->type
.t
& VT_BTYPE
) == VT_INT
&& p
->c
.i
== 0) ||
1202 ((p
->type
.t
& VT_BTYPE
) == VT_LLONG
&& p
->c
.ll
== 0);
1205 static inline int is_integer_btype(int bt
)
1207 return (bt
== VT_BYTE
|| bt
== VT_SHORT
||
1208 bt
== VT_INT
|| bt
== VT_LLONG
);
1211 /* check types for comparison or substraction of pointers */
1212 static void check_comparison_pointer_types(SValue
*p1
, SValue
*p2
, int op
)
1214 CType
*type1
, *type2
, tmp_type1
, tmp_type2
;
1217 /* null pointers are accepted for all comparisons as gcc */
1218 if (is_null_pointer(p1
) || is_null_pointer(p2
))
1222 bt1
= type1
->t
& VT_BTYPE
;
1223 bt2
= type2
->t
& VT_BTYPE
;
1224 /* accept comparison between pointer and integer with a warning */
1225 if ((is_integer_btype(bt1
) || is_integer_btype(bt2
)) && op
!= '-') {
1226 if (op
!= TOK_LOR
&& op
!= TOK_LAND
)
1227 warning("comparison between pointer and integer");
1231 /* both must be pointers or implicit function pointers */
1232 if (bt1
== VT_PTR
) {
1233 type1
= pointed_type(type1
);
1234 } else if (bt1
!= VT_FUNC
)
1235 goto invalid_operands
;
1237 if (bt2
== VT_PTR
) {
1238 type2
= pointed_type(type2
);
1239 } else if (bt2
!= VT_FUNC
) {
1241 error("invalid operands to binary %s", get_tok_str(op
, NULL
));
1243 if ((type1
->t
& VT_BTYPE
) == VT_VOID
||
1244 (type2
->t
& VT_BTYPE
) == VT_VOID
)
1248 tmp_type1
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1249 tmp_type2
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1250 if (!is_compatible_types(&tmp_type1
, &tmp_type2
)) {
1251 /* gcc-like error if '-' is used */
1253 goto invalid_operands
;
1255 warning("comparison of distinct pointer types lacks a cast");
1259 /* generic gen_op: handles types problems */
1262 int u
, t1
, t2
, bt1
, bt2
, t
;
1265 t1
= vtop
[-1].type
.t
;
1266 t2
= vtop
[0].type
.t
;
1267 bt1
= t1
& VT_BTYPE
;
1268 bt2
= t2
& VT_BTYPE
;
1270 if (bt1
== VT_PTR
|| bt2
== VT_PTR
) {
1271 /* at least one operand is a pointer */
1272 /* relationnal op: must be both pointers */
1273 if (op
>= TOK_ULT
&& op
<= TOK_LOR
) {
1274 check_comparison_pointer_types(vtop
- 1, vtop
, op
);
1275 /* pointers are handled are unsigned */
1276 #ifdef TCC_TARGET_X86_64
1277 t
= VT_LLONG
| VT_UNSIGNED
;
1279 t
= VT_INT
| VT_UNSIGNED
;
1283 /* if both pointers, then it must be the '-' op */
1284 if (bt1
== VT_PTR
&& bt2
== VT_PTR
) {
1286 error("cannot use pointers here");
1287 check_comparison_pointer_types(vtop
- 1, vtop
, op
);
1288 /* XXX: check that types are compatible */
1289 u
= pointed_size(&vtop
[-1].type
);
1291 /* set to integer type */
1292 #ifdef TCC_TARGET_X86_64
1293 vtop
->type
.t
= VT_LLONG
;
1295 vtop
->type
.t
= VT_INT
;
1300 /* exactly one pointer : must be '+' or '-'. */
1301 if (op
!= '-' && op
!= '+')
1302 error("cannot use pointers here");
1303 /* Put pointer as first operand */
1304 if (bt2
== VT_PTR
) {
1308 type1
= vtop
[-1].type
;
1309 type1
.t
&= ~VT_ARRAY
;
1310 #ifdef TCC_TARGET_X86_64
1311 vpushll(pointed_size(&vtop
[-1].type
));
1313 /* XXX: cast to int ? (long long case) */
1314 vpushi(pointed_size(&vtop
[-1].type
));
1317 #ifdef CONFIG_TCC_BCHECK
1318 /* if evaluating constant expression, no code should be
1319 generated, so no bound check */
1320 if (tcc_state
->do_bounds_check
&& !const_wanted
) {
1321 /* if bounded pointers, we generate a special code to
1328 gen_bounded_ptr_add();
1334 /* put again type if gen_opic() swaped operands */
1337 } else if (is_float(bt1
) || is_float(bt2
)) {
1338 /* compute bigger type and do implicit casts */
1339 if (bt1
== VT_LDOUBLE
|| bt2
== VT_LDOUBLE
) {
1341 } else if (bt1
== VT_DOUBLE
|| bt2
== VT_DOUBLE
) {
1346 /* floats can only be used for a few operations */
1347 if (op
!= '+' && op
!= '-' && op
!= '*' && op
!= '/' &&
1348 (op
< TOK_ULT
|| op
> TOK_GT
))
1349 error("invalid operands for binary operation");
1351 } else if (bt1
== VT_LLONG
|| bt2
== VT_LLONG
) {
1352 /* cast to biggest op */
1354 /* convert to unsigned if it does not fit in a long long */
1355 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
) ||
1356 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
))
1360 /* integer operations */
1362 /* convert to unsigned if it does not fit in an integer */
1363 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
) ||
1364 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
))
1367 /* XXX: currently, some unsigned operations are explicit, so
1368 we modify them here */
1369 if (t
& VT_UNSIGNED
) {
1376 else if (op
== TOK_LT
)
1378 else if (op
== TOK_GT
)
1380 else if (op
== TOK_LE
)
1382 else if (op
== TOK_GE
)
1389 /* special case for shifts and long long: we keep the shift as
1391 if (op
== TOK_SHR
|| op
== TOK_SAR
|| op
== TOK_SHL
)
1398 if (op
>= TOK_ULT
&& op
<= TOK_GT
) {
1399 /* relationnal op: the result is an int */
1400 vtop
->type
.t
= VT_INT
;
1407 #ifndef TCC_TARGET_ARM
1408 /* generic itof for unsigned long long case */
1409 void gen_cvt_itof1(int t
)
1411 if ((vtop
->type
.t
& (VT_BTYPE
| VT_UNSIGNED
)) ==
1412 (VT_LLONG
| VT_UNSIGNED
)) {
1415 vpush_global_sym(&func_old_type
, TOK___floatundisf
);
1416 #if LDOUBLE_SIZE != 8
1417 else if (t
== VT_LDOUBLE
)
1418 vpush_global_sym(&func_old_type
, TOK___floatundixf
);
1421 vpush_global_sym(&func_old_type
, TOK___floatundidf
);
1425 vtop
->r
= reg_fret(t
);
1432 /* generic ftoi for unsigned long long case */
1433 void gen_cvt_ftoi1(int t
)
1437 if (t
== (VT_LLONG
| VT_UNSIGNED
)) {
1438 /* not handled natively */
1439 st
= vtop
->type
.t
& VT_BTYPE
;
1441 vpush_global_sym(&func_old_type
, TOK___fixunssfdi
);
1442 #if LDOUBLE_SIZE != 8
1443 else if (st
== VT_LDOUBLE
)
1444 vpush_global_sym(&func_old_type
, TOK___fixunsxfdi
);
1447 vpush_global_sym(&func_old_type
, TOK___fixunsdfdi
);
1452 vtop
->r2
= REG_LRET
;
1458 /* force char or short cast */
1459 void force_charshort_cast(int t
)
1463 /* XXX: add optimization if lvalue : just change type and offset */
1468 if (t
& VT_UNSIGNED
) {
1469 vpushi((1 << bits
) - 1);
1475 /* result must be signed or the SAR is converted to an SHL
1476 This was not the case when "t" was a signed short
1477 and the last value on the stack was an unsigned int */
1478 vtop
->type
.t
&= ~VT_UNSIGNED
;
1484 /* cast 'vtop' to 'type'. Casting to bitfields is forbidden. */
1485 static void gen_cast(CType
*type
)
1487 int sbt
, dbt
, sf
, df
, c
, p
;
1489 /* special delayed cast for char/short */
1490 /* XXX: in some cases (multiple cascaded casts), it may still
1492 if (vtop
->r
& VT_MUSTCAST
) {
1493 vtop
->r
&= ~VT_MUSTCAST
;
1494 force_charshort_cast(vtop
->type
.t
);
1497 /* bitfields first get cast to ints */
1498 if (vtop
->type
.t
& VT_BITFIELD
) {
1502 dbt
= type
->t
& (VT_BTYPE
| VT_UNSIGNED
);
1503 sbt
= vtop
->type
.t
& (VT_BTYPE
| VT_UNSIGNED
);
1508 c
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
1509 p
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == (VT_CONST
| VT_SYM
);
1511 /* constant case: we can do it now */
1512 /* XXX: in ISOC, cannot do it if error in convert */
1513 if (sbt
== VT_FLOAT
)
1514 vtop
->c
.ld
= vtop
->c
.f
;
1515 else if (sbt
== VT_DOUBLE
)
1516 vtop
->c
.ld
= vtop
->c
.d
;
1519 if ((sbt
& VT_BTYPE
) == VT_LLONG
) {
1520 if (sbt
& VT_UNSIGNED
)
1521 vtop
->c
.ld
= vtop
->c
.ull
;
1523 vtop
->c
.ld
= vtop
->c
.ll
;
1525 if (sbt
& VT_UNSIGNED
)
1526 vtop
->c
.ld
= vtop
->c
.ui
;
1528 vtop
->c
.ld
= vtop
->c
.i
;
1531 if (dbt
== VT_FLOAT
)
1532 vtop
->c
.f
= (float)vtop
->c
.ld
;
1533 else if (dbt
== VT_DOUBLE
)
1534 vtop
->c
.d
= (double)vtop
->c
.ld
;
1535 } else if (sf
&& dbt
== (VT_LLONG
|VT_UNSIGNED
)) {
1536 vtop
->c
.ull
= (unsigned long long)vtop
->c
.ld
;
1537 } else if (sf
&& dbt
== VT_BOOL
) {
1538 vtop
->c
.i
= (vtop
->c
.ld
!= 0);
1541 vtop
->c
.ll
= (long long)vtop
->c
.ld
;
1542 else if (sbt
== (VT_LLONG
|VT_UNSIGNED
))
1543 vtop
->c
.ll
= vtop
->c
.ull
;
1544 else if (sbt
& VT_UNSIGNED
)
1545 vtop
->c
.ll
= vtop
->c
.ui
;
1546 else if (sbt
!= VT_LLONG
)
1547 vtop
->c
.ll
= vtop
->c
.i
;
1549 if (dbt
== (VT_LLONG
|VT_UNSIGNED
))
1550 vtop
->c
.ull
= vtop
->c
.ll
;
1551 else if (dbt
== VT_BOOL
)
1552 vtop
->c
.i
= (vtop
->c
.ll
!= 0);
1553 else if (dbt
!= VT_LLONG
) {
1555 if ((dbt
& VT_BTYPE
) == VT_BYTE
)
1557 else if ((dbt
& VT_BTYPE
) == VT_SHORT
)
1560 if(dbt
& VT_UNSIGNED
)
1561 vtop
->c
.ui
= ((unsigned int)vtop
->c
.ll
<< s
) >> s
;
1563 vtop
->c
.i
= ((int)vtop
->c
.ll
<< s
) >> s
;
1566 } else if (p
&& dbt
== VT_BOOL
) {
1569 } else if (!nocode_wanted
) {
1570 /* non constant case: generate code */
1572 /* convert from fp to fp */
1575 /* convert int to fp */
1578 /* convert fp to int */
1579 if (dbt
== VT_BOOL
) {
1583 /* we handle char/short/etc... with generic code */
1584 if (dbt
!= (VT_INT
| VT_UNSIGNED
) &&
1585 dbt
!= (VT_LLONG
| VT_UNSIGNED
) &&
1589 if (dbt
== VT_INT
&& (type
->t
& (VT_BTYPE
| VT_UNSIGNED
)) != dbt
) {
1590 /* additional cast for char/short... */
1595 #ifndef TCC_TARGET_X86_64
1596 } else if ((dbt
& VT_BTYPE
) == VT_LLONG
) {
1597 if ((sbt
& VT_BTYPE
) != VT_LLONG
) {
1598 /* scalar to long long */
1599 /* machine independent conversion */
1601 /* generate high word */
1602 if (sbt
== (VT_INT
| VT_UNSIGNED
)) {
1606 if (sbt
== VT_PTR
) {
1607 /* cast from pointer to int before we apply
1608 shift operation, which pointers don't support*/
1609 gen_cast(&int_type
);
1615 /* patch second register */
1616 vtop
[-1].r2
= vtop
->r
;
1620 } else if ((dbt
& VT_BTYPE
) == VT_LLONG
||
1621 (dbt
& VT_BTYPE
) == VT_PTR
) {
1622 /* XXX: not sure if this is perfect... need more tests */
1623 if ((sbt
& VT_BTYPE
) != VT_LLONG
) {
1625 if (sbt
!= (VT_INT
| VT_UNSIGNED
) &&
1626 sbt
!= VT_PTR
&& sbt
!= VT_FUNC
) {
1627 /* x86_64 specific: movslq */
1629 o(0xc0 + (REG_VALUE(r
) << 3) + REG_VALUE(r
));
1633 } else if (dbt
== VT_BOOL
) {
1634 /* scalar to bool */
1637 } else if ((dbt
& VT_BTYPE
) == VT_BYTE
||
1638 (dbt
& VT_BTYPE
) == VT_SHORT
) {
1639 if (sbt
== VT_PTR
) {
1640 vtop
->type
.t
= VT_INT
;
1641 warning("nonportable conversion from pointer to char/short");
1643 force_charshort_cast(dbt
);
1644 } else if ((dbt
& VT_BTYPE
) == VT_INT
) {
1646 if (sbt
== VT_LLONG
) {
1647 /* from long long: just take low order word */
1651 /* if lvalue and single word type, nothing to do because
1652 the lvalue already contains the real type size (see
1653 VT_LVAL_xxx constants) */
1656 } else if ((dbt
& VT_BTYPE
) == VT_PTR
&& !(vtop
->r
& VT_LVAL
)) {
1657 /* if we are casting between pointer types,
1658 we must update the VT_LVAL_xxx size */
1659 vtop
->r
= (vtop
->r
& ~VT_LVAL_TYPE
)
1660 | (lvalue_type(type
->ref
->type
.t
) & VT_LVAL_TYPE
);
1665 /* return type size. Put alignment at 'a' */
1666 static int type_size(CType
*type
, int *a
)
1671 bt
= type
->t
& VT_BTYPE
;
1672 if (bt
== VT_STRUCT
) {
1677 } else if (bt
== VT_PTR
) {
1678 if (type
->t
& VT_ARRAY
) {
1682 ts
= type_size(&s
->type
, a
);
1684 if (ts
< 0 && s
->c
< 0)
1692 } else if (bt
== VT_LDOUBLE
) {
1694 return LDOUBLE_SIZE
;
1695 } else if (bt
== VT_DOUBLE
|| bt
== VT_LLONG
) {
1696 #ifdef TCC_TARGET_I386
1697 #ifdef TCC_TARGET_PE
1702 #elif defined(TCC_TARGET_ARM)
1712 } else if (bt
== VT_INT
|| bt
== VT_ENUM
|| bt
== VT_FLOAT
) {
1715 } else if (bt
== VT_SHORT
) {
1719 /* char, void, function, _Bool */
1725 /* return the pointed type of t */
1726 static inline CType
*pointed_type(CType
*type
)
1728 return &type
->ref
->type
;
1731 /* modify type so that its it is a pointer to type. */
1732 static void mk_pointer(CType
*type
)
1735 s
= sym_push(SYM_FIELD
, type
, 0, -1);
1736 type
->t
= VT_PTR
| (type
->t
& ~VT_TYPE
);
1740 /* compare function types. OLD functions match any new functions */
1741 static int is_compatible_func(CType
*type1
, CType
*type2
)
1747 if (!is_compatible_types(&s1
->type
, &s2
->type
))
1749 /* check func_call */
1750 if (FUNC_CALL(s1
->r
) != FUNC_CALL(s2
->r
))
1752 /* XXX: not complete */
1753 if (s1
->c
== FUNC_OLD
|| s2
->c
== FUNC_OLD
)
1757 while (s1
!= NULL
) {
1760 if (!is_compatible_parameter_types(&s1
->type
, &s2
->type
))
1770 /* return true if type1 and type2 are the same. If unqualified is
1771 true, qualifiers on the types are ignored.
1773 - enums are not checked as gcc __builtin_types_compatible_p ()
1775 static int compare_types(CType
*type1
, CType
*type2
, int unqualified
)
1779 t1
= type1
->t
& VT_TYPE
;
1780 t2
= type2
->t
& VT_TYPE
;
1782 /* strip qualifiers before comparing */
1783 t1
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1784 t2
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1786 /* XXX: bitfields ? */
1789 /* test more complicated cases */
1790 bt1
= t1
& VT_BTYPE
;
1791 if (bt1
== VT_PTR
) {
1792 type1
= pointed_type(type1
);
1793 type2
= pointed_type(type2
);
1794 return is_compatible_types(type1
, type2
);
1795 } else if (bt1
== VT_STRUCT
) {
1796 return (type1
->ref
== type2
->ref
);
1797 } else if (bt1
== VT_FUNC
) {
1798 return is_compatible_func(type1
, type2
);
1804 /* return true if type1 and type2 are exactly the same (including
1807 static int is_compatible_types(CType
*type1
, CType
*type2
)
1809 return compare_types(type1
,type2
,0);
1812 /* return true if type1 and type2 are the same (ignoring qualifiers).
1814 static int is_compatible_parameter_types(CType
*type1
, CType
*type2
)
1816 return compare_types(type1
,type2
,1);
1819 /* print a type. If 'varstr' is not NULL, then the variable is also
1820 printed in the type */
1822 /* XXX: add array and function pointers */
1823 void type_to_str(char *buf
, int buf_size
,
1824 CType
*type
, const char *varstr
)
1831 t
= type
->t
& VT_TYPE
;
1834 if (t
& VT_CONSTANT
)
1835 pstrcat(buf
, buf_size
, "const ");
1836 if (t
& VT_VOLATILE
)
1837 pstrcat(buf
, buf_size
, "volatile ");
1838 if (t
& VT_UNSIGNED
)
1839 pstrcat(buf
, buf_size
, "unsigned ");
1869 tstr
= "long double";
1871 pstrcat(buf
, buf_size
, tstr
);
1875 if (bt
== VT_STRUCT
)
1879 pstrcat(buf
, buf_size
, tstr
);
1880 v
= type
->ref
->v
& ~SYM_STRUCT
;
1881 if (v
>= SYM_FIRST_ANOM
)
1882 pstrcat(buf
, buf_size
, "<anonymous>");
1884 pstrcat(buf
, buf_size
, get_tok_str(v
, NULL
));
1888 type_to_str(buf
, buf_size
, &s
->type
, varstr
);
1889 pstrcat(buf
, buf_size
, "(");
1891 while (sa
!= NULL
) {
1892 type_to_str(buf1
, sizeof(buf1
), &sa
->type
, NULL
);
1893 pstrcat(buf
, buf_size
, buf1
);
1896 pstrcat(buf
, buf_size
, ", ");
1898 pstrcat(buf
, buf_size
, ")");
1902 pstrcpy(buf1
, sizeof(buf1
), "*");
1904 pstrcat(buf1
, sizeof(buf1
), varstr
);
1905 type_to_str(buf
, buf_size
, &s
->type
, buf1
);
1909 pstrcat(buf
, buf_size
, " ");
1910 pstrcat(buf
, buf_size
, varstr
);
1915 /* verify type compatibility to store vtop in 'dt' type, and generate
1917 static void gen_assign_cast(CType
*dt
)
1919 CType
*st
, *type1
, *type2
, tmp_type1
, tmp_type2
;
1920 char buf1
[256], buf2
[256];
1923 st
= &vtop
->type
; /* source type */
1924 dbt
= dt
->t
& VT_BTYPE
;
1925 sbt
= st
->t
& VT_BTYPE
;
1926 if (dt
->t
& VT_CONSTANT
)
1927 warning("assignment of read-only location");
1930 /* special cases for pointers */
1931 /* '0' can also be a pointer */
1932 if (is_null_pointer(vtop
))
1934 /* accept implicit pointer to integer cast with warning */
1935 if (is_integer_btype(sbt
)) {
1936 warning("assignment makes pointer from integer without a cast");
1939 type1
= pointed_type(dt
);
1940 /* a function is implicitely a function pointer */
1941 if (sbt
== VT_FUNC
) {
1942 if ((type1
->t
& VT_BTYPE
) != VT_VOID
&&
1943 !is_compatible_types(pointed_type(dt
), st
))
1944 warning("assignment from incompatible pointer type");
1949 type2
= pointed_type(st
);
1950 if ((type1
->t
& VT_BTYPE
) == VT_VOID
||
1951 (type2
->t
& VT_BTYPE
) == VT_VOID
) {
1952 /* void * can match anything */
1954 /* exact type match, except for unsigned */
1957 tmp_type1
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1958 tmp_type2
.t
&= ~(VT_UNSIGNED
| VT_CONSTANT
| VT_VOLATILE
);
1959 if (!is_compatible_types(&tmp_type1
, &tmp_type2
))
1960 warning("assignment from incompatible pointer type");
1962 /* check const and volatile */
1963 if ((!(type1
->t
& VT_CONSTANT
) && (type2
->t
& VT_CONSTANT
)) ||
1964 (!(type1
->t
& VT_VOLATILE
) && (type2
->t
& VT_VOLATILE
)))
1965 warning("assignment discards qualifiers from pointer target type");
1971 if (sbt
== VT_PTR
|| sbt
== VT_FUNC
) {
1972 warning("assignment makes integer from pointer without a cast");
1974 /* XXX: more tests */
1979 tmp_type1
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1980 tmp_type2
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
1981 if (!is_compatible_types(&tmp_type1
, &tmp_type2
)) {
1983 type_to_str(buf1
, sizeof(buf1
), st
, NULL
);
1984 type_to_str(buf2
, sizeof(buf2
), dt
, NULL
);
1985 error("cannot cast '%s' to '%s'", buf1
, buf2
);
1993 /* store vtop in lvalue pushed on stack */
1996 int sbt
, dbt
, ft
, r
, t
, size
, align
, bit_size
, bit_pos
, rc
, delayed_cast
;
1998 ft
= vtop
[-1].type
.t
;
1999 sbt
= vtop
->type
.t
& VT_BTYPE
;
2000 dbt
= ft
& VT_BTYPE
;
2001 if (((sbt
== VT_INT
|| sbt
== VT_SHORT
) && dbt
== VT_BYTE
) ||
2002 (sbt
== VT_INT
&& dbt
== VT_SHORT
)) {
2003 /* optimize char/short casts */
2004 delayed_cast
= VT_MUSTCAST
;
2005 vtop
->type
.t
= ft
& (VT_TYPE
& ~(VT_BITFIELD
| (-1 << VT_STRUCT_SHIFT
)));
2006 /* XXX: factorize */
2007 if (ft
& VT_CONSTANT
)
2008 warning("assignment of read-only location");
2011 if (!(ft
& VT_BITFIELD
))
2012 gen_assign_cast(&vtop
[-1].type
);
2015 if (sbt
== VT_STRUCT
) {
2016 /* if structure, only generate pointer */
2017 /* structure assignment : generate memcpy */
2018 /* XXX: optimize if small size */
2019 if (!nocode_wanted
) {
2020 size
= type_size(&vtop
->type
, &align
);
2024 vtop
->type
.t
= VT_PTR
;
2027 /* address of memcpy() */
2030 vpush_global_sym(&func_old_type
, TOK_memcpy8
);
2031 else if(!(align
& 3))
2032 vpush_global_sym(&func_old_type
, TOK_memcpy4
);
2035 vpush_global_sym(&func_old_type
, TOK_memcpy
);
2040 vtop
->type
.t
= VT_PTR
;
2049 /* leave source on stack */
2050 } else if (ft
& VT_BITFIELD
) {
2051 /* bitfield store handling */
2052 bit_pos
= (ft
>> VT_STRUCT_SHIFT
) & 0x3f;
2053 bit_size
= (ft
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f;
2054 /* remove bit field info to avoid loops */
2055 vtop
[-1].type
.t
= ft
& ~(VT_BITFIELD
| (-1 << VT_STRUCT_SHIFT
));
2057 /* duplicate source into other register */
2062 if((ft
& VT_BTYPE
) == VT_BOOL
) {
2063 gen_cast(&vtop
[-1].type
);
2064 vtop
[-1].type
.t
= (vtop
[-1].type
.t
& ~VT_BTYPE
) | (VT_BYTE
| VT_UNSIGNED
);
2067 /* duplicate destination */
2069 vtop
[-1] = vtop
[-2];
2071 /* mask and shift source */
2072 if((ft
& VT_BTYPE
) != VT_BOOL
) {
2073 if((ft
& VT_BTYPE
) == VT_LLONG
) {
2074 vpushll((1ULL << bit_size
) - 1ULL);
2076 vpushi((1 << bit_size
) - 1);
2082 /* load destination, mask and or with source */
2084 if((ft
& VT_BTYPE
) == VT_LLONG
) {
2085 vpushll(~(((1ULL << bit_size
) - 1ULL) << bit_pos
));
2087 vpushi(~(((1 << bit_size
) - 1) << bit_pos
));
2094 /* pop off shifted source from "duplicate source..." above */
2098 #ifdef CONFIG_TCC_BCHECK
2099 /* bound check case */
2100 if (vtop
[-1].r
& VT_MUSTBOUND
) {
2106 if (!nocode_wanted
) {
2110 #ifdef TCC_TARGET_X86_64
2111 if ((ft
& VT_BTYPE
) == VT_LDOUBLE
) {
2116 r
= gv(rc
); /* generate value */
2117 /* if lvalue was saved on stack, must read it */
2118 if ((vtop
[-1].r
& VT_VALMASK
) == VT_LLOCAL
) {
2120 t
= get_reg(RC_INT
);
2121 #ifdef TCC_TARGET_X86_64
2126 sv
.r
= VT_LOCAL
| VT_LVAL
;
2127 sv
.c
.ul
= vtop
[-1].c
.ul
;
2129 vtop
[-1].r
= t
| VT_LVAL
;
2132 #ifndef TCC_TARGET_X86_64
2133 /* two word case handling : store second register at word + 4 */
2134 if ((ft
& VT_BTYPE
) == VT_LLONG
) {
2136 /* convert to int to increment easily */
2137 vtop
->type
.t
= VT_INT
;
2143 /* XXX: it works because r2 is spilled last ! */
2144 store(vtop
->r2
, vtop
- 1);
2149 vtop
--; /* NOT vpop() because on x86 it would flush the fp stack */
2150 vtop
->r
|= delayed_cast
;
2154 /* post defines POST/PRE add. c is the token ++ or -- */
2155 void inc(int post
, int c
)
2158 vdup(); /* save lvalue */
2160 gv_dup(); /* duplicate value */
2165 vpushi(c
- TOK_MID
);
2167 vstore(); /* store value */
2169 vpop(); /* if post op, return saved value */
2172 /* Parse GNUC __attribute__ extension. Currently, the following
2173 extensions are recognized:
2174 - aligned(n) : set data/function alignment.
2175 - packed : force data alignment to 1
2176 - section(x) : generate data/code in this section.
2177 - unused : currently ignored, but may be used someday.
2178 - regparm(n) : pass function parameters in registers (i386 only)
2180 static void parse_attribute(AttributeDef
*ad
)
2184 while (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
) {
2188 while (tok
!= ')') {
2189 if (tok
< TOK_IDENT
)
2190 expect("attribute name");
2198 expect("section name");
2199 ad
->section
= find_section(tcc_state
, (char *)tokc
.cstr
->data
);
2208 if (n
<= 0 || (n
& (n
- 1)) != 0)
2209 error("alignment must be a positive power of two");
2222 /* currently, no need to handle it because tcc does not
2223 track unused objects */
2227 /* currently, no need to handle it because tcc does not
2228 track unused objects */
2233 ad
->func_call
= FUNC_CDECL
;
2238 ad
->func_call
= FUNC_STDCALL
;
2240 #ifdef TCC_TARGET_I386
2250 ad
->func_call
= FUNC_FASTCALL1
+ n
- 1;
2256 ad
->func_call
= FUNC_FASTCALLW
;
2260 ad
->func_export
= 1;
2263 ad
->func_import
= 1;
2266 if (tcc_state
->warn_unsupported
)
2267 warning("'%s' attribute ignored", get_tok_str(t
, NULL
));
2268 /* skip parameters */
2270 int parenthesis
= 0;
2274 else if (tok
== ')')
2277 } while (parenthesis
&& tok
!= -1);
2290 /* enum/struct/union declaration. u is either VT_ENUM or VT_STRUCT */
2291 static void struct_decl(CType
*type
, int u
)
2293 int a
, v
, size
, align
, maxalign
, c
, offset
;
2294 int bit_size
, bit_pos
, bsize
, bt
, lbit_pos
, prevbt
;
2295 Sym
*s
, *ss
, *ass
, **ps
;
2299 a
= tok
; /* save decl type */
2304 /* struct already defined ? return it */
2306 expect("struct/union/enum name");
2310 error("invalid type");
2317 /* we put an undefined size for struct/union */
2318 s
= sym_push(v
| SYM_STRUCT
, &type1
, 0, -1);
2319 s
->r
= 0; /* default alignment is zero as gcc */
2320 /* put struct/union/enum name in type */
2328 error("struct/union/enum already defined");
2329 /* cannot be empty */
2331 /* non empty enums are not allowed */
2332 if (a
== TOK_ENUM
) {
2336 expect("identifier");
2342 /* enum symbols have static storage */
2343 ss
= sym_push(v
, &int_type
, VT_CONST
, c
);
2344 ss
->type
.t
|= VT_STATIC
;
2349 /* NOTE: we accept a trailing comma */
2360 while (tok
!= '}') {
2361 parse_btype(&btype
, &ad
);
2367 type_decl(&type1
, &ad
, &v
, TYPE_DIRECT
| TYPE_ABSTRACT
);
2368 if (v
== 0 && (type1
.t
& VT_BTYPE
) != VT_STRUCT
)
2369 expect("identifier");
2370 if ((type1
.t
& VT_BTYPE
) == VT_FUNC
||
2371 (type1
.t
& (VT_TYPEDEF
| VT_STATIC
| VT_EXTERN
| VT_INLINE
)))
2372 error("invalid type for '%s'",
2373 get_tok_str(v
, NULL
));
2377 bit_size
= expr_const();
2378 /* XXX: handle v = 0 case for messages */
2380 error("negative width in bit-field '%s'",
2381 get_tok_str(v
, NULL
));
2382 if (v
&& bit_size
== 0)
2383 error("zero width for bit-field '%s'",
2384 get_tok_str(v
, NULL
));
2386 size
= type_size(&type1
, &align
);
2388 if (align
< ad
.aligned
)
2390 } else if (ad
.packed
) {
2392 } else if (*tcc_state
->pack_stack_ptr
) {
2393 if (align
> *tcc_state
->pack_stack_ptr
)
2394 align
= *tcc_state
->pack_stack_ptr
;
2397 if (bit_size
>= 0) {
2398 bt
= type1
.t
& VT_BTYPE
;
2405 error("bitfields must have scalar type");
2407 if (bit_size
> bsize
) {
2408 error("width of '%s' exceeds its type",
2409 get_tok_str(v
, NULL
));
2410 } else if (bit_size
== bsize
) {
2411 /* no need for bit fields */
2413 } else if (bit_size
== 0) {
2414 /* XXX: what to do if only padding in a
2416 /* zero size: means to pad */
2419 /* we do not have enough room ?
2420 did the type change?
2422 if ((bit_pos
+ bit_size
) > bsize
||
2423 bt
!= prevbt
|| a
== TOK_UNION
)
2426 /* XXX: handle LSB first */
2427 type1
.t
|= VT_BITFIELD
|
2428 (bit_pos
<< VT_STRUCT_SHIFT
) |
2429 (bit_size
<< (VT_STRUCT_SHIFT
+ 6));
2430 bit_pos
+= bit_size
;
2436 if (v
!= 0 || (type1
.t
& VT_BTYPE
) == VT_STRUCT
) {
2437 /* add new memory data only if starting
2439 if (lbit_pos
== 0) {
2440 if (a
== TOK_STRUCT
) {
2441 c
= (c
+ align
- 1) & -align
;
2450 if (align
> maxalign
)
2454 printf("add field %s offset=%d",
2455 get_tok_str(v
, NULL
), offset
);
2456 if (type1
.t
& VT_BITFIELD
) {
2457 printf(" pos=%d size=%d",
2458 (type1
.t
>> VT_STRUCT_SHIFT
) & 0x3f,
2459 (type1
.t
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f);
2464 if (v
== 0 && (type1
.t
& VT_BTYPE
) == VT_STRUCT
) {
2466 while ((ass
= ass
->next
) != NULL
) {
2467 ss
= sym_push(ass
->v
, &ass
->type
, 0, offset
+ ass
->c
);
2472 ss
= sym_push(v
| SYM_FIELD
, &type1
, 0, offset
);
2476 if (tok
== ';' || tok
== TOK_EOF
)
2483 /* store size and alignment */
2484 s
->c
= (c
+ maxalign
- 1) & -maxalign
;
2490 /* return 0 if no type declaration. otherwise, return the basic type
2493 static int parse_btype(CType
*type
, AttributeDef
*ad
)
2495 int t
, u
, type_found
, typespec_found
, typedef_found
;
2499 memset(ad
, 0, sizeof(AttributeDef
));
2507 /* currently, we really ignore extension */
2517 if ((t
& VT_BTYPE
) != 0)
2518 error("too many basic types");
2534 if ((t
& VT_BTYPE
) == VT_DOUBLE
) {
2535 #ifndef TCC_TARGET_PE
2536 t
= (t
& ~VT_BTYPE
) | VT_LDOUBLE
;
2538 } else if ((t
& VT_BTYPE
) == VT_LONG
) {
2539 t
= (t
& ~VT_BTYPE
) | VT_LLONG
;
2553 if ((t
& VT_BTYPE
) == VT_LONG
) {
2554 #ifdef TCC_TARGET_PE
2555 t
= (t
& ~VT_BTYPE
) | VT_DOUBLE
;
2557 t
= (t
& ~VT_BTYPE
) | VT_LDOUBLE
;
2565 struct_decl(&type1
, VT_ENUM
);
2568 type
->ref
= type1
.ref
;
2572 struct_decl(&type1
, VT_STRUCT
);
2575 /* type modifiers */
2628 /* GNUC attribute */
2629 case TOK_ATTRIBUTE1
:
2630 case TOK_ATTRIBUTE2
:
2631 parse_attribute(ad
);
2638 parse_expr_type(&type1
);
2641 if (typespec_found
|| typedef_found
)
2644 if (!s
|| !(s
->type
.t
& VT_TYPEDEF
))
2647 t
|= (s
->type
.t
& ~VT_TYPEDEF
);
2648 type
->ref
= s
->type
.ref
;
2650 /* get attributes from typedef */
2651 if (0 == ad
->aligned
)
2652 ad
->aligned
= FUNC_ALIGN(s
->r
);
2653 if (0 == ad
->func_call
)
2654 ad
->func_call
= FUNC_CALL(s
->r
);
2655 ad
->packed
|= FUNC_PACKED(s
->r
);
2664 if ((t
& (VT_SIGNED
|VT_UNSIGNED
)) == (VT_SIGNED
|VT_UNSIGNED
))
2665 error("signed and unsigned modifier");
2666 if (tcc_state
->char_is_unsigned
) {
2667 if ((t
& (VT_SIGNED
|VT_UNSIGNED
|VT_BTYPE
)) == VT_BYTE
)
2672 /* long is never used as type */
2673 if ((t
& VT_BTYPE
) == VT_LONG
)
2674 #if !defined TCC_TARGET_X86_64 || defined TCC_TARGET_PE
2675 t
= (t
& ~VT_BTYPE
) | VT_INT
;
2677 t
= (t
& ~VT_BTYPE
) | VT_LLONG
;
2683 /* convert a function parameter type (array to pointer and function to
2684 function pointer) */
2685 static inline void convert_parameter_type(CType
*pt
)
2687 /* remove const and volatile qualifiers (XXX: const could be used
2688 to indicate a const function parameter */
2689 pt
->t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
2690 /* array must be transformed to pointer according to ANSI C */
2692 if ((pt
->t
& VT_BTYPE
) == VT_FUNC
) {
2697 static void post_type(CType
*type
, AttributeDef
*ad
)
2699 int n
, l
, t1
, arg_size
, align
;
2700 Sym
**plast
, *s
, *first
;
2705 /* function declaration */
2713 /* read param name and compute offset */
2714 if (l
!= FUNC_OLD
) {
2715 if (!parse_btype(&pt
, &ad1
)) {
2717 error("invalid type");
2724 if ((pt
.t
& VT_BTYPE
) == VT_VOID
&& tok
== ')')
2726 type_decl(&pt
, &ad1
, &n
, TYPE_DIRECT
| TYPE_ABSTRACT
);
2727 if ((pt
.t
& VT_BTYPE
) == VT_VOID
)
2728 error("parameter declared as void");
2729 arg_size
+= (type_size(&pt
, &align
) + 3) & ~3;
2734 expect("identifier");
2738 convert_parameter_type(&pt
);
2739 s
= sym_push(n
| SYM_FIELD
, &pt
, 0, 0);
2745 if (l
== FUNC_NEW
&& tok
== TOK_DOTS
) {
2752 /* if no parameters, then old type prototype */
2756 t1
= type
->t
& VT_STORAGE
;
2757 /* NOTE: const is ignored in returned type as it has a special
2758 meaning in gcc / C++ */
2759 type
->t
&= ~(VT_STORAGE
| VT_CONSTANT
);
2760 post_type(type
, ad
);
2761 /* we push a anonymous symbol which will contain the function prototype */
2762 ad
->func_args
= arg_size
;
2763 s
= sym_push(SYM_FIELD
, type
, INT_ATTR(ad
), l
);
2765 type
->t
= t1
| VT_FUNC
;
2767 } else if (tok
== '[') {
2768 /* array definition */
2770 if (tok
== TOK_RESTRICT1
)
2776 error("invalid array size");
2779 /* parse next post type */
2780 t1
= type
->t
& VT_STORAGE
;
2781 type
->t
&= ~VT_STORAGE
;
2782 post_type(type
, ad
);
2784 /* we push a anonymous symbol which will contain the array
2786 s
= sym_push(SYM_FIELD
, type
, 0, n
);
2787 type
->t
= t1
| VT_ARRAY
| VT_PTR
;
2792 /* Parse a type declaration (except basic type), and return the type
2793 in 'type'. 'td' is a bitmask indicating which kind of type decl is
2794 expected. 'type' should contain the basic type. 'ad' is the
2795 attribute definition of the basic type. It can be modified by
2798 static void type_decl(CType
*type
, AttributeDef
*ad
, int *v
, int td
)
2801 CType type1
, *type2
;
2804 while (tok
== '*') {
2812 qualifiers
|= VT_CONSTANT
;
2817 qualifiers
|= VT_VOLATILE
;
2825 type
->t
|= qualifiers
;
2828 /* XXX: clarify attribute handling */
2829 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2830 parse_attribute(ad
);
2832 /* recursive type */
2833 /* XXX: incorrect if abstract type for functions (e.g. 'int ()') */
2834 type1
.t
= 0; /* XXX: same as int */
2837 /* XXX: this is not correct to modify 'ad' at this point, but
2838 the syntax is not clear */
2839 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2840 parse_attribute(ad
);
2841 type_decl(&type1
, ad
, v
, td
);
2844 /* type identifier */
2845 if (tok
>= TOK_IDENT
&& (td
& TYPE_DIRECT
)) {
2849 if (!(td
& TYPE_ABSTRACT
))
2850 expect("identifier");
2854 post_type(type
, ad
);
2855 if (tok
== TOK_ATTRIBUTE1
|| tok
== TOK_ATTRIBUTE2
)
2856 parse_attribute(ad
);
2859 /* append type at the end of type1 */
2872 /* compute the lvalue VT_LVAL_xxx needed to match type t. */
2873 static int lvalue_type(int t
)
2878 if (bt
== VT_BYTE
|| bt
== VT_BOOL
)
2880 else if (bt
== VT_SHORT
)
2884 if (t
& VT_UNSIGNED
)
2885 r
|= VT_LVAL_UNSIGNED
;
2889 /* indirection with full error checking and bound check */
2890 static void indir(void)
2892 if ((vtop
->type
.t
& VT_BTYPE
) != VT_PTR
) {
2893 if ((vtop
->type
.t
& VT_BTYPE
) == VT_FUNC
)
2897 if ((vtop
->r
& VT_LVAL
) && !nocode_wanted
)
2899 vtop
->type
= *pointed_type(&vtop
->type
);
2900 /* Arrays and functions are never lvalues */
2901 if (!(vtop
->type
.t
& VT_ARRAY
)
2902 && (vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
) {
2903 vtop
->r
|= lvalue_type(vtop
->type
.t
);
2904 /* if bound checking, the referenced pointer must be checked */
2905 if (tcc_state
->do_bounds_check
)
2906 vtop
->r
|= VT_MUSTBOUND
;
2910 /* pass a parameter to a function and do type checking and casting */
2911 static void gfunc_param_typed(Sym
*func
, Sym
*arg
)
2916 func_type
= func
->c
;
2917 if (func_type
== FUNC_OLD
||
2918 (func_type
== FUNC_ELLIPSIS
&& arg
== NULL
)) {
2919 /* default casting : only need to convert float to double */
2920 if ((vtop
->type
.t
& VT_BTYPE
) == VT_FLOAT
) {
2924 } else if (arg
== NULL
) {
2925 error("too many arguments to function");
2928 type
.t
&= ~VT_CONSTANT
; /* need to do that to avoid false warning */
2929 gen_assign_cast(&type
);
2933 /* parse an expression of the form '(type)' or '(expr)' and return its
2935 static void parse_expr_type(CType
*type
)
2941 if (parse_btype(type
, &ad
)) {
2942 type_decl(type
, &ad
, &n
, TYPE_ABSTRACT
);
2949 static void parse_type(CType
*type
)
2954 if (!parse_btype(type
, &ad
)) {
2957 type_decl(type
, &ad
, &n
, TYPE_ABSTRACT
);
2960 static void vpush_tokc(int t
)
2964 vsetc(&type
, VT_CONST
, &tokc
);
2967 static void unary(void)
2969 int n
, t
, align
, size
, r
;
2974 /* XXX: GCC 2.95.3 does not generate a table although it should be
2988 vpush_tokc(VT_INT
| VT_UNSIGNED
);
2992 vpush_tokc(VT_LLONG
);
2996 vpush_tokc(VT_LLONG
| VT_UNSIGNED
);
3000 vpush_tokc(VT_FLOAT
);
3004 vpush_tokc(VT_DOUBLE
);
3008 vpush_tokc(VT_LDOUBLE
);
3011 case TOK___FUNCTION__
:
3013 goto tok_identifier
;
3019 /* special function name identifier */
3020 len
= strlen(funcname
) + 1;
3021 /* generate char[len] type */
3026 vpush_ref(&type
, data_section
, data_section
->data_offset
, len
);
3027 ptr
= section_ptr_add(data_section
, len
);
3028 memcpy(ptr
, funcname
, len
);
3033 #ifdef TCC_TARGET_PE
3034 t
= VT_SHORT
| VT_UNSIGNED
;
3040 /* string parsing */
3043 if (tcc_state
->warn_write_strings
)
3048 memset(&ad
, 0, sizeof(AttributeDef
));
3049 decl_initializer_alloc(&type
, &ad
, VT_CONST
, 2, 0, 0);
3054 if (parse_btype(&type
, &ad
)) {
3055 type_decl(&type
, &ad
, &n
, TYPE_ABSTRACT
);
3057 /* check ISOC99 compound literal */
3059 /* data is allocated locally by default */
3064 /* all except arrays are lvalues */
3065 if (!(type
.t
& VT_ARRAY
))
3066 r
|= lvalue_type(type
.t
);
3067 memset(&ad
, 0, sizeof(AttributeDef
));
3068 decl_initializer_alloc(&type
, &ad
, r
, 1, 0, 0);
3073 } else if (tok
== '{') {
3074 /* save all registers */
3076 /* statement expression : we do not accept break/continue
3077 inside as GCC does */
3078 block(NULL
, NULL
, NULL
, NULL
, 0, 1);
3093 /* functions names must be treated as function pointers,
3094 except for unary '&' and sizeof. Since we consider that
3095 functions are not lvalues, we only have to handle it
3096 there and in function calls. */
3097 /* arrays can also be used although they are not lvalues */
3098 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
&&
3099 !(vtop
->type
.t
& VT_ARRAY
) && !(vtop
->type
.t
& VT_LLOCAL
))
3101 mk_pointer(&vtop
->type
);
3107 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
) {
3109 boolean
.t
= VT_BOOL
;
3111 vtop
->c
.i
= !vtop
->c
.i
;
3112 } else if ((vtop
->r
& VT_VALMASK
) == VT_CMP
)
3113 vtop
->c
.i
= vtop
->c
.i
^ 1;
3116 vseti(VT_JMP
, gtst(1, 0));
3127 /* in order to force cast, we add zero */
3129 if ((vtop
->type
.t
& VT_BTYPE
) == VT_PTR
)
3130 error("pointer not accepted for unary plus");
3140 parse_expr_type(&type
);
3144 size
= type_size(&type
, &align
);
3145 if (t
== TOK_SIZEOF
) {
3147 error("sizeof applied to an incomplete type");
3152 vtop
->type
.t
|= VT_UNSIGNED
;
3155 case TOK_builtin_types_compatible_p
:
3164 type1
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
3165 type2
.t
&= ~(VT_CONSTANT
| VT_VOLATILE
);
3166 vpushi(is_compatible_types(&type1
, &type2
));
3169 case TOK_builtin_constant_p
:
3171 int saved_nocode_wanted
, res
;
3174 saved_nocode_wanted
= nocode_wanted
;
3177 res
= (vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) == VT_CONST
;
3179 nocode_wanted
= saved_nocode_wanted
;
3184 case TOK_builtin_frame_address
:
3189 if (tok
!= TOK_CINT
) {
3190 error("__builtin_frame_address only takes integers");
3193 error("TCC only supports __builtin_frame_address(0)");
3199 vset(&type
, VT_LOCAL
, 0);
3202 #ifdef TCC_TARGET_X86_64
3203 case TOK_builtin_malloc
:
3205 goto tok_identifier
;
3206 case TOK_builtin_free
:
3208 goto tok_identifier
;
3225 goto tok_identifier
;
3227 /* allow to take the address of a label */
3228 if (tok
< TOK_UIDENT
)
3229 expect("label identifier");
3230 s
= label_find(tok
);
3232 s
= label_push(&global_label_stack
, tok
, LABEL_FORWARD
);
3234 if (s
->r
== LABEL_DECLARED
)
3235 s
->r
= LABEL_FORWARD
;
3238 s
->type
.t
= VT_VOID
;
3239 mk_pointer(&s
->type
);
3240 s
->type
.t
|= VT_STATIC
;
3242 vset(&s
->type
, VT_CONST
| VT_SYM
, 0);
3251 expect("identifier");
3255 error("'%s' undeclared", get_tok_str(t
, NULL
));
3256 /* for simple function calls, we tolerate undeclared
3257 external reference to int() function */
3258 if (tcc_state
->warn_implicit_function_declaration
)
3259 warning("implicit declaration of function '%s'",
3260 get_tok_str(t
, NULL
));
3261 s
= external_global_sym(t
, &func_old_type
, 0);
3263 if ((s
->type
.t
& (VT_STATIC
| VT_INLINE
| VT_BTYPE
)) ==
3264 (VT_STATIC
| VT_INLINE
| VT_FUNC
)) {
3265 /* if referencing an inline function, then we generate a
3266 symbol to it if not already done. It will have the
3267 effect to generate code for it at the end of the
3268 compilation unit. Inline function as always
3269 generated in the text section. */
3271 put_extern_sym(s
, text_section
, 0, 0);
3272 r
= VT_SYM
| VT_CONST
;
3276 vset(&s
->type
, r
, s
->c
);
3277 /* if forward reference, we must point to s */
3278 if (vtop
->r
& VT_SYM
) {
3285 /* post operations */
3287 if (tok
== TOK_INC
|| tok
== TOK_DEC
) {
3290 } else if (tok
== '.' || tok
== TOK_ARROW
) {
3293 if (tok
== TOK_ARROW
)
3295 qualifiers
= vtop
->type
.t
& (VT_CONSTANT
| VT_VOLATILE
);
3299 /* expect pointer on structure */
3300 if ((vtop
->type
.t
& VT_BTYPE
) != VT_STRUCT
)
3301 expect("struct or union");
3305 while ((s
= s
->next
) != NULL
) {
3310 error("field not found: %s", get_tok_str(tok
& ~SYM_FIELD
, NULL
));
3311 /* add field offset to pointer */
3312 vtop
->type
= char_pointer_type
; /* change type to 'char *' */
3315 /* change type to field type, and set to lvalue */
3316 vtop
->type
= s
->type
;
3317 vtop
->type
.t
|= qualifiers
;
3318 /* an array is never an lvalue */
3319 if (!(vtop
->type
.t
& VT_ARRAY
)) {
3320 vtop
->r
|= lvalue_type(vtop
->type
.t
);
3321 /* if bound checking, the referenced pointer must be checked */
3322 if (tcc_state
->do_bounds_check
)
3323 vtop
->r
|= VT_MUSTBOUND
;
3326 } else if (tok
== '[') {
3332 } else if (tok
== '(') {
3338 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
) {
3339 /* pointer test (no array accepted) */
3340 if ((vtop
->type
.t
& (VT_BTYPE
| VT_ARRAY
)) == VT_PTR
) {
3341 vtop
->type
= *pointed_type(&vtop
->type
);
3342 if ((vtop
->type
.t
& VT_BTYPE
) != VT_FUNC
)
3346 expect("function pointer");
3349 vtop
->r
&= ~VT_LVAL
; /* no lvalue */
3351 /* get return type */
3354 sa
= s
->next
; /* first parameter */
3357 /* compute first implicit argument if a structure is returned */
3358 if ((s
->type
.t
& VT_BTYPE
) == VT_STRUCT
) {
3359 /* get some space for the returned structure */
3360 size
= type_size(&s
->type
, &align
);
3361 loc
= (loc
- size
) & -align
;
3363 ret
.r
= VT_LOCAL
| VT_LVAL
;
3364 /* pass it as 'int' to avoid structure arg passing
3366 vseti(VT_LOCAL
, loc
);
3371 /* return in register */
3372 if (is_float(ret
.type
.t
)) {
3373 ret
.r
= reg_fret(ret
.type
.t
);
3375 if ((ret
.type
.t
& VT_BTYPE
) == VT_LLONG
)
3384 gfunc_param_typed(s
, sa
);
3394 error("too few arguments to function");
3396 if (!nocode_wanted
) {
3397 gfunc_call(nb_args
);
3399 vtop
-= (nb_args
+ 1);
3402 vsetc(&ret
.type
, ret
.r
, &ret
.c
);
3410 static void uneq(void)
3416 (tok
>= TOK_A_MOD
&& tok
<= TOK_A_DIV
) ||
3417 tok
== TOK_A_XOR
|| tok
== TOK_A_OR
||
3418 tok
== TOK_A_SHL
|| tok
== TOK_A_SAR
) {
3433 static void expr_prod(void)
3438 while (tok
== '*' || tok
== '/' || tok
== '%') {
3446 static void expr_sum(void)
3451 while (tok
== '+' || tok
== '-') {
3459 static void expr_shift(void)
3464 while (tok
== TOK_SHL
|| tok
== TOK_SAR
) {
3472 static void expr_cmp(void)
3477 while ((tok
>= TOK_ULE
&& tok
<= TOK_GT
) ||
3478 tok
== TOK_ULT
|| tok
== TOK_UGE
) {
3486 static void expr_cmpeq(void)
3491 while (tok
== TOK_EQ
|| tok
== TOK_NE
) {
3499 static void expr_and(void)
3502 while (tok
== '&') {
3509 static void expr_xor(void)
3512 while (tok
== '^') {
3519 static void expr_or(void)
3522 while (tok
== '|') {
3529 /* XXX: fix this mess */
3530 static void expr_land_const(void)
3533 while (tok
== TOK_LAND
) {
3540 /* XXX: fix this mess */
3541 static void expr_lor_const(void)
3544 while (tok
== TOK_LOR
) {
3551 /* only used if non constant */
3552 static void expr_land(void)
3557 if (tok
== TOK_LAND
) {
3562 if (tok
!= TOK_LAND
) {
3572 static void expr_lor(void)
3577 if (tok
== TOK_LOR
) {
3582 if (tok
!= TOK_LOR
) {
3592 /* XXX: better constant handling */
3593 static void expr_eq(void)
3595 int tt
, u
, r1
, r2
, rc
, t1
, t2
, bt1
, bt2
;
3597 CType type
, type1
, type2
;
3604 boolean
.t
= VT_BOOL
;
3610 if (tok
!= ':' || !gnu_ext
) {
3625 if (vtop
!= vstack
) {
3626 /* needed to avoid having different registers saved in
3628 if (is_float(vtop
->type
.t
)) {
3630 #ifdef TCC_TARGET_X86_64
3631 if ((vtop
->type
.t
& VT_BTYPE
) == VT_LDOUBLE
) {
3641 if (tok
== ':' && gnu_ext
) {
3649 sv
= *vtop
; /* save value to handle it later */
3650 vtop
--; /* no vpop so that FP stack is not flushed */
3658 bt1
= t1
& VT_BTYPE
;
3660 bt2
= t2
& VT_BTYPE
;
3661 /* cast operands to correct type according to ISOC rules */
3662 if (is_float(bt1
) || is_float(bt2
)) {
3663 if (bt1
== VT_LDOUBLE
|| bt2
== VT_LDOUBLE
) {
3664 type
.t
= VT_LDOUBLE
;
3665 } else if (bt1
== VT_DOUBLE
|| bt2
== VT_DOUBLE
) {
3670 } else if (bt1
== VT_LLONG
|| bt2
== VT_LLONG
) {
3671 /* cast to biggest op */
3673 /* convert to unsigned if it does not fit in a long long */
3674 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
) ||
3675 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_LLONG
| VT_UNSIGNED
))
3676 type
.t
|= VT_UNSIGNED
;
3677 } else if (bt1
== VT_PTR
|| bt2
== VT_PTR
) {
3678 /* XXX: test pointer compatibility */
3680 } else if (bt1
== VT_FUNC
|| bt2
== VT_FUNC
) {
3681 /* XXX: test function pointer compatibility */
3683 } else if (bt1
== VT_STRUCT
|| bt2
== VT_STRUCT
) {
3684 /* XXX: test structure compatibility */
3686 } else if (bt1
== VT_VOID
|| bt2
== VT_VOID
) {
3687 /* NOTE: as an extension, we accept void on only one side */
3690 /* integer operations */
3692 /* convert to unsigned if it does not fit in an integer */
3693 if ((t1
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
) ||
3694 (t2
& (VT_BTYPE
| VT_UNSIGNED
)) == (VT_INT
| VT_UNSIGNED
))
3695 type
.t
|= VT_UNSIGNED
;
3698 /* now we convert second operand */
3700 if (VT_STRUCT
== (vtop
->type
.t
& VT_BTYPE
))
3703 if (is_float(type
.t
)) {
3705 #ifdef TCC_TARGET_X86_64
3706 if ((type
.t
& VT_BTYPE
) == VT_LDOUBLE
) {
3710 } else if ((type
.t
& VT_BTYPE
) == VT_LLONG
) {
3711 /* for long longs, we use fixed registers to avoid having
3712 to handle a complicated move */
3717 /* this is horrible, but we must also convert first
3721 /* put again first value and cast it */
3724 if (VT_STRUCT
== (vtop
->type
.t
& VT_BTYPE
))
3734 static void gexpr(void)
3745 /* parse an expression and return its type without any side effect. */
3746 static void expr_type(CType
*type
)
3748 int saved_nocode_wanted
;
3750 saved_nocode_wanted
= nocode_wanted
;
3755 nocode_wanted
= saved_nocode_wanted
;
3758 /* parse a unary expression and return its type without any side
3760 static void unary_type(CType
*type
)
3772 /* parse a constant expression and return value in vtop. */
3773 static void expr_const1(void)
3782 /* parse an integer constant and return its value. */
3783 static int expr_const(void)
3787 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
| VT_SYM
)) != VT_CONST
)
3788 expect("constant expression");
3794 /* return the label token if current token is a label, otherwise
3796 static int is_label(void)
3800 /* fast test first */
3801 if (tok
< TOK_UIDENT
)
3803 /* no need to save tokc because tok is an identifier */
3810 unget_tok(last_tok
);
3815 static void block(int *bsym
, int *csym
, int *case_sym
, int *def_sym
,
3816 int case_reg
, int is_expr
)
3821 /* generate line number info */
3822 if (tcc_state
->do_debug
&&
3823 (last_line_num
!= file
->line_num
|| last_ind
!= ind
)) {
3824 put_stabn(N_SLINE
, 0, file
->line_num
, ind
- func_ind
);
3826 last_line_num
= file
->line_num
;
3830 /* default return value is (void) */
3832 vtop
->type
.t
= VT_VOID
;
3835 if (tok
== TOK_IF
) {
3842 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, 0);
3844 if (c
== TOK_ELSE
) {
3848 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, 0);
3849 gsym(d
); /* patch else jmp */
3852 } else if (tok
== TOK_WHILE
) {
3860 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
3864 } else if (tok
== '{') {
3868 /* record local declaration stack position */
3870 llabel
= local_label_stack
;
3871 /* handle local labels declarations */
3872 if (tok
== TOK_LABEL
) {
3875 if (tok
< TOK_UIDENT
)
3876 expect("label identifier");
3877 label_push(&local_label_stack
, tok
, LABEL_DECLARED
);
3887 while (tok
!= '}') {
3892 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, is_expr
);
3895 /* pop locally defined labels */
3896 label_pop(&local_label_stack
, llabel
);
3897 /* pop locally defined symbols */
3899 /* XXX: this solution makes only valgrind happy...
3900 triggered by gcc.c-torture/execute/20000917-1.c */
3902 switch(vtop
->type
.t
& VT_BTYPE
) {
3907 for(p
=vtop
->type
.ref
;p
;p
=p
->prev
)
3909 error("unsupported expression type");
3912 sym_pop(&local_stack
, s
);
3914 } else if (tok
== TOK_RETURN
) {
3918 gen_assign_cast(&func_vt
);
3919 if ((func_vt
.t
& VT_BTYPE
) == VT_STRUCT
) {
3921 /* if returning structure, must copy it to implicit
3922 first pointer arg location */
3925 size
= type_size(&func_vt
,&align
);
3928 if((vtop
->r
!= (VT_LOCAL
| VT_LVAL
) || (vtop
->c
.i
& 3))
3932 loc
= (loc
- size
) & -4;
3935 vset(&type
, VT_LOCAL
| VT_LVAL
, addr
);
3938 vset(&int_type
, VT_LOCAL
| VT_LVAL
, addr
);
3940 vtop
->type
= int_type
;
3946 vset(&type
, VT_LOCAL
| VT_LVAL
, func_vc
);
3949 /* copy structure value to pointer */
3954 } else if (is_float(func_vt
.t
)) {
3955 gv(rc_fret(func_vt
.t
));
3959 vtop
--; /* NOT vpop() because on x86 it would flush the fp stack */
3962 rsym
= gjmp(rsym
); /* jmp */
3963 } else if (tok
== TOK_BREAK
) {
3966 error("cannot break");
3967 *bsym
= gjmp(*bsym
);
3970 } else if (tok
== TOK_CONTINUE
) {
3973 error("cannot continue");
3974 *csym
= gjmp(*csym
);
3977 } else if (tok
== TOK_FOR
) {
4004 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
4009 if (tok
== TOK_DO
) {
4014 block(&a
, &b
, case_sym
, def_sym
, case_reg
, 0);
4025 if (tok
== TOK_SWITCH
) {
4029 /* XXX: other types than integer */
4030 case_reg
= gv(RC_INT
);
4034 b
= gjmp(0); /* jump to first case */
4036 block(&a
, csym
, &b
, &c
, case_reg
, 0);
4037 /* if no default, jmp after switch */
4045 if (tok
== TOK_CASE
) {
4052 if (gnu_ext
&& tok
== TOK_DOTS
) {
4056 warning("empty case range");
4058 /* since a case is like a label, we must skip it with a jmp */
4065 *case_sym
= gtst(1, 0);
4068 *case_sym
= gtst(1, 0);
4072 *case_sym
= gtst(1, *case_sym
);
4077 goto block_after_label
;
4079 if (tok
== TOK_DEFAULT
) {
4085 error("too many 'default'");
4088 goto block_after_label
;
4090 if (tok
== TOK_GOTO
) {
4092 if (tok
== '*' && gnu_ext
) {
4096 if ((vtop
->type
.t
& VT_BTYPE
) != VT_PTR
)
4099 } else if (tok
>= TOK_UIDENT
) {
4100 s
= label_find(tok
);
4101 /* put forward definition if needed */
4103 s
= label_push(&global_label_stack
, tok
, LABEL_FORWARD
);
4105 if (s
->r
== LABEL_DECLARED
)
4106 s
->r
= LABEL_FORWARD
;
4108 /* label already defined */
4109 if (s
->r
& LABEL_FORWARD
)
4110 s
->jnext
= gjmp(s
->jnext
);
4112 gjmp_addr(s
->jnext
);
4115 expect("label identifier");
4118 } else if (tok
== TOK_ASM1
|| tok
== TOK_ASM2
|| tok
== TOK_ASM3
) {
4126 if (s
->r
== LABEL_DEFINED
)
4127 error("duplicate label '%s'", get_tok_str(s
->v
, NULL
));
4129 s
->r
= LABEL_DEFINED
;
4131 s
= label_push(&global_label_stack
, b
, LABEL_DEFINED
);
4134 /* we accept this, but it is a mistake */
4137 warning("deprecated use of label at end of compound statement");
4141 block(bsym
, csym
, case_sym
, def_sym
, case_reg
, is_expr
);
4144 /* expression case */
4159 /* t is the array or struct type. c is the array or struct
4160 address. cur_index/cur_field is the pointer to the current
4161 value. 'size_only' is true if only size info is needed (only used
4163 static void decl_designator(CType
*type
, Section
*sec
, unsigned long c
,
4164 int *cur_index
, Sym
**cur_field
,
4168 int notfirst
, index
, index_last
, align
, l
, nb_elems
, elem_size
;
4174 if (gnu_ext
&& (l
= is_label()) != 0)
4176 while (tok
== '[' || tok
== '.') {
4178 if (!(type
->t
& VT_ARRAY
))
4179 expect("array type");
4182 index
= expr_const();
4183 if (index
< 0 || (s
->c
>= 0 && index
>= s
->c
))
4184 expect("invalid index");
4185 if (tok
== TOK_DOTS
&& gnu_ext
) {
4187 index_last
= expr_const();
4188 if (index_last
< 0 ||
4189 (s
->c
>= 0 && index_last
>= s
->c
) ||
4191 expect("invalid index");
4197 *cur_index
= index_last
;
4198 type
= pointed_type(type
);
4199 elem_size
= type_size(type
, &align
);
4200 c
+= index
* elem_size
;
4201 /* NOTE: we only support ranges for last designator */
4202 nb_elems
= index_last
- index
+ 1;
4203 if (nb_elems
!= 1) {
4212 if ((type
->t
& VT_BTYPE
) != VT_STRUCT
)
4213 expect("struct/union type");
4226 /* XXX: fix this mess by using explicit storage field */
4228 type1
.t
|= (type
->t
& ~VT_TYPE
);
4242 if (type
->t
& VT_ARRAY
) {
4244 type
= pointed_type(type
);
4245 c
+= index
* type_size(type
, &align
);
4249 error("too many field init");
4250 /* XXX: fix this mess by using explicit storage field */
4252 type1
.t
|= (type
->t
& ~VT_TYPE
);
4257 decl_initializer(type
, sec
, c
, 0, size_only
);
4259 /* XXX: make it more general */
4260 if (!size_only
&& nb_elems
> 1) {
4261 unsigned long c_end
;
4266 error("range init not supported yet for dynamic storage");
4267 c_end
= c
+ nb_elems
* elem_size
;
4268 if (c_end
> sec
->data_allocated
)
4269 section_realloc(sec
, c_end
);
4270 src
= sec
->data
+ c
;
4272 for(i
= 1; i
< nb_elems
; i
++) {
4274 memcpy(dst
, src
, elem_size
);
4280 #define EXPR_CONST 1
4283 /* store a value or an expression directly in global data or in local array */
4284 static void init_putv(CType
*type
, Section
*sec
, unsigned long c
,
4285 int v
, int expr_type
)
4287 int saved_global_expr
, bt
, bit_pos
, bit_size
;
4289 unsigned long long bit_mask
;
4297 /* compound literals must be allocated globally in this case */
4298 saved_global_expr
= global_expr
;
4301 global_expr
= saved_global_expr
;
4302 /* NOTE: symbols are accepted */
4303 if ((vtop
->r
& (VT_VALMASK
| VT_LVAL
)) != VT_CONST
)
4304 error("initializer element is not constant");
4312 dtype
.t
&= ~VT_CONSTANT
; /* need to do that to avoid false warning */
4315 /* XXX: not portable */
4316 /* XXX: generate error if incorrect relocation */
4317 gen_assign_cast(&dtype
);
4318 bt
= type
->t
& VT_BTYPE
;
4319 /* we'll write at most 12 bytes */
4320 if (c
+ 12 > sec
->data_allocated
) {
4321 section_realloc(sec
, c
+ 12);
4323 ptr
= sec
->data
+ c
;
4324 /* XXX: make code faster ? */
4325 if (!(type
->t
& VT_BITFIELD
)) {
4330 bit_pos
= (vtop
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4331 bit_size
= (vtop
->type
.t
>> (VT_STRUCT_SHIFT
+ 6)) & 0x3f;
4332 bit_mask
= (1LL << bit_size
) - 1;
4334 if ((vtop
->r
& VT_SYM
) &&
4340 (bt
== VT_INT
&& bit_size
!= 32)))
4341 error("initializer element is not computable at load time");
4344 vtop
->c
.i
= (vtop
->c
.i
!= 0);
4346 *(char *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4349 *(short *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4352 *(double *)ptr
= vtop
->c
.d
;
4355 *(long double *)ptr
= vtop
->c
.ld
;
4358 *(long long *)ptr
|= (vtop
->c
.ll
& bit_mask
) << bit_pos
;
4361 if (vtop
->r
& VT_SYM
) {
4362 greloc(sec
, vtop
->sym
, c
, R_DATA_PTR
);
4364 *(int *)ptr
|= (vtop
->c
.i
& bit_mask
) << bit_pos
;
4369 vset(&dtype
, VT_LOCAL
|VT_LVAL
, c
);
4376 /* put zeros for variable based init */
4377 static void init_putz(CType
*t
, Section
*sec
, unsigned long c
, int size
)
4380 /* nothing to do because globals are already set to zero */
4382 vpush_global_sym(&func_old_type
, TOK_memset
);
4390 /* 't' contains the type and storage info. 'c' is the offset of the
4391 object in section 'sec'. If 'sec' is NULL, it means stack based
4392 allocation. 'first' is true if array '{' must be read (multi
4393 dimension implicit array init handling). 'size_only' is true if
4394 size only evaluation is wanted (only for arrays). */
4395 static void decl_initializer(CType
*type
, Section
*sec
, unsigned long c
,
4396 int first
, int size_only
)
4398 int index
, array_length
, n
, no_oblock
, nb
, parlevel
, i
;
4399 int size1
, align1
, expr_type
;
4403 if (type
->t
& VT_ARRAY
) {
4407 t1
= pointed_type(type
);
4408 size1
= type_size(t1
, &align1
);
4411 if ((first
&& tok
!= TOK_LSTR
&& tok
!= TOK_STR
) ||
4417 /* only parse strings here if correct type (otherwise: handle
4418 them as ((w)char *) expressions */
4419 if ((tok
== TOK_LSTR
&&
4420 #ifdef TCC_TARGET_PE
4421 (t1
->t
& VT_BTYPE
) == VT_SHORT
&& (t1
->t
& VT_UNSIGNED
)
4423 (t1
->t
& VT_BTYPE
) == VT_INT
4425 ) || (tok
== TOK_STR
&& (t1
->t
& VT_BTYPE
) == VT_BYTE
)) {
4426 while (tok
== TOK_STR
|| tok
== TOK_LSTR
) {
4431 /* compute maximum number of chars wanted */
4433 cstr_len
= cstr
->size
;
4435 cstr_len
= cstr
->size
/ sizeof(nwchar_t
);
4438 if (n
>= 0 && nb
> (n
- array_length
))
4439 nb
= n
- array_length
;
4442 warning("initializer-string for array is too long");
4443 /* in order to go faster for common case (char
4444 string in global variable, we handle it
4446 if (sec
&& tok
== TOK_STR
&& size1
== 1) {
4447 memcpy(sec
->data
+ c
+ array_length
, cstr
->data
, nb
);
4451 ch
= ((unsigned char *)cstr
->data
)[i
];
4453 ch
= ((nwchar_t
*)cstr
->data
)[i
];
4454 init_putv(t1
, sec
, c
+ (array_length
+ i
) * size1
,
4462 /* only add trailing zero if enough storage (no
4463 warning in this case since it is standard) */
4464 if (n
< 0 || array_length
< n
) {
4466 init_putv(t1
, sec
, c
+ (array_length
* size1
), 0, EXPR_VAL
);
4472 while (tok
!= '}') {
4473 decl_designator(type
, sec
, c
, &index
, NULL
, size_only
);
4474 if (n
>= 0 && index
>= n
)
4475 error("index too large");
4476 /* must put zero in holes (note that doing it that way
4477 ensures that it even works with designators) */
4478 if (!size_only
&& array_length
< index
) {
4479 init_putz(t1
, sec
, c
+ array_length
* size1
,
4480 (index
- array_length
) * size1
);
4483 if (index
> array_length
)
4484 array_length
= index
;
4485 /* special test for multi dimensional arrays (may not
4486 be strictly correct if designators are used at the
4488 if (index
>= n
&& no_oblock
)
4497 /* put zeros at the end */
4498 if (!size_only
&& n
>= 0 && array_length
< n
) {
4499 init_putz(t1
, sec
, c
+ array_length
* size1
,
4500 (n
- array_length
) * size1
);
4502 /* patch type size if needed */
4504 s
->c
= array_length
;
4505 } else if ((type
->t
& VT_BTYPE
) == VT_STRUCT
&&
4506 (sec
|| !first
|| tok
== '{')) {
4509 /* NOTE: the previous test is a specific case for automatic
4510 struct/union init */
4511 /* XXX: union needs only one init */
4513 /* XXX: this test is incorrect for local initializers
4514 beginning with ( without {. It would be much more difficult
4515 to do it correctly (ideally, the expression parser should
4516 be used in all cases) */
4522 while (tok
== '(') {
4526 if (!parse_btype(&type1
, &ad1
))
4528 type_decl(&type1
, &ad1
, &n
, TYPE_ABSTRACT
);
4530 if (!is_assignable_types(type
, &type1
))
4531 error("invalid type for cast");
4536 if (first
|| tok
== '{') {
4545 while (tok
!= '}') {
4546 decl_designator(type
, sec
, c
, NULL
, &f
, size_only
);
4548 if (!size_only
&& array_length
< index
) {
4549 init_putz(type
, sec
, c
+ array_length
,
4550 index
- array_length
);
4552 index
= index
+ type_size(&f
->type
, &align1
);
4553 if (index
> array_length
)
4554 array_length
= index
;
4556 /* gr: skip fields from same union - ugly. */
4558 ///printf("index: %2d %08x -- %2d %08x\n", f->c, f->type.t, f->next->c, f->next->type.t);
4559 /* test for same offset */
4560 if (f
->next
->c
!= f
->c
)
4562 /* if yes, test for bitfield shift */
4563 if ((f
->type
.t
& VT_BITFIELD
) && (f
->next
->type
.t
& VT_BITFIELD
)) {
4564 int bit_pos_1
= (f
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4565 int bit_pos_2
= (f
->next
->type
.t
>> VT_STRUCT_SHIFT
) & 0x3f;
4566 //printf("bitfield %d %d\n", bit_pos_1, bit_pos_2);
4567 if (bit_pos_1
!= bit_pos_2
)
4574 if (no_oblock
&& f
== NULL
)
4580 /* put zeros at the end */
4581 if (!size_only
&& array_length
< n
) {
4582 init_putz(type
, sec
, c
+ array_length
,
4591 } else if (tok
== '{') {
4593 decl_initializer(type
, sec
, c
, first
, size_only
);
4595 } else if (size_only
) {
4596 /* just skip expression */
4598 while ((parlevel
> 0 || (tok
!= '}' && tok
!= ',')) &&
4602 else if (tok
== ')')
4607 /* currently, we always use constant expression for globals
4608 (may change for scripting case) */
4609 expr_type
= EXPR_CONST
;
4611 expr_type
= EXPR_ANY
;
4612 init_putv(type
, sec
, c
, 0, expr_type
);
4616 /* parse an initializer for type 't' if 'has_init' is non zero, and
4617 allocate space in local or global data space ('r' is either
4618 VT_LOCAL or VT_CONST). If 'v' is non zero, then an associated
4619 variable 'v' of scope 'scope' is declared before initializers are
4620 parsed. If 'v' is zero, then a reference to the new object is put
4621 in the value stack. If 'has_init' is 2, a special parsing is done
4622 to handle string constants. */
4623 static void decl_initializer_alloc(CType
*type
, AttributeDef
*ad
, int r
,
4624 int has_init
, int v
, int scope
)
4626 int size
, align
, addr
, data_offset
;
4628 ParseState saved_parse_state
= {0};
4629 TokenString init_str
;
4632 size
= type_size(type
, &align
);
4633 /* If unknown size, we must evaluate it before
4634 evaluating initializers because
4635 initializers can generate global data too
4636 (e.g. string pointers or ISOC99 compound
4637 literals). It also simplifies local
4638 initializers handling */
4639 tok_str_new(&init_str
);
4642 error("unknown type size");
4643 /* get all init string */
4644 if (has_init
== 2) {
4645 /* only get strings */
4646 while (tok
== TOK_STR
|| tok
== TOK_LSTR
) {
4647 tok_str_add_tok(&init_str
);
4652 while (level
> 0 || (tok
!= ',' && tok
!= ';')) {
4654 error("unexpected end of file in initializer");
4655 tok_str_add_tok(&init_str
);
4658 else if (tok
== '}') {
4668 tok_str_add(&init_str
, -1);
4669 tok_str_add(&init_str
, 0);
4672 save_parse_state(&saved_parse_state
);
4674 macro_ptr
= init_str
.str
;
4676 decl_initializer(type
, NULL
, 0, 1, 1);
4677 /* prepare second initializer parsing */
4678 macro_ptr
= init_str
.str
;
4681 /* if still unknown size, error */
4682 size
= type_size(type
, &align
);
4684 error("unknown type size");
4686 /* take into account specified alignment if bigger */
4688 if (ad
->aligned
> align
)
4689 align
= ad
->aligned
;
4690 } else if (ad
->packed
) {
4693 if ((r
& VT_VALMASK
) == VT_LOCAL
) {
4695 if (tcc_state
->do_bounds_check
&& (type
->t
& VT_ARRAY
))
4697 loc
= (loc
- size
) & -align
;
4699 /* handles bounds */
4700 /* XXX: currently, since we do only one pass, we cannot track
4701 '&' operators, so we add only arrays */
4702 if (tcc_state
->do_bounds_check
&& (type
->t
& VT_ARRAY
)) {
4703 unsigned long *bounds_ptr
;
4704 /* add padding between regions */
4706 /* then add local bound info */
4707 bounds_ptr
= section_ptr_add(lbounds_section
, 2 * sizeof(unsigned long));
4708 bounds_ptr
[0] = addr
;
4709 bounds_ptr
[1] = size
;
4712 /* local variable */
4713 sym_push(v
, type
, r
, addr
);
4715 /* push local reference */
4716 vset(type
, r
, addr
);
4722 if (v
&& scope
== VT_CONST
) {
4723 /* see if the symbol was already defined */
4726 if (!is_compatible_types(&sym
->type
, type
))
4727 error("incompatible types for redefinition of '%s'",
4728 get_tok_str(v
, NULL
));
4729 if (sym
->type
.t
& VT_EXTERN
) {
4730 /* if the variable is extern, it was not allocated */
4731 sym
->type
.t
&= ~VT_EXTERN
;
4732 /* set array size if it was ommited in extern
4734 if ((sym
->type
.t
& VT_ARRAY
) &&
4735 sym
->type
.ref
->c
< 0 &&
4737 sym
->type
.ref
->c
= type
->ref
->c
;
4739 /* we accept several definitions of the same
4740 global variable. this is tricky, because we
4741 must play with the SHN_COMMON type of the symbol */
4742 /* XXX: should check if the variable was already
4743 initialized. It is incorrect to initialized it
4745 /* no init data, we won't add more to the symbol */
4752 /* allocate symbol in corresponding section */
4757 else if (tcc_state
->nocommon
)
4761 data_offset
= sec
->data_offset
;
4762 data_offset
= (data_offset
+ align
- 1) & -align
;
4764 /* very important to increment global pointer at this time
4765 because initializers themselves can create new initializers */
4766 data_offset
+= size
;
4767 /* add padding if bound check */
4768 if (tcc_state
->do_bounds_check
)
4770 sec
->data_offset
= data_offset
;
4771 /* allocate section space to put the data */
4772 if (sec
->sh_type
!= SHT_NOBITS
&&
4773 data_offset
> sec
->data_allocated
)
4774 section_realloc(sec
, data_offset
);
4775 /* align section if needed */
4776 if (align
> sec
->sh_addralign
)
4777 sec
->sh_addralign
= align
;
4779 addr
= 0; /* avoid warning */
4783 if (scope
!= VT_CONST
|| !sym
) {
4784 sym
= sym_push(v
, type
, r
| VT_SYM
, 0);
4786 /* update symbol definition */
4788 put_extern_sym(sym
, sec
, addr
, size
);
4791 /* put a common area */
4792 put_extern_sym(sym
, NULL
, align
, size
);
4793 /* XXX: find a nicer way */
4794 esym
= &((ElfW(Sym
) *)symtab_section
->data
)[sym
->c
];
4795 esym
->st_shndx
= SHN_COMMON
;
4800 /* push global reference */
4801 sym
= get_sym_ref(type
, sec
, addr
, size
);
4803 vsetc(type
, VT_CONST
| VT_SYM
, &cval
);
4807 /* handles bounds now because the symbol must be defined
4808 before for the relocation */
4809 if (tcc_state
->do_bounds_check
) {
4810 unsigned long *bounds_ptr
;
4812 greloc(bounds_section
, sym
, bounds_section
->data_offset
, R_DATA_PTR
);
4813 /* then add global bound info */
4814 bounds_ptr
= section_ptr_add(bounds_section
, 2 * sizeof(long));
4815 bounds_ptr
[0] = 0; /* relocated */
4816 bounds_ptr
[1] = size
;
4820 decl_initializer(type
, sec
, addr
, 1, 0);
4821 /* restore parse state if needed */
4823 tok_str_free(init_str
.str
);
4824 restore_parse_state(&saved_parse_state
);
4830 void put_func_debug(Sym
*sym
)
4835 /* XXX: we put here a dummy type */
4836 snprintf(buf
, sizeof(buf
), "%s:%c1",
4837 funcname
, sym
->type
.t
& VT_STATIC
? 'f' : 'F');
4838 put_stabs_r(buf
, N_FUN
, 0, file
->line_num
, 0,
4839 cur_text_section
, sym
->c
);
4840 /* //gr gdb wants a line at the function */
4841 put_stabn(N_SLINE
, 0, file
->line_num
, 0);
4846 /* parse an old style function declaration list */
4847 /* XXX: check multiple parameter */
4848 static void func_decl_list(Sym
*func_sym
)
4855 /* parse each declaration */
4856 while (tok
!= '{' && tok
!= ';' && tok
!= ',' && tok
!= TOK_EOF
) {
4857 if (!parse_btype(&btype
, &ad
))
4858 expect("declaration list");
4859 if (((btype
.t
& VT_BTYPE
) == VT_ENUM
||
4860 (btype
.t
& VT_BTYPE
) == VT_STRUCT
) &&
4862 /* we accept no variable after */
4866 type_decl(&type
, &ad
, &v
, TYPE_DIRECT
);
4867 /* find parameter in function parameter list */
4870 if ((s
->v
& ~SYM_FIELD
) == v
)
4874 error("declaration for parameter '%s' but no such parameter",
4875 get_tok_str(v
, NULL
));
4877 /* check that no storage specifier except 'register' was given */
4878 if (type
.t
& VT_STORAGE
)
4879 error("storage class specified for '%s'", get_tok_str(v
, NULL
));
4880 convert_parameter_type(&type
);
4881 /* we can add the type (NOTE: it could be local to the function) */
4883 /* accept other parameters */
4894 /* parse a function defined by symbol 'sym' and generate its code in
4895 'cur_text_section' */
4896 static void gen_function(Sym
*sym
)
4898 int saved_nocode_wanted
= nocode_wanted
;
4900 ind
= cur_text_section
->data_offset
;
4901 /* NOTE: we patch the symbol size later */
4902 put_extern_sym(sym
, cur_text_section
, ind
, 0);
4903 funcname
= get_tok_str(sym
->v
, NULL
);
4905 /* put debug symbol */
4906 if (tcc_state
->do_debug
)
4907 put_func_debug(sym
);
4908 /* push a dummy symbol to enable local sym storage */
4909 sym_push2(&local_stack
, SYM_FIELD
, 0, 0);
4910 gfunc_prolog(&sym
->type
);
4912 block(NULL
, NULL
, NULL
, NULL
, 0, 0);
4915 cur_text_section
->data_offset
= ind
;
4916 label_pop(&global_label_stack
, NULL
);
4917 sym_pop(&local_stack
, NULL
); /* reset local stack */
4918 /* end of function */
4919 /* patch symbol size */
4920 ((ElfW(Sym
) *)symtab_section
->data
)[sym
->c
].st_size
=
4922 if (tcc_state
->do_debug
) {
4923 put_stabn(N_FUN
, 0, 0, ind
- func_ind
);
4925 /* It's better to crash than to generate wrong code */
4926 cur_text_section
= NULL
;
4927 funcname
= ""; /* for safety */
4928 func_vt
.t
= VT_VOID
; /* for safety */
4929 ind
= 0; /* for safety */
4930 nocode_wanted
= saved_nocode_wanted
;
4933 static void gen_inline_functions(void)
4936 int *str
, inline_generated
, i
;
4937 struct InlineFunc
*fn
;
4939 /* iterate while inline function are referenced */
4941 inline_generated
= 0;
4942 for (i
= 0; i
< tcc_state
->nb_inline_fns
; ++i
) {
4943 fn
= tcc_state
->inline_fns
[i
];
4945 if (sym
&& sym
->c
) {
4946 /* the function was used: generate its code and
4947 convert it to a normal function */
4948 str
= fn
->token_str
;
4951 strcpy(file
->filename
, fn
->filename
);
4952 sym
->r
= VT_SYM
| VT_CONST
;
4953 sym
->type
.t
&= ~VT_INLINE
;
4957 cur_text_section
= text_section
;
4959 macro_ptr
= NULL
; /* fail safe */
4961 inline_generated
= 1;
4964 if (!inline_generated
)
4967 for (i
= 0; i
< tcc_state
->nb_inline_fns
; ++i
) {
4968 fn
= tcc_state
->inline_fns
[i
];
4969 str
= fn
->token_str
;
4972 dynarray_reset(&tcc_state
->inline_fns
, &tcc_state
->nb_inline_fns
);
4975 /* 'l' is VT_LOCAL or VT_CONST to define default storage type */
4976 static void decl(int l
)
4984 if (!parse_btype(&btype
, &ad
)) {
4985 /* skip redundant ';' */
4986 /* XXX: find more elegant solution */
4991 if (l
== VT_CONST
&&
4992 (tok
== TOK_ASM1
|| tok
== TOK_ASM2
|| tok
== TOK_ASM3
)) {
4993 /* global asm block */
4997 /* special test for old K&R protos without explicit int
4998 type. Only accepted when defining global data */
4999 if (l
== VT_LOCAL
|| tok
< TOK_DEFINE
)
5003 if (((btype
.t
& VT_BTYPE
) == VT_ENUM
||
5004 (btype
.t
& VT_BTYPE
) == VT_STRUCT
) &&
5006 /* we accept no variable after */
5010 while (1) { /* iterate thru each declaration */
5012 type_decl(&type
, &ad
, &v
, TYPE_DIRECT
);
5016 type_to_str(buf
, sizeof(buf
), t
, get_tok_str(v
, NULL
));
5017 printf("type = '%s'\n", buf
);
5020 if ((type
.t
& VT_BTYPE
) == VT_FUNC
) {
5021 /* if old style function prototype, we accept a
5024 if (sym
->c
== FUNC_OLD
)
5025 func_decl_list(sym
);
5030 error("cannot use local functions");
5031 if ((type
.t
& VT_BTYPE
) != VT_FUNC
)
5032 expect("function definition");
5034 /* reject abstract declarators in function definition */
5036 while ((sym
= sym
->next
) != NULL
)
5037 if (!(sym
->v
& ~SYM_FIELD
))
5038 expect("identifier");
5040 /* XXX: cannot do better now: convert extern line to static inline */
5041 if ((type
.t
& (VT_EXTERN
| VT_INLINE
)) == (VT_EXTERN
| VT_INLINE
))
5042 type
.t
= (type
.t
& ~VT_EXTERN
) | VT_STATIC
;
5046 if ((sym
->type
.t
& VT_BTYPE
) != VT_FUNC
)
5049 r
= sym
->type
.ref
->r
;
5050 /* use func_call from prototype if not defined */
5051 if (FUNC_CALL(r
) != FUNC_CDECL
5052 && FUNC_CALL(type
.ref
->r
) == FUNC_CDECL
)
5053 FUNC_CALL(type
.ref
->r
) = FUNC_CALL(r
);
5055 /* use export from prototype */
5057 FUNC_EXPORT(type
.ref
->r
) = 1;
5059 /* use static from prototype */
5060 if (sym
->type
.t
& VT_STATIC
)
5061 type
.t
= (type
.t
& ~VT_EXTERN
) | VT_STATIC
;
5063 if (!is_compatible_types(&sym
->type
, &type
)) {
5065 error("incompatible types for redefinition of '%s'",
5066 get_tok_str(v
, NULL
));
5068 /* if symbol is already defined, then put complete type */
5071 /* put function symbol */
5072 sym
= global_identifier_push(v
, type
.t
, 0);
5073 sym
->type
.ref
= type
.ref
;
5076 /* static inline functions are just recorded as a kind
5077 of macro. Their code will be emitted at the end of
5078 the compilation unit only if they are used */
5079 if ((type
.t
& (VT_INLINE
| VT_STATIC
)) ==
5080 (VT_INLINE
| VT_STATIC
)) {
5081 TokenString func_str
;
5083 struct InlineFunc
*fn
;
5084 const char *filename
;
5086 tok_str_new(&func_str
);
5092 error("unexpected end of file");
5093 tok_str_add_tok(&func_str
);
5098 } else if (t
== '}') {
5100 if (block_level
== 0)
5104 tok_str_add(&func_str
, -1);
5105 tok_str_add(&func_str
, 0);
5106 filename
= file
? file
->filename
: "";
5107 fn
= tcc_malloc(sizeof *fn
+ strlen(filename
));
5108 strcpy(fn
->filename
, filename
);
5110 fn
->token_str
= func_str
.str
;
5111 dynarray_add((void ***)&tcc_state
->inline_fns
, &tcc_state
->nb_inline_fns
, fn
);
5114 /* compute text section */
5115 cur_text_section
= ad
.section
;
5116 if (!cur_text_section
)
5117 cur_text_section
= text_section
;
5118 sym
->r
= VT_SYM
| VT_CONST
;
5123 if (btype
.t
& VT_TYPEDEF
) {
5124 /* save typedefed type */
5125 /* XXX: test storage specifiers ? */
5126 sym
= sym_push(v
, &type
, INT_ATTR(&ad
), 0);
5127 sym
->type
.t
|= VT_TYPEDEF
;
5128 } else if ((type
.t
& VT_BTYPE
) == VT_FUNC
) {
5129 /* external function definition */
5130 /* specific case for func_call attribute */
5131 type
.ref
->r
= INT_ATTR(&ad
);
5132 external_sym(v
, &type
, 0);
5134 /* not lvalue if array */
5136 if (!(type
.t
& VT_ARRAY
))
5137 r
|= lvalue_type(type
.t
);
5138 has_init
= (tok
== '=');
5139 if ((btype
.t
& VT_EXTERN
) ||
5140 ((type
.t
& VT_ARRAY
) && (type
.t
& VT_STATIC
) &&
5141 !has_init
&& l
== VT_CONST
&& type
.ref
->c
< 0)) {
5142 /* external variable */
5143 /* NOTE: as GCC, uninitialized global static
5144 arrays of null size are considered as
5146 #ifdef TCC_TARGET_PE
5148 type
.t
|= VT_IMPORT
;
5150 external_sym(v
, &type
, r
);
5152 type
.t
|= (btype
.t
& VT_STATIC
); /* Retain "static". */
5153 if (type
.t
& VT_STATIC
)
5159 decl_initializer_alloc(&type
, &ad
, r
,