allow redefinition of func_old_type functions
[tinycc.git] / tccgen.c
blob7ac05d3d9d6c9c33690d90e891722019d67932f5
1 /*
2 * TCC - Tiny C Compiler
3 *
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)
23 int t;
24 t = *p;
25 *p = *q;
26 *q = t;
29 void vsetc(CType *type, int r, CValue *vc)
31 int v;
33 if (vtop >= vstack + (VSTACK_SIZE - 1))
34 error("memory full");
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. */
38 if (vtop >= vstack) {
39 v = vtop->r & VT_VALMASK;
40 if (v == VT_CMP || (v & ~1) == VT_JMP)
41 gv(RC_INT);
43 vtop++;
44 vtop->type = *type;
45 vtop->r = r;
46 vtop->r2 = VT_CONST;
47 vtop->c = *vc;
50 /* push integer constant */
51 void vpushi(int v)
53 CValue cval;
54 cval.i = v;
55 vsetc(&int_type, VT_CONST, &cval);
58 /* push long long constant */
59 void vpushll(long long v)
61 CValue cval;
62 CType ctype;
63 ctype.t = VT_LLONG;
64 cval.ull = 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)
72 int v;
73 Sym *sym;
75 v = anon_sym++;
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);
80 return sym;
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)
86 CValue cval;
88 cval.ul = 0;
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)
96 Sym *s;
98 s = sym_find(v);
99 if (!s) {
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;
105 return s;
108 /* define a new external reference to a symbol 'v' of type 'u' */
109 static Sym *external_sym(int v, CType *type, int r)
111 Sym *s;
113 s = sym_find(v);
114 if (!s) {
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));
126 return s;
129 /* push a reference to global symbol v */
130 static void vpush_global_sym(CType *type, int v)
132 Sym *sym;
133 CValue cval;
135 sym = external_global_sym(v, type, 0);
136 cval.ul = 0;
137 vsetc(type, VT_CONST | VT_SYM, &cval);
138 vtop->sym = sym;
141 void vset(CType *type, int r, int v)
143 CValue cval;
145 cval.i = v;
146 vsetc(type, r, &cval);
149 void vseti(int r, int v)
151 CType type;
152 type.t = VT_INT;
153 vset(&type, r, v);
156 void vswap(void)
158 SValue tmp;
160 tmp = vtop[0];
161 vtop[0] = vtop[-1];
162 vtop[-1] = tmp;
165 void vpushv(SValue *v)
167 if (vtop >= vstack + (VSTACK_SIZE - 1))
168 error("memory full");
169 vtop++;
170 *vtop = *v;
173 void vdup(void)
175 vpushv(vtop);
178 /* save r to the memory stack, and mark it as being free */
179 void save_reg(int r)
181 int l, saved, size, align;
182 SValue *p, sv;
183 CType *type;
185 /* modify all stack values */
186 saved = 0;
187 l = 0;
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 */
192 if (!saved) {
193 /* NOTE: must reload 'r' because r might be equal to r2 */
194 r = p->r & VT_VALMASK;
195 /* store register in the stack */
196 type = &p->type;
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;
201 #else
202 type = &int_type;
203 #endif
204 size = type_size(type, &align);
205 loc = (loc - size) & -align;
206 sv.type.t = type->t;
207 sv.r = VT_LOCAL | VT_LVAL;
208 sv.c.ul = loc;
209 store(r, &sv);
210 #if defined(TCC_TARGET_I386) || defined(TCC_TARGET_X86_64)
211 /* x86 specific: need to pop fp register ST0 if saved */
212 if (r == TREG_ST0) {
213 o(0xd8dd); /* fstp %st(0) */
215 #endif
216 #ifndef TCC_TARGET_X86_64
217 /* special long long case */
218 if ((type->t & VT_BTYPE) == VT_LLONG) {
219 sv.c.ul += 4;
220 store(p->r2, &sv);
222 #endif
223 l = loc;
224 saved = 1;
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
230 p->c.ul */
231 p->r = (p->r & ~(VT_VALMASK | VT_BOUNDED)) | VT_LLOCAL;
232 } else {
233 p->r = lvalue_type(p->type.t) | VT_LOCAL;
235 p->r2 = VT_CONST;
236 p->c.ul = l;
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)
245 int r;
246 SValue *p;
248 for(r=0;r<NB_REGS;r++) {
249 if (reg_classes[r] & rc2) {
250 int n;
251 n=0;
252 for(p = vstack; p <= vtop; p++) {
253 if ((p->r & VT_VALMASK) == r ||
254 (p->r2 & VT_VALMASK) == r)
255 n++;
257 if (n <= 1)
258 return r;
261 return get_reg(rc);
264 /* find a free register of class 'rc'. If none, save one register */
265 int get_reg(int rc)
267 int r;
268 SValue *p;
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)
276 goto notfound;
278 return r;
280 notfound: ;
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))
289 goto save_found;
290 /* also look at second register (if long long) */
291 r = p->r2 & VT_VALMASK;
292 if (r < VT_CONST && (reg_classes[r] & rc)) {
293 save_found:
294 save_reg(r);
295 return r;
298 /* Should never comes here */
299 return -1;
302 /* save registers up to (vtop - n) stack entry */
303 void save_regs(int n)
305 int r;
306 SValue *p, *p1;
307 p1 = vtop - n;
308 for(p = vstack;p <= p1; p++) {
309 r = p->r & VT_VALMASK;
310 if (r < VT_CONST) {
311 save_reg(r);
316 /* move register 's' to 'r', and flush previous value of r to memory
317 if needed */
318 void move_reg(int r, int s)
320 SValue sv;
322 if (r != s) {
323 save_reg(r);
324 sv.type.t = VT_INT;
325 sv.r = s;
326 sv.c.ul = 0;
327 load(r, &sv);
331 /* get address of vtop (vtop MUST BE an lvalue) */
332 void gaddrof(void)
334 vtop->r &= ~VT_LVAL;
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 */
342 void gbound(void)
344 int lval_type;
345 CType type1;
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 */
354 type1 = vtop->type;
355 vtop->type.t = VT_INT;
356 gaddrof();
357 vpushi(0);
358 gen_bounded_ptr_add();
359 vtop->r |= lval_type;
360 vtop->type = type1;
362 /* then check for dereferencing */
363 gen_bounded_ptr_deref();
366 #endif
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). */
371 int gv(int rc)
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) {
377 CType type;
378 int bits = 32;
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) {
385 type.t = VT_LLONG;
386 bits = 64;
387 } else
388 type.t = VT_INT;
389 if((vtop->type.t & VT_UNSIGNED) ||
390 (vtop->type.t & VT_BTYPE) == VT_BOOL)
391 type.t |= VT_UNSIGNED;
392 gen_cast(&type);
393 /* generate shifts */
394 vpushi(bits - (bit_pos + bit_size));
395 gen_op(TOK_SHL);
396 vpushi(bits - bit_size);
397 /* NOTE: transformed to SHR if unsigned */
398 gen_op(TOK_SAR);
399 r = gv(rc);
400 } else {
401 if (is_float(vtop->type.t) &&
402 (vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
403 Sym *sym;
404 int *ptr;
405 unsigned long offset;
406 #if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)
407 CValue check;
408 #endif
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;
421 #endif
422 ptr = section_ptr_add(data_section, size);
423 size = size >> 2;
424 #if defined(TCC_TARGET_ARM) && !defined(TCC_ARM_VFP)
425 check.d = 1;
426 if(check.tab[0])
427 for(i=0;i<size;i++)
428 ptr[i] = vtop->c.tab[size-1-i];
429 else
430 #endif
431 for(i=0;i<size;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;
435 vtop->sym = sym;
436 vtop->c.ul = 0;
438 #ifdef CONFIG_TCC_BCHECK
439 if (vtop->r & VT_MUSTBOUND)
440 gbound();
441 #endif
443 r = vtop->r & VT_VALMASK;
444 rc2 = RC_INT;
445 if (rc == RC_IRET)
446 rc2 = RC_LRET;
447 /* need to reload if:
448 - constant
449 - lvalue (need to dereference pointer)
450 - already a register, but not in the right class */
451 if (r >= VT_CONST ||
452 (vtop->r & VT_LVAL) ||
453 !(reg_classes[r] & rc) ||
454 ((vtop->type.t & VT_BTYPE) == VT_LLONG &&
455 !(reg_classes[vtop->r2] & rc2))) {
456 r = get_reg(rc);
457 #ifndef TCC_TARGET_X86_64
458 if ((vtop->type.t & VT_BTYPE) == VT_LLONG) {
459 int r2;
460 unsigned long long ll;
461 /* two register type load : expand to two words
462 temporarily */
463 if ((vtop->r & (VT_VALMASK | VT_LVAL)) == VT_CONST) {
464 /* load constant */
465 ll = vtop->c.ull;
466 vtop->c.ui = ll; /* first word */
467 load(r, vtop);
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. */
476 save_regs(1);
477 /* load from memory */
478 load(r, vtop);
479 vdup();
480 vtop[-1].r = r; /* save register value */
481 /* increment pointer to get second word */
482 vtop->type.t = VT_INT;
483 gaddrof();
484 vpushi(4);
485 gen_op('+');
486 vtop->r |= VT_LVAL;
487 } else {
488 /* move registers */
489 load(r, vtop);
490 vdup();
491 vtop[-1].r = r; /* save register value */
492 vtop->r = vtop[-1].r2;
494 /* allocate second register */
495 r2 = get_reg(rc2);
496 load(r2, vtop);
497 vpop();
498 /* write second register */
499 vtop->r2 = r2;
500 } else
501 #endif
502 if ((vtop->r & VT_LVAL) && !is_float(vtop->type.t)) {
503 int t1, t;
504 /* lvalue of scalar type : need to use lvalue type
505 because of possible cast */
506 t = vtop->type.t;
507 t1 = t;
508 /* compute memory access type */
509 if (vtop->r & VT_LVAL_BYTE)
510 t = VT_BYTE;
511 else if (vtop->r & VT_LVAL_SHORT)
512 t = VT_SHORT;
513 if (vtop->r & VT_LVAL_UNSIGNED)
514 t |= VT_UNSIGNED;
515 vtop->type.t = t;
516 load(r, vtop);
517 /* restore wanted type */
518 vtop->type.t = t1;
519 } else {
520 /* one register type load */
521 load(r, vtop);
524 vtop->r = r;
525 #ifdef TCC_TARGET_C67
526 /* uses register pairs for doubles */
527 if ((vtop->type.t & VT_BTYPE) == VT_DOUBLE)
528 vtop->r2 = r+1;
529 #endif
531 return r;
534 /* generate vtop[-1] and vtop[0] in resp. classes rc1 and rc2 */
535 void gv2(int rc1, int rc2)
537 int v;
539 /* generate more generic register first. But VT_JMP or VT_CMP
540 values must be generated first in all cases to avoid possible
541 reload errors */
542 v = vtop[0].r & VT_VALMASK;
543 if (v != VT_CMP && (v & ~1) != VT_JMP && rc1 <= rc2) {
544 vswap();
545 gv(rc1);
546 vswap();
547 gv(rc2);
548 /* test if reload is needed for first register */
549 if ((vtop[-1].r & VT_VALMASK) >= VT_CONST) {
550 vswap();
551 gv(rc1);
552 vswap();
554 } else {
555 gv(rc2);
556 vswap();
557 gv(rc1);
558 vswap();
559 /* test if reload is needed for first register */
560 if ((vtop[0].r & VT_VALMASK) >= VT_CONST) {
561 gv(rc2);
566 /* wrapper around RC_FRET to return a register by type */
567 int rc_fret(int t)
569 #ifdef TCC_TARGET_X86_64
570 if (t == VT_LDOUBLE) {
571 return RC_ST0;
573 #endif
574 return RC_FRET;
577 /* wrapper around REG_FRET to return a register by type */
578 int reg_fret(int t)
580 #ifdef TCC_TARGET_X86_64
581 if (t == VT_LDOUBLE) {
582 return TREG_ST0;
584 #endif
585 return REG_FRET;
588 /* expand long long on stack in two int registers */
589 void lexpand(void)
591 int u;
593 u = vtop->type.t & VT_UNSIGNED;
594 gv(RC_INT);
595 vdup();
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)
607 int u,v;
609 u = vtop->type.t & VT_UNSIGNED;
610 vdup();
611 vtop->r2 = VT_CONST;
612 vtop->type.t = VT_INT | u;
613 v=vtop[-1].r & (VT_VALMASK | VT_LVAL);
614 if (v == VT_CONST) {
615 vtop[-1].c.ui = vtop->c.ull;
616 vtop->c.ui = vtop->c.ull >> 32;
617 vtop->r = VT_CONST;
618 } else if (v == (VT_LVAL|VT_CONST) || v == (VT_LVAL|VT_LOCAL)) {
619 vtop->c.ui += 4;
620 vtop->r = vtop[-1].r;
621 } else if (v > VT_CONST) {
622 vtop--;
623 lexpand();
624 } else
625 vtop->r = vtop[-1].r2;
626 vtop[-1].r2 = VT_CONST;
627 vtop[-1].type.t = VT_INT | u;
629 #endif
631 /* build a long long from two ints */
632 void lbuild(int t)
634 gv2(RC_INT, RC_INT);
635 vtop[-1].r2 = vtop[0].r;
636 vtop[-1].type.t = t;
637 vpop();
640 /* rotate n first stack elements to the bottom
641 I1 ... In -> I2 ... In I1 [top is right]
643 void vrotb(int n)
645 int i;
646 SValue tmp;
648 tmp = vtop[-n + 1];
649 for(i=-n+1;i!=0;i++)
650 vtop[i] = vtop[i+1];
651 vtop[0] = tmp;
654 /* rotate n first stack elements to the top
655 I1 ... In -> In I1 ... I(n-1) [top is right]
657 void vrott(int n)
659 int i;
660 SValue tmp;
662 tmp = vtop[0];
663 for(i = 0;i < n - 1; i++)
664 vtop[-i] = vtop[-i - 1];
665 vtop[-n + 1] = tmp;
668 #ifdef TCC_TARGET_ARM
669 /* like vrott but in other direction
670 In ... I1 -> I(n-1) ... I1 In [top is right]
672 void vnrott(int n)
674 int i;
675 SValue tmp;
677 tmp = vtop[-n + 1];
678 for(i = n - 1; i > 0; i--)
679 vtop[-i] = vtop[-i + 1];
680 vtop[0] = tmp;
682 #endif
684 /* pop stack value */
685 void vpop(void)
687 int v;
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) */
693 } else
694 #endif
695 if (v == VT_JMP || v == VT_JMPI) {
696 /* need to put correct jump if && or || without test */
697 gsym(vtop->c.ul);
699 vtop--;
702 /* convert stack entry to register and duplicate its value in another
703 register */
704 void gv_dup(void)
706 int rc, t, r, r1;
707 SValue sv;
709 t = vtop->type.t;
710 if ((t & VT_BTYPE) == VT_LLONG) {
711 lexpand();
712 gv_dup();
713 vswap();
714 vrotb(3);
715 gv_dup();
716 vrotb(4);
717 /* stack: H L L1 H1 */
718 lbuild(t);
719 vrotb(3);
720 vrotb(3);
721 vswap();
722 lbuild(t);
723 vswap();
724 } else {
725 /* duplicate value */
726 rc = RC_INT;
727 sv.type.t = VT_INT;
728 if (is_float(t)) {
729 rc = RC_FLOAT;
730 #ifdef TCC_TARGET_X86_64
731 if ((t & VT_BTYPE) == VT_LDOUBLE) {
732 rc = RC_ST0;
734 #endif
735 sv.type.t = t;
737 r = gv(rc);
738 r1 = get_reg(rc);
739 sv.r = r;
740 sv.c.ul = 0;
741 load(r1, &sv); /* move r to r1 */
742 vdup();
743 /* duplicates value */
744 if (r != r1)
745 vtop->r = r1;
749 #ifndef TCC_TARGET_X86_64
750 /* generate CPU independent (unsigned) long long operations */
751 void gen_opl(int op)
753 int t, a, b, op1, c, i;
754 int func;
755 unsigned short reg_iret = REG_IRET;
756 unsigned short reg_lret = REG_LRET;
757 SValue tmp;
759 switch(op) {
760 case '/':
761 case TOK_PDIV:
762 func = TOK___divdi3;
763 goto gen_func;
764 case TOK_UDIV:
765 func = TOK___udivdi3;
766 goto gen_func;
767 case '%':
768 func = TOK___moddi3;
769 goto gen_mod_func;
770 case TOK_UMOD:
771 func = TOK___umoddi3;
772 gen_mod_func:
773 #ifdef TCC_ARM_EABI
774 reg_iret = TREG_R2;
775 reg_lret = TREG_R3;
776 #endif
777 gen_func:
778 /* call generic long long function */
779 vpush_global_sym(&func_old_type, func);
780 vrott(3);
781 gfunc_call(2);
782 vpushi(0);
783 vtop->r = reg_iret;
784 vtop->r2 = reg_lret;
785 break;
786 case '^':
787 case '&':
788 case '|':
789 case '*':
790 case '+':
791 case '-':
792 t = vtop->type.t;
793 vswap();
794 lexpand();
795 vrotb(3);
796 lexpand();
797 /* stack: L1 H1 L2 H2 */
798 tmp = vtop[0];
799 vtop[0] = vtop[-3];
800 vtop[-3] = tmp;
801 tmp = vtop[-2];
802 vtop[-2] = vtop[-3];
803 vtop[-3] = tmp;
804 vswap();
805 /* stack: H1 H2 L1 L2 */
806 if (op == '*') {
807 vpushv(vtop - 1);
808 vpushv(vtop - 1);
809 gen_op(TOK_UMULL);
810 lexpand();
811 /* stack: H1 H2 L1 L2 ML MH */
812 for(i=0;i<4;i++)
813 vrotb(6);
814 /* stack: ML MH H1 H2 L1 L2 */
815 tmp = vtop[0];
816 vtop[0] = vtop[-2];
817 vtop[-2] = tmp;
818 /* stack: ML MH H1 L2 H2 L1 */
819 gen_op('*');
820 vrotb(3);
821 vrotb(3);
822 gen_op('*');
823 /* stack: ML MH M1 M2 */
824 gen_op('+');
825 gen_op('+');
826 } else if (op == '+' || op == '-') {
827 /* XXX: add non carry method too (for MIPS or alpha) */
828 if (op == '+')
829 op1 = TOK_ADDC1;
830 else
831 op1 = TOK_SUBC1;
832 gen_op(op1);
833 /* stack: H1 H2 (L1 op L2) */
834 vrotb(3);
835 vrotb(3);
836 gen_op(op1 + 1); /* TOK_xxxC2 */
837 } else {
838 gen_op(op);
839 /* stack: H1 H2 (L1 op L2) */
840 vrotb(3);
841 vrotb(3);
842 /* stack: (L1 op L2) H1 H2 */
843 gen_op(op);
844 /* stack: (L1 op L2) (H1 op H2) */
846 /* stack: L H */
847 lbuild(t);
848 break;
849 case TOK_SAR:
850 case TOK_SHR:
851 case TOK_SHL:
852 if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {
853 t = vtop[-1].type.t;
854 vswap();
855 lexpand();
856 vrotb(3);
857 /* stack: L H shift */
858 c = (int)vtop->c.i;
859 /* constant: simpler */
860 /* NOTE: all comments are for SHL. the other cases are
861 done by swaping words */
862 vpop();
863 if (op != TOK_SHL)
864 vswap();
865 if (c >= 32) {
866 /* stack: L H */
867 vpop();
868 if (c > 32) {
869 vpushi(c - 32);
870 gen_op(op);
872 if (op != TOK_SAR) {
873 vpushi(0);
874 } else {
875 gv_dup();
876 vpushi(31);
877 gen_op(TOK_SAR);
879 vswap();
880 } else {
881 vswap();
882 gv_dup();
883 /* stack: H L L */
884 vpushi(c);
885 gen_op(op);
886 vswap();
887 vpushi(32 - c);
888 if (op == TOK_SHL)
889 gen_op(TOK_SHR);
890 else
891 gen_op(TOK_SHL);
892 vrotb(3);
893 /* stack: L L H */
894 vpushi(c);
895 if (op == TOK_SHL)
896 gen_op(TOK_SHL);
897 else
898 gen_op(TOK_SHR);
899 gen_op('|');
901 if (op != TOK_SHL)
902 vswap();
903 lbuild(t);
904 } else {
905 /* XXX: should provide a faster fallback on x86 ? */
906 switch(op) {
907 case TOK_SAR:
908 func = TOK___ashrdi3;
909 goto gen_func;
910 case TOK_SHR:
911 func = TOK___lshrdi3;
912 goto gen_func;
913 case TOK_SHL:
914 func = TOK___ashldi3;
915 goto gen_func;
918 break;
919 default:
920 /* compare operations */
921 t = vtop->type.t;
922 vswap();
923 lexpand();
924 vrotb(3);
925 lexpand();
926 /* stack: L1 H1 L2 H2 */
927 tmp = vtop[-1];
928 vtop[-1] = vtop[-2];
929 vtop[-2] = tmp;
930 /* stack: L1 L2 H1 H2 */
931 /* compare high */
932 op1 = op;
933 /* when values are equal, we need to compare low words. since
934 the jump is inverted, we invert the test too. */
935 if (op1 == TOK_LT)
936 op1 = TOK_LE;
937 else if (op1 == TOK_GT)
938 op1 = TOK_GE;
939 else if (op1 == TOK_ULT)
940 op1 = TOK_ULE;
941 else if (op1 == TOK_UGT)
942 op1 = TOK_UGE;
943 a = 0;
944 b = 0;
945 gen_op(op1);
946 if (op1 != TOK_NE) {
947 a = gtst(1, 0);
949 if (op != TOK_EQ) {
950 /* generate non equal test */
951 /* XXX: NOT PORTABLE yet */
952 if (a == 0) {
953 b = gtst(0, 0);
954 } else {
955 #if defined(TCC_TARGET_I386)
956 b = psym(0x850f, 0);
957 #elif defined(TCC_TARGET_ARM)
958 b = ind;
959 o(0x1A000000 | encbranch(ind, 0, 1));
960 #elif defined(TCC_TARGET_C67)
961 error("not implemented");
962 #else
963 #error not supported
964 #endif
967 /* compare low. Always unsigned */
968 op1 = op;
969 if (op1 == TOK_LT)
970 op1 = TOK_ULT;
971 else if (op1 == TOK_LE)
972 op1 = TOK_ULE;
973 else if (op1 == TOK_GT)
974 op1 = TOK_UGT;
975 else if (op1 == TOK_GE)
976 op1 = TOK_UGE;
977 gen_op(op1);
978 a = gtst(1, a);
979 gsym(b);
980 vseti(VT_JMPI, a);
981 break;
984 #endif
986 /* handle integer constant optimizations and various machine
987 independent opt */
988 void gen_opic(int op)
990 int c1, c2, t1, t2, n;
991 SValue *v1, *v2;
992 long long l1, l2;
993 typedef unsigned long long U;
995 v1 = vtop - 1;
996 v2 = vtop;
997 t1 = v1->type.t & VT_BTYPE;
998 t2 = v2->type.t & VT_BTYPE;
1000 if (t1 == VT_LLONG)
1001 l1 = v1->c.ll;
1002 else if (v1->type.t & VT_UNSIGNED)
1003 l1 = v1->c.ui;
1004 else
1005 l1 = v1->c.i;
1007 if (t2 == VT_LLONG)
1008 l2 = v2->c.ll;
1009 else if (v2->type.t & VT_UNSIGNED)
1010 l2 = v2->c.ui;
1011 else
1012 l2 = v2->c.i;
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;
1017 if (c1 && c2) {
1018 switch(op) {
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;
1026 case TOK_PDIV:
1027 case '/':
1028 case '%':
1029 case TOK_UDIV:
1030 case TOK_UMOD:
1031 /* if division by zero, generate explicit division */
1032 if (l2 == 0) {
1033 if (const_wanted)
1034 error("division by zero in constant");
1035 goto general_case;
1037 switch(op) {
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;
1043 break;
1044 case TOK_SHL: l1 <<= l2; break;
1045 case TOK_SHR: l1 = (U)l1 >> l2; break;
1046 case TOK_SAR: l1 >>= l2; break;
1047 /* tests */
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;
1058 /* logical */
1059 case TOK_LAND: l1 = l1 && l2; break;
1060 case TOK_LOR: l1 = l1 || l2; break;
1061 default:
1062 goto general_case;
1064 v1->c.ll = l1;
1065 vtop--;
1066 } else {
1067 /* if commutative ops, put c2 as constant */
1068 if (c1 && (op == '+' || op == '&' || op == '^' ||
1069 op == '|' || op == '*')) {
1070 vswap();
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 ||
1076 op == TOK_PDIV) &&
1077 l2 == 1) ||
1078 ((op == '+' || op == '-' || op == '|' || op == '^' ||
1079 op == TOK_SHL || op == TOK_SHR || op == TOK_SAR) &&
1080 l2 == 0) ||
1081 (op == '&' &&
1082 l2 == -1))) {
1083 /* nothing to do */
1084 vtop--;
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) {
1088 n = -1;
1089 while (l2) {
1090 l2 >>= 1;
1091 n++;
1093 vtop->c.ll = n;
1094 if (op == '*')
1095 op = TOK_SHL;
1096 else if (op == TOK_PDIV)
1097 op = TOK_SAR;
1098 else
1099 op = TOK_SHR;
1101 goto general_case;
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 */
1107 if (op == '-')
1108 l2 = -l2;
1109 vtop--;
1110 vtop->c.ll += l2;
1111 } else {
1112 general_case:
1113 if (!nocode_wanted) {
1114 /* call low level op generator */
1115 if (t1 == VT_LLONG || t2 == VT_LLONG)
1116 gen_opl(op);
1117 else
1118 gen_opi(op);
1119 } else {
1120 vtop--;
1126 /* generate a floating point operation with constant propagation */
1127 void gen_opif(int op)
1129 int c1, c2;
1130 SValue *v1, *v2;
1131 long double f1, f2;
1133 v1 = vtop - 1;
1134 v2 = vtop;
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;
1138 if (c1 && c2) {
1139 if (v1->type.t == VT_FLOAT) {
1140 f1 = v1->c.f;
1141 f2 = v2->c.f;
1142 } else if (v1->type.t == VT_DOUBLE) {
1143 f1 = v1->c.d;
1144 f2 = v2->c.d;
1145 } else {
1146 f1 = v1->c.ld;
1147 f2 = v2->c.ld;
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))
1153 goto general_case;
1155 switch(op) {
1156 case '+': f1 += f2; break;
1157 case '-': f1 -= f2; break;
1158 case '*': f1 *= f2; break;
1159 case '/':
1160 if (f2 == 0.0) {
1161 if (const_wanted)
1162 error("division by zero in constant");
1163 goto general_case;
1165 f1 /= f2;
1166 break;
1167 /* XXX: also handles tests ? */
1168 default:
1169 goto general_case;
1171 /* XXX: overflow test ? */
1172 if (v1->type.t == VT_FLOAT) {
1173 v1->c.f = f1;
1174 } else if (v1->type.t == VT_DOUBLE) {
1175 v1->c.d = f1;
1176 } else {
1177 v1->c.ld = f1;
1179 vtop--;
1180 } else {
1181 general_case:
1182 if (!nocode_wanted) {
1183 gen_opf(op);
1184 } else {
1185 vtop--;
1190 static int pointed_size(CType *type)
1192 int align;
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)
1199 return 0;
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;
1214 int bt1, bt2;
1216 /* null pointers are accepted for all comparisons as gcc */
1217 if (is_null_pointer(p1) || is_null_pointer(p2))
1218 return;
1219 type1 = &p1->type;
1220 type2 = &p2->type;
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");
1227 return;
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) {
1239 invalid_operands:
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)
1244 return;
1245 tmp_type1 = *type1;
1246 tmp_type2 = *type2;
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 */
1251 if (op == '-')
1252 goto invalid_operands;
1253 else
1254 warning("comparison of distinct pointer types lacks a cast");
1258 /* generic gen_op: handles types problems */
1259 void gen_op(int op)
1261 int u, t1, t2, bt1, bt2, t;
1262 CType type1;
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;
1277 #else
1278 t = VT_INT | VT_UNSIGNED;
1279 #endif
1280 goto std_op;
1282 /* if both pointers, then it must be the '-' op */
1283 if (bt1 == VT_PTR && bt2 == VT_PTR) {
1284 if (op != '-')
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);
1289 gen_opic(op);
1290 /* set to integer type */
1291 #ifdef TCC_TARGET_X86_64
1292 vtop->type.t = VT_LLONG;
1293 #else
1294 vtop->type.t = VT_INT;
1295 #endif
1296 vpushi(u);
1297 gen_op(TOK_PDIV);
1298 } else {
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) {
1304 vswap();
1305 swap(&t1, &t2);
1307 type1 = vtop[-1].type;
1308 #ifdef TCC_TARGET_X86_64
1309 vpushll(pointed_size(&vtop[-1].type));
1310 #else
1311 /* XXX: cast to int ? (long long case) */
1312 vpushi(pointed_size(&vtop[-1].type));
1313 #endif
1314 gen_op('*');
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
1320 test bounds */
1321 if (op == '-') {
1322 vpushi(0);
1323 vswap();
1324 gen_op('-');
1326 gen_bounded_ptr_add();
1327 } else
1328 #endif
1330 gen_opic(op);
1332 /* put again type if gen_opic() swaped operands */
1333 vtop->type = type1;
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) {
1338 t = VT_LDOUBLE;
1339 } else if (bt1 == VT_DOUBLE || bt2 == VT_DOUBLE) {
1340 t = VT_DOUBLE;
1341 } else {
1342 t = VT_FLOAT;
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");
1348 goto std_op;
1349 } else if (bt1 == VT_LLONG || bt2 == VT_LLONG) {
1350 /* cast to biggest op */
1351 t = VT_LLONG;
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))
1355 t |= VT_UNSIGNED;
1356 goto std_op;
1357 } else {
1358 /* integer operations */
1359 t = VT_INT;
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))
1363 t |= VT_UNSIGNED;
1364 std_op:
1365 /* XXX: currently, some unsigned operations are explicit, so
1366 we modify them here */
1367 if (t & VT_UNSIGNED) {
1368 if (op == TOK_SAR)
1369 op = TOK_SHR;
1370 else if (op == '/')
1371 op = TOK_UDIV;
1372 else if (op == '%')
1373 op = TOK_UMOD;
1374 else if (op == TOK_LT)
1375 op = TOK_ULT;
1376 else if (op == TOK_GT)
1377 op = TOK_UGT;
1378 else if (op == TOK_LE)
1379 op = TOK_ULE;
1380 else if (op == TOK_GE)
1381 op = TOK_UGE;
1383 vswap();
1384 type1.t = t;
1385 gen_cast(&type1);
1386 vswap();
1387 /* special case for shifts and long long: we keep the shift as
1388 an integer */
1389 if (op == TOK_SHR || op == TOK_SAR || op == TOK_SHL)
1390 type1.t = VT_INT;
1391 gen_cast(&type1);
1392 if (is_float(t))
1393 gen_opif(op);
1394 else
1395 gen_opic(op);
1396 if (op >= TOK_ULT && op <= TOK_GT) {
1397 /* relationnal op: the result is an int */
1398 vtop->type.t = VT_INT;
1399 } else {
1400 vtop->type.t = t;
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)) {
1412 if (t == VT_FLOAT)
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);
1417 #endif
1418 else
1419 vpush_global_sym(&func_old_type, TOK___floatundidf);
1420 vrott(2);
1421 gfunc_call(1);
1422 vpushi(0);
1423 vtop->r = reg_fret(t);
1424 } else {
1425 gen_cvt_itof(t);
1428 #endif
1430 /* generic ftoi for unsigned long long case */
1431 void gen_cvt_ftoi1(int t)
1433 int st;
1435 if (t == (VT_LLONG | VT_UNSIGNED)) {
1436 /* not handled natively */
1437 st = vtop->type.t & VT_BTYPE;
1438 if (st == VT_FLOAT)
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);
1443 #endif
1444 else
1445 vpush_global_sym(&func_old_type, TOK___fixunsdfdi);
1446 vrott(2);
1447 gfunc_call(1);
1448 vpushi(0);
1449 vtop->r = REG_IRET;
1450 vtop->r2 = REG_LRET;
1451 } else {
1452 gen_cvt_ftoi(t);
1456 /* force char or short cast */
1457 void force_charshort_cast(int t)
1459 int bits, dbt;
1460 dbt = t & VT_BTYPE;
1461 /* XXX: add optimization if lvalue : just change type and offset */
1462 if (dbt == VT_BYTE)
1463 bits = 8;
1464 else
1465 bits = 16;
1466 if (t & VT_UNSIGNED) {
1467 vpushi((1 << bits) - 1);
1468 gen_op('&');
1469 } else {
1470 bits = 32 - bits;
1471 vpushi(bits);
1472 gen_op(TOK_SHL);
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;
1477 vpushi(bits);
1478 gen_op(TOK_SAR);
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
1489 be incorrect */
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) {
1497 gv(RC_INT);
1500 dbt = type->t & (VT_BTYPE | VT_UNSIGNED);
1501 sbt = vtop->type.t & (VT_BTYPE | VT_UNSIGNED);
1503 if (sbt != dbt) {
1504 sf = is_float(sbt);
1505 df = is_float(dbt);
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);
1508 if (c) {
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;
1516 if (df) {
1517 if ((sbt & VT_BTYPE) == VT_LLONG) {
1518 if (sbt & VT_UNSIGNED)
1519 vtop->c.ld = vtop->c.ull;
1520 else
1521 vtop->c.ld = vtop->c.ll;
1522 } else if(!sf) {
1523 if (sbt & VT_UNSIGNED)
1524 vtop->c.ld = vtop->c.ui;
1525 else
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);
1537 } else {
1538 if(sf)
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) {
1552 int s = 0;
1553 if ((dbt & VT_BTYPE) == VT_BYTE)
1554 s = 24;
1555 else if ((dbt & VT_BTYPE) == VT_SHORT)
1556 s = 16;
1558 if(dbt & VT_UNSIGNED)
1559 vtop->c.ui = ((unsigned int)vtop->c.ll << s) >> s;
1560 else
1561 vtop->c.i = ((int)vtop->c.ll << s) >> s;
1564 } else if (p && dbt == VT_BOOL) {
1565 vtop->r = VT_CONST;
1566 vtop->c.i = 1;
1567 } else if (!nocode_wanted) {
1568 /* non constant case: generate code */
1569 if (sf && df) {
1570 /* convert from fp to fp */
1571 gen_cvt_ftof(dbt);
1572 } else if (df) {
1573 /* convert int to fp */
1574 gen_cvt_itof1(dbt);
1575 } else if (sf) {
1576 /* convert fp to int */
1577 if (dbt == VT_BOOL) {
1578 vpushi(0);
1579 gen_op(TOK_NE);
1580 } else {
1581 /* we handle char/short/etc... with generic code */
1582 if (dbt != (VT_INT | VT_UNSIGNED) &&
1583 dbt != (VT_LLONG | VT_UNSIGNED) &&
1584 dbt != VT_LLONG)
1585 dbt = VT_INT;
1586 gen_cvt_ftoi1(dbt);
1587 if (dbt == VT_INT && (type->t & (VT_BTYPE | VT_UNSIGNED)) != dbt) {
1588 /* additional cast for char/short... */
1589 vtop->type.t = dbt;
1590 gen_cast(type);
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 */
1598 gv(RC_INT);
1599 /* generate high word */
1600 if (sbt == (VT_INT | VT_UNSIGNED)) {
1601 vpushi(0);
1602 gv(RC_INT);
1603 } else {
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);
1609 gv_dup();
1610 vpushi(31);
1611 gen_op(TOK_SAR);
1613 /* patch second register */
1614 vtop[-1].r2 = vtop->r;
1615 vpop();
1617 #else
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) {
1622 int r = gv(RC_INT);
1623 if (sbt != (VT_INT | VT_UNSIGNED) &&
1624 sbt != VT_PTR && sbt != VT_FUNC) {
1625 /* x86_64 specific: movslq */
1626 o(0x6348);
1627 o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
1630 #endif
1631 } else if (dbt == VT_BOOL) {
1632 /* scalar to bool */
1633 vpushi(0);
1634 gen_op(TOK_NE);
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) {
1643 /* scalar to int */
1644 if (sbt == VT_LLONG) {
1645 /* from long long: just take low order word */
1646 lexpand();
1647 vpop();
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);
1660 vtop->type = *type;
1663 /* return type size. Put alignment at 'a' */
1664 static int type_size(CType *type, int *a)
1666 Sym *s;
1667 int bt;
1669 bt = type->t & VT_BTYPE;
1670 if (bt == VT_STRUCT) {
1671 /* struct/union */
1672 s = type->ref;
1673 *a = s->r;
1674 return s->c;
1675 } else if (bt == VT_PTR) {
1676 if (type->t & VT_ARRAY) {
1677 int ts;
1679 s = type->ref;
1680 ts = type_size(&s->type, a);
1682 if (ts < 0 && s->c < 0)
1683 ts = -ts;
1685 return ts * s->c;
1686 } else {
1687 *a = PTR_SIZE;
1688 return PTR_SIZE;
1690 } else if (bt == VT_LDOUBLE) {
1691 *a = LDOUBLE_ALIGN;
1692 return LDOUBLE_SIZE;
1693 } else if (bt == VT_DOUBLE || bt == VT_LLONG) {
1694 #ifdef TCC_TARGET_I386
1695 #ifdef TCC_TARGET_PE
1696 *a = 8;
1697 #else
1698 *a = 4;
1699 #endif
1700 #elif defined(TCC_TARGET_ARM)
1701 #ifdef TCC_ARM_EABI
1702 *a = 8;
1703 #else
1704 *a = 4;
1705 #endif
1706 #else
1707 *a = 8;
1708 #endif
1709 return 8;
1710 } else if (bt == VT_INT || bt == VT_ENUM || bt == VT_FLOAT) {
1711 *a = 4;
1712 return 4;
1713 } else if (bt == VT_SHORT) {
1714 *a = 2;
1715 return 2;
1716 } else {
1717 /* char, void, function, _Bool */
1718 *a = 1;
1719 return 1;
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)
1732 Sym *s;
1733 s = sym_push(SYM_FIELD, type, 0, -1);
1734 type->t = VT_PTR | (type->t & ~VT_TYPE);
1735 type->ref = s;
1738 /* compare function types. OLD functions match any new functions */
1739 static int is_compatible_func(CType *type1, CType *type2)
1741 Sym *s1, *s2;
1743 s1 = type1->ref;
1744 s2 = type2->ref;
1745 if (!is_compatible_types(&s1->type, &s2->type))
1746 return 0;
1747 /* check func_call */
1748 if (FUNC_CALL(s1->r) != FUNC_CALL(s2->r))
1749 return 0;
1750 /* XXX: not complete */
1751 if (s1->c == FUNC_OLD || s2->c == FUNC_OLD)
1752 return 1;
1753 if (s1->c != s2->c)
1754 return 0;
1755 while (s1 != NULL) {
1756 if (s2 == NULL)
1757 return 0;
1758 if (!is_compatible_parameter_types(&s1->type, &s2->type))
1759 return 0;
1760 s1 = s1->next;
1761 s2 = s2->next;
1763 if (s2)
1764 return 0;
1765 return 1;
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)
1775 int bt1, t1, t2;
1777 t1 = type1->t & VT_TYPE;
1778 t2 = type2->t & VT_TYPE;
1779 if (unqualified) {
1780 /* strip qualifiers before comparing */
1781 t1 &= ~(VT_CONSTANT | VT_VOLATILE);
1782 t2 &= ~(VT_CONSTANT | VT_VOLATILE);
1784 /* XXX: bitfields ? */
1785 if (t1 != t2)
1786 return 0;
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);
1797 } else {
1798 return 1;
1802 /* return true if type1 and type2 are exactly the same (including
1803 qualifiers).
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 */
1819 /* XXX: union */
1820 /* XXX: add array and function pointers */
1821 void type_to_str(char *buf, int buf_size,
1822 CType *type, const char *varstr)
1824 int bt, v, t;
1825 Sym *s, *sa;
1826 char buf1[256];
1827 const char *tstr;
1829 t = type->t & VT_TYPE;
1830 bt = t & VT_BTYPE;
1831 buf[0] = '\0';
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 ");
1838 switch(bt) {
1839 case VT_VOID:
1840 tstr = "void";
1841 goto add_tstr;
1842 case VT_BOOL:
1843 tstr = "_Bool";
1844 goto add_tstr;
1845 case VT_BYTE:
1846 tstr = "char";
1847 goto add_tstr;
1848 case VT_SHORT:
1849 tstr = "short";
1850 goto add_tstr;
1851 case VT_INT:
1852 tstr = "int";
1853 goto add_tstr;
1854 case VT_LONG:
1855 tstr = "long";
1856 goto add_tstr;
1857 case VT_LLONG:
1858 tstr = "long long";
1859 goto add_tstr;
1860 case VT_FLOAT:
1861 tstr = "float";
1862 goto add_tstr;
1863 case VT_DOUBLE:
1864 tstr = "double";
1865 goto add_tstr;
1866 case VT_LDOUBLE:
1867 tstr = "long double";
1868 add_tstr:
1869 pstrcat(buf, buf_size, tstr);
1870 break;
1871 case VT_ENUM:
1872 case VT_STRUCT:
1873 if (bt == VT_STRUCT)
1874 tstr = "struct ";
1875 else
1876 tstr = "enum ";
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>");
1881 else
1882 pstrcat(buf, buf_size, get_tok_str(v, NULL));
1883 break;
1884 case VT_FUNC:
1885 s = type->ref;
1886 type_to_str(buf, buf_size, &s->type, varstr);
1887 pstrcat(buf, buf_size, "(");
1888 sa = s->next;
1889 while (sa != NULL) {
1890 type_to_str(buf1, sizeof(buf1), &sa->type, NULL);
1891 pstrcat(buf, buf_size, buf1);
1892 sa = sa->next;
1893 if (sa)
1894 pstrcat(buf, buf_size, ", ");
1896 pstrcat(buf, buf_size, ")");
1897 goto no_var;
1898 case VT_PTR:
1899 s = type->ref;
1900 pstrcpy(buf1, sizeof(buf1), "*");
1901 if (varstr)
1902 pstrcat(buf1, sizeof(buf1), varstr);
1903 type_to_str(buf, buf_size, &s->type, buf1);
1904 goto no_var;
1906 if (varstr) {
1907 pstrcat(buf, buf_size, " ");
1908 pstrcat(buf, buf_size, varstr);
1910 no_var: ;
1913 /* verify type compatibility to store vtop in 'dt' type, and generate
1914 casts if needed. */
1915 static void gen_assign_cast(CType *dt)
1917 CType *st, *type1, *type2, tmp_type1, tmp_type2;
1918 char buf1[256], buf2[256];
1919 int dbt, sbt;
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");
1926 switch(dbt) {
1927 case VT_PTR:
1928 /* special cases for pointers */
1929 /* '0' can also be a pointer */
1930 if (is_null_pointer(vtop))
1931 goto type_ok;
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");
1935 goto type_ok;
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 goto error;
1943 else
1944 goto type_ok;
1946 if (sbt != VT_PTR)
1947 goto error;
1948 type2 = pointed_type(st);
1949 if ((type1->t & VT_BTYPE) == VT_VOID ||
1950 (type2->t & VT_BTYPE) == VT_VOID) {
1951 /* void * can match anything */
1952 } else {
1953 /* exact type match, except for unsigned */
1954 tmp_type1 = *type1;
1955 tmp_type2 = *type2;
1956 tmp_type1.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);
1957 tmp_type2.t &= ~(VT_UNSIGNED | VT_CONSTANT | VT_VOLATILE);
1958 if (!is_compatible_types(&tmp_type1, &tmp_type2))
1959 warning("assignment from incompatible pointer type");
1961 /* check const and volatile */
1962 if ((!(type1->t & VT_CONSTANT) && (type2->t & VT_CONSTANT)) ||
1963 (!(type1->t & VT_VOLATILE) && (type2->t & VT_VOLATILE)))
1964 warning("assignment discards qualifiers from pointer target type");
1965 break;
1966 case VT_BYTE:
1967 case VT_SHORT:
1968 case VT_INT:
1969 case VT_LLONG:
1970 if (sbt == VT_PTR || sbt == VT_FUNC) {
1971 warning("assignment makes integer from pointer without a cast");
1973 /* XXX: more tests */
1974 break;
1975 case VT_STRUCT:
1976 tmp_type1 = *dt;
1977 tmp_type2 = *st;
1978 tmp_type1.t &= ~(VT_CONSTANT | VT_VOLATILE);
1979 tmp_type2.t &= ~(VT_CONSTANT | VT_VOLATILE);
1980 if (!is_compatible_types(&tmp_type1, &tmp_type2)) {
1981 error:
1982 type_to_str(buf1, sizeof(buf1), st, NULL);
1983 type_to_str(buf2, sizeof(buf2), dt, NULL);
1984 error("cannot cast '%s' to '%s'", buf1, buf2);
1986 break;
1988 type_ok:
1989 gen_cast(dt);
1992 /* store vtop in lvalue pushed on stack */
1993 void vstore(void)
1995 int sbt, dbt, ft, r, t, size, align, bit_size, bit_pos, rc, delayed_cast;
1997 ft = vtop[-1].type.t;
1998 sbt = vtop->type.t & VT_BTYPE;
1999 dbt = ft & VT_BTYPE;
2000 if (((sbt == VT_INT || sbt == VT_SHORT) && dbt == VT_BYTE) ||
2001 (sbt == VT_INT && dbt == VT_SHORT)) {
2002 /* optimize char/short casts */
2003 delayed_cast = VT_MUSTCAST;
2004 vtop->type.t = ft & (VT_TYPE & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT)));
2005 /* XXX: factorize */
2006 if (ft & VT_CONSTANT)
2007 warning("assignment of read-only location");
2008 } else {
2009 delayed_cast = 0;
2010 if (!(ft & VT_BITFIELD))
2011 gen_assign_cast(&vtop[-1].type);
2014 if (sbt == VT_STRUCT) {
2015 /* if structure, only generate pointer */
2016 /* structure assignment : generate memcpy */
2017 /* XXX: optimize if small size */
2018 if (!nocode_wanted) {
2019 size = type_size(&vtop->type, &align);
2021 #ifdef TCC_ARM_EABI
2022 if(!(align & 7))
2023 vpush_global_sym(&func_old_type, TOK_memcpy8);
2024 else if(!(align & 3))
2025 vpush_global_sym(&func_old_type, TOK_memcpy4);
2026 else
2027 #endif
2028 vpush_global_sym(&func_old_type, TOK_memcpy);
2030 /* destination */
2031 vpushv(vtop - 2);
2032 vtop->type.t = VT_PTR;
2033 gaddrof();
2034 /* source */
2035 vpushv(vtop - 2);
2036 vtop->type.t = VT_PTR;
2037 gaddrof();
2038 /* type size */
2039 vpushi(size);
2040 gfunc_call(3);
2042 vswap();
2043 vpop();
2044 } else {
2045 vswap();
2046 vpop();
2048 /* leave source on stack */
2049 } else if (ft & VT_BITFIELD) {
2050 /* bitfield store handling */
2051 bit_pos = (ft >> VT_STRUCT_SHIFT) & 0x3f;
2052 bit_size = (ft >> (VT_STRUCT_SHIFT + 6)) & 0x3f;
2053 /* remove bit field info to avoid loops */
2054 vtop[-1].type.t = ft & ~(VT_BITFIELD | (-1 << VT_STRUCT_SHIFT));
2056 /* duplicate source into other register */
2057 gv_dup();
2058 vswap();
2059 vrott(3);
2061 if((ft & VT_BTYPE) == VT_BOOL) {
2062 gen_cast(&vtop[-1].type);
2063 vtop[-1].type.t = (vtop[-1].type.t & ~VT_BTYPE) | (VT_BYTE | VT_UNSIGNED);
2066 /* duplicate destination */
2067 vdup();
2068 vtop[-1] = vtop[-2];
2070 /* mask and shift source */
2071 if((ft & VT_BTYPE) != VT_BOOL) {
2072 if((ft & VT_BTYPE) == VT_LLONG) {
2073 vpushll((1ULL << bit_size) - 1ULL);
2074 } else {
2075 vpushi((1 << bit_size) - 1);
2077 gen_op('&');
2079 vpushi(bit_pos);
2080 gen_op(TOK_SHL);
2081 /* load destination, mask and or with source */
2082 vswap();
2083 if((ft & VT_BTYPE) == VT_LLONG) {
2084 vpushll(~(((1ULL << bit_size) - 1ULL) << bit_pos));
2085 } else {
2086 vpushi(~(((1 << bit_size) - 1) << bit_pos));
2088 gen_op('&');
2089 gen_op('|');
2090 /* store result */
2091 vstore();
2093 /* pop off shifted source from "duplicate source..." above */
2094 vpop();
2096 } else {
2097 #ifdef CONFIG_TCC_BCHECK
2098 /* bound check case */
2099 if (vtop[-1].r & VT_MUSTBOUND) {
2100 vswap();
2101 gbound();
2102 vswap();
2104 #endif
2105 if (!nocode_wanted) {
2106 rc = RC_INT;
2107 if (is_float(ft)) {
2108 rc = RC_FLOAT;
2109 #ifdef TCC_TARGET_X86_64
2110 if ((ft & VT_BTYPE) == VT_LDOUBLE) {
2111 rc = RC_ST0;
2113 #endif
2115 r = gv(rc); /* generate value */
2116 /* if lvalue was saved on stack, must read it */
2117 if ((vtop[-1].r & VT_VALMASK) == VT_LLOCAL) {
2118 SValue sv;
2119 t = get_reg(RC_INT);
2120 #ifdef TCC_TARGET_X86_64
2121 sv.type.t = VT_PTR;
2122 #else
2123 sv.type.t = VT_INT;
2124 #endif
2125 sv.r = VT_LOCAL | VT_LVAL;
2126 sv.c.ul = vtop[-1].c.ul;
2127 load(t, &sv);
2128 vtop[-1].r = t | VT_LVAL;
2130 store(r, vtop - 1);
2131 #ifndef TCC_TARGET_X86_64
2132 /* two word case handling : store second register at word + 4 */
2133 if ((ft & VT_BTYPE) == VT_LLONG) {
2134 vswap();
2135 /* convert to int to increment easily */
2136 vtop->type.t = VT_INT;
2137 gaddrof();
2138 vpushi(4);
2139 gen_op('+');
2140 vtop->r |= VT_LVAL;
2141 vswap();
2142 /* XXX: it works because r2 is spilled last ! */
2143 store(vtop->r2, vtop - 1);
2145 #endif
2147 vswap();
2148 vtop--; /* NOT vpop() because on x86 it would flush the fp stack */
2149 vtop->r |= delayed_cast;
2153 /* post defines POST/PRE add. c is the token ++ or -- */
2154 void inc(int post, int c)
2156 test_lvalue();
2157 vdup(); /* save lvalue */
2158 if (post) {
2159 gv_dup(); /* duplicate value */
2160 vrotb(3);
2161 vrotb(3);
2163 /* add constant */
2164 vpushi(c - TOK_MID);
2165 gen_op('+');
2166 vstore(); /* store value */
2167 if (post)
2168 vpop(); /* if post op, return saved value */
2171 /* Parse GNUC __attribute__ extension. Currently, the following
2172 extensions are recognized:
2173 - aligned(n) : set data/function alignment.
2174 - packed : force data alignment to 1
2175 - section(x) : generate data/code in this section.
2176 - unused : currently ignored, but may be used someday.
2177 - regparm(n) : pass function parameters in registers (i386 only)
2179 static void parse_attribute(AttributeDef *ad)
2181 int t, n;
2183 while (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2) {
2184 next();
2185 skip('(');
2186 skip('(');
2187 while (tok != ')') {
2188 if (tok < TOK_IDENT)
2189 expect("attribute name");
2190 t = tok;
2191 next();
2192 switch(t) {
2193 case TOK_SECTION1:
2194 case TOK_SECTION2:
2195 skip('(');
2196 if (tok != TOK_STR)
2197 expect("section name");
2198 ad->section = find_section(tcc_state, (char *)tokc.cstr->data);
2199 next();
2200 skip(')');
2201 break;
2202 case TOK_ALIGNED1:
2203 case TOK_ALIGNED2:
2204 if (tok == '(') {
2205 next();
2206 n = expr_const();
2207 if (n <= 0 || (n & (n - 1)) != 0)
2208 error("alignment must be a positive power of two");
2209 skip(')');
2210 } else {
2211 n = MAX_ALIGN;
2213 ad->aligned = n;
2214 break;
2215 case TOK_PACKED1:
2216 case TOK_PACKED2:
2217 ad->packed = 1;
2218 break;
2219 case TOK_UNUSED1:
2220 case TOK_UNUSED2:
2221 /* currently, no need to handle it because tcc does not
2222 track unused objects */
2223 break;
2224 case TOK_NORETURN1:
2225 case TOK_NORETURN2:
2226 /* currently, no need to handle it because tcc does not
2227 track unused objects */
2228 break;
2229 case TOK_CDECL1:
2230 case TOK_CDECL2:
2231 case TOK_CDECL3:
2232 FUNC_CALL(ad->func_attr) = FUNC_CDECL;
2233 break;
2234 case TOK_STDCALL1:
2235 case TOK_STDCALL2:
2236 case TOK_STDCALL3:
2237 FUNC_CALL(ad->func_attr) = FUNC_STDCALL;
2238 break;
2239 #ifdef TCC_TARGET_I386
2240 case TOK_REGPARM1:
2241 case TOK_REGPARM2:
2242 skip('(');
2243 n = expr_const();
2244 if (n > 3)
2245 n = 3;
2246 else if (n < 0)
2247 n = 0;
2248 if (n > 0)
2249 FUNC_CALL(ad->func_attr) = FUNC_FASTCALL1 + n - 1;
2250 skip(')');
2251 break;
2252 case TOK_FASTCALL1:
2253 case TOK_FASTCALL2:
2254 case TOK_FASTCALL3:
2255 FUNC_CALL(ad->func_attr) = FUNC_FASTCALLW;
2256 break;
2257 #endif
2258 case TOK_DLLEXPORT:
2259 FUNC_EXPORT(ad->func_attr) = 1;
2260 break;
2261 default:
2262 if (tcc_state->warn_unsupported)
2263 warning("'%s' attribute ignored", get_tok_str(t, NULL));
2264 /* skip parameters */
2265 if (tok == '(') {
2266 int parenthesis = 0;
2267 do {
2268 if (tok == '(')
2269 parenthesis++;
2270 else if (tok == ')')
2271 parenthesis--;
2272 next();
2273 } while (parenthesis && tok != -1);
2275 break;
2277 if (tok != ',')
2278 break;
2279 next();
2281 skip(')');
2282 skip(')');
2286 /* enum/struct/union declaration. u is either VT_ENUM or VT_STRUCT */
2287 static void struct_decl(CType *type, int u)
2289 int a, v, size, align, maxalign, c, offset;
2290 int bit_size, bit_pos, bsize, bt, lbit_pos, prevbt;
2291 Sym *s, *ss, *ass, **ps;
2292 AttributeDef ad;
2293 CType type1, btype;
2295 a = tok; /* save decl type */
2296 next();
2297 if (tok != '{') {
2298 v = tok;
2299 next();
2300 /* struct already defined ? return it */
2301 if (v < TOK_IDENT)
2302 expect("struct/union/enum name");
2303 s = struct_find(v);
2304 if (s) {
2305 if (s->type.t != a)
2306 error("invalid type");
2307 goto do_decl;
2309 } else {
2310 v = anon_sym++;
2312 type1.t = a;
2313 /* we put an undefined size for struct/union */
2314 s = sym_push(v | SYM_STRUCT, &type1, 0, -1);
2315 s->r = 0; /* default alignment is zero as gcc */
2316 /* put struct/union/enum name in type */
2317 do_decl:
2318 type->t = u;
2319 type->ref = s;
2321 if (tok == '{') {
2322 next();
2323 if (s->c != -1)
2324 error("struct/union/enum already defined");
2325 /* cannot be empty */
2326 c = 0;
2327 /* non empty enums are not allowed */
2328 if (a == TOK_ENUM) {
2329 for(;;) {
2330 v = tok;
2331 if (v < TOK_UIDENT)
2332 expect("identifier");
2333 next();
2334 if (tok == '=') {
2335 next();
2336 c = expr_const();
2338 /* enum symbols have static storage */
2339 ss = sym_push(v, &int_type, VT_CONST, c);
2340 ss->type.t |= VT_STATIC;
2341 if (tok != ',')
2342 break;
2343 next();
2344 c++;
2345 /* NOTE: we accept a trailing comma */
2346 if (tok == '}')
2347 break;
2349 skip('}');
2350 } else {
2351 maxalign = 1;
2352 ps = &s->next;
2353 prevbt = VT_INT;
2354 bit_pos = 0;
2355 offset = 0;
2356 while (tok != '}') {
2357 parse_btype(&btype, &ad);
2358 while (1) {
2359 bit_size = -1;
2360 v = 0;
2361 type1 = btype;
2362 if (tok != ':') {
2363 type_decl(&type1, &ad, &v, TYPE_DIRECT | TYPE_ABSTRACT);
2364 if (v == 0 && (type1.t & VT_BTYPE) != VT_STRUCT)
2365 expect("identifier");
2366 if ((type1.t & VT_BTYPE) == VT_FUNC ||
2367 (type1.t & (VT_TYPEDEF | VT_STATIC | VT_EXTERN | VT_INLINE)))
2368 error("invalid type for '%s'",
2369 get_tok_str(v, NULL));
2371 if (tok == ':') {
2372 next();
2373 bit_size = expr_const();
2374 /* XXX: handle v = 0 case for messages */
2375 if (bit_size < 0)
2376 error("negative width in bit-field '%s'",
2377 get_tok_str(v, NULL));
2378 if (v && bit_size == 0)
2379 error("zero width for bit-field '%s'",
2380 get_tok_str(v, NULL));
2382 size = type_size(&type1, &align);
2383 if (ad.aligned) {
2384 if (align < ad.aligned)
2385 align = ad.aligned;
2386 } else if (ad.packed) {
2387 align = 1;
2388 } else if (*tcc_state->pack_stack_ptr) {
2389 if (align > *tcc_state->pack_stack_ptr)
2390 align = *tcc_state->pack_stack_ptr;
2392 lbit_pos = 0;
2393 if (bit_size >= 0) {
2394 bt = type1.t & VT_BTYPE;
2395 if (bt != VT_INT &&
2396 bt != VT_BYTE &&
2397 bt != VT_SHORT &&
2398 bt != VT_BOOL &&
2399 bt != VT_ENUM &&
2400 bt != VT_LLONG)
2401 error("bitfields must have scalar type");
2402 bsize = size * 8;
2403 if (bit_size > bsize) {
2404 error("width of '%s' exceeds its type",
2405 get_tok_str(v, NULL));
2406 } else if (bit_size == bsize) {
2407 /* no need for bit fields */
2408 bit_pos = 0;
2409 } else if (bit_size == 0) {
2410 /* XXX: what to do if only padding in a
2411 structure ? */
2412 /* zero size: means to pad */
2413 bit_pos = 0;
2414 } else {
2415 /* we do not have enough room ?
2416 did the type change?
2417 is it a union? */
2418 if ((bit_pos + bit_size) > bsize ||
2419 bt != prevbt || a == TOK_UNION)
2420 bit_pos = 0;
2421 lbit_pos = bit_pos;
2422 /* XXX: handle LSB first */
2423 type1.t |= VT_BITFIELD |
2424 (bit_pos << VT_STRUCT_SHIFT) |
2425 (bit_size << (VT_STRUCT_SHIFT + 6));
2426 bit_pos += bit_size;
2428 prevbt = bt;
2429 } else {
2430 bit_pos = 0;
2432 if (v != 0 || (type1.t & VT_BTYPE) == VT_STRUCT) {
2433 /* add new memory data only if starting
2434 bit field */
2435 if (lbit_pos == 0) {
2436 if (a == TOK_STRUCT) {
2437 c = (c + align - 1) & -align;
2438 offset = c;
2439 if (size > 0)
2440 c += size;
2441 } else {
2442 offset = 0;
2443 if (size > c)
2444 c = size;
2446 if (align > maxalign)
2447 maxalign = align;
2449 #if 0
2450 printf("add field %s offset=%d",
2451 get_tok_str(v, NULL), offset);
2452 if (type1.t & VT_BITFIELD) {
2453 printf(" pos=%d size=%d",
2454 (type1.t >> VT_STRUCT_SHIFT) & 0x3f,
2455 (type1.t >> (VT_STRUCT_SHIFT + 6)) & 0x3f);
2457 printf("\n");
2458 #endif
2460 if (v == 0 && (type1.t & VT_BTYPE) == VT_STRUCT) {
2461 ass = type1.ref;
2462 while ((ass = ass->next) != NULL) {
2463 ss = sym_push(ass->v, &ass->type, 0, offset + ass->c);
2464 *ps = ss;
2465 ps = &ss->next;
2467 } else if (v) {
2468 ss = sym_push(v | SYM_FIELD, &type1, 0, offset);
2469 *ps = ss;
2470 ps = &ss->next;
2472 if (tok == ';' || tok == TOK_EOF)
2473 break;
2474 skip(',');
2476 skip(';');
2478 skip('}');
2479 /* store size and alignment */
2480 s->c = (c + maxalign - 1) & -maxalign;
2481 s->r = maxalign;
2486 /* return 0 if no type declaration. otherwise, return the basic type
2487 and skip it.
2489 static int parse_btype(CType *type, AttributeDef *ad)
2491 int t, u, type_found, typespec_found, typedef_found;
2492 Sym *s;
2493 CType type1;
2495 memset(ad, 0, sizeof(AttributeDef));
2496 type_found = 0;
2497 typespec_found = 0;
2498 typedef_found = 0;
2499 t = 0;
2500 while(1) {
2501 switch(tok) {
2502 case TOK_EXTENSION:
2503 /* currently, we really ignore extension */
2504 next();
2505 continue;
2507 /* basic types */
2508 case TOK_CHAR:
2509 u = VT_BYTE;
2510 basic_type:
2511 next();
2512 basic_type1:
2513 if ((t & VT_BTYPE) != 0)
2514 error("too many basic types");
2515 t |= u;
2516 typespec_found = 1;
2517 break;
2518 case TOK_VOID:
2519 u = VT_VOID;
2520 goto basic_type;
2521 case TOK_SHORT:
2522 u = VT_SHORT;
2523 goto basic_type;
2524 case TOK_INT:
2525 next();
2526 typespec_found = 1;
2527 break;
2528 case TOK_LONG:
2529 next();
2530 if ((t & VT_BTYPE) == VT_DOUBLE) {
2531 t = (t & ~VT_BTYPE) | VT_LDOUBLE;
2532 } else if ((t & VT_BTYPE) == VT_LONG) {
2533 t = (t & ~VT_BTYPE) | VT_LLONG;
2534 } else {
2535 u = VT_LONG;
2536 goto basic_type1;
2538 break;
2539 case TOK_BOOL:
2540 u = VT_BOOL;
2541 goto basic_type;
2542 case TOK_FLOAT:
2543 u = VT_FLOAT;
2544 goto basic_type;
2545 case TOK_DOUBLE:
2546 next();
2547 if ((t & VT_BTYPE) == VT_LONG) {
2548 t = (t & ~VT_BTYPE) | VT_LDOUBLE;
2549 } else {
2550 u = VT_DOUBLE;
2551 goto basic_type1;
2553 break;
2554 case TOK_ENUM:
2555 struct_decl(&type1, VT_ENUM);
2556 basic_type2:
2557 u = type1.t;
2558 type->ref = type1.ref;
2559 goto basic_type1;
2560 case TOK_STRUCT:
2561 case TOK_UNION:
2562 struct_decl(&type1, VT_STRUCT);
2563 goto basic_type2;
2565 /* type modifiers */
2566 case TOK_CONST1:
2567 case TOK_CONST2:
2568 case TOK_CONST3:
2569 t |= VT_CONSTANT;
2570 next();
2571 break;
2572 case TOK_VOLATILE1:
2573 case TOK_VOLATILE2:
2574 case TOK_VOLATILE3:
2575 t |= VT_VOLATILE;
2576 next();
2577 break;
2578 case TOK_SIGNED1:
2579 case TOK_SIGNED2:
2580 case TOK_SIGNED3:
2581 typespec_found = 1;
2582 t |= VT_SIGNED;
2583 next();
2584 break;
2585 case TOK_REGISTER:
2586 case TOK_AUTO:
2587 case TOK_RESTRICT1:
2588 case TOK_RESTRICT2:
2589 case TOK_RESTRICT3:
2590 next();
2591 break;
2592 case TOK_UNSIGNED:
2593 t |= VT_UNSIGNED;
2594 next();
2595 typespec_found = 1;
2596 break;
2598 /* storage */
2599 case TOK_EXTERN:
2600 t |= VT_EXTERN;
2601 next();
2602 break;
2603 case TOK_STATIC:
2604 t |= VT_STATIC;
2605 next();
2606 break;
2607 case TOK_TYPEDEF:
2608 t |= VT_TYPEDEF;
2609 next();
2610 break;
2611 case TOK_INLINE1:
2612 case TOK_INLINE2:
2613 case TOK_INLINE3:
2614 t |= VT_INLINE;
2615 next();
2616 break;
2618 /* GNUC attribute */
2619 case TOK_ATTRIBUTE1:
2620 case TOK_ATTRIBUTE2:
2621 parse_attribute(ad);
2622 break;
2623 /* GNUC typeof */
2624 case TOK_TYPEOF1:
2625 case TOK_TYPEOF2:
2626 case TOK_TYPEOF3:
2627 next();
2628 parse_expr_type(&type1);
2629 goto basic_type2;
2630 default:
2631 if (typespec_found || typedef_found)
2632 goto the_end;
2633 s = sym_find(tok);
2634 if (!s || !(s->type.t & VT_TYPEDEF))
2635 goto the_end;
2636 typedef_found = 1;
2637 t |= (s->type.t & ~VT_TYPEDEF);
2638 type->ref = s->type.ref;
2639 next();
2640 typespec_found = 1;
2641 break;
2643 type_found = 1;
2645 the_end:
2646 if ((t & (VT_SIGNED|VT_UNSIGNED)) == (VT_SIGNED|VT_UNSIGNED))
2647 error("signed and unsigned modifier");
2648 if (tcc_state->char_is_unsigned) {
2649 if ((t & (VT_SIGNED|VT_UNSIGNED|VT_BTYPE)) == VT_BYTE)
2650 t |= VT_UNSIGNED;
2652 t &= ~VT_SIGNED;
2654 /* long is never used as type */
2655 if ((t & VT_BTYPE) == VT_LONG)
2656 #ifndef TCC_TARGET_X86_64
2657 t = (t & ~VT_BTYPE) | VT_INT;
2658 #else
2659 t = (t & ~VT_BTYPE) | VT_LLONG;
2660 #endif
2661 type->t = t;
2662 return type_found;
2665 /* convert a function parameter type (array to pointer and function to
2666 function pointer) */
2667 static inline void convert_parameter_type(CType *pt)
2669 /* remove const and volatile qualifiers (XXX: const could be used
2670 to indicate a const function parameter */
2671 pt->t &= ~(VT_CONSTANT | VT_VOLATILE);
2672 /* array must be transformed to pointer according to ANSI C */
2673 pt->t &= ~VT_ARRAY;
2674 if ((pt->t & VT_BTYPE) == VT_FUNC) {
2675 mk_pointer(pt);
2679 static void post_type(CType *type, AttributeDef *ad)
2681 int n, l, t1, arg_size, align;
2682 Sym **plast, *s, *first;
2683 AttributeDef ad1;
2684 CType pt;
2686 if (tok == '(') {
2687 /* function declaration */
2688 next();
2689 l = 0;
2690 first = NULL;
2691 plast = &first;
2692 arg_size = 0;
2693 if (tok != ')') {
2694 for(;;) {
2695 /* read param name and compute offset */
2696 if (l != FUNC_OLD) {
2697 if (!parse_btype(&pt, &ad1)) {
2698 if (l) {
2699 error("invalid type");
2700 } else {
2701 l = FUNC_OLD;
2702 goto old_proto;
2705 l = FUNC_NEW;
2706 if ((pt.t & VT_BTYPE) == VT_VOID && tok == ')')
2707 break;
2708 type_decl(&pt, &ad1, &n, TYPE_DIRECT | TYPE_ABSTRACT);
2709 if ((pt.t & VT_BTYPE) == VT_VOID)
2710 error("parameter declared as void");
2711 arg_size += (type_size(&pt, &align) + 3) & ~3;
2712 } else {
2713 old_proto:
2714 n = tok;
2715 if (n < TOK_UIDENT)
2716 expect("identifier");
2717 pt.t = VT_INT;
2718 next();
2720 convert_parameter_type(&pt);
2721 s = sym_push(n | SYM_FIELD, &pt, 0, 0);
2722 *plast = s;
2723 plast = &s->next;
2724 if (tok == ')')
2725 break;
2726 skip(',');
2727 if (l == FUNC_NEW && tok == TOK_DOTS) {
2728 l = FUNC_ELLIPSIS;
2729 next();
2730 break;
2734 /* if no parameters, then old type prototype */
2735 if (l == 0)
2736 l = FUNC_OLD;
2737 skip(')');
2738 t1 = type->t & VT_STORAGE;
2739 /* NOTE: const is ignored in returned type as it has a special
2740 meaning in gcc / C++ */
2741 type->t &= ~(VT_STORAGE | VT_CONSTANT);
2742 post_type(type, ad);
2743 /* we push a anonymous symbol which will contain the function prototype */
2744 FUNC_ARGS(ad->func_attr) = arg_size;
2745 s = sym_push(SYM_FIELD, type, ad->func_attr, l);
2746 s->next = first;
2747 type->t = t1 | VT_FUNC;
2748 type->ref = s;
2749 } else if (tok == '[') {
2750 /* array definition */
2751 next();
2752 if (tok == TOK_RESTRICT1)
2753 next();
2754 n = -1;
2755 if (tok != ']') {
2756 n = expr_const();
2757 if (n < 0)
2758 error("invalid array size");
2760 skip(']');
2761 /* parse next post type */
2762 t1 = type->t & VT_STORAGE;
2763 type->t &= ~VT_STORAGE;
2764 post_type(type, ad);
2766 /* we push a anonymous symbol which will contain the array
2767 element type */
2768 s = sym_push(SYM_FIELD, type, 0, n);
2769 type->t = t1 | VT_ARRAY | VT_PTR;
2770 type->ref = s;
2774 /* Parse a type declaration (except basic type), and return the type
2775 in 'type'. 'td' is a bitmask indicating which kind of type decl is
2776 expected. 'type' should contain the basic type. 'ad' is the
2777 attribute definition of the basic type. It can be modified by
2778 type_decl().
2780 static void type_decl(CType *type, AttributeDef *ad, int *v, int td)
2782 Sym *s;
2783 CType type1, *type2;
2784 int qualifiers;
2786 while (tok == '*') {
2787 qualifiers = 0;
2788 redo:
2789 next();
2790 switch(tok) {
2791 case TOK_CONST1:
2792 case TOK_CONST2:
2793 case TOK_CONST3:
2794 qualifiers |= VT_CONSTANT;
2795 goto redo;
2796 case TOK_VOLATILE1:
2797 case TOK_VOLATILE2:
2798 case TOK_VOLATILE3:
2799 qualifiers |= VT_VOLATILE;
2800 goto redo;
2801 case TOK_RESTRICT1:
2802 case TOK_RESTRICT2:
2803 case TOK_RESTRICT3:
2804 goto redo;
2806 mk_pointer(type);
2807 type->t |= qualifiers;
2810 /* XXX: clarify attribute handling */
2811 if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)
2812 parse_attribute(ad);
2814 /* recursive type */
2815 /* XXX: incorrect if abstract type for functions (e.g. 'int ()') */
2816 type1.t = 0; /* XXX: same as int */
2817 if (tok == '(') {
2818 next();
2819 /* XXX: this is not correct to modify 'ad' at this point, but
2820 the syntax is not clear */
2821 if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)
2822 parse_attribute(ad);
2823 type_decl(&type1, ad, v, td);
2824 skip(')');
2825 } else {
2826 /* type identifier */
2827 if (tok >= TOK_IDENT && (td & TYPE_DIRECT)) {
2828 *v = tok;
2829 next();
2830 } else {
2831 if (!(td & TYPE_ABSTRACT))
2832 expect("identifier");
2833 *v = 0;
2836 post_type(type, ad);
2837 if (tok == TOK_ATTRIBUTE1 || tok == TOK_ATTRIBUTE2)
2838 parse_attribute(ad);
2839 if (!type1.t)
2840 return;
2841 /* append type at the end of type1 */
2842 type2 = &type1;
2843 for(;;) {
2844 s = type2->ref;
2845 type2 = &s->type;
2846 if (!type2->t) {
2847 *type2 = *type;
2848 break;
2851 *type = type1;
2854 /* compute the lvalue VT_LVAL_xxx needed to match type t. */
2855 static int lvalue_type(int t)
2857 int bt, r;
2858 r = VT_LVAL;
2859 bt = t & VT_BTYPE;
2860 if (bt == VT_BYTE || bt == VT_BOOL)
2861 r |= VT_LVAL_BYTE;
2862 else if (bt == VT_SHORT)
2863 r |= VT_LVAL_SHORT;
2864 else
2865 return r;
2866 if (t & VT_UNSIGNED)
2867 r |= VT_LVAL_UNSIGNED;
2868 return r;
2871 /* indirection with full error checking and bound check */
2872 static void indir(void)
2874 if ((vtop->type.t & VT_BTYPE) != VT_PTR) {
2875 if ((vtop->type.t & VT_BTYPE) == VT_FUNC)
2876 return;
2877 expect("pointer");
2879 if ((vtop->r & VT_LVAL) && !nocode_wanted)
2880 gv(RC_INT);
2881 vtop->type = *pointed_type(&vtop->type);
2882 /* Arrays and functions are never lvalues */
2883 if (!(vtop->type.t & VT_ARRAY)
2884 && (vtop->type.t & VT_BTYPE) != VT_FUNC) {
2885 vtop->r |= lvalue_type(vtop->type.t);
2886 /* if bound checking, the referenced pointer must be checked */
2887 if (tcc_state->do_bounds_check)
2888 vtop->r |= VT_MUSTBOUND;
2892 /* pass a parameter to a function and do type checking and casting */
2893 static void gfunc_param_typed(Sym *func, Sym *arg)
2895 int func_type;
2896 CType type;
2898 func_type = func->c;
2899 if (func_type == FUNC_OLD ||
2900 (func_type == FUNC_ELLIPSIS && arg == NULL)) {
2901 /* default casting : only need to convert float to double */
2902 if ((vtop->type.t & VT_BTYPE) == VT_FLOAT) {
2903 type.t = VT_DOUBLE;
2904 gen_cast(&type);
2906 } else if (arg == NULL) {
2907 error("too many arguments to function");
2908 } else {
2909 type = arg->type;
2910 type.t &= ~VT_CONSTANT; /* need to do that to avoid false warning */
2911 gen_assign_cast(&type);
2915 /* parse an expression of the form '(type)' or '(expr)' and return its
2916 type */
2917 static void parse_expr_type(CType *type)
2919 int n;
2920 AttributeDef ad;
2922 skip('(');
2923 if (parse_btype(type, &ad)) {
2924 type_decl(type, &ad, &n, TYPE_ABSTRACT);
2925 } else {
2926 expr_type(type);
2928 skip(')');
2931 static void parse_type(CType *type)
2933 AttributeDef ad;
2934 int n;
2936 if (!parse_btype(type, &ad)) {
2937 expect("type");
2939 type_decl(type, &ad, &n, TYPE_ABSTRACT);
2942 static void vpush_tokc(int t)
2944 CType type;
2945 type.t = t;
2946 vsetc(&type, VT_CONST, &tokc);
2949 static void unary(void)
2951 int n, t, align, size, r;
2952 CType type;
2953 Sym *s;
2954 AttributeDef ad;
2956 /* XXX: GCC 2.95.3 does not generate a table although it should be
2957 better here */
2958 tok_next:
2959 switch(tok) {
2960 case TOK_EXTENSION:
2961 next();
2962 goto tok_next;
2963 case TOK_CINT:
2964 case TOK_CCHAR:
2965 case TOK_LCHAR:
2966 vpushi(tokc.i);
2967 next();
2968 break;
2969 case TOK_CUINT:
2970 vpush_tokc(VT_INT | VT_UNSIGNED);
2971 next();
2972 break;
2973 case TOK_CLLONG:
2974 vpush_tokc(VT_LLONG);
2975 next();
2976 break;
2977 case TOK_CULLONG:
2978 vpush_tokc(VT_LLONG | VT_UNSIGNED);
2979 next();
2980 break;
2981 case TOK_CFLOAT:
2982 vpush_tokc(VT_FLOAT);
2983 next();
2984 break;
2985 case TOK_CDOUBLE:
2986 vpush_tokc(VT_DOUBLE);
2987 next();
2988 break;
2989 case TOK_CLDOUBLE:
2990 vpush_tokc(VT_LDOUBLE);
2991 next();
2992 break;
2993 case TOK___FUNCTION__:
2994 if (!gnu_ext)
2995 goto tok_identifier;
2996 /* fall thru */
2997 case TOK___FUNC__:
2999 void *ptr;
3000 int len;
3001 /* special function name identifier */
3002 len = strlen(funcname) + 1;
3003 /* generate char[len] type */
3004 type.t = VT_BYTE;
3005 mk_pointer(&type);
3006 type.t |= VT_ARRAY;
3007 type.ref->c = len;
3008 vpush_ref(&type, data_section, data_section->data_offset, len);
3009 ptr = section_ptr_add(data_section, len);
3010 memcpy(ptr, funcname, len);
3011 next();
3013 break;
3014 case TOK_LSTR:
3015 #ifdef TCC_TARGET_PE
3016 t = VT_SHORT | VT_UNSIGNED;
3017 #else
3018 t = VT_INT;
3019 #endif
3020 goto str_init;
3021 case TOK_STR:
3022 /* string parsing */
3023 t = VT_BYTE;
3024 str_init:
3025 if (tcc_state->warn_write_strings)
3026 t |= VT_CONSTANT;
3027 type.t = t;
3028 mk_pointer(&type);
3029 type.t |= VT_ARRAY;
3030 memset(&ad, 0, sizeof(AttributeDef));
3031 decl_initializer_alloc(&type, &ad, VT_CONST, 2, 0, 0);
3032 break;
3033 case '(':
3034 next();
3035 /* cast ? */
3036 if (parse_btype(&type, &ad)) {
3037 type_decl(&type, &ad, &n, TYPE_ABSTRACT);
3038 skip(')');
3039 /* check ISOC99 compound literal */
3040 if (tok == '{') {
3041 /* data is allocated locally by default */
3042 if (global_expr)
3043 r = VT_CONST;
3044 else
3045 r = VT_LOCAL;
3046 /* all except arrays are lvalues */
3047 if (!(type.t & VT_ARRAY))
3048 r |= lvalue_type(type.t);
3049 memset(&ad, 0, sizeof(AttributeDef));
3050 decl_initializer_alloc(&type, &ad, r, 1, 0, 0);
3051 } else {
3052 unary();
3053 gen_cast(&type);
3055 } else if (tok == '{') {
3056 /* save all registers */
3057 save_regs(0);
3058 /* statement expression : we do not accept break/continue
3059 inside as GCC does */
3060 block(NULL, NULL, NULL, NULL, 0, 1);
3061 skip(')');
3062 } else {
3063 gexpr();
3064 skip(')');
3066 break;
3067 case '*':
3068 next();
3069 unary();
3070 indir();
3071 break;
3072 case '&':
3073 next();
3074 unary();
3075 /* functions names must be treated as function pointers,
3076 except for unary '&' and sizeof. Since we consider that
3077 functions are not lvalues, we only have to handle it
3078 there and in function calls. */
3079 /* arrays can also be used although they are not lvalues */
3080 if ((vtop->type.t & VT_BTYPE) != VT_FUNC &&
3081 !(vtop->type.t & VT_ARRAY) && !(vtop->type.t & VT_LLOCAL))
3082 test_lvalue();
3083 mk_pointer(&vtop->type);
3084 gaddrof();
3085 break;
3086 case '!':
3087 next();
3088 unary();
3089 if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) {
3090 CType boolean;
3091 boolean.t = VT_BOOL;
3092 gen_cast(&boolean);
3093 vtop->c.i = !vtop->c.i;
3094 } else if ((vtop->r & VT_VALMASK) == VT_CMP)
3095 vtop->c.i = vtop->c.i ^ 1;
3096 else {
3097 save_regs(1);
3098 vseti(VT_JMP, gtst(1, 0));
3100 break;
3101 case '~':
3102 next();
3103 unary();
3104 vpushi(-1);
3105 gen_op('^');
3106 break;
3107 case '+':
3108 next();
3109 /* in order to force cast, we add zero */
3110 unary();
3111 if ((vtop->type.t & VT_BTYPE) == VT_PTR)
3112 error("pointer not accepted for unary plus");
3113 vpushi(0);
3114 gen_op('+');
3115 break;
3116 case TOK_SIZEOF:
3117 case TOK_ALIGNOF1:
3118 case TOK_ALIGNOF2:
3119 t = tok;
3120 next();
3121 if (tok == '(') {
3122 parse_expr_type(&type);
3123 } else {
3124 unary_type(&type);
3126 size = type_size(&type, &align);
3127 if (t == TOK_SIZEOF) {
3128 if (size < 0)
3129 error("sizeof applied to an incomplete type");
3130 vpushi(size);
3131 } else {
3132 vpushi(align);
3134 vtop->type.t |= VT_UNSIGNED;
3135 break;
3137 case TOK_builtin_types_compatible_p:
3139 CType type1, type2;
3140 next();
3141 skip('(');
3142 parse_type(&type1);
3143 skip(',');
3144 parse_type(&type2);
3145 skip(')');
3146 type1.t &= ~(VT_CONSTANT | VT_VOLATILE);
3147 type2.t &= ~(VT_CONSTANT | VT_VOLATILE);
3148 vpushi(is_compatible_types(&type1, &type2));
3150 break;
3151 case TOK_builtin_constant_p:
3153 int saved_nocode_wanted, res;
3154 next();
3155 skip('(');
3156 saved_nocode_wanted = nocode_wanted;
3157 nocode_wanted = 1;
3158 gexpr();
3159 res = (vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST;
3160 vpop();
3161 nocode_wanted = saved_nocode_wanted;
3162 skip(')');
3163 vpushi(res);
3165 break;
3166 case TOK_builtin_frame_address:
3168 CType type;
3169 next();
3170 skip('(');
3171 if (tok != TOK_CINT) {
3172 error("__builtin_frame_address only takes integers");
3174 if (tokc.i != 0) {
3175 error("TCC only supports __builtin_frame_address(0)");
3177 next();
3178 skip(')');
3179 type.t = VT_VOID;
3180 mk_pointer(&type);
3181 vset(&type, VT_LOCAL, 0);
3183 break;
3184 #ifdef TCC_TARGET_X86_64
3185 case TOK_builtin_malloc:
3186 tok = TOK_malloc;
3187 goto tok_identifier;
3188 case TOK_builtin_free:
3189 tok = TOK_free;
3190 goto tok_identifier;
3191 #endif
3192 case TOK_INC:
3193 case TOK_DEC:
3194 t = tok;
3195 next();
3196 unary();
3197 inc(0, t);
3198 break;
3199 case '-':
3200 next();
3201 vpushi(0);
3202 unary();
3203 gen_op('-');
3204 break;
3205 case TOK_LAND:
3206 if (!gnu_ext)
3207 goto tok_identifier;
3208 next();
3209 /* allow to take the address of a label */
3210 if (tok < TOK_UIDENT)
3211 expect("label identifier");
3212 s = label_find(tok);
3213 if (!s) {
3214 s = label_push(&global_label_stack, tok, LABEL_FORWARD);
3215 } else {
3216 if (s->r == LABEL_DECLARED)
3217 s->r = LABEL_FORWARD;
3219 if (!s->type.t) {
3220 s->type.t = VT_VOID;
3221 mk_pointer(&s->type);
3222 s->type.t |= VT_STATIC;
3224 vset(&s->type, VT_CONST | VT_SYM, 0);
3225 vtop->sym = s;
3226 next();
3227 break;
3228 default:
3229 tok_identifier:
3230 t = tok;
3231 next();
3232 if (t < TOK_UIDENT)
3233 expect("identifier");
3234 s = sym_find(t);
3235 if (!s) {
3236 if (tok != '(')
3237 error("'%s' undeclared", get_tok_str(t, NULL));
3238 /* for simple function calls, we tolerate undeclared
3239 external reference to int() function */
3240 if (tcc_state->warn_implicit_function_declaration)
3241 warning("implicit declaration of function '%s'",
3242 get_tok_str(t, NULL));
3243 s = external_global_sym(t, &func_old_type, 0);
3245 if ((s->type.t & (VT_STATIC | VT_INLINE | VT_BTYPE)) ==
3246 (VT_STATIC | VT_INLINE | VT_FUNC)) {
3247 /* if referencing an inline function, then we generate a
3248 symbol to it if not already done. It will have the
3249 effect to generate code for it at the end of the
3250 compilation unit. Inline function as always
3251 generated in the text section. */
3252 if (!s->c)
3253 put_extern_sym(s, text_section, 0, 0);
3254 r = VT_SYM | VT_CONST;
3255 } else {
3256 r = s->r;
3258 vset(&s->type, r, s->c);
3259 /* if forward reference, we must point to s */
3260 if (vtop->r & VT_SYM) {
3261 vtop->sym = s;
3262 vtop->c.ul = 0;
3264 break;
3267 /* post operations */
3268 while (1) {
3269 if (tok == TOK_INC || tok == TOK_DEC) {
3270 inc(1, tok);
3271 next();
3272 } else if (tok == '.' || tok == TOK_ARROW) {
3273 int qualifiers;
3274 /* field */
3275 if (tok == TOK_ARROW)
3276 indir();
3277 qualifiers = vtop->type.t & (VT_CONSTANT | VT_VOLATILE);
3278 test_lvalue();
3279 gaddrof();
3280 next();
3281 /* expect pointer on structure */
3282 if ((vtop->type.t & VT_BTYPE) != VT_STRUCT)
3283 expect("struct or union");
3284 s = vtop->type.ref;
3285 /* find field */
3286 tok |= SYM_FIELD;
3287 while ((s = s->next) != NULL) {
3288 if (s->v == tok)
3289 break;
3291 if (!s)
3292 error("field not found: %s", get_tok_str(tok & ~SYM_FIELD, NULL));
3293 /* add field offset to pointer */
3294 vtop->type = char_pointer_type; /* change type to 'char *' */
3295 vpushi(s->c);
3296 gen_op('+');
3297 /* change type to field type, and set to lvalue */
3298 vtop->type = s->type;
3299 vtop->type.t |= qualifiers;
3300 /* an array is never an lvalue */
3301 if (!(vtop->type.t & VT_ARRAY)) {
3302 vtop->r |= lvalue_type(vtop->type.t);
3303 /* if bound checking, the referenced pointer must be checked */
3304 if (tcc_state->do_bounds_check)
3305 vtop->r |= VT_MUSTBOUND;
3307 next();
3308 } else if (tok == '[') {
3309 next();
3310 gexpr();
3311 gen_op('+');
3312 indir();
3313 skip(']');
3314 } else if (tok == '(') {
3315 SValue ret;
3316 Sym *sa;
3317 int nb_args;
3319 /* function call */
3320 if ((vtop->type.t & VT_BTYPE) != VT_FUNC) {
3321 /* pointer test (no array accepted) */
3322 if ((vtop->type.t & (VT_BTYPE | VT_ARRAY)) == VT_PTR) {
3323 vtop->type = *pointed_type(&vtop->type);
3324 if ((vtop->type.t & VT_BTYPE) != VT_FUNC)
3325 goto error_func;
3326 } else {
3327 error_func:
3328 expect("function pointer");
3330 } else {
3331 vtop->r &= ~VT_LVAL; /* no lvalue */
3333 /* get return type */
3334 s = vtop->type.ref;
3335 next();
3336 sa = s->next; /* first parameter */
3337 nb_args = 0;
3338 ret.r2 = VT_CONST;
3339 /* compute first implicit argument if a structure is returned */
3340 if ((s->type.t & VT_BTYPE) == VT_STRUCT) {
3341 /* get some space for the returned structure */
3342 size = type_size(&s->type, &align);
3343 loc = (loc - size) & -align;
3344 ret.type = s->type;
3345 ret.r = VT_LOCAL | VT_LVAL;
3346 /* pass it as 'int' to avoid structure arg passing
3347 problems */
3348 vseti(VT_LOCAL, loc);
3349 ret.c = vtop->c;
3350 nb_args++;
3351 } else {
3352 ret.type = s->type;
3353 /* return in register */
3354 if (is_float(ret.type.t)) {
3355 ret.r = reg_fret(ret.type.t);
3356 } else {
3357 if ((ret.type.t & VT_BTYPE) == VT_LLONG)
3358 ret.r2 = REG_LRET;
3359 ret.r = REG_IRET;
3361 ret.c.i = 0;
3363 if (tok != ')') {
3364 for(;;) {
3365 expr_eq();
3366 gfunc_param_typed(s, sa);
3367 nb_args++;
3368 if (sa)
3369 sa = sa->next;
3370 if (tok == ')')
3371 break;
3372 skip(',');
3375 if (sa)
3376 error("too few arguments to function");
3377 skip(')');
3378 if (!nocode_wanted) {
3379 gfunc_call(nb_args);
3380 } else {
3381 vtop -= (nb_args + 1);
3383 /* return value */
3384 vsetc(&ret.type, ret.r, &ret.c);
3385 vtop->r2 = ret.r2;
3386 } else {
3387 break;
3392 static void uneq(void)
3394 int t;
3396 unary();
3397 if (tok == '=' ||
3398 (tok >= TOK_A_MOD && tok <= TOK_A_DIV) ||
3399 tok == TOK_A_XOR || tok == TOK_A_OR ||
3400 tok == TOK_A_SHL || tok == TOK_A_SAR) {
3401 test_lvalue();
3402 t = tok;
3403 next();
3404 if (t == '=') {
3405 expr_eq();
3406 } else {
3407 vdup();
3408 expr_eq();
3409 gen_op(t & 0x7f);
3411 vstore();
3415 static void expr_prod(void)
3417 int t;
3419 uneq();
3420 while (tok == '*' || tok == '/' || tok == '%') {
3421 t = tok;
3422 next();
3423 uneq();
3424 gen_op(t);
3428 static void expr_sum(void)
3430 int t;
3432 expr_prod();
3433 while (tok == '+' || tok == '-') {
3434 t = tok;
3435 next();
3436 expr_prod();
3437 gen_op(t);
3441 static void expr_shift(void)
3443 int t;
3445 expr_sum();
3446 while (tok == TOK_SHL || tok == TOK_SAR) {
3447 t = tok;
3448 next();
3449 expr_sum();
3450 gen_op(t);
3454 static void expr_cmp(void)
3456 int t;
3458 expr_shift();
3459 while ((tok >= TOK_ULE && tok <= TOK_GT) ||
3460 tok == TOK_ULT || tok == TOK_UGE) {
3461 t = tok;
3462 next();
3463 expr_shift();
3464 gen_op(t);
3468 static void expr_cmpeq(void)
3470 int t;
3472 expr_cmp();
3473 while (tok == TOK_EQ || tok == TOK_NE) {
3474 t = tok;
3475 next();
3476 expr_cmp();
3477 gen_op(t);
3481 static void expr_and(void)
3483 expr_cmpeq();
3484 while (tok == '&') {
3485 next();
3486 expr_cmpeq();
3487 gen_op('&');
3491 static void expr_xor(void)
3493 expr_and();
3494 while (tok == '^') {
3495 next();
3496 expr_and();
3497 gen_op('^');
3501 static void expr_or(void)
3503 expr_xor();
3504 while (tok == '|') {
3505 next();
3506 expr_xor();
3507 gen_op('|');
3511 /* XXX: fix this mess */
3512 static void expr_land_const(void)
3514 expr_or();
3515 while (tok == TOK_LAND) {
3516 next();
3517 expr_or();
3518 gen_op(TOK_LAND);
3522 /* XXX: fix this mess */
3523 static void expr_lor_const(void)
3525 expr_land_const();
3526 while (tok == TOK_LOR) {
3527 next();
3528 expr_land_const();
3529 gen_op(TOK_LOR);
3533 /* only used if non constant */
3534 static void expr_land(void)
3536 int t;
3538 expr_or();
3539 if (tok == TOK_LAND) {
3540 t = 0;
3541 save_regs(1);
3542 for(;;) {
3543 t = gtst(1, t);
3544 if (tok != TOK_LAND) {
3545 vseti(VT_JMPI, t);
3546 break;
3548 next();
3549 expr_or();
3554 static void expr_lor(void)
3556 int t;
3558 expr_land();
3559 if (tok == TOK_LOR) {
3560 t = 0;
3561 save_regs(1);
3562 for(;;) {
3563 t = gtst(0, t);
3564 if (tok != TOK_LOR) {
3565 vseti(VT_JMP, t);
3566 break;
3568 next();
3569 expr_land();
3574 /* XXX: better constant handling */
3575 static void expr_eq(void)
3577 int tt, u, r1, r2, rc, t1, t2, bt1, bt2;
3578 SValue sv;
3579 CType type, type1, type2;
3581 if (const_wanted) {
3582 expr_lor_const();
3583 if (tok == '?') {
3584 CType boolean;
3585 int c;
3586 boolean.t = VT_BOOL;
3587 vdup();
3588 gen_cast(&boolean);
3589 c = vtop->c.i;
3590 vpop();
3591 next();
3592 if (tok != ':' || !gnu_ext) {
3593 vpop();
3594 gexpr();
3596 if (!c)
3597 vpop();
3598 skip(':');
3599 expr_eq();
3600 if (c)
3601 vpop();
3603 } else {
3604 expr_lor();
3605 if (tok == '?') {
3606 next();
3607 if (vtop != vstack) {
3608 /* needed to avoid having different registers saved in
3609 each branch */
3610 if (is_float(vtop->type.t)) {
3611 rc = RC_FLOAT;
3612 #ifdef TCC_TARGET_X86_64
3613 if ((vtop->type.t & VT_BTYPE) == VT_LDOUBLE) {
3614 rc = RC_ST0;
3616 #endif
3618 else
3619 rc = RC_INT;
3620 gv(rc);
3621 save_regs(1);
3623 if (tok == ':' && gnu_ext) {
3624 gv_dup();
3625 tt = gtst(1, 0);
3626 } else {
3627 tt = gtst(1, 0);
3628 gexpr();
3630 type1 = vtop->type;
3631 sv = *vtop; /* save value to handle it later */
3632 vtop--; /* no vpop so that FP stack is not flushed */
3633 skip(':');
3634 u = gjmp(0);
3635 gsym(tt);
3636 expr_eq();
3637 type2 = vtop->type;
3639 t1 = type1.t;
3640 bt1 = t1 & VT_BTYPE;
3641 t2 = type2.t;
3642 bt2 = t2 & VT_BTYPE;
3643 /* cast operands to correct type according to ISOC rules */
3644 if (is_float(bt1) || is_float(bt2)) {
3645 if (bt1 == VT_LDOUBLE || bt2 == VT_LDOUBLE) {
3646 type.t = VT_LDOUBLE;
3647 } else if (bt1 == VT_DOUBLE || bt2 == VT_DOUBLE) {
3648 type.t = VT_DOUBLE;
3649 } else {
3650 type.t = VT_FLOAT;
3652 } else if (bt1 == VT_LLONG || bt2 == VT_LLONG) {
3653 /* cast to biggest op */
3654 type.t = VT_LLONG;
3655 /* convert to unsigned if it does not fit in a long long */
3656 if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED) ||
3657 (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_LLONG | VT_UNSIGNED))
3658 type.t |= VT_UNSIGNED;
3659 } else if (bt1 == VT_PTR || bt2 == VT_PTR) {
3660 /* XXX: test pointer compatibility */
3661 type = type1;
3662 } else if (bt1 == VT_FUNC || bt2 == VT_FUNC) {
3663 /* XXX: test function pointer compatibility */
3664 type = type1;
3665 } else if (bt1 == VT_STRUCT || bt2 == VT_STRUCT) {
3666 /* XXX: test structure compatibility */
3667 type = type1;
3668 } else if (bt1 == VT_VOID || bt2 == VT_VOID) {
3669 /* NOTE: as an extension, we accept void on only one side */
3670 type.t = VT_VOID;
3671 } else {
3672 /* integer operations */
3673 type.t = VT_INT;
3674 /* convert to unsigned if it does not fit in an integer */
3675 if ((t1 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED) ||
3676 (t2 & (VT_BTYPE | VT_UNSIGNED)) == (VT_INT | VT_UNSIGNED))
3677 type.t |= VT_UNSIGNED;
3680 /* now we convert second operand */
3681 gen_cast(&type);
3682 if (VT_STRUCT == (vtop->type.t & VT_BTYPE))
3683 gaddrof();
3684 rc = RC_INT;
3685 if (is_float(type.t)) {
3686 rc = RC_FLOAT;
3687 #ifdef TCC_TARGET_X86_64
3688 if ((type.t & VT_BTYPE) == VT_LDOUBLE) {
3689 rc = RC_ST0;
3691 #endif
3692 } else if ((type.t & VT_BTYPE) == VT_LLONG) {
3693 /* for long longs, we use fixed registers to avoid having
3694 to handle a complicated move */
3695 rc = RC_IRET;
3698 r2 = gv(rc);
3699 /* this is horrible, but we must also convert first
3700 operand */
3701 tt = gjmp(0);
3702 gsym(u);
3703 /* put again first value and cast it */
3704 *vtop = sv;
3705 gen_cast(&type);
3706 if (VT_STRUCT == (vtop->type.t & VT_BTYPE))
3707 gaddrof();
3708 r1 = gv(rc);
3709 move_reg(r2, r1);
3710 vtop->r = r2;
3711 gsym(tt);
3716 static void gexpr(void)
3718 while (1) {
3719 expr_eq();
3720 if (tok != ',')
3721 break;
3722 vpop();
3723 next();
3727 /* parse an expression and return its type without any side effect. */
3728 static void expr_type(CType *type)
3730 int saved_nocode_wanted;
3732 saved_nocode_wanted = nocode_wanted;
3733 nocode_wanted = 1;
3734 gexpr();
3735 *type = vtop->type;
3736 vpop();
3737 nocode_wanted = saved_nocode_wanted;
3740 /* parse a unary expression and return its type without any side
3741 effect. */
3742 static void unary_type(CType *type)
3744 int a;
3746 a = nocode_wanted;
3747 nocode_wanted = 1;
3748 unary();
3749 *type = vtop->type;
3750 vpop();
3751 nocode_wanted = a;
3754 /* parse a constant expression and return value in vtop. */
3755 static void expr_const1(void)
3757 int a;
3758 a = const_wanted;
3759 const_wanted = 1;
3760 expr_eq();
3761 const_wanted = a;
3764 /* parse an integer constant and return its value. */
3765 static int expr_const(void)
3767 int c;
3768 expr_const1();
3769 if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) != VT_CONST)
3770 expect("constant expression");
3771 c = vtop->c.i;
3772 vpop();
3773 return c;
3776 /* return the label token if current token is a label, otherwise
3777 return zero */
3778 static int is_label(void)
3780 int last_tok;
3782 /* fast test first */
3783 if (tok < TOK_UIDENT)
3784 return 0;
3785 /* no need to save tokc because tok is an identifier */
3786 last_tok = tok;
3787 next();
3788 if (tok == ':') {
3789 next();
3790 return last_tok;
3791 } else {
3792 unget_tok(last_tok);
3793 return 0;
3797 static void block(int *bsym, int *csym, int *case_sym, int *def_sym,
3798 int case_reg, int is_expr)
3800 int a, b, c, d;
3801 Sym *s;
3803 /* generate line number info */
3804 if (tcc_state->do_debug &&
3805 (last_line_num != file->line_num || last_ind != ind)) {
3806 put_stabn(N_SLINE, 0, file->line_num, ind - func_ind);
3807 last_ind = ind;
3808 last_line_num = file->line_num;
3811 if (is_expr) {
3812 /* default return value is (void) */
3813 vpushi(0);
3814 vtop->type.t = VT_VOID;
3817 if (tok == TOK_IF) {
3818 /* if test */
3819 next();
3820 skip('(');
3821 gexpr();
3822 skip(')');
3823 a = gtst(1, 0);
3824 block(bsym, csym, case_sym, def_sym, case_reg, 0);
3825 c = tok;
3826 if (c == TOK_ELSE) {
3827 next();
3828 d = gjmp(0);
3829 gsym(a);
3830 block(bsym, csym, case_sym, def_sym, case_reg, 0);
3831 gsym(d); /* patch else jmp */
3832 } else
3833 gsym(a);
3834 } else if (tok == TOK_WHILE) {
3835 next();
3836 d = ind;
3837 skip('(');
3838 gexpr();
3839 skip(')');
3840 a = gtst(1, 0);
3841 b = 0;
3842 block(&a, &b, case_sym, def_sym, case_reg, 0);
3843 gjmp_addr(d);
3844 gsym(a);
3845 gsym_addr(b, d);
3846 } else if (tok == '{') {
3847 Sym *llabel;
3849 next();
3850 /* record local declaration stack position */
3851 s = local_stack;
3852 llabel = local_label_stack;
3853 /* handle local labels declarations */
3854 if (tok == TOK_LABEL) {
3855 next();
3856 for(;;) {
3857 if (tok < TOK_UIDENT)
3858 expect("label identifier");
3859 label_push(&local_label_stack, tok, LABEL_DECLARED);
3860 next();
3861 if (tok == ',') {
3862 next();
3863 } else {
3864 skip(';');
3865 break;
3869 while (tok != '}') {
3870 decl(VT_LOCAL);
3871 if (tok != '}') {
3872 if (is_expr)
3873 vpop();
3874 block(bsym, csym, case_sym, def_sym, case_reg, is_expr);
3877 /* pop locally defined labels */
3878 label_pop(&local_label_stack, llabel);
3879 /* pop locally defined symbols */
3880 if(is_expr) {
3881 /* XXX: this solution makes only valgrind happy...
3882 triggered by gcc.c-torture/execute/20000917-1.c */
3883 Sym *p;
3884 switch(vtop->type.t & VT_BTYPE) {
3885 case VT_PTR:
3886 case VT_STRUCT:
3887 case VT_ENUM:
3888 case VT_FUNC:
3889 for(p=vtop->type.ref;p;p=p->prev)
3890 if(p->prev==s)
3891 error("unsupported expression type");
3894 sym_pop(&local_stack, s);
3895 next();
3896 } else if (tok == TOK_RETURN) {
3897 next();
3898 if (tok != ';') {
3899 gexpr();
3900 gen_assign_cast(&func_vt);
3901 if ((func_vt.t & VT_BTYPE) == VT_STRUCT) {
3902 CType type;
3903 /* if returning structure, must copy it to implicit
3904 first pointer arg location */
3905 #ifdef TCC_ARM_EABI
3906 int align, size;
3907 size = type_size(&func_vt,&align);
3908 if(size <= 4)
3910 if((vtop->r != (VT_LOCAL | VT_LVAL) || (vtop->c.i & 3))
3911 && (align & 3))
3913 int addr;
3914 loc = (loc - size) & -4;
3915 addr = loc;
3916 type = func_vt;
3917 vset(&type, VT_LOCAL | VT_LVAL, addr);
3918 vswap();
3919 vstore();
3920 vset(&int_type, VT_LOCAL | VT_LVAL, addr);
3922 vtop->type = int_type;
3923 gv(RC_IRET);
3924 } else {
3925 #endif
3926 type = func_vt;
3927 mk_pointer(&type);
3928 vset(&type, VT_LOCAL | VT_LVAL, func_vc);
3929 indir();
3930 vswap();
3931 /* copy structure value to pointer */
3932 vstore();
3933 #ifdef TCC_ARM_EABI
3935 #endif
3936 } else if (is_float(func_vt.t)) {
3937 gv(rc_fret(func_vt.t));
3938 } else {
3939 gv(RC_IRET);
3941 vtop--; /* NOT vpop() because on x86 it would flush the fp stack */
3943 skip(';');
3944 rsym = gjmp(rsym); /* jmp */
3945 } else if (tok == TOK_BREAK) {
3946 /* compute jump */
3947 if (!bsym)
3948 error("cannot break");
3949 *bsym = gjmp(*bsym);
3950 next();
3951 skip(';');
3952 } else if (tok == TOK_CONTINUE) {
3953 /* compute jump */
3954 if (!csym)
3955 error("cannot continue");
3956 *csym = gjmp(*csym);
3957 next();
3958 skip(';');
3959 } else if (tok == TOK_FOR) {
3960 int e;
3961 next();
3962 skip('(');
3963 if (tok != ';') {
3964 gexpr();
3965 vpop();
3967 skip(';');
3968 d = ind;
3969 c = ind;
3970 a = 0;
3971 b = 0;
3972 if (tok != ';') {
3973 gexpr();
3974 a = gtst(1, 0);
3976 skip(';');
3977 if (tok != ')') {
3978 e = gjmp(0);
3979 c = ind;
3980 gexpr();
3981 vpop();
3982 gjmp_addr(d);
3983 gsym(e);
3985 skip(')');
3986 block(&a, &b, case_sym, def_sym, case_reg, 0);
3987 gjmp_addr(c);
3988 gsym(a);
3989 gsym_addr(b, c);
3990 } else
3991 if (tok == TOK_DO) {
3992 next();
3993 a = 0;
3994 b = 0;
3995 d = ind;
3996 block(&a, &b, case_sym, def_sym, case_reg, 0);
3997 skip(TOK_WHILE);
3998 skip('(');
3999 gsym(b);
4000 gexpr();
4001 c = gtst(0, 0);
4002 gsym_addr(c, d);
4003 skip(')');
4004 gsym(a);
4005 skip(';');
4006 } else
4007 if (tok == TOK_SWITCH) {
4008 next();
4009 skip('(');
4010 gexpr();
4011 /* XXX: other types than integer */
4012 case_reg = gv(RC_INT);
4013 vpop();
4014 skip(')');
4015 a = 0;
4016 b = gjmp(0); /* jump to first case */
4017 c = 0;
4018 block(&a, csym, &b, &c, case_reg, 0);
4019 /* if no default, jmp after switch */
4020 if (c == 0)
4021 c = ind;
4022 /* default label */
4023 gsym_addr(b, c);
4024 /* break label */
4025 gsym(a);
4026 } else
4027 if (tok == TOK_CASE) {
4028 int v1, v2;
4029 if (!case_sym)
4030 expect("switch");
4031 next();
4032 v1 = expr_const();
4033 v2 = v1;
4034 if (gnu_ext && tok == TOK_DOTS) {
4035 next();
4036 v2 = expr_const();
4037 if (v2 < v1)
4038 warning("empty case range");
4040 /* since a case is like a label, we must skip it with a jmp */
4041 b = gjmp(0);
4042 gsym(*case_sym);
4043 vseti(case_reg, 0);
4044 vpushi(v1);
4045 if (v1 == v2) {
4046 gen_op(TOK_EQ);
4047 *case_sym = gtst(1, 0);
4048 } else {
4049 gen_op(TOK_GE);
4050 *case_sym = gtst(1, 0);
4051 vseti(case_reg, 0);
4052 vpushi(v2);
4053 gen_op(TOK_LE);
4054 *case_sym = gtst(1, *case_sym);
4056 gsym(b);
4057 skip(':');
4058 is_expr = 0;
4059 goto block_after_label;
4060 } else
4061 if (tok == TOK_DEFAULT) {
4062 next();
4063 skip(':');
4064 if (!def_sym)
4065 expect("switch");
4066 if (*def_sym)
4067 error("too many 'default'");
4068 *def_sym = ind;
4069 is_expr = 0;
4070 goto block_after_label;
4071 } else
4072 if (tok == TOK_GOTO) {
4073 next();
4074 if (tok == '*' && gnu_ext) {
4075 /* computed goto */
4076 next();
4077 gexpr();
4078 if ((vtop->type.t & VT_BTYPE) != VT_PTR)
4079 expect("pointer");
4080 ggoto();
4081 } else if (tok >= TOK_UIDENT) {
4082 s = label_find(tok);
4083 /* put forward definition if needed */
4084 if (!s) {
4085 s = label_push(&global_label_stack, tok, LABEL_FORWARD);
4086 } else {
4087 if (s->r == LABEL_DECLARED)
4088 s->r = LABEL_FORWARD;
4090 /* label already defined */
4091 if (s->r & LABEL_FORWARD)
4092 s->next = (void *)gjmp((long)s->next);
4093 else
4094 gjmp_addr((long)s->next);
4095 next();
4096 } else {
4097 expect("label identifier");
4099 skip(';');
4100 } else if (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3) {
4101 asm_instr();
4102 } else {
4103 b = is_label();
4104 if (b) {
4105 /* label case */
4106 s = label_find(b);
4107 if (s) {
4108 if (s->r == LABEL_DEFINED)
4109 error("duplicate label '%s'", get_tok_str(s->v, NULL));
4110 gsym((long)s->next);
4111 s->r = LABEL_DEFINED;
4112 } else {
4113 s = label_push(&global_label_stack, b, LABEL_DEFINED);
4115 s->next = (void *)ind;
4116 /* we accept this, but it is a mistake */
4117 block_after_label:
4118 if (tok == '}') {
4119 warning("deprecated use of label at end of compound statement");
4120 } else {
4121 if (is_expr)
4122 vpop();
4123 block(bsym, csym, case_sym, def_sym, case_reg, is_expr);
4125 } else {
4126 /* expression case */
4127 if (tok != ';') {
4128 if (is_expr) {
4129 vpop();
4130 gexpr();
4131 } else {
4132 gexpr();
4133 vpop();
4136 skip(';');
4141 /* t is the array or struct type. c is the array or struct
4142 address. cur_index/cur_field is the pointer to the current
4143 value. 'size_only' is true if only size info is needed (only used
4144 in arrays) */
4145 static void decl_designator(CType *type, Section *sec, unsigned long c,
4146 int *cur_index, Sym **cur_field,
4147 int size_only)
4149 Sym *s, *f;
4150 int notfirst, index, index_last, align, l, nb_elems, elem_size;
4151 CType type1;
4153 notfirst = 0;
4154 elem_size = 0;
4155 nb_elems = 1;
4156 if (gnu_ext && (l = is_label()) != 0)
4157 goto struct_field;
4158 while (tok == '[' || tok == '.') {
4159 if (tok == '[') {
4160 if (!(type->t & VT_ARRAY))
4161 expect("array type");
4162 s = type->ref;
4163 next();
4164 index = expr_const();
4165 if (index < 0 || (s->c >= 0 && index >= s->c))
4166 expect("invalid index");
4167 if (tok == TOK_DOTS && gnu_ext) {
4168 next();
4169 index_last = expr_const();
4170 if (index_last < 0 ||
4171 (s->c >= 0 && index_last >= s->c) ||
4172 index_last < index)
4173 expect("invalid index");
4174 } else {
4175 index_last = index;
4177 skip(']');
4178 if (!notfirst)
4179 *cur_index = index_last;
4180 type = pointed_type(type);
4181 elem_size = type_size(type, &align);
4182 c += index * elem_size;
4183 /* NOTE: we only support ranges for last designator */
4184 nb_elems = index_last - index + 1;
4185 if (nb_elems != 1) {
4186 notfirst = 1;
4187 break;
4189 } else {
4190 next();
4191 l = tok;
4192 next();
4193 struct_field:
4194 if ((type->t & VT_BTYPE) != VT_STRUCT)
4195 expect("struct/union type");
4196 s = type->ref;
4197 l |= SYM_FIELD;
4198 f = s->next;
4199 while (f) {
4200 if (f->v == l)
4201 break;
4202 f = f->next;
4204 if (!f)
4205 expect("field");
4206 if (!notfirst)
4207 *cur_field = f;
4208 /* XXX: fix this mess by using explicit storage field */
4209 type1 = f->type;
4210 type1.t |= (type->t & ~VT_TYPE);
4211 type = &type1;
4212 c += f->c;
4214 notfirst = 1;
4216 if (notfirst) {
4217 if (tok == '=') {
4218 next();
4219 } else {
4220 if (!gnu_ext)
4221 expect("=");
4223 } else {
4224 if (type->t & VT_ARRAY) {
4225 index = *cur_index;
4226 type = pointed_type(type);
4227 c += index * type_size(type, &align);
4228 } else {
4229 f = *cur_field;
4230 if (!f)
4231 error("too many field init");
4232 /* XXX: fix this mess by using explicit storage field */
4233 type1 = f->type;
4234 type1.t |= (type->t & ~VT_TYPE);
4235 type = &type1;
4236 c += f->c;
4239 decl_initializer(type, sec, c, 0, size_only);
4241 /* XXX: make it more general */
4242 if (!size_only && nb_elems > 1) {
4243 unsigned long c_end;
4244 uint8_t *src, *dst;
4245 int i;
4247 if (!sec)
4248 error("range init not supported yet for dynamic storage");
4249 c_end = c + nb_elems * elem_size;
4250 if (c_end > sec->data_allocated)
4251 section_realloc(sec, c_end);
4252 src = sec->data + c;
4253 dst = src;
4254 for(i = 1; i < nb_elems; i++) {
4255 dst += elem_size;
4256 memcpy(dst, src, elem_size);
4261 #define EXPR_VAL 0
4262 #define EXPR_CONST 1
4263 #define EXPR_ANY 2
4265 /* store a value or an expression directly in global data or in local array */
4266 static void init_putv(CType *type, Section *sec, unsigned long c,
4267 int v, int expr_type)
4269 int saved_global_expr, bt, bit_pos, bit_size;
4270 void *ptr;
4271 unsigned long long bit_mask;
4272 CType dtype;
4274 switch(expr_type) {
4275 case EXPR_VAL:
4276 vpushi(v);
4277 break;
4278 case EXPR_CONST:
4279 /* compound literals must be allocated globally in this case */
4280 saved_global_expr = global_expr;
4281 global_expr = 1;
4282 expr_const1();
4283 global_expr = saved_global_expr;
4284 /* NOTE: symbols are accepted */
4285 if ((vtop->r & (VT_VALMASK | VT_LVAL)) != VT_CONST)
4286 error("initializer element is not constant");
4287 break;
4288 case EXPR_ANY:
4289 expr_eq();
4290 break;
4293 dtype = *type;
4294 dtype.t &= ~VT_CONSTANT; /* need to do that to avoid false warning */
4296 if (sec) {
4297 /* XXX: not portable */
4298 /* XXX: generate error if incorrect relocation */
4299 gen_assign_cast(&dtype);
4300 bt = type->t & VT_BTYPE;
4301 /* we'll write at most 12 bytes */
4302 if (c + 12 > sec->data_allocated) {
4303 section_realloc(sec, c + 12);
4305 ptr = sec->data + c;
4306 /* XXX: make code faster ? */
4307 if (!(type->t & VT_BITFIELD)) {
4308 bit_pos = 0;
4309 bit_size = 32;
4310 bit_mask = -1LL;
4311 } else {
4312 bit_pos = (vtop->type.t >> VT_STRUCT_SHIFT) & 0x3f;
4313 bit_size = (vtop->type.t >> (VT_STRUCT_SHIFT + 6)) & 0x3f;
4314 bit_mask = (1LL << bit_size) - 1;
4316 if ((vtop->r & VT_SYM) &&
4317 (bt == VT_BYTE ||
4318 bt == VT_SHORT ||
4319 bt == VT_DOUBLE ||
4320 bt == VT_LDOUBLE ||
4321 bt == VT_LLONG ||
4322 (bt == VT_INT && bit_size != 32)))
4323 error("initializer element is not computable at load time");
4324 switch(bt) {
4325 case VT_BOOL:
4326 vtop->c.i = (vtop->c.i != 0);
4327 case VT_BYTE:
4328 *(char *)ptr |= (vtop->c.i & bit_mask) << bit_pos;
4329 break;
4330 case VT_SHORT:
4331 *(short *)ptr |= (vtop->c.i & bit_mask) << bit_pos;
4332 break;
4333 case VT_DOUBLE:
4334 *(double *)ptr = vtop->c.d;
4335 break;
4336 case VT_LDOUBLE:
4337 *(long double *)ptr = vtop->c.ld;
4338 break;
4339 case VT_LLONG:
4340 *(long long *)ptr |= (vtop->c.ll & bit_mask) << bit_pos;
4341 break;
4342 default:
4343 if (vtop->r & VT_SYM) {
4344 greloc(sec, vtop->sym, c, R_DATA_32);
4346 *(int *)ptr |= (vtop->c.i & bit_mask) << bit_pos;
4347 break;
4349 vtop--;
4350 } else {
4351 vset(&dtype, VT_LOCAL|VT_LVAL, c);
4352 vswap();
4353 vstore();
4354 vpop();
4358 /* put zeros for variable based init */
4359 static void init_putz(CType *t, Section *sec, unsigned long c, int size)
4361 if (sec) {
4362 /* nothing to do because globals are already set to zero */
4363 } else {
4364 vpush_global_sym(&func_old_type, TOK_memset);
4365 vseti(VT_LOCAL, c);
4366 vpushi(0);
4367 vpushi(size);
4368 gfunc_call(3);
4372 /* 't' contains the type and storage info. 'c' is the offset of the
4373 object in section 'sec'. If 'sec' is NULL, it means stack based
4374 allocation. 'first' is true if array '{' must be read (multi
4375 dimension implicit array init handling). 'size_only' is true if
4376 size only evaluation is wanted (only for arrays). */
4377 static void decl_initializer(CType *type, Section *sec, unsigned long c,
4378 int first, int size_only)
4380 int index, array_length, n, no_oblock, nb, parlevel, i;
4381 int size1, align1, expr_type;
4382 Sym *s, *f;
4383 CType *t1;
4385 if (type->t & VT_ARRAY) {
4386 s = type->ref;
4387 n = s->c;
4388 array_length = 0;
4389 t1 = pointed_type(type);
4390 size1 = type_size(t1, &align1);
4392 no_oblock = 1;
4393 if ((first && tok != TOK_LSTR && tok != TOK_STR) ||
4394 tok == '{') {
4395 skip('{');
4396 no_oblock = 0;
4399 /* only parse strings here if correct type (otherwise: handle
4400 them as ((w)char *) expressions */
4401 if ((tok == TOK_LSTR &&
4402 #ifdef TCC_TARGET_PE
4403 (t1->t & VT_BTYPE) == VT_SHORT && (t1->t & VT_UNSIGNED)
4404 #else
4405 (t1->t & VT_BTYPE) == VT_INT
4406 #endif
4407 ) || (tok == TOK_STR && (t1->t & VT_BTYPE) == VT_BYTE)) {
4408 while (tok == TOK_STR || tok == TOK_LSTR) {
4409 int cstr_len, ch;
4410 CString *cstr;
4412 cstr = tokc.cstr;
4413 /* compute maximum number of chars wanted */
4414 if (tok == TOK_STR)
4415 cstr_len = cstr->size;
4416 else
4417 cstr_len = cstr->size / sizeof(nwchar_t);
4418 cstr_len--;
4419 nb = cstr_len;
4420 if (n >= 0 && nb > (n - array_length))
4421 nb = n - array_length;
4422 if (!size_only) {
4423 if (cstr_len > nb)
4424 warning("initializer-string for array is too long");
4425 /* in order to go faster for common case (char
4426 string in global variable, we handle it
4427 specifically */
4428 if (sec && tok == TOK_STR && size1 == 1) {
4429 memcpy(sec->data + c + array_length, cstr->data, nb);
4430 } else {
4431 for(i=0;i<nb;i++) {
4432 if (tok == TOK_STR)
4433 ch = ((unsigned char *)cstr->data)[i];
4434 else
4435 ch = ((nwchar_t *)cstr->data)[i];
4436 init_putv(t1, sec, c + (array_length + i) * size1,
4437 ch, EXPR_VAL);
4441 array_length += nb;
4442 next();
4444 /* only add trailing zero if enough storage (no
4445 warning in this case since it is standard) */
4446 if (n < 0 || array_length < n) {
4447 if (!size_only) {
4448 init_putv(t1, sec, c + (array_length * size1), 0, EXPR_VAL);
4450 array_length++;
4452 } else {
4453 index = 0;
4454 while (tok != '}') {
4455 decl_designator(type, sec, c, &index, NULL, size_only);
4456 if (n >= 0 && index >= n)
4457 error("index too large");
4458 /* must put zero in holes (note that doing it that way
4459 ensures that it even works with designators) */
4460 if (!size_only && array_length < index) {
4461 init_putz(t1, sec, c + array_length * size1,
4462 (index - array_length) * size1);
4464 index++;
4465 if (index > array_length)
4466 array_length = index;
4467 /* special test for multi dimensional arrays (may not
4468 be strictly correct if designators are used at the
4469 same time) */
4470 if (index >= n && no_oblock)
4471 break;
4472 if (tok == '}')
4473 break;
4474 skip(',');
4477 if (!no_oblock)
4478 skip('}');
4479 /* put zeros at the end */
4480 if (!size_only && n >= 0 && array_length < n) {
4481 init_putz(t1, sec, c + array_length * size1,
4482 (n - array_length) * size1);
4484 /* patch type size if needed */
4485 if (n < 0)
4486 s->c = array_length;
4487 } else if ((type->t & VT_BTYPE) == VT_STRUCT &&
4488 (sec || !first || tok == '{')) {
4489 int par_count;
4491 /* NOTE: the previous test is a specific case for automatic
4492 struct/union init */
4493 /* XXX: union needs only one init */
4495 /* XXX: this test is incorrect for local initializers
4496 beginning with ( without {. It would be much more difficult
4497 to do it correctly (ideally, the expression parser should
4498 be used in all cases) */
4499 par_count = 0;
4500 if (tok == '(') {
4501 AttributeDef ad1;
4502 CType type1;
4503 next();
4504 while (tok == '(') {
4505 par_count++;
4506 next();
4508 if (!parse_btype(&type1, &ad1))
4509 expect("cast");
4510 type_decl(&type1, &ad1, &n, TYPE_ABSTRACT);
4511 #if 0
4512 if (!is_assignable_types(type, &type1))
4513 error("invalid type for cast");
4514 #endif
4515 skip(')');
4517 no_oblock = 1;
4518 if (first || tok == '{') {
4519 skip('{');
4520 no_oblock = 0;
4522 s = type->ref;
4523 f = s->next;
4524 array_length = 0;
4525 index = 0;
4526 n = s->c;
4527 while (tok != '}') {
4528 decl_designator(type, sec, c, NULL, &f, size_only);
4529 index = f->c;
4530 if (!size_only && array_length < index) {
4531 init_putz(type, sec, c + array_length,
4532 index - array_length);
4534 index = index + type_size(&f->type, &align1);
4535 if (index > array_length)
4536 array_length = index;
4538 /* gr: skip fields from same union - ugly. */
4539 while (f->next) {
4540 ///printf("index: %2d %08x -- %2d %08x\n", f->c, f->type.t, f->next->c, f->next->type.t);
4541 /* test for same offset */
4542 if (f->next->c != f->c)
4543 break;
4544 /* if yes, test for bitfield shift */
4545 if ((f->type.t & VT_BITFIELD) && (f->next->type.t & VT_BITFIELD)) {
4546 int bit_pos_1 = (f->type.t >> VT_STRUCT_SHIFT) & 0x3f;
4547 int bit_pos_2 = (f->next->type.t >> VT_STRUCT_SHIFT) & 0x3f;
4548 //printf("bitfield %d %d\n", bit_pos_1, bit_pos_2);
4549 if (bit_pos_1 != bit_pos_2)
4550 break;
4552 f = f->next;
4555 f = f->next;
4556 if (no_oblock && f == NULL)
4557 break;
4558 if (tok == '}')
4559 break;
4560 skip(',');
4562 /* put zeros at the end */
4563 if (!size_only && array_length < n) {
4564 init_putz(type, sec, c + array_length,
4565 n - array_length);
4567 if (!no_oblock)
4568 skip('}');
4569 while (par_count) {
4570 skip(')');
4571 par_count--;
4573 } else if (tok == '{') {
4574 next();
4575 decl_initializer(type, sec, c, first, size_only);
4576 skip('}');
4577 } else if (size_only) {
4578 /* just skip expression */
4579 parlevel = 0;
4580 while ((parlevel > 0 || (tok != '}' && tok != ',')) &&
4581 tok != -1) {
4582 if (tok == '(')
4583 parlevel++;
4584 else if (tok == ')')
4585 parlevel--;
4586 next();
4588 } else {
4589 /* currently, we always use constant expression for globals
4590 (may change for scripting case) */
4591 expr_type = EXPR_CONST;
4592 if (!sec)
4593 expr_type = EXPR_ANY;
4594 init_putv(type, sec, c, 0, expr_type);
4598 /* parse an initializer for type 't' if 'has_init' is non zero, and
4599 allocate space in local or global data space ('r' is either
4600 VT_LOCAL or VT_CONST). If 'v' is non zero, then an associated
4601 variable 'v' of scope 'scope' is declared before initializers are
4602 parsed. If 'v' is zero, then a reference to the new object is put
4603 in the value stack. If 'has_init' is 2, a special parsing is done
4604 to handle string constants. */
4605 static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r,
4606 int has_init, int v, int scope)
4608 int size, align, addr, data_offset;
4609 int level;
4610 ParseState saved_parse_state = {0};
4611 TokenString init_str;
4612 Section *sec;
4614 size = type_size(type, &align);
4615 /* If unknown size, we must evaluate it before
4616 evaluating initializers because
4617 initializers can generate global data too
4618 (e.g. string pointers or ISOC99 compound
4619 literals). It also simplifies local
4620 initializers handling */
4621 tok_str_new(&init_str);
4622 if (size < 0) {
4623 if (!has_init)
4624 error("unknown type size");
4625 /* get all init string */
4626 if (has_init == 2) {
4627 /* only get strings */
4628 while (tok == TOK_STR || tok == TOK_LSTR) {
4629 tok_str_add_tok(&init_str);
4630 next();
4632 } else {
4633 level = 0;
4634 while (level > 0 || (tok != ',' && tok != ';')) {
4635 if (tok < 0)
4636 error("unexpected end of file in initializer");
4637 tok_str_add_tok(&init_str);
4638 if (tok == '{')
4639 level++;
4640 else if (tok == '}') {
4641 level--;
4642 if (level <= 0) {
4643 next();
4644 break;
4647 next();
4650 tok_str_add(&init_str, -1);
4651 tok_str_add(&init_str, 0);
4653 /* compute size */
4654 save_parse_state(&saved_parse_state);
4656 macro_ptr = init_str.str;
4657 next();
4658 decl_initializer(type, NULL, 0, 1, 1);
4659 /* prepare second initializer parsing */
4660 macro_ptr = init_str.str;
4661 next();
4663 /* if still unknown size, error */
4664 size = type_size(type, &align);
4665 if (size < 0)
4666 error("unknown type size");
4668 /* take into account specified alignment if bigger */
4669 if (ad->aligned) {
4670 if (ad->aligned > align)
4671 align = ad->aligned;
4672 } else if (ad->packed) {
4673 align = 1;
4675 if ((r & VT_VALMASK) == VT_LOCAL) {
4676 sec = NULL;
4677 if (tcc_state->do_bounds_check && (type->t & VT_ARRAY))
4678 loc--;
4679 loc = (loc - size) & -align;
4680 addr = loc;
4681 /* handles bounds */
4682 /* XXX: currently, since we do only one pass, we cannot track
4683 '&' operators, so we add only arrays */
4684 if (tcc_state->do_bounds_check && (type->t & VT_ARRAY)) {
4685 unsigned long *bounds_ptr;
4686 /* add padding between regions */
4687 loc--;
4688 /* then add local bound info */
4689 bounds_ptr = section_ptr_add(lbounds_section, 2 * sizeof(unsigned long));
4690 bounds_ptr[0] = addr;
4691 bounds_ptr[1] = size;
4693 if (v) {
4694 /* local variable */
4695 sym_push(v, type, r, addr);
4696 } else {
4697 /* push local reference */
4698 vset(type, r, addr);
4700 } else {
4701 Sym *sym;
4703 sym = NULL;
4704 if (v && scope == VT_CONST) {
4705 /* see if the symbol was already defined */
4706 sym = sym_find(v);
4707 if (sym) {
4708 if (!is_compatible_types(&sym->type, type))
4709 error("incompatible types for redefinition of '%s'",
4710 get_tok_str(v, NULL));
4711 if (sym->type.t & VT_EXTERN) {
4712 /* if the variable is extern, it was not allocated */
4713 sym->type.t &= ~VT_EXTERN;
4714 /* set array size if it was ommited in extern
4715 declaration */
4716 if ((sym->type.t & VT_ARRAY) &&
4717 sym->type.ref->c < 0 &&
4718 type->ref->c >= 0)
4719 sym->type.ref->c = type->ref->c;
4720 } else {
4721 /* we accept several definitions of the same
4722 global variable. this is tricky, because we
4723 must play with the SHN_COMMON type of the symbol */
4724 /* XXX: should check if the variable was already
4725 initialized. It is incorrect to initialized it
4726 twice */
4727 /* no init data, we won't add more to the symbol */
4728 if (!has_init)
4729 goto no_alloc;
4734 /* allocate symbol in corresponding section */
4735 sec = ad->section;
4736 if (!sec) {
4737 if (has_init)
4738 sec = data_section;
4739 else if (tcc_state->nocommon)
4740 sec = bss_section;
4742 if (sec) {
4743 data_offset = sec->data_offset;
4744 data_offset = (data_offset + align - 1) & -align;
4745 addr = data_offset;
4746 /* very important to increment global pointer at this time
4747 because initializers themselves can create new initializers */
4748 data_offset += size;
4749 /* add padding if bound check */
4750 if (tcc_state->do_bounds_check)
4751 data_offset++;
4752 sec->data_offset = data_offset;
4753 /* allocate section space to put the data */
4754 if (sec->sh_type != SHT_NOBITS &&
4755 data_offset > sec->data_allocated)
4756 section_realloc(sec, data_offset);
4757 /* align section if needed */
4758 if (align > sec->sh_addralign)
4759 sec->sh_addralign = align;
4760 } else {
4761 addr = 0; /* avoid warning */
4764 if (v) {
4765 if (scope != VT_CONST || !sym) {
4766 sym = sym_push(v, type, r | VT_SYM, 0);
4768 /* update symbol definition */
4769 if (sec) {
4770 put_extern_sym(sym, sec, addr, size);
4771 } else {
4772 ElfW(Sym) *esym;
4773 /* put a common area */
4774 put_extern_sym(sym, NULL, align, size);
4775 /* XXX: find a nicer way */
4776 esym = &((ElfW(Sym) *)symtab_section->data)[sym->c];
4777 esym->st_shndx = SHN_COMMON;
4779 } else {
4780 CValue cval;
4782 /* push global reference */
4783 sym = get_sym_ref(type, sec, addr, size);
4784 cval.ul = 0;
4785 vsetc(type, VT_CONST | VT_SYM, &cval);
4786 vtop->sym = sym;
4789 /* handles bounds now because the symbol must be defined
4790 before for the relocation */
4791 if (tcc_state->do_bounds_check) {
4792 unsigned long *bounds_ptr;
4794 greloc(bounds_section, sym, bounds_section->data_offset, R_DATA_32);
4795 /* then add global bound info */
4796 bounds_ptr = section_ptr_add(bounds_section, 2 * sizeof(long));
4797 bounds_ptr[0] = 0; /* relocated */
4798 bounds_ptr[1] = size;
4801 if (has_init) {
4802 decl_initializer(type, sec, addr, 1, 0);
4803 /* restore parse state if needed */
4804 if (init_str.str) {
4805 tok_str_free(init_str.str);
4806 restore_parse_state(&saved_parse_state);
4809 no_alloc: ;
4812 void put_func_debug(Sym *sym)
4814 char buf[512];
4816 /* stabs info */
4817 /* XXX: we put here a dummy type */
4818 snprintf(buf, sizeof(buf), "%s:%c1",
4819 funcname, sym->type.t & VT_STATIC ? 'f' : 'F');
4820 put_stabs_r(buf, N_FUN, 0, file->line_num, 0,
4821 cur_text_section, sym->c);
4822 /* //gr gdb wants a line at the function */
4823 put_stabn(N_SLINE, 0, file->line_num, 0);
4824 last_ind = 0;
4825 last_line_num = 0;
4828 /* parse an old style function declaration list */
4829 /* XXX: check multiple parameter */
4830 static void func_decl_list(Sym *func_sym)
4832 AttributeDef ad;
4833 int v;
4834 Sym *s;
4835 CType btype, type;
4837 /* parse each declaration */
4838 while (tok != '{' && tok != ';' && tok != ',' && tok != TOK_EOF) {
4839 if (!parse_btype(&btype, &ad))
4840 expect("declaration list");
4841 if (((btype.t & VT_BTYPE) == VT_ENUM ||
4842 (btype.t & VT_BTYPE) == VT_STRUCT) &&
4843 tok == ';') {
4844 /* we accept no variable after */
4845 } else {
4846 for(;;) {
4847 type = btype;
4848 type_decl(&type, &ad, &v, TYPE_DIRECT);
4849 /* find parameter in function parameter list */
4850 s = func_sym->next;
4851 while (s != NULL) {
4852 if ((s->v & ~SYM_FIELD) == v)
4853 goto found;
4854 s = s->next;
4856 error("declaration for parameter '%s' but no such parameter",
4857 get_tok_str(v, NULL));
4858 found:
4859 /* check that no storage specifier except 'register' was given */
4860 if (type.t & VT_STORAGE)
4861 error("storage class specified for '%s'", get_tok_str(v, NULL));
4862 convert_parameter_type(&type);
4863 /* we can add the type (NOTE: it could be local to the function) */
4864 s->type = type;
4865 /* accept other parameters */
4866 if (tok == ',')
4867 next();
4868 else
4869 break;
4872 skip(';');
4876 /* parse a function defined by symbol 'sym' and generate its code in
4877 'cur_text_section' */
4878 static void gen_function(Sym *sym)
4880 int saved_nocode_wanted = nocode_wanted;
4881 nocode_wanted = 0;
4882 ind = cur_text_section->data_offset;
4883 /* NOTE: we patch the symbol size later */
4884 put_extern_sym(sym, cur_text_section, ind, 0);
4885 funcname = get_tok_str(sym->v, NULL);
4886 func_ind = ind;
4887 /* put debug symbol */
4888 if (tcc_state->do_debug)
4889 put_func_debug(sym);
4890 /* push a dummy symbol to enable local sym storage */
4891 sym_push2(&local_stack, SYM_FIELD, 0, 0);
4892 gfunc_prolog(&sym->type);
4893 rsym = 0;
4894 block(NULL, NULL, NULL, NULL, 0, 0);
4895 gsym(rsym);
4896 gfunc_epilog();
4897 cur_text_section->data_offset = ind;
4898 label_pop(&global_label_stack, NULL);
4899 sym_pop(&local_stack, NULL); /* reset local stack */
4900 /* end of function */
4901 /* patch symbol size */
4902 ((ElfW(Sym) *)symtab_section->data)[sym->c].st_size =
4903 ind - func_ind;
4904 if (tcc_state->do_debug) {
4905 put_stabn(N_FUN, 0, 0, ind - func_ind);
4907 /* It's better to crash than to generate wrong code */
4908 cur_text_section = NULL;
4909 funcname = ""; /* for safety */
4910 func_vt.t = VT_VOID; /* for safety */
4911 ind = 0; /* for safety */
4912 nocode_wanted = saved_nocode_wanted;
4915 static void gen_inline_functions(void)
4917 Sym *sym;
4918 CType *type;
4919 int *str, inline_generated;
4921 /* iterate while inline function are referenced */
4922 for(;;) {
4923 inline_generated = 0;
4924 for(sym = global_stack; sym != NULL; sym = sym->prev) {
4925 type = &sym->type;
4926 if (((type->t & VT_BTYPE) == VT_FUNC) &&
4927 (type->t & (VT_STATIC | VT_INLINE)) ==
4928 (VT_STATIC | VT_INLINE) &&
4929 sym->c != 0) {
4930 /* the function was used: generate its code and
4931 convert it to a normal function */
4932 str = INLINE_DEF(sym->r);
4933 sym->r = VT_SYM | VT_CONST;
4934 sym->type.t &= ~VT_INLINE;
4936 macro_ptr = str;
4937 next();
4938 cur_text_section = text_section;
4939 gen_function(sym);
4940 macro_ptr = NULL; /* fail safe */
4942 tok_str_free(str);
4943 inline_generated = 1;
4946 if (!inline_generated)
4947 break;
4950 /* free all remaining inline function tokens */
4951 for(sym = global_stack; sym != NULL; sym = sym->prev) {
4952 type = &sym->type;
4953 if (((type->t & VT_BTYPE) == VT_FUNC) &&
4954 (type->t & (VT_STATIC | VT_INLINE)) ==
4955 (VT_STATIC | VT_INLINE)) {
4956 //gr printf("sym %d %s\n", sym->r, get_tok_str(sym->v, NULL));
4957 if (sym->r == (VT_SYM | VT_CONST)) //gr beware!
4958 continue;
4959 str = INLINE_DEF(sym->r);
4960 tok_str_free(str);
4961 sym->r = 0; /* fail safe */
4966 /* 'l' is VT_LOCAL or VT_CONST to define default storage type */
4967 static void decl(int l)
4969 int v, has_init, r;
4970 CType type, btype;
4971 Sym *sym;
4972 AttributeDef ad;
4974 while (1) {
4975 if (!parse_btype(&btype, &ad)) {
4976 /* skip redundant ';' */
4977 /* XXX: find more elegant solution */
4978 if (tok == ';') {
4979 next();
4980 continue;
4982 if (l == VT_CONST &&
4983 (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3)) {
4984 /* global asm block */
4985 asm_global_instr();
4986 continue;
4988 /* special test for old K&R protos without explicit int
4989 type. Only accepted when defining global data */
4990 if (l == VT_LOCAL || tok < TOK_DEFINE)
4991 break;
4992 btype.t = VT_INT;
4994 if (((btype.t & VT_BTYPE) == VT_ENUM ||
4995 (btype.t & VT_BTYPE) == VT_STRUCT) &&
4996 tok == ';') {
4997 /* we accept no variable after */
4998 next();
4999 continue;
5001 while (1) { /* iterate thru each declaration */
5002 type = btype;
5003 type_decl(&type, &ad, &v, TYPE_DIRECT);
5004 #if 0
5006 char buf[500];
5007 type_to_str(buf, sizeof(buf), t, get_tok_str(v, NULL));
5008 printf("type = '%s'\n", buf);
5010 #endif
5011 if ((type.t & VT_BTYPE) == VT_FUNC) {
5012 /* if old style function prototype, we accept a
5013 declaration list */
5014 sym = type.ref;
5015 if (sym->c == FUNC_OLD)
5016 func_decl_list(sym);
5019 if (tok == '{') {
5020 if (l == VT_LOCAL)
5021 error("cannot use local functions");
5022 if ((type.t & VT_BTYPE) != VT_FUNC)
5023 expect("function definition");
5025 /* reject abstract declarators in function definition */
5026 sym = type.ref;
5027 while ((sym = sym->next) != NULL)
5028 if (!(sym->v & ~SYM_FIELD))
5029 expect("identifier");
5031 /* XXX: cannot do better now: convert extern line to static inline */
5032 if ((type.t & (VT_EXTERN | VT_INLINE)) == (VT_EXTERN | VT_INLINE))
5033 type.t = (type.t & ~VT_EXTERN) | VT_STATIC;
5035 sym = sym_find(v);
5036 if (sym) {
5037 if ((sym->type.t & VT_BTYPE) != VT_FUNC)
5038 goto func_error1;
5040 r = sym->type.ref->r;
5041 /* use func_call from prototype if not defined */
5042 if (FUNC_CALL(r) != FUNC_CDECL
5043 && FUNC_CALL(type.ref->r) == FUNC_CDECL)
5044 FUNC_CALL(type.ref->r) = FUNC_CALL(r);
5046 /* use export from prototype */
5047 if (FUNC_EXPORT(r))
5048 FUNC_EXPORT(type.ref->r) = 1;
5050 /* use static from prototype */
5051 if (sym->type.t & VT_STATIC)
5052 type.t = (type.t & ~VT_EXTERN) | VT_STATIC;
5054 if (!is_compatible_types(&sym->type, &type)) {
5055 func_error1:
5056 error("incompatible types for redefinition of '%s'",
5057 get_tok_str(v, NULL));
5059 /* if symbol is already defined, then put complete type */
5060 sym->type = type;
5061 } else {
5062 /* put function symbol */
5063 sym = global_identifier_push(v, type.t, 0);
5064 sym->type.ref = type.ref;
5067 /* static inline functions are just recorded as a kind
5068 of macro. Their code will be emitted at the end of
5069 the compilation unit only if they are used */
5070 if ((type.t & (VT_INLINE | VT_STATIC)) ==
5071 (VT_INLINE | VT_STATIC)) {
5072 TokenString func_str;
5073 int block_level;
5075 tok_str_new(&func_str);
5077 block_level = 0;
5078 for(;;) {
5079 int t;
5080 if (tok == TOK_EOF)
5081 error("unexpected end of file");
5082 tok_str_add_tok(&func_str);
5083 t = tok;
5084 next();
5085 if (t == '{') {
5086 block_level++;
5087 } else if (t == '}') {
5088 block_level--;
5089 if (block_level == 0)
5090 break;
5093 tok_str_add(&func_str, -1);
5094 tok_str_add(&func_str, 0);
5095 INLINE_DEF(sym->r) = func_str.str;
5096 } else {
5097 /* compute text section */
5098 cur_text_section = ad.section;
5099 if (!cur_text_section)
5100 cur_text_section = text_section;
5101 sym->r = VT_SYM | VT_CONST;
5102 gen_function(sym);
5104 break;
5105 } else {
5106 if (btype.t & VT_TYPEDEF) {
5107 /* save typedefed type */
5108 /* XXX: test storage specifiers ? */
5109 sym = sym_push(v, &type, 0, 0);
5110 sym->type.t |= VT_TYPEDEF;
5111 } else if ((type.t & VT_BTYPE) == VT_FUNC) {
5112 /* external function definition */
5113 /* specific case for func_call attribute */
5114 if (ad.func_attr)
5115 type.ref->r = ad.func_attr;
5116 external_sym(v, &type, 0);
5117 } else {
5118 /* not lvalue if array */
5119 r = 0;
5120 if (!(type.t & VT_ARRAY))
5121 r |= lvalue_type(type.t);
5122 has_init = (tok == '=');
5123 if ((btype.t & VT_EXTERN) ||
5124 ((type.t & VT_ARRAY) && (type.t & VT_STATIC) &&
5125 !has_init && l == VT_CONST && type.ref->c < 0)) {
5126 /* external variable */
5127 /* NOTE: as GCC, uninitialized global static
5128 arrays of null size are considered as
5129 extern */
5130 external_sym(v, &type, r);
5131 } else {
5132 type.t |= (btype.t & VT_STATIC); /* Retain "static". */
5133 if (type.t & VT_STATIC)
5134 r |= VT_CONST;
5135 else
5136 r |= l;
5137 if (has_init)
5138 next();
5139 decl_initializer_alloc(&type, &ad, r,
5140 has_init, v, l);
5143 if (tok != ',') {
5144 skip(';');
5145 break;
5147 next();