1# 1 "tccgen.c" 2# 1 "<built-in>" 3# 1 "<command-line>" 4# 1 "tccgen.c" 5# 21 "tccgen.c" 6# 1 "tcc.h" 1 7# 25 "tcc.h" 8# 1 "config.h" 1 9# 26 "tcc.h" 2 10 11# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdlib.h" 1 12# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 13# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdlib.h" 2 14# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_typedefs.h" 1 15 16 17 18typedef int size_t; 19typedef int __builtin_va_list; 20typedef int __gnuc_va_list; 21typedef int va_list; 22typedef int __int8_t; 23typedef int __uint8_t; 24typedef int __int16_t; 25typedef int __uint16_t; 26typedef int __int_least16_t; 27typedef int __uint_least16_t; 28typedef int __int32_t; 29typedef int __uint32_t; 30typedef int __int64_t; 31typedef int __uint64_t; 32typedef int __int_least32_t; 33typedef int __uint_least32_t; 34typedef int __s8; 35typedef int __u8; 36typedef int __s16; 37typedef int __u16; 38typedef int __s32; 39typedef int __u32; 40typedef int __s64; 41typedef int __u64; 42typedef int _LOCK_T; 43typedef int _LOCK_RECURSIVE_T; 44typedef int _off_t; 45typedef int __dev_t; 46typedef int __uid_t; 47typedef int __gid_t; 48typedef int _off64_t; 49typedef int _fpos_t; 50typedef int _ssize_t; 51typedef int wint_t; 52typedef int _mbstate_t; 53typedef int _flock_t; 54typedef int _iconv_t; 55typedef int __ULong; 56typedef int __FILE; 57typedef int ptrdiff_t; 58typedef int wchar_t; 59typedef int __off_t; 60typedef int __pid_t; 61typedef int __loff_t; 62typedef int u_char; 63typedef int u_short; 64typedef int u_int; 65typedef int u_long; 66typedef int ushort; 67typedef int uint; 68typedef int clock_t; 69typedef int time_t; 70typedef int daddr_t; 71typedef int caddr_t; 72typedef int ino_t; 73typedef int off_t; 74typedef int dev_t; 75typedef int uid_t; 76typedef int gid_t; 77typedef int pid_t; 78typedef int key_t; 79typedef int ssize_t; 80typedef int mode_t; 81typedef int nlink_t; 82typedef int fd_mask; 83typedef int _types_fd_set; 84typedef int clockid_t; 85typedef int timer_t; 86typedef int useconds_t; 87typedef int suseconds_t; 88typedef int FILE; 89typedef int fpos_t; 90typedef int cookie_read_function_t; 91typedef int cookie_write_function_t; 92typedef int cookie_seek_function_t; 93typedef int cookie_close_function_t; 94typedef int cookie_io_functions_t; 95typedef int div_t; 96typedef int ldiv_t; 97typedef int lldiv_t; 98typedef int sigset_t; 99typedef int __sigset_t; 100typedef int _sig_func_ptr; 101typedef int sig_atomic_t; 102typedef int __tzrule_type; 103typedef int __tzinfo_type; 104typedef int mbstate_t; 105typedef int sem_t; 106typedef int pthread_t; 107typedef int pthread_attr_t; 108typedef int pthread_mutex_t; 109typedef int pthread_mutexattr_t; 110typedef int pthread_cond_t; 111typedef int pthread_condattr_t; 112typedef int pthread_key_t; 113typedef int pthread_once_t; 114typedef int pthread_rwlock_t; 115typedef int pthread_rwlockattr_t; 116typedef int pthread_spinlock_t; 117typedef int pthread_barrier_t; 118typedef int pthread_barrierattr_t; 119typedef int jmp_buf; 120typedef int rlim_t; 121typedef int sa_family_t; 122typedef int sigjmp_buf; 123typedef int stack_t; 124typedef int siginfo_t; 125typedef int z_stream; 126 127 128typedef int int8_t; 129typedef int uint8_t; 130typedef int int16_t; 131typedef int uint16_t; 132typedef int int32_t; 133typedef int uint32_t; 134typedef int int64_t; 135typedef int uint64_t; 136 137 138typedef int int_least8_t; 139typedef int uint_least8_t; 140typedef int int_least16_t; 141typedef int uint_least16_t; 142typedef int int_least32_t; 143typedef int uint_least32_t; 144typedef int int_least64_t; 145typedef int uint_least64_t; 146 147 148typedef int int_fast8_t; 149typedef int uint_fast8_t; 150typedef int int_fast16_t; 151typedef int uint_fast16_t; 152typedef int int_fast32_t; 153typedef int uint_fast32_t; 154typedef int int_fast64_t; 155typedef int uint_fast64_t; 156 157 158typedef int intptr_t; 159typedef int uintptr_t; 160 161 162typedef int intmax_t; 163typedef int uintmax_t; 164 165 166typedef _Bool bool; 167 168 169typedef void* MirEGLNativeWindowType; 170typedef void* MirEGLNativeDisplayType; 171typedef struct MirConnection MirConnection; 172typedef struct MirSurface MirSurface; 173typedef struct MirSurfaceSpec MirSurfaceSpec; 174typedef struct MirScreencast MirScreencast; 175typedef struct MirPromptSession MirPromptSession; 176typedef struct MirBufferStream MirBufferStream; 177typedef struct MirPersistentId MirPersistentId; 178typedef struct MirBlob MirBlob; 179typedef struct MirDisplayConfig MirDisplayConfig; 180 181 182typedef struct xcb_connection_t xcb_connection_t; 183typedef uint32_t xcb_window_t; 184typedef uint32_t xcb_visualid_t; 185# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdlib.h" 2 186# 28 "tcc.h" 2 187# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdio.h" 1 188# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 189# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdio.h" 2 190# 29 "tcc.h" 2 191# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdarg.h" 1 192# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 193# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/stdarg.h" 2 194# 30 "tcc.h" 2 195# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/string.h" 1 196# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 197# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/string.h" 2 198# 31 "tcc.h" 2 199# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/errno.h" 1 200# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 201# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/errno.h" 2 202# 32 "tcc.h" 2 203# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/math.h" 1 204# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 205# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/math.h" 2 206# 33 "tcc.h" 2 207# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/fcntl.h" 1 208# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 209# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/fcntl.h" 2 210# 34 "tcc.h" 2 211# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/setjmp.h" 1 212# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 213# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/setjmp.h" 2 214# 35 "tcc.h" 2 215# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/time.h" 1 216# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 217# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/time.h" 2 218# 36 "tcc.h" 2 219 220 221# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/unistd.h" 1 222# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 223# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/unistd.h" 2 224# 39 "tcc.h" 2 225# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/sys/time.h" 1 226# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 227# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/sys/time.h" 2 228# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_typedefs.h" 1 229# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/sys/time.h" 2 230# 40 "tcc.h" 2 231 232# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/dlfcn.h" 1 233# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 234# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/dlfcn.h" 2 235# 42 "tcc.h" 2 236 237 238extern float strtof (const char *__nptr, char **__endptr); 239extern long double strtold (const char *__nptr, char **__endptr); 240# 283 "tcc.h" 241# 1 "libtcc.h" 1 242# 12 "libtcc.h" 243struct TCCState; 244 245typedef struct TCCState TCCState; 246 247 248 TCCState *tcc_new(void); 249 250 251 void tcc_delete(TCCState *s); 252 253 254 void tcc_set_lib_path(TCCState *s, const char *path); 255 256 257 void tcc_set_error_func(TCCState *s, void *error_opaque, 258 void (*error_func)(void *opaque, const char *msg)); 259 260 261 void tcc_set_options(TCCState *s, const char *str); 262 263 264 265 266 267 int tcc_add_include_path(TCCState *s, const char *pathname); 268 269 270 int tcc_add_sysinclude_path(TCCState *s, const char *pathname); 271 272 273 void tcc_define_symbol(TCCState *s, const char *sym, const char *value); 274 275 276 void tcc_undefine_symbol(TCCState *s, const char *sym); 277 278 279 280 281 282 int tcc_add_file(TCCState *s, const char *filename); 283 284 285 int tcc_compile_string(TCCState *s, const char *buf); 286 287 288 289 290 291 int tcc_set_output_type(TCCState *s, int output_type); 292 293 294 295 296 297 298 299 int tcc_add_library_path(TCCState *s, const char *pathname); 300 301 302 int tcc_add_library(TCCState *s, const char *libraryname); 303 304 305 int tcc_add_symbol(TCCState *s, const char *name, const void *val); 306 307 308 309 int tcc_output_file(TCCState *s, const char *filename); 310 311 312 313 int tcc_run(TCCState *s, int argc, char **argv); 314 315 316 int tcc_relocate(TCCState *s1, void *ptr); 317# 94 "libtcc.h" 318 void *tcc_get_symbol(TCCState *s, const char *name); 319# 284 "tcc.h" 2 320# 1 "elf.h" 1 321# 23 "elf.h" 322# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/inttypes.h" 1 323# 1 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/_fake_defines.h" 1 324# 2 "/usr/local/google/home/eliben/eli/pycparser/utils/fake_libc_include/inttypes.h" 2 325# 24 "elf.h" 2 326# 41 "elf.h" 327typedef uint16_t Elf32_Half; 328typedef uint16_t Elf64_Half; 329 330 331typedef uint32_t Elf32_Word; 332typedef int32_t Elf32_Sword; 333typedef uint32_t Elf64_Word; 334typedef int32_t Elf64_Sword; 335 336 337typedef uint64_t Elf32_Xword; 338typedef int64_t Elf32_Sxword; 339typedef uint64_t Elf64_Xword; 340typedef int64_t Elf64_Sxword; 341 342 343typedef uint32_t Elf32_Addr; 344typedef uint64_t Elf64_Addr; 345 346 347typedef uint32_t Elf32_Off; 348typedef uint64_t Elf64_Off; 349 350 351typedef uint16_t Elf32_Section; 352typedef uint16_t Elf64_Section; 353 354 355typedef Elf32_Half Elf32_Versym; 356typedef Elf64_Half Elf64_Versym; 357 358 359 360 361 362 363typedef struct 364{ 365 unsigned char e_ident[(16)]; 366 Elf32_Half e_type; 367 Elf32_Half e_machine; 368 Elf32_Word e_version; 369 Elf32_Addr e_entry; 370 Elf32_Off e_phoff; 371 Elf32_Off e_shoff; 372 Elf32_Word e_flags; 373 Elf32_Half e_ehsize; 374 Elf32_Half e_phentsize; 375 Elf32_Half e_phnum; 376 Elf32_Half e_shentsize; 377 Elf32_Half e_shnum; 378 Elf32_Half e_shstrndx; 379} Elf32_Ehdr; 380 381typedef struct 382{ 383 unsigned char e_ident[(16)]; 384 Elf64_Half e_type; 385 Elf64_Half e_machine; 386 Elf64_Word e_version; 387 Elf64_Addr e_entry; 388 Elf64_Off e_phoff; 389 Elf64_Off e_shoff; 390 Elf64_Word e_flags; 391 Elf64_Half e_ehsize; 392 Elf64_Half e_phentsize; 393 Elf64_Half e_phnum; 394 Elf64_Half e_shentsize; 395 Elf64_Half e_shnum; 396 Elf64_Half e_shstrndx; 397} Elf64_Ehdr; 398# 282 "elf.h" 399typedef struct 400{ 401 Elf32_Word sh_name; 402 Elf32_Word sh_type; 403 Elf32_Word sh_flags; 404 Elf32_Addr sh_addr; 405 Elf32_Off sh_offset; 406 Elf32_Word sh_size; 407 Elf32_Word sh_link; 408 Elf32_Word sh_info; 409 Elf32_Word sh_addralign; 410 Elf32_Word sh_entsize; 411} Elf32_Shdr; 412 413typedef struct 414{ 415 Elf64_Word sh_name; 416 Elf64_Word sh_type; 417 Elf64_Xword sh_flags; 418 Elf64_Addr sh_addr; 419 Elf64_Off sh_offset; 420 Elf64_Xword sh_size; 421 Elf64_Word sh_link; 422 Elf64_Word sh_info; 423 Elf64_Xword sh_addralign; 424 Elf64_Xword sh_entsize; 425} Elf64_Shdr; 426# 392 "elf.h" 427typedef struct 428{ 429 Elf32_Word st_name; 430 Elf32_Addr st_value; 431 Elf32_Word st_size; 432 unsigned char st_info; 433 unsigned char st_other; 434 Elf32_Section st_shndx; 435} Elf32_Sym; 436 437typedef struct 438{ 439 Elf64_Word st_name; 440 unsigned char st_info; 441 unsigned char st_other; 442 Elf64_Section st_shndx; 443 Elf64_Addr st_value; 444 Elf64_Xword st_size; 445} Elf64_Sym; 446 447 448 449 450typedef struct 451{ 452 Elf32_Half si_boundto; 453 Elf32_Half si_flags; 454} Elf32_Syminfo; 455 456typedef struct 457{ 458 Elf64_Half si_boundto; 459 Elf64_Half si_flags; 460} Elf64_Syminfo; 461# 507 "elf.h" 462typedef struct 463{ 464 Elf32_Addr r_offset; 465 Elf32_Word r_info; 466} Elf32_Rel; 467 468 469 470 471 472 473typedef struct 474{ 475 Elf64_Addr r_offset; 476 Elf64_Xword r_info; 477} Elf64_Rel; 478 479 480 481typedef struct 482{ 483 Elf32_Addr r_offset; 484 Elf32_Word r_info; 485 Elf32_Sword r_addend; 486} Elf32_Rela; 487 488typedef struct 489{ 490 Elf64_Addr r_offset; 491 Elf64_Xword r_info; 492 Elf64_Sxword r_addend; 493} Elf64_Rela; 494# 552 "elf.h" 495typedef struct 496{ 497 Elf32_Word p_type; 498 Elf32_Off p_offset; 499 Elf32_Addr p_vaddr; 500 Elf32_Addr p_paddr; 501 Elf32_Word p_filesz; 502 Elf32_Word p_memsz; 503 Elf32_Word p_flags; 504 Elf32_Word p_align; 505} Elf32_Phdr; 506 507typedef struct 508{ 509 Elf64_Word p_type; 510 Elf64_Word p_flags; 511 Elf64_Off p_offset; 512 Elf64_Addr p_vaddr; 513 Elf64_Addr p_paddr; 514 Elf64_Xword p_filesz; 515 Elf64_Xword p_memsz; 516 Elf64_Xword p_align; 517} Elf64_Phdr; 518# 658 "elf.h" 519typedef struct 520{ 521 Elf32_Sword d_tag; 522 union 523 { 524 Elf32_Word d_val; 525 Elf32_Addr d_ptr; 526 } d_un; 527} Elf32_Dyn; 528 529typedef struct 530{ 531 Elf64_Sxword d_tag; 532 union 533 { 534 Elf64_Xword d_val; 535 Elf64_Addr d_ptr; 536 } d_un; 537} Elf64_Dyn; 538# 834 "elf.h" 539typedef struct 540{ 541 Elf32_Half vd_version; 542 Elf32_Half vd_flags; 543 Elf32_Half vd_ndx; 544 Elf32_Half vd_cnt; 545 Elf32_Word vd_hash; 546 Elf32_Word vd_aux; 547 Elf32_Word vd_next; 548 549} Elf32_Verdef; 550 551typedef struct 552{ 553 Elf64_Half vd_version; 554 Elf64_Half vd_flags; 555 Elf64_Half vd_ndx; 556 Elf64_Half vd_cnt; 557 Elf64_Word vd_hash; 558 Elf64_Word vd_aux; 559 Elf64_Word vd_next; 560 561} Elf64_Verdef; 562# 876 "elf.h" 563typedef struct 564{ 565 Elf32_Word vda_name; 566 Elf32_Word vda_next; 567 568} Elf32_Verdaux; 569 570typedef struct 571{ 572 Elf64_Word vda_name; 573 Elf64_Word vda_next; 574 575} Elf64_Verdaux; 576 577 578 579 580typedef struct 581{ 582 Elf32_Half vn_version; 583 Elf32_Half vn_cnt; 584 Elf32_Word vn_file; 585 586 Elf32_Word vn_aux; 587 Elf32_Word vn_next; 588 589} Elf32_Verneed; 590 591typedef struct 592{ 593 Elf64_Half vn_version; 594 Elf64_Half vn_cnt; 595 Elf64_Word vn_file; 596 597 Elf64_Word vn_aux; 598 Elf64_Word vn_next; 599 600} Elf64_Verneed; 601# 923 "elf.h" 602typedef struct 603{ 604 Elf32_Word vna_hash; 605 Elf32_Half vna_flags; 606 Elf32_Half vna_other; 607 Elf32_Word vna_name; 608 Elf32_Word vna_next; 609 610} Elf32_Vernaux; 611 612typedef struct 613{ 614 Elf64_Word vna_hash; 615 Elf64_Half vna_flags; 616 Elf64_Half vna_other; 617 Elf64_Word vna_name; 618 Elf64_Word vna_next; 619 620} Elf64_Vernaux; 621# 957 "elf.h" 622typedef struct 623{ 624 uint32_t a_type; 625 union 626 { 627 uint32_t a_val; 628 629 630 631 } a_un; 632} Elf32_auxv_t; 633 634typedef struct 635{ 636 uint64_t a_type; 637 union 638 { 639 uint64_t a_val; 640 641 642 643 } a_un; 644} Elf64_auxv_t; 645# 1041 "elf.h" 646typedef struct 647{ 648 Elf32_Word n_namesz; 649 Elf32_Word n_descsz; 650 Elf32_Word n_type; 651} Elf32_Nhdr; 652 653typedef struct 654{ 655 Elf64_Word n_namesz; 656 Elf64_Word n_descsz; 657 Elf64_Word n_type; 658} Elf64_Nhdr; 659# 1105 "elf.h" 660typedef struct 661{ 662 Elf32_Xword m_value; 663 Elf32_Word m_info; 664 Elf32_Word m_poffset; 665 Elf32_Half m_repeat; 666 Elf32_Half m_stride; 667} Elf32_Move; 668 669typedef struct 670{ 671 Elf64_Xword m_value; 672 Elf64_Xword m_info; 673 Elf64_Xword m_poffset; 674 Elf64_Half m_repeat; 675 Elf64_Half m_stride; 676} Elf64_Move; 677# 1489 "elf.h" 678typedef union 679{ 680 struct 681 { 682 Elf32_Word gt_current_g_value; 683 Elf32_Word gt_unused; 684 } gt_header; 685 struct 686 { 687 Elf32_Word gt_g_value; 688 Elf32_Word gt_bytes; 689 } gt_entry; 690} Elf32_gptab; 691 692 693 694typedef struct 695{ 696 Elf32_Word ri_gprmask; 697 Elf32_Word ri_cprmask[4]; 698 Elf32_Sword ri_gp_value; 699} Elf32_RegInfo; 700 701 702 703typedef struct 704{ 705 unsigned char kind; 706 707 unsigned char size; 708 Elf32_Section section; 709 710 Elf32_Word info; 711} Elf_Options; 712# 1565 "elf.h" 713typedef struct 714{ 715 Elf32_Word hwp_flags1; 716 Elf32_Word hwp_flags2; 717} Elf_Options_Hw; 718# 1726 "elf.h" 719typedef struct 720{ 721 Elf32_Word l_name; 722 Elf32_Word l_time_stamp; 723 Elf32_Word l_checksum; 724 Elf32_Word l_version; 725 Elf32_Word l_flags; 726} Elf32_Lib; 727 728typedef struct 729{ 730 Elf64_Word l_name; 731 Elf64_Word l_time_stamp; 732 Elf64_Word l_checksum; 733 Elf64_Word l_version; 734 Elf64_Word l_flags; 735} Elf64_Lib; 736# 1757 "elf.h" 737typedef Elf32_Addr Elf32_Conflict; 738# 285 "tcc.h" 2 739# 1 "stab.h" 1 740# 9 "stab.h" 741enum __stab_debug_code 742{ 743# 1 "stab.def" 1 744# 24 "stab.def" 745N_GSYM=0x20, 746 747 748 749N_FNAME=0x22, 750 751 752 753 754N_FUN=0x24, 755 756 757 758N_STSYM=0x26, 759 760 761N_LCSYM=0x28, 762 763 764 765N_MAIN=0x2a, 766 767 768 769N_PC=0x30, 770 771 772N_NSYMS=0x32, 773 774 775N_NOMAP=0x34, 776 777 778 779N_OBJ=0x38, 780 781 782 783 784N_OPT=0x3c, 785 786 787N_RSYM=0x40, 788 789 790N_M2C=0x42, 791 792 793 794N_SLINE=0x44, 795 796 797N_DSLINE=0x46, 798 799 800N_BSLINE=0x48, 801 802 803 804 805N_BROWS=0x48, 806 807 808 809 810 811N_DEFD=0x4a, 812 813 814 815 816N_EHDECL=0x50, 817 818N_MOD2=0x50, 819 820 821 822 823 824 825N_CATCH=0x54, 826 827 828N_SSYM=0x60, 829 830 831 832N_SO=0x64, 833 834 835 836N_LSYM=0x80, 837 838 839 840 841N_BINCL=0x82, 842 843 844 845N_SOL=0x84, 846 847 848 849N_PSYM=0xa0, 850 851 852 853 854 855N_EINCL=0xa2, 856 857 858N_ENTRY=0xa4, 859 860 861 862 863 864N_LBRAC=0xc0, 865 866 867 868 869 870N_EXCL=0xc2, 871 872 873N_SCOPE=0xc4, 874 875 876 877N_RBRAC=0xe0, 878 879 880N_BCOMM=0xe2, 881 882 883 884N_ECOMM=0xe4, 885 886 887 888N_ECOML=0xe8, 889 890 891 892 893N_NBTEXT=0xF0, 894N_NBDATA=0xF2, 895N_NBBSS=0xF4, 896N_NBSTS=0xF6, 897N_NBLCS=0xF8, 898 899 900 901N_LENG=0xfe, 902# 12 "stab.h" 2 903LAST_UNUSED_STAB_CODE 904}; 905# 286 "tcc.h" 2 906# 320 "tcc.h" 907# 1 "x86_64-gen.c" 1 908# 57 "x86_64-gen.c" 909enum { 910 TREG_RAX = 0, 911 TREG_RCX = 1, 912 TREG_RDX = 2, 913 TREG_RSP = 4, 914 TREG_RSI = 6, 915 TREG_RDI = 7, 916 917 TREG_R8 = 8, 918 TREG_R9 = 9, 919 TREG_R10 = 10, 920 TREG_R11 = 11, 921 922 TREG_XMM0 = 16, 923 TREG_XMM1 = 17, 924 TREG_XMM2 = 18, 925 TREG_XMM3 = 19, 926 TREG_XMM4 = 20, 927 TREG_XMM5 = 21, 928 TREG_XMM6 = 22, 929 TREG_XMM7 = 23, 930 931 TREG_ST0 = 24, 932 933 TREG_MEM = 0x20 934}; 935# 321 "tcc.h" 2 936# 1 "x86_64-link.c" 1 937# 322 "tcc.h" 2 938# 381 "tcc.h" 939typedef struct TokenSym { 940 struct TokenSym *hash_next; 941 struct Sym *sym_define; 942 struct Sym *sym_label; 943 struct Sym *sym_struct; 944 struct Sym *sym_identifier; 945 int tok; 946 int len; 947 char str[1]; 948} TokenSym; 949 950 951 952 953typedef int nwchar_t; 954 955 956typedef struct CString { 957 int size; 958 void *data; 959 int size_allocated; 960} CString; 961 962 963typedef struct CType { 964 int t; 965 struct Sym *ref; 966} CType; 967 968 969typedef union CValue { 970 long double ld; 971 double d; 972 float f; 973 uint64_t i; 974 struct { 975 int size; 976 const void *data; 977 } str; 978 int tab[16/4]; 979} CValue; 980 981 982typedef struct SValue { 983 CType type; 984 unsigned short r; 985 unsigned short r2; 986 987 CValue c; 988 struct Sym *sym; 989 990} SValue; 991 992 993struct SymAttr { 994 unsigned short 995 aligned : 5, 996 packed : 1, 997 weak : 1, 998 visibility : 2, 999 dllexport : 1, 1000 dllimport : 1, 1001 unused : 5; 1002}; 1003 1004 1005struct FuncAttr { 1006 unsigned 1007 func_call : 3, 1008 func_type : 2, 1009 func_args : 8; 1010}; 1011 1012 1013typedef struct AttributeDef { 1014 struct SymAttr a; 1015 struct FuncAttr f; 1016 struct Section *section; 1017 int alias_target; 1018 int asm_label; 1019 char attr_mode; 1020} AttributeDef; 1021 1022 1023typedef struct Sym { 1024 int v; 1025 unsigned short r; 1026 struct SymAttr a; 1027 union { 1028 struct { 1029 int c; 1030 union { 1031 int sym_scope; 1032 int jnext; 1033 struct FuncAttr f; 1034 int auxtype; 1035 }; 1036 }; 1037 long long enum_val; 1038 int *d; 1039 }; 1040 CType type; 1041 union { 1042 struct Sym *next; 1043 int asm_label; 1044 }; 1045 struct Sym *prev; 1046 struct Sym *prev_tok; 1047} Sym; 1048 1049 1050typedef struct Section { 1051 unsigned long data_offset; 1052 unsigned char *data; 1053 unsigned long data_allocated; 1054 int sh_name; 1055 int sh_num; 1056 int sh_type; 1057 int sh_flags; 1058 int sh_info; 1059 int sh_addralign; 1060 int sh_entsize; 1061 unsigned long sh_size; 1062 Elf64_Addr sh_addr; 1063 unsigned long sh_offset; 1064 int nb_hashed_syms; 1065 struct Section *link; 1066 struct Section *reloc; 1067 struct Section *hash; 1068 struct Section *prev; 1069 char name[1]; 1070} Section; 1071 1072typedef struct DLLReference { 1073 int level; 1074 void *handle; 1075 char name[1]; 1076} DLLReference; 1077# 554 "tcc.h" 1078typedef struct BufferedFile { 1079 uint8_t *buf_ptr; 1080 uint8_t *buf_end; 1081 int fd; 1082 struct BufferedFile *prev; 1083 int line_num; 1084 int line_ref; 1085 int ifndef_macro; 1086 int ifndef_macro_saved; 1087 int *ifdef_stack_ptr; 1088 int include_next_index; 1089 char filename[1024]; 1090 char *true_filename; 1091 unsigned char unget[4]; 1092 unsigned char buffer[1]; 1093} BufferedFile; 1094 1095 1096 1097 1098 1099typedef struct TokenString { 1100 int *str; 1101 int len; 1102 int lastlen; 1103 int allocated_len; 1104 int last_line_num; 1105 int save_line_num; 1106 1107 struct TokenString *prev; 1108 const int *prev_ptr; 1109 char alloc; 1110} TokenString; 1111 1112 1113typedef struct InlineFunc { 1114 TokenString *func_str; 1115 Sym *sym; 1116 char filename[1]; 1117} InlineFunc; 1118 1119 1120 1121typedef struct CachedInclude { 1122 int ifndef_macro; 1123 int once; 1124 int hash_next; 1125 char filename[1]; 1126} CachedInclude; 1127 1128 1129 1130 1131typedef struct ExprValue { 1132 uint64_t v; 1133 Sym *sym; 1134 int pcrel; 1135} ExprValue; 1136 1137 1138typedef struct ASMOperand { 1139 int id; 1140 char *constraint; 1141 char asm_str[16]; 1142 SValue *vt; 1143 int ref_index; 1144 int input_index; 1145 int priority; 1146 int reg; 1147 int is_llong; 1148 int is_memory; 1149 int is_rw; 1150} ASMOperand; 1151 1152 1153 1154struct sym_attr { 1155 unsigned got_offset; 1156 unsigned plt_offset; 1157 int plt_sym; 1158 int dyn_index; 1159 1160 1161 1162}; 1163 1164struct TCCState { 1165 1166 int verbose; 1167 int nostdinc; 1168 int nostdlib; 1169 int nocommon; 1170 int static_link; 1171 int rdynamic; 1172 int symbolic; 1173 int alacarte_link; 1174 1175 char *tcc_lib_path; 1176 char *soname; 1177 char *rpath; 1178 int enable_new_dtags; 1179 1180 1181 int output_type; 1182 1183 int output_format; 1184 1185 1186 int char_is_unsigned; 1187 int leading_underscore; 1188 int ms_extensions; 1189 int dollars_in_identifiers; 1190 int ms_bitfields; 1191 1192 1193 int warn_write_strings; 1194 int warn_unsupported; 1195 int warn_error; 1196 int warn_none; 1197 int warn_implicit_function_declaration; 1198 int warn_gcc_compat; 1199 1200 1201 int do_debug; 1202 1203 1204 int do_bounds_check; 1205 1206 1207 1208 1209 int run_test; 1210 1211 Elf64_Addr text_addr; 1212 int has_text_addr; 1213 1214 unsigned section_align; 1215 1216 char *init_symbol; 1217 char *fini_symbol; 1218 1219 1220 1221 1222 1223 int nosse; 1224 1225 1226 1227 DLLReference **loaded_dlls; 1228 int nb_loaded_dlls; 1229 1230 1231 char **include_paths; 1232 int nb_include_paths; 1233 1234 char **sysinclude_paths; 1235 int nb_sysinclude_paths; 1236 1237 1238 char **library_paths; 1239 int nb_library_paths; 1240 1241 1242 char **crt_paths; 1243 int nb_crt_paths; 1244 1245 1246 char **cmd_include_files; 1247 int nb_cmd_include_files; 1248 1249 1250 void *error_opaque; 1251 void (*error_func)(void *opaque, const char *msg); 1252 int error_set_jmp_enabled; 1253 jmp_buf error_jmp_buf; 1254 int nb_errors; 1255 1256 1257 FILE *ppfp; 1258 enum { 1259 LINE_MACRO_OUTPUT_FORMAT_GCC, 1260 LINE_MACRO_OUTPUT_FORMAT_NONE, 1261 LINE_MACRO_OUTPUT_FORMAT_STD, 1262 LINE_MACRO_OUTPUT_FORMAT_P10 = 11 1263 } Pflag; 1264 char dflag; 1265 1266 1267 char **target_deps; 1268 int nb_target_deps; 1269 1270 1271 BufferedFile *include_stack[32]; 1272 BufferedFile **include_stack_ptr; 1273 1274 int ifdef_stack[64]; 1275 int *ifdef_stack_ptr; 1276 1277 1278 int cached_includes_hash[32]; 1279 CachedInclude **cached_includes; 1280 int nb_cached_includes; 1281 1282 1283 int pack_stack[8]; 1284 int *pack_stack_ptr; 1285 char **pragma_libs; 1286 int nb_pragma_libs; 1287 1288 1289 1290 struct InlineFunc **inline_fns; 1291 int nb_inline_fns; 1292 1293 1294 Section **sections; 1295 int nb_sections; 1296 1297 Section **priv_sections; 1298 int nb_priv_sections; 1299 1300 1301 Section *got; 1302 Section *plt; 1303 1304 1305 Section *dynsymtab_section; 1306 1307 Section *dynsym; 1308 1309 Section *symtab; 1310 1311 struct sym_attr *sym_attrs; 1312 int nb_sym_attrs; 1313# 805 "tcc.h" 1314 const char *runtime_main; 1315 void **runtime_mem; 1316 int nb_runtime_mem; 1317 1318 1319 1320 struct filespec **files; 1321 int nb_files; 1322 int nb_libraries; 1323 int filetype; 1324 char *outfile; 1325 int option_r; 1326 int do_bench; 1327 int gen_deps; 1328 char *deps_outfile; 1329 int option_pthread; 1330 int argc; 1331 char **argv; 1332}; 1333 1334struct filespec { 1335 char type; 1336 char alacarte; 1337 char name[1]; 1338}; 1339# 1070 "tcc.h" 1340enum tcc_token { 1341 TOK_LAST = 256 - 1 1342 1343# 1 "tcctok.h" 1 1344 1345 ,TOK_INT 1346 ,TOK_VOID 1347 ,TOK_CHAR 1348 ,TOK_IF 1349 ,TOK_ELSE 1350 ,TOK_WHILE 1351 ,TOK_BREAK 1352 ,TOK_RETURN 1353 ,TOK_FOR 1354 ,TOK_EXTERN 1355 ,TOK_STATIC 1356 ,TOK_UNSIGNED 1357 ,TOK_GOTO 1358 ,TOK_DO 1359 ,TOK_CONTINUE 1360 ,TOK_SWITCH 1361 ,TOK_CASE 1362 1363 ,TOK_CONST1 1364 ,TOK_CONST2 1365 ,TOK_CONST3 1366 ,TOK_VOLATILE1 1367 ,TOK_VOLATILE2 1368 ,TOK_VOLATILE3 1369 ,TOK_LONG 1370 ,TOK_REGISTER 1371 ,TOK_SIGNED1 1372 ,TOK_SIGNED2 1373 ,TOK_SIGNED3 1374 ,TOK_AUTO 1375 ,TOK_INLINE1 1376 ,TOK_INLINE2 1377 ,TOK_INLINE3 1378 ,TOK_RESTRICT1 1379 ,TOK_RESTRICT2 1380 ,TOK_RESTRICT3 1381 ,TOK_EXTENSION 1382 1383 ,TOK_GENERIC 1384 1385 ,TOK_FLOAT 1386 ,TOK_DOUBLE 1387 ,TOK_BOOL 1388 ,TOK_SHORT 1389 ,TOK_STRUCT 1390 ,TOK_UNION 1391 ,TOK_TYPEDEF 1392 ,TOK_DEFAULT 1393 ,TOK_ENUM 1394 ,TOK_SIZEOF 1395 ,TOK_ATTRIBUTE1 1396 ,TOK_ATTRIBUTE2 1397 ,TOK_ALIGNOF1 1398 ,TOK_ALIGNOF2 1399 ,TOK_TYPEOF1 1400 ,TOK_TYPEOF2 1401 ,TOK_TYPEOF3 1402 ,TOK_LABEL 1403 ,TOK_ASM1 1404 ,TOK_ASM2 1405 ,TOK_ASM3 1406# 71 "tcctok.h" 1407 ,TOK_DEFINE 1408 ,TOK_INCLUDE 1409 ,TOK_INCLUDE_NEXT 1410 ,TOK_IFDEF 1411 ,TOK_IFNDEF 1412 ,TOK_ELIF 1413 ,TOK_ENDIF 1414 ,TOK_DEFINED 1415 ,TOK_UNDEF 1416 ,TOK_ERROR 1417 ,TOK_WARNING 1418 ,TOK_LINE 1419 ,TOK_PRAGMA 1420 ,TOK___LINE__ 1421 ,TOK___FILE__ 1422 ,TOK___DATE__ 1423 ,TOK___TIME__ 1424 ,TOK___FUNCTION__ 1425 ,TOK___VA_ARGS__ 1426 ,TOK___COUNTER__ 1427 1428 1429 ,TOK___FUNC__ 1430 1431 1432 ,TOK___NAN__ 1433 ,TOK___SNAN__ 1434 ,TOK___INF__ 1435 1436 1437 1438 ,TOK_SECTION1 1439 ,TOK_SECTION2 1440 ,TOK_ALIGNED1 1441 ,TOK_ALIGNED2 1442 ,TOK_PACKED1 1443 ,TOK_PACKED2 1444 ,TOK_WEAK1 1445 ,TOK_WEAK2 1446 ,TOK_ALIAS1 1447 ,TOK_ALIAS2 1448 ,TOK_UNUSED1 1449 ,TOK_UNUSED2 1450 ,TOK_CDECL1 1451 ,TOK_CDECL2 1452 ,TOK_CDECL3 1453 ,TOK_STDCALL1 1454 ,TOK_STDCALL2 1455 ,TOK_STDCALL3 1456 ,TOK_FASTCALL1 1457 ,TOK_FASTCALL2 1458 ,TOK_FASTCALL3 1459 ,TOK_REGPARM1 1460 ,TOK_REGPARM2 1461 1462 ,TOK_MODE 1463 ,TOK_MODE_QI 1464 ,TOK_MODE_DI 1465 ,TOK_MODE_HI 1466 ,TOK_MODE_SI 1467 ,TOK_MODE_word 1468 1469 ,TOK_DLLEXPORT 1470 ,TOK_DLLIMPORT 1471 ,TOK_NORETURN1 1472 ,TOK_NORETURN2 1473 ,TOK_VISIBILITY1 1474 ,TOK_VISIBILITY2 1475 1476 ,TOK_builtin_types_compatible_p 1477 ,TOK_builtin_choose_expr 1478 ,TOK_builtin_constant_p 1479 ,TOK_builtin_frame_address 1480 ,TOK_builtin_return_address 1481 ,TOK_builtin_expect 1482 1483 1484 1485 1486 ,TOK_builtin_va_arg_types 1487 1488 1489 1490 1491 1492 1493 ,TOK_pack 1494 1495 1496 1497 1498 1499 ,TOK_comment 1500 ,TOK_lib 1501 ,TOK_push_macro 1502 ,TOK_pop_macro 1503 ,TOK_once 1504 ,TOK_option 1505 1506 1507 1508 ,TOK_memcpy 1509 ,TOK_memmove 1510 ,TOK_memset 1511 ,TOK___divdi3 1512 ,TOK___moddi3 1513 ,TOK___udivdi3 1514 ,TOK___umoddi3 1515 ,TOK___ashrdi3 1516 ,TOK___lshrdi3 1517 ,TOK___ashldi3 1518 ,TOK___floatundisf 1519 ,TOK___floatundidf 1520 1521 ,TOK___floatundixf 1522 ,TOK___fixunsxfdi 1523 1524 ,TOK___fixunssfdi 1525 ,TOK___fixunsdfdi 1526# 251 "tcctok.h" 1527 ,TOK_alloca 1528# 285 "tcctok.h" 1529 ,TOK___bound_ptr_add 1530 ,TOK___bound_ptr_indir1 1531 ,TOK___bound_ptr_indir2 1532 ,TOK___bound_ptr_indir4 1533 ,TOK___bound_ptr_indir8 1534 ,TOK___bound_ptr_indir12 1535 ,TOK___bound_ptr_indir16 1536 ,TOK___bound_main_arg 1537 ,TOK___bound_local_new 1538 ,TOK___bound_local_delete 1539 1540 1541 1542 1543 1544 1545 1546 ,TOK_strlen 1547 ,TOK_strcpy 1548 1549 1550 1551 ,TOK_ASMDIR_byte 1552 ,TOK_ASMDIR_word 1553 ,TOK_ASMDIR_align 1554 ,TOK_ASMDIR_balign 1555 ,TOK_ASMDIR_p2align 1556 ,TOK_ASMDIR_set 1557 ,TOK_ASMDIR_skip 1558 ,TOK_ASMDIR_space 1559 ,TOK_ASMDIR_string 1560 ,TOK_ASMDIR_asciz 1561 ,TOK_ASMDIR_ascii 1562 ,TOK_ASMDIR_file 1563 ,TOK_ASMDIR_globl 1564 ,TOK_ASMDIR_global 1565 ,TOK_ASMDIR_weak 1566 ,TOK_ASMDIR_hidden 1567 ,TOK_ASMDIR_ident 1568 ,TOK_ASMDIR_size 1569 ,TOK_ASMDIR_type 1570 ,TOK_ASMDIR_text 1571 ,TOK_ASMDIR_data 1572 ,TOK_ASMDIR_bss 1573 ,TOK_ASMDIR_previous 1574 ,TOK_ASMDIR_pushsection 1575 ,TOK_ASMDIR_popsection 1576 ,TOK_ASMDIR_fill 1577 ,TOK_ASMDIR_rept 1578 ,TOK_ASMDIR_endr 1579 ,TOK_ASMDIR_org 1580 ,TOK_ASMDIR_quad 1581 1582 1583 1584 1585 ,TOK_ASMDIR_code64 1586 1587 ,TOK_ASMDIR_short 1588 ,TOK_ASMDIR_long 1589 ,TOK_ASMDIR_int 1590 ,TOK_ASMDIR_section 1591 1592 1593# 1 "i386-tok.h" 1 1594 1595 1596 1597 1598 ,TOK_ASM_al 1599 ,TOK_ASM_cl 1600 ,TOK_ASM_dl 1601 ,TOK_ASM_bl 1602 ,TOK_ASM_ah 1603 ,TOK_ASM_ch 1604 ,TOK_ASM_dh 1605 ,TOK_ASM_bh 1606 ,TOK_ASM_ax 1607 ,TOK_ASM_cx 1608 ,TOK_ASM_dx 1609 ,TOK_ASM_bx 1610 ,TOK_ASM_sp 1611 ,TOK_ASM_bp 1612 ,TOK_ASM_si 1613 ,TOK_ASM_di 1614 ,TOK_ASM_eax 1615 ,TOK_ASM_ecx 1616 ,TOK_ASM_edx 1617 ,TOK_ASM_ebx 1618 ,TOK_ASM_esp 1619 ,TOK_ASM_ebp 1620 ,TOK_ASM_esi 1621 ,TOK_ASM_edi 1622 1623 ,TOK_ASM_rax 1624 ,TOK_ASM_rcx 1625 ,TOK_ASM_rdx 1626 ,TOK_ASM_rbx 1627 ,TOK_ASM_rsp 1628 ,TOK_ASM_rbp 1629 ,TOK_ASM_rsi 1630 ,TOK_ASM_rdi 1631 1632 ,TOK_ASM_mm0 1633 ,TOK_ASM_mm1 1634 ,TOK_ASM_mm2 1635 ,TOK_ASM_mm3 1636 ,TOK_ASM_mm4 1637 ,TOK_ASM_mm5 1638 ,TOK_ASM_mm6 1639 ,TOK_ASM_mm7 1640 ,TOK_ASM_xmm0 1641 ,TOK_ASM_xmm1 1642 ,TOK_ASM_xmm2 1643 ,TOK_ASM_xmm3 1644 ,TOK_ASM_xmm4 1645 ,TOK_ASM_xmm5 1646 ,TOK_ASM_xmm6 1647 ,TOK_ASM_xmm7 1648 ,TOK_ASM_cr0 1649 ,TOK_ASM_cr1 1650 ,TOK_ASM_cr2 1651 ,TOK_ASM_cr3 1652 ,TOK_ASM_cr4 1653 ,TOK_ASM_cr5 1654 ,TOK_ASM_cr6 1655 ,TOK_ASM_cr7 1656 ,TOK_ASM_tr0 1657 ,TOK_ASM_tr1 1658 ,TOK_ASM_tr2 1659 ,TOK_ASM_tr3 1660 ,TOK_ASM_tr4 1661 ,TOK_ASM_tr5 1662 ,TOK_ASM_tr6 1663 ,TOK_ASM_tr7 1664 ,TOK_ASM_db0 1665 ,TOK_ASM_db1 1666 ,TOK_ASM_db2 1667 ,TOK_ASM_db3 1668 ,TOK_ASM_db4 1669 ,TOK_ASM_db5 1670 ,TOK_ASM_db6 1671 ,TOK_ASM_db7 1672 ,TOK_ASM_dr0 1673 ,TOK_ASM_dr1 1674 ,TOK_ASM_dr2 1675 ,TOK_ASM_dr3 1676 ,TOK_ASM_dr4 1677 ,TOK_ASM_dr5 1678 ,TOK_ASM_dr6 1679 ,TOK_ASM_dr7 1680 ,TOK_ASM_es 1681 ,TOK_ASM_cs 1682 ,TOK_ASM_ss 1683 ,TOK_ASM_ds 1684 ,TOK_ASM_fs 1685 ,TOK_ASM_gs 1686 ,TOK_ASM_st 1687 ,TOK_ASM_rip 1688 1689 1690 1691 1692 ,TOK_ASM_spl 1693 ,TOK_ASM_bpl 1694 ,TOK_ASM_sil 1695 ,TOK_ASM_dil 1696 1697 1698 ,TOK_ASM_movb ,TOK_ASM_movw ,TOK_ASM_movl ,TOK_ASM_movq ,TOK_ASM_mov 1699 1700 ,TOK_ASM_addb ,TOK_ASM_addw ,TOK_ASM_addl ,TOK_ASM_addq ,TOK_ASM_add 1701 ,TOK_ASM_orb ,TOK_ASM_orw ,TOK_ASM_orl ,TOK_ASM_orq ,TOK_ASM_or 1702 ,TOK_ASM_adcb ,TOK_ASM_adcw ,TOK_ASM_adcl ,TOK_ASM_adcq ,TOK_ASM_adc 1703 ,TOK_ASM_sbbb ,TOK_ASM_sbbw ,TOK_ASM_sbbl ,TOK_ASM_sbbq ,TOK_ASM_sbb 1704 ,TOK_ASM_andb ,TOK_ASM_andw ,TOK_ASM_andl ,TOK_ASM_andq ,TOK_ASM_and 1705 ,TOK_ASM_subb ,TOK_ASM_subw ,TOK_ASM_subl ,TOK_ASM_subq ,TOK_ASM_sub 1706 ,TOK_ASM_xorb ,TOK_ASM_xorw ,TOK_ASM_xorl ,TOK_ASM_xorq ,TOK_ASM_xor 1707 ,TOK_ASM_cmpb ,TOK_ASM_cmpw ,TOK_ASM_cmpl ,TOK_ASM_cmpq ,TOK_ASM_cmp 1708 1709 1710 ,TOK_ASM_incb ,TOK_ASM_incw ,TOK_ASM_incl ,TOK_ASM_incq ,TOK_ASM_inc 1711 ,TOK_ASM_decb ,TOK_ASM_decw ,TOK_ASM_decl ,TOK_ASM_decq ,TOK_ASM_dec 1712 ,TOK_ASM_notb ,TOK_ASM_notw ,TOK_ASM_notl ,TOK_ASM_notq ,TOK_ASM_not 1713 ,TOK_ASM_negb ,TOK_ASM_negw ,TOK_ASM_negl ,TOK_ASM_negq ,TOK_ASM_neg 1714 ,TOK_ASM_mulb ,TOK_ASM_mulw ,TOK_ASM_mull ,TOK_ASM_mulq ,TOK_ASM_mul 1715 ,TOK_ASM_imulb ,TOK_ASM_imulw ,TOK_ASM_imull ,TOK_ASM_imulq ,TOK_ASM_imul 1716 ,TOK_ASM_divb ,TOK_ASM_divw ,TOK_ASM_divl ,TOK_ASM_divq ,TOK_ASM_div 1717 ,TOK_ASM_idivb ,TOK_ASM_idivw ,TOK_ASM_idivl ,TOK_ASM_idivq ,TOK_ASM_idiv 1718 1719 ,TOK_ASM_xchgb ,TOK_ASM_xchgw ,TOK_ASM_xchgl ,TOK_ASM_xchgq ,TOK_ASM_xchg 1720 ,TOK_ASM_testb ,TOK_ASM_testw ,TOK_ASM_testl ,TOK_ASM_testq ,TOK_ASM_test 1721 1722 1723 ,TOK_ASM_rolb ,TOK_ASM_rolw ,TOK_ASM_roll ,TOK_ASM_rolq ,TOK_ASM_rol 1724 ,TOK_ASM_rorb ,TOK_ASM_rorw ,TOK_ASM_rorl ,TOK_ASM_rorq ,TOK_ASM_ror 1725 ,TOK_ASM_rclb ,TOK_ASM_rclw ,TOK_ASM_rcll ,TOK_ASM_rclq ,TOK_ASM_rcl 1726 ,TOK_ASM_rcrb ,TOK_ASM_rcrw ,TOK_ASM_rcrl ,TOK_ASM_rcrq ,TOK_ASM_rcr 1727 ,TOK_ASM_shlb ,TOK_ASM_shlw ,TOK_ASM_shll ,TOK_ASM_shlq ,TOK_ASM_shl 1728 ,TOK_ASM_shrb ,TOK_ASM_shrw ,TOK_ASM_shrl ,TOK_ASM_shrq ,TOK_ASM_shr 1729 ,TOK_ASM_sarb ,TOK_ASM_sarw ,TOK_ASM_sarl ,TOK_ASM_sarq ,TOK_ASM_sar 1730 1731 ,TOK_ASM_shldw ,TOK_ASM_shldl ,TOK_ASM_shldq ,TOK_ASM_shld 1732 ,TOK_ASM_shrdw ,TOK_ASM_shrdl ,TOK_ASM_shrdq ,TOK_ASM_shrd 1733 1734 ,TOK_ASM_pushw 1735 ,TOK_ASM_pushl 1736 1737 ,TOK_ASM_pushq 1738 1739 ,TOK_ASM_push 1740 1741 ,TOK_ASM_popw 1742 ,TOK_ASM_popl 1743 1744 ,TOK_ASM_popq 1745 1746 ,TOK_ASM_pop 1747 1748 ,TOK_ASM_inb ,TOK_ASM_inw ,TOK_ASM_inl ,TOK_ASM_in 1749 ,TOK_ASM_outb ,TOK_ASM_outw ,TOK_ASM_outl ,TOK_ASM_out 1750 1751 ,TOK_ASM_movzbw ,TOK_ASM_movzbl ,TOK_ASM_movzbq ,TOK_ASM_movzb 1752 ,TOK_ASM_movzwl 1753 ,TOK_ASM_movsbw 1754 ,TOK_ASM_movsbl 1755 ,TOK_ASM_movswl 1756 1757 ,TOK_ASM_movsbq 1758 ,TOK_ASM_movswq 1759 ,TOK_ASM_movzwq 1760 ,TOK_ASM_movslq 1761 1762 1763 ,TOK_ASM_leaw ,TOK_ASM_leal ,TOK_ASM_leaq ,TOK_ASM_lea 1764 1765 ,TOK_ASM_les 1766 ,TOK_ASM_lds 1767 ,TOK_ASM_lss 1768 ,TOK_ASM_lfs 1769 ,TOK_ASM_lgs 1770 1771 ,TOK_ASM_call 1772 ,TOK_ASM_jmp 1773 ,TOK_ASM_lcall 1774 ,TOK_ASM_ljmp 1775 1776 ,TOK_ASM_jo ,TOK_ASM_jno ,TOK_ASM_jb ,TOK_ASM_jc ,TOK_ASM_jnae ,TOK_ASM_jnb ,TOK_ASM_jnc ,TOK_ASM_jae ,TOK_ASM_je ,TOK_ASM_jz ,TOK_ASM_jne ,TOK_ASM_jnz ,TOK_ASM_jbe ,TOK_ASM_jna ,TOK_ASM_jnbe ,TOK_ASM_ja ,TOK_ASM_js ,TOK_ASM_jns ,TOK_ASM_jp ,TOK_ASM_jpe ,TOK_ASM_jnp ,TOK_ASM_jpo ,TOK_ASM_jl ,TOK_ASM_jnge ,TOK_ASM_jnl ,TOK_ASM_jge ,TOK_ASM_jle ,TOK_ASM_jng ,TOK_ASM_jnle ,TOK_ASM_jg 1777 1778 ,TOK_ASM_seto ,TOK_ASM_setno ,TOK_ASM_setb ,TOK_ASM_setc ,TOK_ASM_setnae ,TOK_ASM_setnb ,TOK_ASM_setnc ,TOK_ASM_setae ,TOK_ASM_sete ,TOK_ASM_setz ,TOK_ASM_setne ,TOK_ASM_setnz ,TOK_ASM_setbe ,TOK_ASM_setna ,TOK_ASM_setnbe ,TOK_ASM_seta ,TOK_ASM_sets ,TOK_ASM_setns ,TOK_ASM_setp ,TOK_ASM_setpe ,TOK_ASM_setnp ,TOK_ASM_setpo ,TOK_ASM_setl ,TOK_ASM_setnge ,TOK_ASM_setnl ,TOK_ASM_setge ,TOK_ASM_setle ,TOK_ASM_setng ,TOK_ASM_setnle ,TOK_ASM_setg 1779 ,TOK_ASM_setob ,TOK_ASM_setnob ,TOK_ASM_setbb ,TOK_ASM_setcb ,TOK_ASM_setnaeb ,TOK_ASM_setnbb ,TOK_ASM_setncb ,TOK_ASM_setaeb ,TOK_ASM_seteb ,TOK_ASM_setzb ,TOK_ASM_setneb ,TOK_ASM_setnzb ,TOK_ASM_setbeb ,TOK_ASM_setnab ,TOK_ASM_setnbeb ,TOK_ASM_setab ,TOK_ASM_setsb ,TOK_ASM_setnsb ,TOK_ASM_setpb ,TOK_ASM_setpeb ,TOK_ASM_setnpb ,TOK_ASM_setpob ,TOK_ASM_setlb ,TOK_ASM_setngeb ,TOK_ASM_setnlb ,TOK_ASM_setgeb ,TOK_ASM_setleb ,TOK_ASM_setngb ,TOK_ASM_setnleb ,TOK_ASM_setgb 1780 ,TOK_ASM_cmovo ,TOK_ASM_cmovno ,TOK_ASM_cmovb ,TOK_ASM_cmovc ,TOK_ASM_cmovnae ,TOK_ASM_cmovnb ,TOK_ASM_cmovnc ,TOK_ASM_cmovae ,TOK_ASM_cmove ,TOK_ASM_cmovz ,TOK_ASM_cmovne ,TOK_ASM_cmovnz ,TOK_ASM_cmovbe ,TOK_ASM_cmovna ,TOK_ASM_cmovnbe ,TOK_ASM_cmova ,TOK_ASM_cmovs ,TOK_ASM_cmovns ,TOK_ASM_cmovp ,TOK_ASM_cmovpe ,TOK_ASM_cmovnp ,TOK_ASM_cmovpo ,TOK_ASM_cmovl ,TOK_ASM_cmovnge ,TOK_ASM_cmovnl ,TOK_ASM_cmovge ,TOK_ASM_cmovle ,TOK_ASM_cmovng ,TOK_ASM_cmovnle ,TOK_ASM_cmovg 1781 1782 ,TOK_ASM_bsfw ,TOK_ASM_bsfl ,TOK_ASM_bsfq ,TOK_ASM_bsf 1783 ,TOK_ASM_bsrw ,TOK_ASM_bsrl ,TOK_ASM_bsrq ,TOK_ASM_bsr 1784 ,TOK_ASM_btw ,TOK_ASM_btl ,TOK_ASM_btq ,TOK_ASM_bt 1785 ,TOK_ASM_btsw ,TOK_ASM_btsl ,TOK_ASM_btsq ,TOK_ASM_bts 1786 ,TOK_ASM_btrw ,TOK_ASM_btrl ,TOK_ASM_btrq ,TOK_ASM_btr 1787 ,TOK_ASM_btcw ,TOK_ASM_btcl ,TOK_ASM_btcq ,TOK_ASM_btc 1788 1789 ,TOK_ASM_larw ,TOK_ASM_larl ,TOK_ASM_larq ,TOK_ASM_lar 1790 ,TOK_ASM_lslw ,TOK_ASM_lsll ,TOK_ASM_lslq ,TOK_ASM_lsl 1791 1792 1793 ,TOK_ASM_fadd ,TOK_ASM_faddp ,TOK_ASM_fadds ,TOK_ASM_fiaddl ,TOK_ASM_faddl ,TOK_ASM_fiadds 1794 ,TOK_ASM_fmul ,TOK_ASM_fmulp ,TOK_ASM_fmuls ,TOK_ASM_fimull ,TOK_ASM_fmull ,TOK_ASM_fimuls 1795 1796 ,TOK_ASM_fcom 1797 ,TOK_ASM_fcom_1 1798 ,TOK_ASM_fcoms ,TOK_ASM_ficoml ,TOK_ASM_fcoml ,TOK_ASM_ficoms 1799 1800 ,TOK_ASM_fcomp ,TOK_ASM_fcompp ,TOK_ASM_fcomps ,TOK_ASM_ficompl ,TOK_ASM_fcompl ,TOK_ASM_ficomps 1801 ,TOK_ASM_fsub ,TOK_ASM_fsubp ,TOK_ASM_fsubs ,TOK_ASM_fisubl ,TOK_ASM_fsubl ,TOK_ASM_fisubs 1802 ,TOK_ASM_fsubr ,TOK_ASM_fsubrp ,TOK_ASM_fsubrs ,TOK_ASM_fisubrl ,TOK_ASM_fsubrl ,TOK_ASM_fisubrs 1803 ,TOK_ASM_fdiv ,TOK_ASM_fdivp ,TOK_ASM_fdivs ,TOK_ASM_fidivl ,TOK_ASM_fdivl ,TOK_ASM_fidivs 1804 ,TOK_ASM_fdivr ,TOK_ASM_fdivrp ,TOK_ASM_fdivrs ,TOK_ASM_fidivrl ,TOK_ASM_fdivrl ,TOK_ASM_fidivrs 1805 1806 ,TOK_ASM_xaddb ,TOK_ASM_xaddw ,TOK_ASM_xaddl ,TOK_ASM_xaddq ,TOK_ASM_xadd 1807 ,TOK_ASM_cmpxchgb ,TOK_ASM_cmpxchgw ,TOK_ASM_cmpxchgl ,TOK_ASM_cmpxchgq ,TOK_ASM_cmpxchg 1808 1809 1810 ,TOK_ASM_cmpsb ,TOK_ASM_cmpsw ,TOK_ASM_cmpsl ,TOK_ASM_cmpsq ,TOK_ASM_cmps 1811 ,TOK_ASM_scmpb ,TOK_ASM_scmpw ,TOK_ASM_scmpl ,TOK_ASM_scmpq ,TOK_ASM_scmp 1812 ,TOK_ASM_insb ,TOK_ASM_insw ,TOK_ASM_insl ,TOK_ASM_ins 1813 ,TOK_ASM_outsb ,TOK_ASM_outsw ,TOK_ASM_outsl ,TOK_ASM_outs 1814 ,TOK_ASM_lodsb ,TOK_ASM_lodsw ,TOK_ASM_lodsl ,TOK_ASM_lodsq ,TOK_ASM_lods 1815 ,TOK_ASM_slodb ,TOK_ASM_slodw ,TOK_ASM_slodl ,TOK_ASM_slodq ,TOK_ASM_slod 1816 ,TOK_ASM_movsb ,TOK_ASM_movsw ,TOK_ASM_movsl ,TOK_ASM_movsq ,TOK_ASM_movs 1817 ,TOK_ASM_smovb ,TOK_ASM_smovw ,TOK_ASM_smovl ,TOK_ASM_smovq ,TOK_ASM_smov 1818 ,TOK_ASM_scasb ,TOK_ASM_scasw ,TOK_ASM_scasl ,TOK_ASM_scasq ,TOK_ASM_scas 1819 ,TOK_ASM_sscab ,TOK_ASM_sscaw ,TOK_ASM_sscal ,TOK_ASM_sscaq ,TOK_ASM_ssca 1820 ,TOK_ASM_stosb ,TOK_ASM_stosw ,TOK_ASM_stosl ,TOK_ASM_stosq ,TOK_ASM_stos 1821 ,TOK_ASM_sstob ,TOK_ASM_sstow ,TOK_ASM_sstol ,TOK_ASM_sstoq ,TOK_ASM_ssto 1822# 238 "i386-tok.h" 1823# 1 "x86_64-asm.h" 1 1824 ,TOK_ASM_clc 1825 ,TOK_ASM_cld 1826 ,TOK_ASM_cli 1827 ,TOK_ASM_clts 1828 ,TOK_ASM_cmc 1829 ,TOK_ASM_lahf 1830 ,TOK_ASM_sahf 1831 ,TOK_ASM_pushfq 1832 ,TOK_ASM_popfq 1833 ,TOK_ASM_pushf 1834 ,TOK_ASM_popf 1835 ,TOK_ASM_stc 1836 ,TOK_ASM_std 1837 ,TOK_ASM_sti 1838 ,TOK_ASM_aaa 1839 ,TOK_ASM_aas 1840 ,TOK_ASM_daa 1841 ,TOK_ASM_das 1842 ,TOK_ASM_aad 1843 ,TOK_ASM_aam 1844 ,TOK_ASM_cbw 1845 ,TOK_ASM_cwd 1846 ,TOK_ASM_cwde 1847 ,TOK_ASM_cdq 1848 ,TOK_ASM_cbtw 1849 ,TOK_ASM_cwtl 1850 ,TOK_ASM_cwtd 1851 ,TOK_ASM_cltd 1852 ,TOK_ASM_cqto 1853 ,TOK_ASM_int3 1854 ,TOK_ASM_into 1855 ,TOK_ASM_iret 1856 ,TOK_ASM_rsm 1857 ,TOK_ASM_hlt 1858 ,TOK_ASM_wait 1859 ,TOK_ASM_nop 1860 ,TOK_ASM_pause 1861 ,TOK_ASM_xlat 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 ,TOK_ASM_lock 1901 ,TOK_ASM_rep 1902 ,TOK_ASM_repe 1903 ,TOK_ASM_repz 1904 ,TOK_ASM_repne 1905 ,TOK_ASM_repnz 1906 1907 ,TOK_ASM_invd 1908 ,TOK_ASM_wbinvd 1909 ,TOK_ASM_cpuid 1910 ,TOK_ASM_wrmsr 1911 ,TOK_ASM_rdtsc 1912 ,TOK_ASM_rdmsr 1913 ,TOK_ASM_rdpmc 1914 1915 ,TOK_ASM_syscall 1916 ,TOK_ASM_sysret 1917 1918 ,TOK_ASM_ud2 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 ,TOK_ASM_leave 2051 ,TOK_ASM_ret 2052 ,TOK_ASM_retq 2053 2054 2055 ,TOK_ASM_lret 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 ,TOK_ASM_fucompp 2085 ,TOK_ASM_ftst 2086 ,TOK_ASM_fxam 2087 ,TOK_ASM_fld1 2088 ,TOK_ASM_fldl2t 2089 ,TOK_ASM_fldl2e 2090 ,TOK_ASM_fldpi 2091 ,TOK_ASM_fldlg2 2092 ,TOK_ASM_fldln2 2093 ,TOK_ASM_fldz 2094 2095 ,TOK_ASM_f2xm1 2096 ,TOK_ASM_fyl2x 2097 ,TOK_ASM_fptan 2098 ,TOK_ASM_fpatan 2099 ,TOK_ASM_fxtract 2100 ,TOK_ASM_fprem1 2101 ,TOK_ASM_fdecstp 2102 ,TOK_ASM_fincstp 2103 ,TOK_ASM_fprem 2104 ,TOK_ASM_fyl2xp1 2105 ,TOK_ASM_fsqrt 2106 ,TOK_ASM_fsincos 2107 ,TOK_ASM_frndint 2108 ,TOK_ASM_fscale 2109 ,TOK_ASM_fsin 2110 ,TOK_ASM_fcos 2111 ,TOK_ASM_fchs 2112 ,TOK_ASM_fabs 2113 ,TOK_ASM_fninit 2114 ,TOK_ASM_fnclex 2115 ,TOK_ASM_fnop 2116 ,TOK_ASM_fwait 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 ,TOK_ASM_fxch 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 ,TOK_ASM_fnstsw 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 ,TOK_ASM_emms 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343# 239 "i386-tok.h" 2 2344# 250 "i386-tok.h" 2345# 1 "x86_64-asm.h" 1 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 ,TOK_ASM_sysretq 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 ,TOK_ASM_ljmpw 2566 ,TOK_ASM_ljmpl 2567 2568 2569 2570 2571 ,TOK_ASM_enter 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 ,TOK_ASM_loopne 2582 ,TOK_ASM_loopnz 2583 ,TOK_ASM_loope 2584 ,TOK_ASM_loopz 2585 ,TOK_ASM_loop 2586 ,TOK_ASM_jecxz 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 ,TOK_ASM_fld 2642 ,TOK_ASM_fldl 2643 ,TOK_ASM_flds 2644 2645 ,TOK_ASM_fildl 2646 ,TOK_ASM_fildq 2647 ,TOK_ASM_fildll 2648 ,TOK_ASM_fldt 2649 ,TOK_ASM_fbld 2650 2651 2652 ,TOK_ASM_fst 2653 ,TOK_ASM_fstl 2654 ,TOK_ASM_fsts 2655 ,TOK_ASM_fstps 2656 2657 ,TOK_ASM_fstpl 2658 ,TOK_ASM_fist 2659 ,TOK_ASM_fistp 2660 ,TOK_ASM_fistl 2661 ,TOK_ASM_fistpl 2662 2663 ,TOK_ASM_fstp 2664 ,TOK_ASM_fistpq 2665 ,TOK_ASM_fistpll 2666 ,TOK_ASM_fstpt 2667 ,TOK_ASM_fbstp 2668 2669 2670 2671 2672 2673 2674 ,TOK_ASM_fucom 2675 ,TOK_ASM_fucomp 2676 2677 ,TOK_ASM_finit 2678 ,TOK_ASM_fldcw 2679 ,TOK_ASM_fnstcw 2680 ,TOK_ASM_fstcw 2681 2682 2683 2684 ,TOK_ASM_fstsw 2685 2686 2687 ,TOK_ASM_fclex 2688 ,TOK_ASM_fnstenv 2689 ,TOK_ASM_fstenv 2690 ,TOK_ASM_fldenv 2691 ,TOK_ASM_fnsave 2692 ,TOK_ASM_fsave 2693 ,TOK_ASM_frstor 2694 ,TOK_ASM_ffree 2695 ,TOK_ASM_ffreep 2696 ,TOK_ASM_fxsave 2697 ,TOK_ASM_fxrstor 2698 2699 2700 2701 2702 ,TOK_ASM_fxsaveq 2703 ,TOK_ASM_fxrstorq 2704 2705 2706 ,TOK_ASM_arpl 2707 2708 ,TOK_ASM_lgdt 2709 ,TOK_ASM_lgdtq 2710 ,TOK_ASM_lidt 2711 ,TOK_ASM_lidtq 2712 ,TOK_ASM_lldt 2713 ,TOK_ASM_lmsw 2714 2715 ,TOK_ASM_ltr 2716 ,TOK_ASM_sgdt 2717 ,TOK_ASM_sgdtq 2718 ,TOK_ASM_sidt 2719 ,TOK_ASM_sidtq 2720 ,TOK_ASM_sldt 2721 ,TOK_ASM_smsw 2722 ,TOK_ASM_str 2723 2724 2725 ,TOK_ASM_verr 2726 ,TOK_ASM_verw 2727 ,TOK_ASM_swapgs 2728 2729 2730 2731 ,TOK_ASM_bswap 2732 ,TOK_ASM_bswapl 2733 ,TOK_ASM_bswapq 2734 2735 2736 2737 ,TOK_ASM_invlpg 2738 2739 2740 ,TOK_ASM_cmpxchg8b 2741 2742 2743 ,TOK_ASM_cmpxchg16b 2744 2745 2746 2747 2748 ,TOK_ASM_fcmovb 2749 ,TOK_ASM_fcmove 2750 ,TOK_ASM_fcmovbe 2751 ,TOK_ASM_fcmovu 2752 ,TOK_ASM_fcmovnb 2753 ,TOK_ASM_fcmovne 2754 ,TOK_ASM_fcmovnbe 2755 ,TOK_ASM_fcmovnu 2756 2757 ,TOK_ASM_fucomi 2758 ,TOK_ASM_fcomi 2759 ,TOK_ASM_fucomip 2760 ,TOK_ASM_fcomip 2761 2762 2763 2764 ,TOK_ASM_movd 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 ,TOK_ASM_packssdw 2778 ,TOK_ASM_packsswb 2779 ,TOK_ASM_packuswb 2780 ,TOK_ASM_paddb 2781 ,TOK_ASM_paddw 2782 ,TOK_ASM_paddd 2783 ,TOK_ASM_paddsb 2784 ,TOK_ASM_paddsw 2785 ,TOK_ASM_paddusb 2786 ,TOK_ASM_paddusw 2787 ,TOK_ASM_pand 2788 ,TOK_ASM_pandn 2789 ,TOK_ASM_pcmpeqb 2790 ,TOK_ASM_pcmpeqw 2791 ,TOK_ASM_pcmpeqd 2792 ,TOK_ASM_pcmpgtb 2793 ,TOK_ASM_pcmpgtw 2794 ,TOK_ASM_pcmpgtd 2795 ,TOK_ASM_pmaddwd 2796 ,TOK_ASM_pmulhw 2797 ,TOK_ASM_pmullw 2798 ,TOK_ASM_por 2799 ,TOK_ASM_psllw 2800 2801 ,TOK_ASM_pslld 2802 2803 ,TOK_ASM_psllq 2804 2805 ,TOK_ASM_psraw 2806 2807 ,TOK_ASM_psrad 2808 2809 ,TOK_ASM_psrlw 2810 2811 ,TOK_ASM_psrld 2812 2813 ,TOK_ASM_psrlq 2814 2815 ,TOK_ASM_psubb 2816 ,TOK_ASM_psubw 2817 ,TOK_ASM_psubd 2818 ,TOK_ASM_psubsb 2819 ,TOK_ASM_psubsw 2820 ,TOK_ASM_psubusb 2821 ,TOK_ASM_psubusw 2822 ,TOK_ASM_punpckhbw 2823 ,TOK_ASM_punpckhwd 2824 ,TOK_ASM_punpckhdq 2825 ,TOK_ASM_punpcklbw 2826 ,TOK_ASM_punpcklwd 2827 ,TOK_ASM_punpckldq 2828 ,TOK_ASM_pxor 2829 2830 2831 ,TOK_ASM_movups 2832 2833 ,TOK_ASM_movaps 2834 2835 ,TOK_ASM_movhps 2836 2837 ,TOK_ASM_addps 2838 ,TOK_ASM_cvtpi2ps 2839 ,TOK_ASM_cvtps2pi 2840 ,TOK_ASM_cvttps2pi 2841 ,TOK_ASM_divps 2842 ,TOK_ASM_maxps 2843 ,TOK_ASM_minps 2844 ,TOK_ASM_mulps 2845 ,TOK_ASM_pavgb 2846 ,TOK_ASM_pavgw 2847 ,TOK_ASM_pmaxsw 2848 ,TOK_ASM_pmaxub 2849 ,TOK_ASM_pminsw 2850 ,TOK_ASM_pminub 2851 ,TOK_ASM_rcpss 2852 ,TOK_ASM_rsqrtps 2853 ,TOK_ASM_sqrtps 2854 ,TOK_ASM_subps 2855 2856 ,TOK_ASM_prefetchnta 2857 ,TOK_ASM_prefetcht0 2858 ,TOK_ASM_prefetcht1 2859 ,TOK_ASM_prefetcht2 2860 ,TOK_ASM_prefetchw 2861 ,TOK_ASM_lfence 2862 ,TOK_ASM_mfence 2863 ,TOK_ASM_sfence 2864 ,TOK_ASM_clflush 2865# 251 "i386-tok.h" 2 2866# 350 "tcctok.h" 2 2867# 1074 "tcc.h" 2 2868 2869}; 2870 2871 2872 2873 2874 2875 2876 2877static int gnu_ext; 2878 2879static int tcc_ext; 2880 2881static struct TCCState *tcc_state; 2882 2883 2884static char *pstrcpy(char *buf, int buf_size, const char *s); 2885static char *pstrcat(char *buf, int buf_size, const char *s); 2886static char *pstrncpy(char *out, const char *in, size_t num); 2887 char *tcc_basename(const char *name); 2888 char *tcc_fileextension (const char *name); 2889 2890 2891 void tcc_free(void *ptr); 2892 void *tcc_malloc(unsigned long size); 2893 void *tcc_mallocz(unsigned long size); 2894 void *tcc_realloc(void *ptr, unsigned long size); 2895 char *tcc_strdup(const char *str); 2896# 1120 "tcc.h" 2897 void tcc_memcheck(void); 2898 void tcc_error_noabort(const char *fmt, ...); 2899 void tcc_error(const char *fmt, ...); 2900 void tcc_warning(const char *fmt, ...); 2901 2902 2903static void dynarray_add(void *ptab, int *nb_ptr, void *data); 2904static void dynarray_reset(void *pp, int *n); 2905static inline void cstr_ccat(CString *cstr, int ch); 2906static void cstr_cat(CString *cstr, const char *str, int len); 2907static void cstr_wccat(CString *cstr, int ch); 2908static void cstr_new(CString *cstr); 2909static void cstr_free(CString *cstr); 2910static void cstr_reset(CString *cstr); 2911 2912static inline void sym_free(Sym *sym); 2913static Sym *sym_push2(Sym **ps, int v, int t, int c); 2914static Sym *sym_find2(Sym *s, int v); 2915static Sym *sym_push(int v, CType *type, int r, int c); 2916static void sym_pop(Sym **ptop, Sym *b, int keep); 2917static inline Sym *struct_find(int v); 2918static inline Sym *sym_find(int v); 2919static Sym *global_identifier_push(int v, int t, int c); 2920 2921static void tcc_open_bf(TCCState *s1, const char *filename, int initlen); 2922static int tcc_open(TCCState *s1, const char *filename); 2923static void tcc_close(void); 2924 2925static int tcc_add_file_internal(TCCState *s1, const char *filename, int flags); 2926# 1166 "tcc.h" 2927static int tcc_add_crt(TCCState *s, const char *filename); 2928static int tcc_add_dll(TCCState *s, const char *filename, int flags); 2929static void tcc_add_pragma_libs(TCCState *s1); 2930 int tcc_add_library_err(TCCState *s, const char *f); 2931 void tcc_print_stats(TCCState *s, unsigned total_time); 2932 int tcc_parse_args(TCCState *s, int *argc, char ***argv, int optind); 2933# 1188 "tcc.h" 2934static struct BufferedFile *file; 2935static int ch, tok; 2936static CValue tokc; 2937static const int *macro_ptr; 2938static int parse_flags; 2939static int tok_flags; 2940static CString tokcstr; 2941 2942 2943static int total_lines; 2944static int total_bytes; 2945static int tok_ident; 2946static TokenSym **table_ident; 2947# 1222 "tcc.h" 2948static TokenSym *tok_alloc(const char *str, int len); 2949static const char *get_tok_str(int v, CValue *cv); 2950static void begin_macro(TokenString *str, int alloc); 2951static void end_macro(void); 2952static int set_idnum(int c, int val); 2953static inline void tok_str_new(TokenString *s); 2954static TokenString *tok_str_alloc(void); 2955static void tok_str_free(TokenString *s); 2956static void tok_str_free_str(int *str); 2957static void tok_str_add(TokenString *s, int t); 2958static void tok_str_add_tok(TokenString *s); 2959static inline void define_push(int v, int macro_type, int *str, Sym *first_arg); 2960static void define_undef(Sym *s); 2961static inline Sym *define_find(int v); 2962static void free_defines(Sym *b); 2963static Sym *label_find(int v); 2964static Sym *label_push(Sym **ptop, int v, int flags); 2965static void label_pop(Sym **ptop, Sym *slast, int keep); 2966static void parse_define(void); 2967static void preprocess(int is_bof); 2968static void next_nomacro(void); 2969static void next(void); 2970static inline void unget_tok(int last_tok); 2971static void preprocess_start(TCCState *s1, int is_asm); 2972static void preprocess_end(TCCState *s1); 2973static void tccpp_new(TCCState *s); 2974static void tccpp_delete(TCCState *s); 2975static int tcc_preprocess(TCCState *s1); 2976static void skip(int c); 2977static void expect(const char *msg); 2978 2979 2980static inline int is_space(int ch) { 2981 return ch == ' ' || ch == '\t' || ch == '\v' || ch == '\f' || ch == '\r'; 2982} 2983static inline int isid(int c) { 2984 return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_'; 2985} 2986static inline int isnum(int c) { 2987 return c >= '0' && c <= '9'; 2988} 2989static inline int isoct(int c) { 2990 return c >= '0' && c <= '7'; 2991} 2992static inline int toup(int c) { 2993 return (c >= 'a' && c <= 'z') ? c - 'a' + 'A' : c; 2994} 2995 2996 2997 2998 2999static Sym *sym_free_first; 3000static void **sym_pools; 3001static int nb_sym_pools; 3002 3003static Sym *global_stack; 3004static Sym *local_stack; 3005static Sym *local_label_stack; 3006static Sym *global_label_stack; 3007static Sym *define_stack; 3008static CType char_pointer_type, func_old_type, int_type, size_type; 3009static SValue __vstack[1+ 256], *vtop, *pvtop; 3010 3011static int rsym, anon_sym, ind, loc; 3012 3013static int const_wanted; 3014static int nocode_wanted; 3015static int global_expr; 3016static CType func_vt; 3017static int func_var; 3018static int func_vc; 3019static int last_line_num, last_ind, func_ind; 3020static const char *funcname; 3021static int g_debug; 3022 3023static void tcc_debug_start(TCCState *s1); 3024static void tcc_debug_end(TCCState *s1); 3025static void tcc_debug_funcstart(TCCState *s1, Sym *sym); 3026static void tcc_debug_funcend(TCCState *s1, int size); 3027static void tcc_debug_line(TCCState *s1); 3028 3029static int tccgen_compile(TCCState *s1); 3030static void free_inline_functions(TCCState *s); 3031static void check_vstack(void); 3032 3033static inline int is_float(int t); 3034static int ieee_finite(double d); 3035static void test_lvalue(void); 3036static void vpushi(int v); 3037static Elf64_Sym *elfsym(Sym *); 3038static void update_storage(Sym *sym); 3039static Sym *external_global_sym(int v, CType *type, int r); 3040static void vset(CType *type, int r, int v); 3041static void vswap(void); 3042static void vpush_global_sym(CType *type, int v); 3043static void vrote(SValue *e, int n); 3044static void vrott(int n); 3045static void vrotb(int n); 3046 3047 3048 3049 3050static void vpushv(SValue *v); 3051static void save_reg(int r); 3052static void save_reg_upstack(int r, int n); 3053static int get_reg(int rc); 3054static void save_regs(int n); 3055static void gaddrof(void); 3056static int gv(int rc); 3057static void gv2(int rc1, int rc2); 3058static void vpop(void); 3059static void gen_op(int op); 3060static int type_size(CType *type, int *a); 3061static void mk_pointer(CType *type); 3062static void vstore(void); 3063static void inc(int post, int c); 3064static void parse_mult_str (CString *astr, const char *msg); 3065static void parse_asm_str(CString *astr); 3066static int lvalue_type(int t); 3067static void indir(void); 3068static void unary(void); 3069static void expr_prod(void); 3070static void expr_sum(void); 3071static void gexpr(void); 3072static int expr_const(void); 3073 3074static Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size); 3075 3076 3077static int classify_x86_64_va_arg(CType *ty); 3078# 1362 "tcc.h" 3079typedef struct { 3080 unsigned int n_strx; 3081 unsigned char n_type; 3082 unsigned char n_other; 3083 unsigned short n_desc; 3084 unsigned int n_value; 3085} Stab_Sym; 3086 3087static Section *text_section, *data_section, *bss_section; 3088static Section *common_section; 3089static Section *cur_text_section; 3090 3091static Section *last_text_section; 3092 3093 3094 3095static Section *bounds_section; 3096static Section *lbounds_section; 3097static void tccelf_bounds_new(TCCState *s); 3098 3099 3100static Section *symtab_section; 3101 3102static Section *stab_section, *stabstr_section; 3103 3104static void tccelf_new(TCCState *s); 3105static void tccelf_delete(TCCState *s); 3106static void tccelf_stab_new(TCCState *s); 3107static void tccelf_begin_file(TCCState *s1); 3108static void tccelf_end_file(TCCState *s1); 3109 3110static Section *new_section(TCCState *s1, const char *name, int sh_type, int sh_flags); 3111static void section_realloc(Section *sec, unsigned long new_size); 3112static size_t section_add(Section *sec, Elf64_Addr size, int align); 3113static void *section_ptr_add(Section *sec, Elf64_Addr size); 3114static void section_reserve(Section *sec, unsigned long size); 3115static Section *find_section(TCCState *s1, const char *name); 3116static Section *new_symtab(TCCState *s1, const char *symtab_name, int sh_type, int sh_flags, const char *strtab_name, const char *hash_name, int hash_sh_flags); 3117 3118static void put_extern_sym2(Sym *sym, int sh_num, Elf64_Addr value, unsigned long size, int can_add_underscore); 3119static void put_extern_sym(Sym *sym, Section *section, Elf64_Addr value, unsigned long size); 3120 3121 3122 3123static void greloca(Section *s, Sym *sym, unsigned long offset, int type, Elf64_Addr addend); 3124 3125static int put_elf_str(Section *s, const char *sym); 3126static int put_elf_sym(Section *s, Elf64_Addr value, unsigned long size, int info, int other, int shndx, const char *name); 3127static int set_elf_sym(Section *s, Elf64_Addr value, unsigned long size, int info, int other, int shndx, const char *name); 3128static int find_elf_sym(Section *s, const char *name); 3129static void put_elf_reloc(Section *symtab, Section *s, unsigned long offset, int type, int symbol); 3130static void put_elf_reloca(Section *symtab, Section *s, unsigned long offset, int type, int symbol, Elf64_Addr addend); 3131 3132static void put_stabs(const char *str, int type, int other, int desc, unsigned long value); 3133static void put_stabs_r(const char *str, int type, int other, int desc, unsigned long value, Section *sec, int sym_index); 3134static void put_stabn(int type, int other, int desc, int value); 3135static void put_stabd(int type, int other, int desc); 3136 3137static void resolve_common_syms(TCCState *s1); 3138static void relocate_syms(TCCState *s1, Section *symtab, int do_resolve); 3139static void relocate_section(TCCState *s1, Section *s); 3140 3141static int tcc_object_type(int fd, Elf64_Ehdr *h); 3142static int tcc_load_object_file(TCCState *s1, int fd, unsigned long file_offset); 3143static int tcc_load_archive(TCCState *s1, int fd); 3144static void tcc_add_bcheck(TCCState *s1); 3145static void tcc_add_runtime(TCCState *s1); 3146 3147static void build_got_entries(TCCState *s1); 3148static struct sym_attr *get_sym_attr(TCCState *s1, int index, int alloc); 3149static void squeeze_multi_relocs(Section *sec, size_t oldrelocoffset); 3150 3151static Elf64_Addr get_elf_sym_addr(TCCState *s, const char *name, int err); 3152 3153static void *tcc_get_symbol_err(TCCState *s, const char *name); 3154 3155 3156 3157static int tcc_load_dll(TCCState *s1, int fd, const char *filename, int level); 3158static int tcc_load_ldscript(TCCState *s1); 3159static uint8_t *parse_comment(uint8_t *p); 3160static void minp(void); 3161static inline void inp(void); 3162static int handle_eob(void); 3163 3164 3165 3166 3167 3168 3169enum gotplt_entry { 3170 NO_GOTPLT_ENTRY, 3171 BUILD_GOT_ONLY, 3172 AUTO_GOTPLT_ENTRY, 3173 ALWAYS_GOTPLT_ENTRY 3174}; 3175 3176static int code_reloc (int reloc_type); 3177static int gotplt_entry_type (int reloc_type); 3178static unsigned create_plt_entry(TCCState *s1, unsigned got_offset, struct sym_attr *attr); 3179static void relocate_init(Section *sr); 3180static void relocate(TCCState *s1, Elf64_Rela *rel, int type, unsigned char *ptr, Elf64_Addr addr, Elf64_Addr val); 3181static void relocate_plt(TCCState *s1); 3182 3183 3184 3185static const int reg_classes[25]; 3186 3187static void gsym_addr(int t, int a); 3188static void gsym(int t); 3189static void load(int r, SValue *sv); 3190static void store(int r, SValue *v); 3191static int gfunc_sret(CType *vt, int variadic, CType *ret, int *align, int *regsize); 3192static void gfunc_call(int nb_args); 3193static void gfunc_prolog(CType *func_type); 3194static void gfunc_epilog(void); 3195static int gjmp(int t); 3196static void gjmp_addr(int a); 3197static int gtst(int inv, int t); 3198 3199static void gtst_addr(int inv, int a); 3200 3201 3202 3203static void gen_opi(int op); 3204static void gen_opf(int op); 3205static void gen_cvt_ftoi(int t); 3206static void gen_cvt_ftof(int t); 3207static void ggoto(void); 3208 3209static void o(unsigned int c); 3210 3211 3212static void gen_cvt_itof(int t); 3213 3214static void gen_vla_sp_save(int addr); 3215static void gen_vla_sp_restore(int addr); 3216static void gen_vla_alloc(CType *type, int align); 3217 3218static inline uint16_t read16le(unsigned char *p) { 3219 return p[0] | (uint16_t)p[1] << 8; 3220} 3221static inline void write16le(unsigned char *p, uint16_t x) { 3222 p[0] = x & 255; p[1] = x >> 8 & 255; 3223} 3224static inline uint32_t read32le(unsigned char *p) { 3225 return read16le(p) | (uint32_t)read16le(p + 2) << 16; 3226} 3227static inline void write32le(unsigned char *p, uint32_t x) { 3228 write16le(p, x); write16le(p + 2, x >> 16); 3229} 3230static inline void add32le(unsigned char *p, int32_t x) { 3231 write32le(p, read32le(p) + x); 3232} 3233static inline uint64_t read64le(unsigned char *p) { 3234 return read32le(p) | (uint64_t)read32le(p + 4) << 32; 3235} 3236static inline void write64le(unsigned char *p, uint64_t x) { 3237 write32le(p, x); write32le(p + 4, x >> 32); 3238} 3239static inline void add64le(unsigned char *p, int64_t x) { 3240 write64le(p, read64le(p) + x); 3241} 3242 3243 3244 3245static void g(int c); 3246static void gen_le16(int c); 3247static void gen_le32(int c); 3248static void gen_addr32(int r, Sym *sym, int c); 3249static void gen_addrpc32(int r, Sym *sym, int c); 3250 3251 3252 3253static void gen_bounded_ptr_add(void); 3254static void gen_bounded_ptr_deref(void); 3255 3256 3257 3258 3259static void gen_addr64(int r, Sym *sym, int64_t c); 3260static void gen_opl(int op); 3261# 1580 "tcc.h" 3262static void asm_instr(void); 3263static void asm_global_instr(void); 3264 3265static int find_constraint(ASMOperand *operands, int nb_operands, const char *name, const char **pp); 3266static Sym* get_asm_sym(int name, Sym *csym); 3267static void asm_expr(TCCState *s1, ExprValue *pe); 3268static int asm_int_expr(TCCState *s1); 3269static int tcc_assemble(TCCState *s1, int do_preprocess); 3270 3271static void gen_expr32(ExprValue *pe); 3272 3273static void gen_expr64(ExprValue *pe); 3274 3275static void asm_opcode(TCCState *s1, int opcode); 3276static int asm_parse_regvar(int t); 3277static void asm_compute_constraints(ASMOperand *operands, int nb_operands, int nb_outputs, const uint8_t *clobber_regs, int *pout_reg); 3278static void subst_asm_operand(CString *add_str, SValue *sv, int modifier); 3279static void asm_gen_code(ASMOperand *operands, int nb_operands, int nb_outputs, int is_output, uint8_t *clobber_regs, int out_reg); 3280static void asm_clobber(uint8_t *clobber_regs, const char *str); 3281# 1634 "tcc.h" 3282static int rt_num_callers; 3283static const char **rt_bound_error_msg; 3284static void *rt_prog_main; 3285static void tcc_set_num_callers(int n); 3286 3287static void tcc_run_free(TCCState *s1); 3288# 22 "tccgen.c" 2 3289# 31 "tccgen.c" 3290static int rsym, anon_sym, ind, loc; 3291 3292static Sym *sym_free_first; 3293static void **sym_pools; 3294static int nb_sym_pools; 3295 3296static Sym *global_stack; 3297static Sym *local_stack; 3298static Sym *define_stack; 3299static Sym *global_label_stack; 3300static Sym *local_label_stack; 3301static int local_scope; 3302static int in_sizeof; 3303static int section_sym; 3304 3305static int vlas_in_scope; 3306static int vla_sp_root_loc; 3307static int vla_sp_loc; 3308 3309static SValue __vstack[1+256], *vtop, *pvtop; 3310 3311static int const_wanted; 3312static int nocode_wanted; 3313 3314 3315static int global_expr; 3316static CType func_vt; 3317static int func_var; 3318static int func_vc; 3319static int last_line_num, last_ind, func_ind; 3320static const char *funcname; 3321static int g_debug; 3322 3323static CType char_pointer_type, func_old_type, int_type, size_type, ptrdiff_type; 3324 3325static struct switch_t { 3326 struct case_t { 3327 int64_t v1, v2; 3328 int sym; 3329 } **p; int n; 3330 int def_sym; 3331} *cur_switch; 3332 3333 3334 3335static void gen_cast(CType *type); 3336static void gen_cast_s(int t); 3337static inline CType *pointed_type(CType *type); 3338static int is_compatible_types(CType *type1, CType *type2); 3339static int parse_btype(CType *type, AttributeDef *ad); 3340static CType *type_decl(CType *type, AttributeDef *ad, int *v, int td); 3341static void parse_expr_type(CType *type); 3342static void init_putv(CType *type, Section *sec, unsigned long c); 3343static void decl_initializer(CType *type, Section *sec, unsigned long c, int first, int size_only); 3344static void block(int *bsym, int *csym, int is_expr); 3345static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, int has_init, int v, int scope); 3346static void decl(int l); 3347static int decl0(int l, int is_for_loop_init, Sym *); 3348static void expr_eq(void); 3349static void vla_runtime_type_size(CType *type, int *a); 3350static void vla_sp_restore(void); 3351static void vla_sp_restore_root(void); 3352static int is_compatible_unqualified_types(CType *type1, CType *type2); 3353static inline int64_t expr_const64(void); 3354static void vpush64(int ty, unsigned long long v); 3355static void vpush(CType *type); 3356static int gvtst(int inv, int t); 3357static void gen_inline_functions(TCCState *s); 3358static void skip_or_save_block(TokenString **str); 3359static void gv_dup(void); 3360 3361static inline int is_float(int t) 3362{ 3363 int bt; 3364 bt = t & 0x000f; 3365 return bt == 10 || bt == 9 || bt == 8 || bt == 14; 3366} 3367 3368 3369 3370 3371static int ieee_finite(double d) 3372{ 3373 int p[4]; 3374 memcpy(p, &d, sizeof(double)); 3375 return ((unsigned)((p[1] | 0x800fffff) + 1)) >> 31; 3376} 3377 3378 3379 3380 3381 3382 3383 3384static void test_lvalue(void) 3385{ 3386 if (!(vtop->r & 0x0100)) 3387 expect("lvalue"); 3388} 3389 3390static void check_vstack(void) 3391{ 3392 if (pvtop != vtop) 3393 tcc_error("internal compiler error: vstack leak (%d)", vtop - pvtop); 3394} 3395# 154 "tccgen.c" 3396static void tcc_debug_start(TCCState *s1) 3397{ 3398 if (s1->do_debug) { 3399 char buf[512]; 3400 3401 3402 section_sym = put_elf_sym(symtab_section, 0, 0, 3403 ((((0)) << 4) + (((3)) & 0xf)), 0, 3404 text_section->sh_num, 0); 3405 getcwd(buf, sizeof(buf)); 3406 3407 3408 3409 pstrcat(buf, sizeof(buf), "/"); 3410 put_stabs_r(buf, N_SO, 0, 0, 3411 text_section->data_offset, text_section, section_sym); 3412 put_stabs_r(file->filename, N_SO, 0, 0, 3413 text_section->data_offset, text_section, section_sym); 3414 last_ind = 0; 3415 last_line_num = 0; 3416 } 3417 3418 3419 3420 put_elf_sym(symtab_section, 0, 0, 3421 ((((0)) << 4) + (((4)) & 0xf)), 0, 3422 0xfff1, file->filename); 3423} 3424 3425 3426static void tcc_debug_end(TCCState *s1) 3427{ 3428 if (!s1->do_debug) 3429 return; 3430 put_stabs_r(0, N_SO, 0, 0, 3431 text_section->data_offset, text_section, section_sym); 3432 3433} 3434 3435 3436static void tcc_debug_line(TCCState *s1) 3437{ 3438 if (!s1->do_debug) 3439 return; 3440 if ((last_line_num != file->line_num || last_ind != ind)) { 3441 put_stabn(N_SLINE, 0, file->line_num, ind - func_ind); 3442 last_ind = ind; 3443 last_line_num = file->line_num; 3444 } 3445} 3446 3447 3448static void tcc_debug_funcstart(TCCState *s1, Sym *sym) 3449{ 3450 char buf[512]; 3451 3452 if (!s1->do_debug) 3453 return; 3454 3455 3456 3457 snprintf(buf, sizeof(buf), "%s:%c1", 3458 funcname, sym->type.t & 0x00002000 ? 'f' : 'F'); 3459 put_stabs_r(buf, N_FUN, 0, file->line_num, 0, 3460 cur_text_section, sym->c); 3461 3462 put_stabn(N_SLINE, 0, file->line_num, 0); 3463 3464 last_ind = 0; 3465 last_line_num = 0; 3466} 3467 3468 3469static void tcc_debug_funcend(TCCState *s1, int size) 3470{ 3471 if (!s1->do_debug) 3472 return; 3473 put_stabn(N_FUN, 0, 0, size); 3474} 3475 3476 3477static int tccgen_compile(TCCState *s1) 3478{ 3479 cur_text_section = 0; 3480 funcname = ""; 3481 anon_sym = 0x10000000; 3482 section_sym = 0; 3483 const_wanted = 0; 3484 nocode_wanted = 0x80000000; 3485 3486 3487 int_type.t = 3; 3488 char_pointer_type.t = 1; 3489 mk_pointer(&char_pointer_type); 3490 3491 3492 3493 3494 3495 3496 3497 size_type.t = 0x0800 | 4 | 0x0010; 3498 ptrdiff_type.t = 0x0800 | 4; 3499 3500 func_old_type.t = 6; 3501 func_old_type.ref = sym_push(0x20000000, &int_type, 0, 0); 3502 func_old_type.ref->f.func_call = 0; 3503 func_old_type.ref->f.func_type = 2; 3504 3505 tcc_debug_start(s1); 3506# 273 "tccgen.c" 3507 parse_flags = 0x0001 | 0x0002 | 0x0040; 3508 next(); 3509 decl(0x0030); 3510 gen_inline_functions(s1); 3511 check_vstack(); 3512 3513 tcc_debug_end(s1); 3514 return 0; 3515} 3516 3517 3518static Elf64_Sym *elfsym(Sym *s) 3519{ 3520 if (!s || !s->c) 3521 return 0; 3522 return &((Elf64_Sym *)symtab_section->data)[s->c]; 3523} 3524 3525 3526static void update_storage(Sym *sym) 3527{ 3528 Elf64_Sym *esym; 3529 int sym_bind, old_sym_bind; 3530 3531 esym = elfsym(sym); 3532 if (!esym) 3533 return; 3534 3535 if (sym->a.visibility) 3536 esym->st_other = (esym->st_other & ~((-1) & 0x03)) 3537 | sym->a.visibility; 3538 3539 if (sym->type.t & 0x00002000) 3540 sym_bind = 0; 3541 else if (sym->a.weak) 3542 sym_bind = 2; 3543 else 3544 sym_bind = 1; 3545 old_sym_bind = (((unsigned char) (esym->st_info)) >> 4); 3546 if (sym_bind != old_sym_bind) { 3547 esym->st_info = ((((sym_bind)) << 4) + (((((esym->st_info) & 0xf))) & 0xf)); 3548 } 3549# 332 "tccgen.c" 3550} 3551 3552 3553 3554 3555 3556static void put_extern_sym2(Sym *sym, int sh_num, 3557 Elf64_Addr value, unsigned long size, 3558 int can_add_underscore) 3559{ 3560 int sym_type, sym_bind, info, other, t; 3561 Elf64_Sym *esym; 3562 const char *name; 3563 char buf1[256]; 3564 3565 char buf[32]; 3566 3567 3568 if (!sym->c) { 3569 name = get_tok_str(sym->v, 0); 3570 3571 if (tcc_state->do_bounds_check) { 3572 3573 3574 3575 switch(sym->v) { 3576# 366 "tccgen.c" 3577 case TOK_memcpy: 3578 case TOK_memmove: 3579 case TOK_memset: 3580 case TOK_strlen: 3581 case TOK_strcpy: 3582 case TOK_alloca: 3583 strcpy(buf, "__bound_"); 3584 strcat(buf, name); 3585 name = buf; 3586 break; 3587 } 3588 } 3589 3590 t = sym->type.t; 3591 if ((t & 0x000f) == 6) { 3592 sym_type = 2; 3593 } else if ((t & 0x000f) == 0) { 3594 sym_type = 0; 3595 } else { 3596 sym_type = 1; 3597 } 3598 if (t & 0x00002000) 3599 sym_bind = 0; 3600 else 3601 sym_bind = 1; 3602 other = 0; 3603# 403 "tccgen.c" 3604 if (tcc_state->leading_underscore && can_add_underscore) { 3605 buf1[0] = '_'; 3606 pstrcpy(buf1 + 1, sizeof(buf1) - 1, name); 3607 name = buf1; 3608 } 3609 if (sym->asm_label) 3610 name = get_tok_str(sym->asm_label, 0); 3611 info = ((((sym_bind)) << 4) + (((sym_type)) & 0xf)); 3612 sym->c = put_elf_sym(symtab_section, value, size, info, other, sh_num, name); 3613 } else { 3614 esym = elfsym(sym); 3615 esym->st_value = value; 3616 esym->st_size = size; 3617 esym->st_shndx = sh_num; 3618 } 3619 update_storage(sym); 3620} 3621 3622static void put_extern_sym(Sym *sym, Section *section, 3623 Elf64_Addr value, unsigned long size) 3624{ 3625 int sh_num = section ? section->sh_num : 0; 3626 put_extern_sym2(sym, sh_num, value, size, 1); 3627} 3628 3629 3630static void greloca(Section *s, Sym *sym, unsigned long offset, int type, 3631 Elf64_Addr addend) 3632{ 3633 int c = 0; 3634 3635 if (nocode_wanted && s == cur_text_section) 3636 return; 3637 3638 if (sym) { 3639 if (0 == sym->c) 3640 put_extern_sym(sym, 0, 0, 0); 3641 c = sym->c; 3642 } 3643 3644 3645 put_elf_reloca(symtab_section, s, offset, type, c, addend); 3646} 3647# 456 "tccgen.c" 3648static Sym *__sym_malloc(void) 3649{ 3650 Sym *sym_pool, *sym, *last_sym; 3651 int i; 3652 3653 sym_pool = tcc_malloc((8192 / sizeof(Sym)) * sizeof(Sym)); 3654 dynarray_add(&sym_pools, &nb_sym_pools, sym_pool); 3655 3656 last_sym = sym_free_first; 3657 sym = sym_pool; 3658 for(i = 0; i < (8192 / sizeof(Sym)); i++) { 3659 sym->next = last_sym; 3660 last_sym = sym; 3661 sym++; 3662 } 3663 sym_free_first = last_sym; 3664 return last_sym; 3665} 3666 3667static inline Sym *sym_malloc(void) 3668{ 3669 Sym *sym; 3670 3671 sym = sym_free_first; 3672 if (!sym) 3673 sym = __sym_malloc(); 3674 sym_free_first = sym->next; 3675 return sym; 3676 3677 3678 3679 3680} 3681 3682static inline void sym_free(Sym *sym) 3683{ 3684 3685 sym->next = sym_free_first; 3686 sym_free_first = sym; 3687 3688 3689 3690} 3691 3692 3693static Sym *sym_push2(Sym **ps, int v, int t, int c) 3694{ 3695 Sym *s; 3696 3697 s = sym_malloc(); 3698 memset(s, 0, sizeof *s); 3699 s->v = v; 3700 s->type.t = t; 3701 s->c = c; 3702 3703 s->prev = *ps; 3704 *ps = s; 3705 return s; 3706} 3707 3708 3709 3710static Sym *sym_find2(Sym *s, int v) 3711{ 3712 while (s) { 3713 if (s->v == v) 3714 return s; 3715 else if (s->v == -1) 3716 return 0; 3717 s = s->prev; 3718 } 3719 return 0; 3720} 3721 3722 3723static inline Sym *struct_find(int v) 3724{ 3725 v -= 256; 3726 if ((unsigned)v >= (unsigned)(tok_ident - 256)) 3727 return 0; 3728 return table_ident[v]->sym_struct; 3729} 3730 3731 3732static inline Sym *sym_find(int v) 3733{ 3734 v -= 256; 3735 if ((unsigned)v >= (unsigned)(tok_ident - 256)) 3736 return 0; 3737 return table_ident[v]->sym_identifier; 3738} 3739 3740 3741static Sym *sym_push(int v, CType *type, int r, int c) 3742{ 3743 Sym *s, **ps; 3744 TokenSym *ts; 3745 3746 if (local_stack) 3747 ps = &local_stack; 3748 else 3749 ps = &global_stack; 3750 s = sym_push2(ps, v, type->t, c); 3751 s->type.ref = type->ref; 3752 s->r = r; 3753 3754 3755 if (!(v & 0x20000000) && (v & ~0x40000000) < 0x10000000) { 3756 3757 ts = table_ident[(v & ~0x40000000) - 256]; 3758 if (v & 0x40000000) 3759 ps = &ts->sym_struct; 3760 else 3761 ps = &ts->sym_identifier; 3762 s->prev_tok = *ps; 3763 *ps = s; 3764 s->sym_scope = local_scope; 3765 if (s->prev_tok && s->prev_tok->sym_scope == s->sym_scope) 3766 tcc_error("redeclaration of '%s'", 3767 get_tok_str(v & ~0x40000000, 0)); 3768 } 3769 return s; 3770} 3771 3772 3773static Sym *global_identifier_push(int v, int t, int c) 3774{ 3775 Sym *s, **ps; 3776 s = sym_push2(&global_stack, v, t, c); 3777 3778 if (v < 0x10000000) { 3779 ps = &table_ident[v - 256]->sym_identifier; 3780 3781 3782 while (*ps != 0 && (*ps)->sym_scope) 3783 ps = &(*ps)->prev_tok; 3784 s->prev_tok = *ps; 3785 *ps = s; 3786 } 3787 return s; 3788} 3789 3790 3791 3792static void sym_pop(Sym **ptop, Sym *b, int keep) 3793{ 3794 Sym *s, *ss, **ps; 3795 TokenSym *ts; 3796 int v; 3797 3798 s = *ptop; 3799 while(s != b) { 3800 ss = s->prev; 3801 v = s->v; 3802 3803 3804 if (!(v & 0x20000000) && (v & ~0x40000000) < 0x10000000) { 3805 ts = table_ident[(v & ~0x40000000) - 256]; 3806 if (v & 0x40000000) 3807 ps = &ts->sym_struct; 3808 else 3809 ps = &ts->sym_identifier; 3810 *ps = s->prev_tok; 3811 } 3812 if (!keep) 3813 sym_free(s); 3814 s = ss; 3815 } 3816 if (!keep) 3817 *ptop = b; 3818} 3819 3820 3821 3822static void vsetc(CType *type, int r, CValue *vc) 3823{ 3824 int v; 3825 3826 if (vtop >= (__vstack + 1) + (256 - 1)) 3827 tcc_error("memory full (vstack)"); 3828# 649 "tccgen.c" 3829 if (vtop >= (__vstack + 1) && !nocode_wanted) { 3830 v = vtop->r & 0x003f; 3831 if (v == 0x0033 || (v & ~1) == 0x0034) 3832 gv(0x0001); 3833 } 3834 3835 vtop++; 3836 vtop->type = *type; 3837 vtop->r = r; 3838 vtop->r2 = 0x0030; 3839 vtop->c = *vc; 3840 vtop->sym = 0; 3841} 3842 3843static void vswap(void) 3844{ 3845 SValue tmp; 3846 3847 if (vtop >= (__vstack + 1) && !nocode_wanted) { 3848 int v = vtop->r & 0x003f; 3849 if (v == 0x0033 || (v & ~1) == 0x0034) 3850 gv(0x0001); 3851 } 3852 tmp = vtop[0]; 3853 vtop[0] = vtop[-1]; 3854 vtop[-1] = tmp; 3855} 3856 3857 3858static void vpop(void) 3859{ 3860 int v; 3861 v = vtop->r & 0x003f; 3862 3863 3864 if (v == TREG_ST0) { 3865 o(0xd8dd); 3866 } else 3867 3868 if (v == 0x0034 || v == 0x0035) { 3869 3870 gsym(vtop->c.i); 3871 } 3872 vtop--; 3873} 3874 3875 3876static void vpush(CType *type) 3877{ 3878 vset(type, 0x0030, 0); 3879} 3880 3881 3882static void vpushi(int v) 3883{ 3884 CValue cval; 3885 cval.i = v; 3886 vsetc(&int_type, 0x0030, &cval); 3887} 3888 3889 3890static void vpushs(Elf64_Addr v) 3891{ 3892 CValue cval; 3893 cval.i = v; 3894 vsetc(&size_type, 0x0030, &cval); 3895} 3896 3897 3898static void vpush64(int ty, unsigned long long v) 3899{ 3900 CValue cval; 3901 CType ctype; 3902 ctype.t = ty; 3903 ctype.ref = 0; 3904 cval.i = v; 3905 vsetc(&ctype, 0x0030, &cval); 3906} 3907 3908 3909static inline void vpushll(long long v) 3910{ 3911 vpush64(4, v); 3912} 3913 3914static void vset(CType *type, int r, int v) 3915{ 3916 CValue cval; 3917 3918 cval.i = v; 3919 vsetc(type, r, &cval); 3920} 3921 3922static void vseti(int r, int v) 3923{ 3924 CType type; 3925 type.t = 3; 3926 type.ref = 0; 3927 vset(&type, r, v); 3928} 3929 3930static void vpushv(SValue *v) 3931{ 3932 if (vtop >= (__vstack + 1) + (256 - 1)) 3933 tcc_error("memory full (vstack)"); 3934 vtop++; 3935 *vtop = *v; 3936} 3937 3938static void vdup(void) 3939{ 3940 vpushv(vtop); 3941} 3942 3943 3944 3945 3946static void vrotb(int n) 3947{ 3948 int i; 3949 SValue tmp; 3950 3951 tmp = vtop[-n + 1]; 3952 for(i=-n+1;i!=0;i++) 3953 vtop[i] = vtop[i+1]; 3954 vtop[0] = tmp; 3955} 3956 3957 3958 3959 3960static void vrote(SValue *e, int n) 3961{ 3962 int i; 3963 SValue tmp; 3964 3965 tmp = *e; 3966 for(i = 0;i < n - 1; i++) 3967 e[-i] = e[-i - 1]; 3968 e[-n + 1] = tmp; 3969} 3970 3971 3972 3973 3974static void vrott(int n) 3975{ 3976 vrote(vtop, n); 3977} 3978 3979 3980static inline void vpushsym(CType *type, Sym *sym) 3981{ 3982 CValue cval; 3983 cval.i = 0; 3984 vsetc(type, 0x0030 | 0x0200, &cval); 3985 vtop->sym = sym; 3986} 3987 3988 3989static Sym *get_sym_ref(CType *type, Section *sec, unsigned long offset, unsigned long size) 3990{ 3991 int v; 3992 Sym *sym; 3993 3994 v = anon_sym++; 3995 sym = global_identifier_push(v, type->t | 0x00002000, 0); 3996 sym->type.ref = type->ref; 3997 sym->r = 0x0030 | 0x0200; 3998 put_extern_sym(sym, sec, offset, size); 3999 return sym; 4000} 4001 4002 4003static void vpush_ref(CType *type, Section *sec, unsigned long offset, unsigned long size) 4004{ 4005 vpushsym(type, get_sym_ref(type, sec, offset, size)); 4006} 4007 4008 4009static Sym *external_global_sym(int v, CType *type, int r) 4010{ 4011 Sym *s; 4012 4013 s = sym_find(v); 4014 if (!s) { 4015 4016 s = global_identifier_push(v, type->t | 0x00001000, 0); 4017 s->type.ref = type->ref; 4018 s->r = r | 0x0030 | 0x0200; 4019 } else if ((((s)->type.t & (0x000f | (0 | 0x0010))) == (0 | 0x0010))) { 4020 s->type.t = type->t | (s->type.t & 0x00001000); 4021 s->type.ref = type->ref; 4022 update_storage(s); 4023 } 4024 return s; 4025} 4026 4027 4028static void patch_type(Sym *sym, CType *type) 4029{ 4030 if (!(type->t & 0x00001000)) { 4031 if (!(sym->type.t & 0x00001000)) 4032 tcc_error("redefinition of '%s'", get_tok_str(sym->v, 0)); 4033 sym->type.t &= ~0x00001000; 4034 } 4035 4036 if ((((sym)->type.t & (0x000f | (0 | 0x0010))) == (0 | 0x0010))) { 4037 4038 sym->type.t = type->t & (sym->type.t | ~0x00002000); 4039 sym->type.ref = type->ref; 4040 } 4041 4042 if (!is_compatible_types(&sym->type, type)) { 4043 tcc_error("incompatible types for redefinition of '%s'", 4044 get_tok_str(sym->v, 0)); 4045 4046 } else if ((sym->type.t & 0x000f) == 6) { 4047 int static_proto = sym->type.t & 0x00002000; 4048 4049 if ((type->t & 0x00002000) && !static_proto && !(type->t & 0x00008000)) 4050 tcc_warning("static storage ignored for redefinition of '%s'", 4051 get_tok_str(sym->v, 0)); 4052 4053 if (0 == (type->t & 0x00001000)) { 4054 4055 sym->type.t = (type->t & ~0x00002000) | static_proto; 4056 if (type->t & 0x00008000) 4057 sym->type.t = type->t; 4058 sym->type.ref = type->ref; 4059 } 4060 4061 } else { 4062 if ((sym->type.t & 0x0040) && type->ref->c >= 0) { 4063 4064 if (sym->type.ref->c < 0) 4065 sym->type.ref->c = type->ref->c; 4066 else if (sym->type.ref->c != type->ref->c) 4067 tcc_error("conflicting type for '%s'", get_tok_str(sym->v, 0)); 4068 } 4069 if ((type->t ^ sym->type.t) & 0x00002000) 4070 tcc_warning("storage mismatch for redefinition of '%s'", 4071 get_tok_str(sym->v, 0)); 4072 } 4073} 4074 4075 4076 4077static void patch_storage(Sym *sym, AttributeDef *ad, CType *type) 4078{ 4079 if (type) 4080 patch_type(sym, type); 4081 4082 4083 4084 4085 4086 4087 4088 sym->a.weak |= ad->a.weak; 4089 if (ad->a.visibility) { 4090 int vis = sym->a.visibility; 4091 int vis2 = ad->a.visibility; 4092 if (vis == 0) 4093 vis = vis2; 4094 else if (vis2 != 0) 4095 vis = (vis < vis2) ? vis : vis2; 4096 sym->a.visibility = vis; 4097 } 4098 if (ad->a.aligned) 4099 sym->a.aligned = ad->a.aligned; 4100 if (ad->asm_label) 4101 sym->asm_label = ad->asm_label; 4102 update_storage(sym); 4103} 4104 4105 4106static Sym *external_sym(int v, CType *type, int r, AttributeDef *ad) 4107{ 4108 Sym *s; 4109 s = sym_find(v); 4110 if (!s) { 4111 4112 s = sym_push(v, type, r | 0x0030 | 0x0200, 0); 4113 s->type.t |= 0x00001000; 4114 s->a = ad->a; 4115 s->sym_scope = 0; 4116 } else { 4117 if (s->type.ref == func_old_type.ref) { 4118 s->type.ref = type->ref; 4119 s->r = r | 0x0030 | 0x0200; 4120 s->type.t |= 0x00001000; 4121 } 4122 patch_storage(s, ad, type); 4123 } 4124 return s; 4125} 4126 4127 4128static void vpush_global_sym(CType *type, int v) 4129{ 4130 vpushsym(type, external_global_sym(v, type, 0)); 4131} 4132 4133 4134static void save_regs(int n) 4135{ 4136 SValue *p, *p1; 4137 for(p = (__vstack + 1), p1 = vtop - n; p <= p1; p++) 4138 save_reg(p->r); 4139} 4140 4141 4142static void save_reg(int r) 4143{ 4144 save_reg_upstack(r, 0); 4145} 4146 4147 4148 4149static void save_reg_upstack(int r, int n) 4150{ 4151 int l, saved, size, align; 4152 SValue *p, *p1, sv; 4153 CType *type; 4154 4155 if ((r &= 0x003f) >= 0x0030) 4156 return; 4157 if (nocode_wanted) 4158 return; 4159 4160 4161 saved = 0; 4162 l = 0; 4163 for(p = (__vstack + 1), p1 = vtop - n; p <= p1; p++) { 4164 if ((p->r & 0x003f) == r || 4165 ((p->type.t & 0x000f) == 4 && (p->r2 & 0x003f) == r)) { 4166 4167 if (!saved) { 4168 4169 r = p->r & 0x003f; 4170 4171 type = &p->type; 4172 if ((p->r & 0x0100) || 4173 (!is_float(type->t) && (type->t & 0x000f) != 4)) 4174 4175 type = &char_pointer_type; 4176 4177 4178 4179 size = type_size(type, &align); 4180 loc = (loc - size) & -align; 4181 sv.type.t = type->t; 4182 sv.r = 0x0032 | 0x0100; 4183 sv.c.i = loc; 4184 store(r, &sv); 4185 4186 4187 if (r == TREG_ST0) { 4188 o(0xd8dd); 4189 } 4190# 1018 "tccgen.c" 4191 l = loc; 4192 saved = 1; 4193 } 4194 4195 if (p->r & 0x0100) { 4196 4197 4198 4199 p->r = (p->r & ~(0x003f | 0x8000)) | 0x0031; 4200 } else { 4201 p->r = lvalue_type(p->type.t) | 0x0032; 4202 } 4203 p->r2 = 0x0030; 4204 p->c.i = l; 4205 } 4206 } 4207} 4208# 1062 "tccgen.c" 4209static int get_reg(int rc) 4210{ 4211 int r; 4212 SValue *p; 4213 4214 4215 for(r=0;r<25;r++) { 4216 if (reg_classes[r] & rc) { 4217 if (nocode_wanted) 4218 return r; 4219 for(p=(__vstack + 1);p<=vtop;p++) { 4220 if ((p->r & 0x003f) == r || 4221 (p->r2 & 0x003f) == r) 4222 goto notfound; 4223 } 4224 return r; 4225 } 4226 notfound: ; 4227 } 4228 4229 4230 4231 4232 for(p=(__vstack + 1);p<=vtop;p++) { 4233 4234 r = p->r2 & 0x003f; 4235 if (r < 0x0030 && (reg_classes[r] & rc)) 4236 goto save_found; 4237 r = p->r & 0x003f; 4238 if (r < 0x0030 && (reg_classes[r] & rc)) { 4239 save_found: 4240 save_reg(r); 4241 return r; 4242 } 4243 } 4244 4245 return -1; 4246} 4247 4248 4249 4250static void move_reg(int r, int s, int t) 4251{ 4252 SValue sv; 4253 4254 if (r != s) { 4255 save_reg(r); 4256 sv.type.t = t; 4257 sv.type.ref = 0; 4258 sv.r = s; 4259 sv.c.i = 0; 4260 load(r, &sv); 4261 } 4262} 4263 4264 4265static void gaddrof(void) 4266{ 4267 vtop->r &= ~0x0100; 4268 4269 if ((vtop->r & 0x003f) == 0x0031) 4270 vtop->r = (vtop->r & ~(0x003f | (0x1000 | 0x2000 | 0x4000))) | 0x0032 | 0x0100; 4271 4272 4273} 4274 4275 4276 4277static void gbound(void) 4278{ 4279 int lval_type; 4280 CType type1; 4281 4282 vtop->r &= ~0x0800; 4283 4284 if (vtop->r & 0x0100) { 4285 4286 if (!(vtop->r & 0x8000)) { 4287 lval_type = vtop->r & ((0x1000 | 0x2000 | 0x4000) | 0x0100); 4288 4289 type1 = vtop->type; 4290 vtop->type.t = 5; 4291 gaddrof(); 4292 vpushi(0); 4293 gen_bounded_ptr_add(); 4294 vtop->r |= lval_type; 4295 vtop->type = type1; 4296 } 4297 4298 gen_bounded_ptr_deref(); 4299 } 4300} 4301 4302 4303static void incr_bf_adr(int o) 4304{ 4305 vtop->type = char_pointer_type; 4306 gaddrof(); 4307 vpushi(o); 4308 gen_op('+'); 4309 vtop->type.t = (vtop->type.t & ~(0x000f|0x0020)) 4310 | (1|0x0010); 4311 vtop->r = (vtop->r & ~(0x1000 | 0x2000 | 0x4000)) 4312 | (0x1000|0x4000|0x0100); 4313} 4314 4315 4316static void load_packed_bf(CType *type, int bit_pos, int bit_size) 4317{ 4318 int n, o, bits; 4319 save_reg_upstack(vtop->r, 1); 4320 vpush64(type->t & 0x000f, 0); 4321 bits = 0, o = bit_pos >> 3, bit_pos &= 7; 4322 do { 4323 vswap(); 4324 incr_bf_adr(o); 4325 vdup(); 4326 n = 8 - bit_pos; 4327 if (n > bit_size) 4328 n = bit_size; 4329 if (bit_pos) 4330 vpushi(bit_pos), gen_op(0xc9), bit_pos = 0; 4331 if (n < 8) 4332 vpushi((1 << n) - 1), gen_op('&'); 4333 gen_cast(type); 4334 if (bits) 4335 vpushi(bits), gen_op(0x01); 4336 vrotb(3); 4337 gen_op('|'); 4338 bits += n, bit_size -= n, o = 1; 4339 } while (bit_size); 4340 vswap(), vpop(); 4341 if (!(type->t & 0x0010)) { 4342 n = ((type->t & 0x000f) == 4 ? 64 : 32) - bits; 4343 vpushi(n), gen_op(0x01); 4344 vpushi(n), gen_op(0x02); 4345 } 4346} 4347 4348 4349static void store_packed_bf(int bit_pos, int bit_size) 4350{ 4351 int bits, n, o, m, c; 4352 4353 c = (vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 4354 vswap(); 4355 save_reg_upstack(vtop->r, 1); 4356 bits = 0, o = bit_pos >> 3, bit_pos &= 7; 4357 do { 4358 incr_bf_adr(o); 4359 vswap(); 4360 c ? vdup() : gv_dup(); 4361 vrott(3); 4362 if (bits) 4363 vpushi(bits), gen_op(0xc9); 4364 if (bit_pos) 4365 vpushi(bit_pos), gen_op(0x01); 4366 n = 8 - bit_pos; 4367 if (n > bit_size) 4368 n = bit_size; 4369 if (n < 8) { 4370 m = ((1 << n) - 1) << bit_pos; 4371 vpushi(m), gen_op('&'); 4372 vpushv(vtop-1); 4373 vpushi(m & 0x80 ? ~m & 0x7f : ~m); 4374 gen_op('&'); 4375 gen_op('|'); 4376 } 4377 vdup(), vtop[-1] = vtop[-2]; 4378 vstore(), vpop(); 4379 bits += n, bit_size -= n, bit_pos = 0, o = 1; 4380 } while (bit_size); 4381 vpop(), vpop(); 4382} 4383 4384static int adjust_bf(SValue *sv, int bit_pos, int bit_size) 4385{ 4386 int t; 4387 if (0 == sv->type.ref) 4388 return 0; 4389 t = sv->type.ref->auxtype; 4390 if (t != -1 && t != 7) { 4391 sv->type.t = (sv->type.t & ~0x000f) | t; 4392 sv->r = (sv->r & ~(0x1000 | 0x2000 | 0x4000)) | lvalue_type(sv->type.t); 4393 } 4394 return t; 4395} 4396 4397 4398 4399 4400static int gv(int rc) 4401{ 4402 int r, bit_pos, bit_size, size, align, rc2; 4403 4404 4405 if (vtop->type.t & 0x0080) { 4406 CType type; 4407 4408 bit_pos = (((vtop->type.t) >> 20) & 0x3f); 4409 bit_size = (((vtop->type.t) >> (20 + 6)) & 0x3f); 4410 4411 vtop->type.t &= ~(((1 << (6+6)) - 1) << 20 | 0x0080); 4412 4413 type.ref = 0; 4414 type.t = vtop->type.t & 0x0010; 4415 if ((vtop->type.t & 0x000f) == 11) 4416 type.t |= 0x0010; 4417 4418 r = adjust_bf(vtop, bit_pos, bit_size); 4419 4420 if ((vtop->type.t & 0x000f) == 4) 4421 type.t |= 4; 4422 else 4423 type.t |= 3; 4424 4425 if (r == 7) { 4426 load_packed_bf(&type, bit_pos, bit_size); 4427 } else { 4428 int bits = (type.t & 0x000f) == 4 ? 64 : 32; 4429 4430 gen_cast(&type); 4431 4432 vpushi(bits - (bit_pos + bit_size)); 4433 gen_op(0x01); 4434 vpushi(bits - bit_size); 4435 4436 gen_op(0x02); 4437 } 4438 r = gv(rc); 4439 } else { 4440 if (is_float(vtop->type.t) && 4441 (vtop->r & (0x003f | 0x0100)) == 0x0030) { 4442 unsigned long offset; 4443 4444 4445 size = type_size(&vtop->type, &align); 4446 if ((nocode_wanted > 0)) 4447 size = 0, align = 1; 4448 offset = section_add(data_section, size, align); 4449 vpush_ref(&vtop->type, data_section, offset, size); 4450 vswap(); 4451 init_putv(&vtop->type, data_section, offset); 4452 vtop->r |= 0x0100; 4453 } 4454 4455 if (vtop->r & 0x0800) 4456 gbound(); 4457 4458 4459 r = vtop->r & 0x003f; 4460 rc2 = (rc & 0x0002) ? 0x0002 : 0x0001; 4461 4462 if (rc == 0x0004) 4463 rc2 = 0x0010; 4464 4465 else if (rc == 0x1000) 4466 rc2 = 0x2000; 4467 4468 4469 4470 4471 4472 4473 if (r >= 0x0030 4474 || (vtop->r & 0x0100) 4475 || !(reg_classes[r] & rc) 4476 4477 || ((vtop->type.t & 0x000f) == 13 && !(reg_classes[vtop->r2] & rc2)) 4478 || ((vtop->type.t & 0x000f) == 14 && !(reg_classes[vtop->r2] & rc2)) 4479 4480 4481 4482 ) 4483 { 4484 r = get_reg(rc); 4485 4486 if (((vtop->type.t & 0x000f) == 13) || ((vtop->type.t & 0x000f) == 14)) { 4487 int addr_type = 4, load_size = 8, load_type = ((vtop->type.t & 0x000f) == 13) ? 4 : 9; 4488 4489 4490 4491 4492 4493 int r2, original_type; 4494 original_type = vtop->type.t; 4495# 1360 "tccgen.c" 4496 if (vtop->r & 0x0100) { 4497# 1369 "tccgen.c" 4498 save_reg_upstack(vtop->r, 1); 4499 4500 4501 vtop->type.t = load_type; 4502 load(r, vtop); 4503 vdup(); 4504 vtop[-1].r = r; 4505 4506 vtop->type.t = addr_type; 4507 gaddrof(); 4508 vpushi(load_size); 4509 gen_op('+'); 4510 vtop->r |= 0x0100; 4511 vtop->type.t = load_type; 4512 } else { 4513 4514 load(r, vtop); 4515 vdup(); 4516 vtop[-1].r = r; 4517 vtop->r = vtop[-1].r2; 4518 } 4519 4520 4521 r2 = get_reg(rc2); 4522 load(r2, vtop); 4523 vpop(); 4524 4525 vtop->r2 = r2; 4526 vtop->type.t = original_type; 4527 } else if ((vtop->r & 0x0100) && !is_float(vtop->type.t)) { 4528 int t1, t; 4529 4530 4531 t = vtop->type.t; 4532 t1 = t; 4533 4534 if (vtop->r & 0x1000) 4535 t = 1; 4536 else if (vtop->r & 0x2000) 4537 t = 2; 4538 if (vtop->r & 0x4000) 4539 t |= 0x0010; 4540 vtop->type.t = t; 4541 load(r, vtop); 4542 4543 vtop->type.t = t1; 4544 } else { 4545 4546 load(r, vtop); 4547 } 4548 } 4549 vtop->r = r; 4550 4551 4552 4553 4554 4555 } 4556 return r; 4557} 4558 4559 4560static void gv2(int rc1, int rc2) 4561{ 4562 int v; 4563 4564 4565 4566 4567 v = vtop[0].r & 0x003f; 4568 if (v != 0x0033 && (v & ~1) != 0x0034 && rc1 <= rc2) { 4569 vswap(); 4570 gv(rc1); 4571 vswap(); 4572 gv(rc2); 4573 4574 if ((vtop[-1].r & 0x003f) >= 0x0030) { 4575 vswap(); 4576 gv(rc1); 4577 vswap(); 4578 } 4579 } else { 4580 gv(rc2); 4581 vswap(); 4582 gv(rc1); 4583 vswap(); 4584 4585 if ((vtop[0].r & 0x003f) >= 0x0030) { 4586 gv(rc2); 4587 } 4588 } 4589} 4590 4591 4592 4593static int rc_fret(int t) 4594{ 4595 4596 if (t == 10) { 4597 return 0x0080; 4598 } 4599 4600 return 0x1000; 4601} 4602 4603 4604 4605static int reg_fret(int t) 4606{ 4607 4608 if (t == 10) { 4609 return TREG_ST0; 4610 } 4611 4612 return TREG_XMM0; 4613} 4614# 1550 "tccgen.c" 4615static void gv_dup(void) 4616{ 4617 int rc, t, r, r1; 4618 SValue sv; 4619 4620 t = vtop->type.t; 4621# 1577 "tccgen.c" 4622 { 4623 4624 rc = 0x0001; 4625 sv.type.t = 3; 4626 if (is_float(t)) { 4627 rc = 0x0002; 4628 4629 if ((t & 0x000f) == 10) { 4630 rc = 0x0080; 4631 } 4632 4633 sv.type.t = t; 4634 } 4635 r = gv(rc); 4636 r1 = get_reg(rc); 4637 sv.r = r; 4638 sv.c.i = 0; 4639 load(r1, &sv); 4640 vdup(); 4641 4642 if (r != r1) 4643 vtop->r = r1; 4644 } 4645} 4646 4647 4648 4649 4650static int gvtst(int inv, int t) 4651{ 4652 int v = vtop->r & 0x003f; 4653 if (v != 0x0033 && v != 0x0034 && v != 0x0035) { 4654 vpushi(0); 4655 gen_op(0x95); 4656 } 4657 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030) { 4658 4659 if ((vtop->c.i != 0) != inv) 4660 t = gjmp(t); 4661 vtop--; 4662 return t; 4663 } 4664 return gtst(inv, t); 4665} 4666# 1851 "tccgen.c" 4667static uint64_t gen_opic_sdiv(uint64_t a, uint64_t b) 4668{ 4669 uint64_t x = (a >> 63 ? -a : a) / (b >> 63 ? -b : b); 4670 return (a ^ b) >> 63 ? -x : x; 4671} 4672 4673static int gen_opic_lt(uint64_t a, uint64_t b) 4674{ 4675 return (a ^ (uint64_t)1 << 63) < (b ^ (uint64_t)1 << 63); 4676} 4677 4678 4679 4680static void gen_opic(int op) 4681{ 4682 SValue *v1 = vtop - 1; 4683 SValue *v2 = vtop; 4684 int t1 = v1->type.t & 0x000f; 4685 int t2 = v2->type.t & 0x000f; 4686 int c1 = (v1->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 4687 int c2 = (v2->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 4688 uint64_t l1 = c1 ? v1->c.i : 0; 4689 uint64_t l2 = c2 ? v2->c.i : 0; 4690 int shm = (t1 == 4) ? 63 : 31; 4691 4692 if (t1 != 4 && (8 != 8 || t1 != 5)) 4693 l1 = ((uint32_t)l1 | 4694 (v1->type.t & 0x0010 ? 0 : -(l1 & 0x80000000))); 4695 if (t2 != 4 && (8 != 8 || t2 != 5)) 4696 l2 = ((uint32_t)l2 | 4697 (v2->type.t & 0x0010 ? 0 : -(l2 & 0x80000000))); 4698 4699 if (c1 && c2) { 4700 switch(op) { 4701 case '+': l1 += l2; break; 4702 case '-': l1 -= l2; break; 4703 case '&': l1 &= l2; break; 4704 case '^': l1 ^= l2; break; 4705 case '|': l1 |= l2; break; 4706 case '*': l1 *= l2; break; 4707 4708 case 0xb2: 4709 case '/': 4710 case '%': 4711 case 0xb0: 4712 case 0xb1: 4713 4714 if (l2 == 0) { 4715 if (const_wanted) 4716 tcc_error("division by zero in constant"); 4717 goto general_case; 4718 } 4719 switch(op) { 4720 default: l1 = gen_opic_sdiv(l1, l2); break; 4721 case '%': l1 = l1 - l2 * gen_opic_sdiv(l1, l2); break; 4722 case 0xb0: l1 = l1 / l2; break; 4723 case 0xb1: l1 = l1 % l2; break; 4724 } 4725 break; 4726 case 0x01: l1 <<= (l2 & shm); break; 4727 case 0xc9: l1 >>= (l2 & shm); break; 4728 case 0x02: 4729 l1 = (l1 >> 63) ? ~(~l1 >> (l2 & shm)) : l1 >> (l2 & shm); 4730 break; 4731 4732 case 0x92: l1 = l1 < l2; break; 4733 case 0x93: l1 = l1 >= l2; break; 4734 case 0x94: l1 = l1 == l2; break; 4735 case 0x95: l1 = l1 != l2; break; 4736 case 0x96: l1 = l1 <= l2; break; 4737 case 0x97: l1 = l1 > l2; break; 4738 case 0x9c: l1 = gen_opic_lt(l1, l2); break; 4739 case 0x9d: l1 = !gen_opic_lt(l1, l2); break; 4740 case 0x9e: l1 = !gen_opic_lt(l2, l1); break; 4741 case 0x9f: l1 = gen_opic_lt(l2, l1); break; 4742 4743 case 0xa0: l1 = l1 && l2; break; 4744 case 0xa1: l1 = l1 || l2; break; 4745 default: 4746 goto general_case; 4747 } 4748 if (t1 != 4 && (8 != 8 || t1 != 5)) 4749 l1 = ((uint32_t)l1 | 4750 (v1->type.t & 0x0010 ? 0 : -(l1 & 0x80000000))); 4751 v1->c.i = l1; 4752 vtop--; 4753 } else { 4754 4755 if (c1 && (op == '+' || op == '&' || op == '^' || 4756 op == '|' || op == '*')) { 4757 vswap(); 4758 c2 = c1; 4759 l2 = l1; 4760 } 4761 if (!const_wanted && 4762 c1 && ((l1 == 0 && 4763 (op == 0x01 || op == 0xc9 || op == 0x02)) || 4764 (l1 == -1 && op == 0x02))) { 4765 4766 vtop--; 4767 } else if (!const_wanted && 4768 c2 && ((l2 == 0 && (op == '&' || op == '*')) || 4769 (op == '|' && 4770 (l2 == -1 || (l2 == 0xFFFFFFFF && t2 != 4))) || 4771 (l2 == 1 && (op == '%' || op == 0xb1)))) { 4772 4773 if (l2 == 1) 4774 vtop->c.i = 0; 4775 vswap(); 4776 vtop--; 4777 } else if (c2 && (((op == '*' || op == '/' || op == 0xb0 || 4778 op == 0xb2) && 4779 l2 == 1) || 4780 ((op == '+' || op == '-' || op == '|' || op == '^' || 4781 op == 0x01 || op == 0xc9 || op == 0x02) && 4782 l2 == 0) || 4783 (op == '&' && 4784 (l2 == -1 || (l2 == 0xFFFFFFFF && t2 != 4))))) { 4785 4786 vtop--; 4787 } else if (c2 && (op == '*' || op == 0xb2 || op == 0xb0)) { 4788 4789 if (l2 > 0 && (l2 & (l2 - 1)) == 0) { 4790 int n = -1; 4791 while (l2) { 4792 l2 >>= 1; 4793 n++; 4794 } 4795 vtop->c.i = n; 4796 if (op == '*') 4797 op = 0x01; 4798 else if (op == 0xb2) 4799 op = 0x02; 4800 else 4801 op = 0xc9; 4802 } 4803 goto general_case; 4804 } else if (c2 && (op == '+' || op == '-') && 4805 (((vtop[-1].r & (0x003f | 0x0100 | 0x0200)) == (0x0030 | 0x0200)) 4806 || (vtop[-1].r & (0x003f | 0x0100)) == 0x0032)) { 4807 4808 if (op == '-') 4809 l2 = -l2; 4810 l2 += vtop[-1].c.i; 4811 4812 4813 if ((int)l2 != l2) 4814 goto general_case; 4815 vtop--; 4816 vtop->c.i = l2; 4817 } else { 4818 general_case: 4819 4820 if (t1 == 4 || t2 == 4 || 4821 (8 == 8 && (t1 == 5 || t2 == 5))) 4822 gen_opl(op); 4823 else 4824 gen_opi(op); 4825 } 4826 } 4827} 4828 4829 4830static void gen_opif(int op) 4831{ 4832 int c1, c2; 4833 SValue *v1, *v2; 4834 4835 4836 4837 4838 long double f1, f2; 4839 4840 v1 = vtop - 1; 4841 v2 = vtop; 4842 4843 c1 = (v1->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 4844 c2 = (v2->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 4845 if (c1 && c2) { 4846 if (v1->type.t == 8) { 4847 f1 = v1->c.f; 4848 f2 = v2->c.f; 4849 } else if (v1->type.t == 9) { 4850 f1 = v1->c.d; 4851 f2 = v2->c.d; 4852 } else { 4853 f1 = v1->c.ld; 4854 f2 = v2->c.ld; 4855 } 4856 4857 4858 4859 if (!ieee_finite(f1) || !ieee_finite(f2)) 4860 goto general_case; 4861 4862 switch(op) { 4863 case '+': f1 += f2; break; 4864 case '-': f1 -= f2; break; 4865 case '*': f1 *= f2; break; 4866 case '/': 4867 if (f2 == 0.0) { 4868 if (const_wanted) 4869 tcc_error("division by zero in constant"); 4870 goto general_case; 4871 } 4872 f1 /= f2; 4873 break; 4874 4875 default: 4876 goto general_case; 4877 } 4878 4879 if (v1->type.t == 8) { 4880 v1->c.f = f1; 4881 } else if (v1->type.t == 9) { 4882 v1->c.d = f1; 4883 } else { 4884 v1->c.ld = f1; 4885 } 4886 vtop--; 4887 } else { 4888 general_case: 4889 gen_opf(op); 4890 } 4891} 4892 4893static int pointed_size(CType *type) 4894{ 4895 int align; 4896 return type_size(pointed_type(type), &align); 4897} 4898 4899static void vla_runtime_pointed_size(CType *type) 4900{ 4901 int align; 4902 vla_runtime_type_size(pointed_type(type), &align); 4903} 4904 4905static inline int is_null_pointer(SValue *p) 4906{ 4907 if ((p->r & (0x003f | 0x0100 | 0x0200)) != 0x0030) 4908 return 0; 4909 return ((p->type.t & 0x000f) == 3 && (uint32_t)p->c.i == 0) || 4910 ((p->type.t & 0x000f) == 4 && p->c.i == 0) || 4911 ((p->type.t & 0x000f) == 5 && 4912 (8 == 4 ? (uint32_t)p->c.i == 0 : p->c.i == 0)); 4913} 4914 4915static inline int is_integer_btype(int bt) 4916{ 4917 return (bt == 1 || bt == 2 || 4918 bt == 3 || bt == 4); 4919} 4920 4921 4922static void check_comparison_pointer_types(SValue *p1, SValue *p2, int op) 4923{ 4924 CType *type1, *type2, tmp_type1, tmp_type2; 4925 int bt1, bt2; 4926 4927 4928 if (is_null_pointer(p1) || is_null_pointer(p2)) 4929 return; 4930 type1 = &p1->type; 4931 type2 = &p2->type; 4932 bt1 = type1->t & 0x000f; 4933 bt2 = type2->t & 0x000f; 4934 4935 if ((is_integer_btype(bt1) || is_integer_btype(bt2)) && op != '-') { 4936 if (op != 0xa1 && op != 0xa0 ) 4937 tcc_warning("comparison between pointer and integer"); 4938 return; 4939 } 4940 4941 4942 if (bt1 == 5) { 4943 type1 = pointed_type(type1); 4944 } else if (bt1 != 6) 4945 goto invalid_operands; 4946 4947 if (bt2 == 5) { 4948 type2 = pointed_type(type2); 4949 } else if (bt2 != 6) { 4950 invalid_operands: 4951 tcc_error("invalid operands to binary %s", get_tok_str(op, 0)); 4952 } 4953 if ((type1->t & 0x000f) == 0 || 4954 (type2->t & 0x000f) == 0) 4955 return; 4956 tmp_type1 = *type1; 4957 tmp_type2 = *type2; 4958 tmp_type1.t &= ~(0x0020 | 0x0010 | 0x0100 | 0x0200); 4959 tmp_type2.t &= ~(0x0020 | 0x0010 | 0x0100 | 0x0200); 4960 if (!is_compatible_types(&tmp_type1, &tmp_type2)) { 4961 4962 if (op == '-') 4963 goto invalid_operands; 4964 else 4965 tcc_warning("comparison of distinct pointer types lacks a cast"); 4966 } 4967} 4968 4969 4970static void gen_op(int op) 4971{ 4972 int u, t1, t2, bt1, bt2, t; 4973 CType type1; 4974 4975redo: 4976 t1 = vtop[-1].type.t; 4977 t2 = vtop[0].type.t; 4978 bt1 = t1 & 0x000f; 4979 bt2 = t2 & 0x000f; 4980 4981 if (bt1 == 7 || bt2 == 7) { 4982 tcc_error("operation on a struct"); 4983 } else if (bt1 == 6 || bt2 == 6) { 4984 if (bt2 == 6) { 4985 mk_pointer(&vtop->type); 4986 gaddrof(); 4987 } 4988 if (bt1 == 6) { 4989 vswap(); 4990 mk_pointer(&vtop->type); 4991 gaddrof(); 4992 vswap(); 4993 } 4994 goto redo; 4995 } else if (bt1 == 5 || bt2 == 5) { 4996 4997 4998 if (op >= 0x92 && op <= 0xa1) { 4999 check_comparison_pointer_types(vtop - 1, vtop, op); 5000 5001 5002 t = 4 | 0x0010; 5003 5004 5005 5006 goto std_op; 5007 } 5008 5009 if (bt1 == 5 && bt2 == 5) { 5010 if (op != '-') 5011 tcc_error("cannot use pointers here"); 5012 check_comparison_pointer_types(vtop - 1, vtop, op); 5013 5014 if (vtop[-1].type.t & 0x0400) { 5015 vla_runtime_pointed_size(&vtop[-1].type); 5016 } else { 5017 vpushi(pointed_size(&vtop[-1].type)); 5018 } 5019 vrott(3); 5020 gen_opic(op); 5021 vtop->type.t = ptrdiff_type.t; 5022 vswap(); 5023 gen_op(0xb2); 5024 } else { 5025 5026 if (op != '-' && op != '+') 5027 tcc_error("cannot use pointers here"); 5028 5029 if (bt2 == 5) { 5030 vswap(); 5031 t = t1, t1 = t2, t2 = t; 5032 } 5033 5034 5035 5036 5037 5038 type1 = vtop[-1].type; 5039 type1.t &= ~0x0040; 5040 if (vtop[-1].type.t & 0x0400) 5041 vla_runtime_pointed_size(&vtop[-1].type); 5042 else { 5043 u = pointed_size(&vtop[-1].type); 5044 if (u < 0) 5045 tcc_error("unknown array element size"); 5046 5047 vpushll(u); 5048 5049 5050 5051 5052 } 5053 gen_op('*'); 5054# 2267 "tccgen.c" 5055 { 5056 gen_opic(op); 5057 } 5058 5059 vtop->type = type1; 5060 } 5061 } else if (is_float(bt1) || is_float(bt2)) { 5062 5063 if (bt1 == 10 || bt2 == 10) { 5064 t = 10; 5065 } else if (bt1 == 9 || bt2 == 9) { 5066 t = 9; 5067 } else { 5068 t = 8; 5069 } 5070 5071 if (op != '+' && op != '-' && op != '*' && op != '/' && 5072 (op < 0x92 || op > 0x9f)) 5073 tcc_error("invalid operands for binary operation"); 5074 goto std_op; 5075 } else if (op == 0xc9 || op == 0x02 || op == 0x01) { 5076 t = bt1 == 4 ? 4 : 3; 5077 if ((t1 & (0x000f | 0x0010 | 0x0080)) == (t | 0x0010)) 5078 t |= 0x0010; 5079 t |= (0x0800 & t1); 5080 goto std_op; 5081 } else if (bt1 == 4 || bt2 == 4) { 5082 5083 t = 4 | 0x0800; 5084 if (bt1 == 4) 5085 t &= t1; 5086 if (bt2 == 4) 5087 t &= t2; 5088 5089 if ((t1 & (0x000f | 0x0010 | 0x0080)) == (4 | 0x0010) || 5090 (t2 & (0x000f | 0x0010 | 0x0080)) == (4 | 0x0010)) 5091 t |= 0x0010; 5092 goto std_op; 5093 } else { 5094 5095 t = 3 | (0x0800 & (t1 | t2)); 5096 5097 if ((t1 & (0x000f | 0x0010 | 0x0080)) == (3 | 0x0010) || 5098 (t2 & (0x000f | 0x0010 | 0x0080)) == (3 | 0x0010)) 5099 t |= 0x0010; 5100 std_op: 5101 5102 5103 if (t & 0x0010) { 5104 if (op == 0x02) 5105 op = 0xc9; 5106 else if (op == '/') 5107 op = 0xb0; 5108 else if (op == '%') 5109 op = 0xb1; 5110 else if (op == 0x9c) 5111 op = 0x92; 5112 else if (op == 0x9f) 5113 op = 0x97; 5114 else if (op == 0x9e) 5115 op = 0x96; 5116 else if (op == 0x9d) 5117 op = 0x93; 5118 } 5119 vswap(); 5120 type1.t = t; 5121 type1.ref = 0; 5122 gen_cast(&type1); 5123 vswap(); 5124 5125 5126 if (op == 0xc9 || op == 0x02 || op == 0x01) 5127 type1.t = 3; 5128 gen_cast(&type1); 5129 if (is_float(t)) 5130 gen_opif(op); 5131 else 5132 gen_opic(op); 5133 if (op >= 0x92 && op <= 0x9f) { 5134 5135 vtop->type.t = 3; 5136 } else { 5137 vtop->type.t = t; 5138 } 5139 } 5140 5141 if (vtop->r & 0x0100) 5142 gv(is_float(vtop->type.t & 0x000f) ? 0x0002 : 0x0001); 5143} 5144 5145 5146 5147static void gen_cvt_itof1(int t) 5148{ 5149 5150 5151 5152 if ((vtop->type.t & (0x000f | 0x0010)) == 5153 (4 | 0x0010)) { 5154 5155 if (t == 8) 5156 vpush_global_sym(&func_old_type, TOK___floatundisf); 5157 5158 else if (t == 10) 5159 vpush_global_sym(&func_old_type, TOK___floatundixf); 5160 5161 else 5162 vpush_global_sym(&func_old_type, TOK___floatundidf); 5163 vrott(2); 5164 gfunc_call(1); 5165 vpushi(0); 5166 vtop->r = reg_fret(t); 5167 } else { 5168 gen_cvt_itof(t); 5169 } 5170 5171} 5172 5173 5174 5175static void gen_cvt_ftoi1(int t) 5176{ 5177 5178 5179 5180 int st; 5181 5182 if (t == (4 | 0x0010)) { 5183 5184 st = vtop->type.t & 0x000f; 5185 if (st == 8) 5186 vpush_global_sym(&func_old_type, TOK___fixunssfdi); 5187 5188 else if (st == 10) 5189 vpush_global_sym(&func_old_type, TOK___fixunsxfdi); 5190 5191 else 5192 vpush_global_sym(&func_old_type, TOK___fixunsdfdi); 5193 vrott(2); 5194 gfunc_call(1); 5195 vpushi(0); 5196 vtop->r = TREG_RAX; 5197 vtop->r2 = TREG_RDX; 5198 } else { 5199 gen_cvt_ftoi(t); 5200 } 5201 5202} 5203 5204 5205static void force_charshort_cast(int t) 5206{ 5207 int bits, dbt; 5208 5209 5210 if ((nocode_wanted & 0xC0000000)) 5211 return; 5212 5213 dbt = t & 0x000f; 5214 5215 if (dbt == 1) 5216 bits = 8; 5217 else 5218 bits = 16; 5219 if (t & 0x0010) { 5220 vpushi((1 << bits) - 1); 5221 gen_op('&'); 5222 } else { 5223 if ((vtop->type.t & 0x000f) == 4) 5224 bits = 64 - bits; 5225 else 5226 bits = 32 - bits; 5227 vpushi(bits); 5228 gen_op(0x01); 5229 5230 5231 5232 vtop->type.t &= ~0x0010; 5233 vpushi(bits); 5234 gen_op(0x02); 5235 } 5236} 5237 5238 5239static void gen_cast_s(int t) 5240{ 5241 CType type; 5242 type.t = t; 5243 type.ref = 0; 5244 gen_cast(&type); 5245} 5246 5247static void gen_cast(CType *type) 5248{ 5249 int sbt, dbt, sf, df, c, p; 5250 5251 5252 5253 5254 if (vtop->r & 0x0400) { 5255 vtop->r &= ~0x0400; 5256 force_charshort_cast(vtop->type.t); 5257 } 5258 5259 5260 if (vtop->type.t & 0x0080) { 5261 gv(0x0001); 5262 } 5263 5264 dbt = type->t & (0x000f | 0x0010); 5265 sbt = vtop->type.t & (0x000f | 0x0010); 5266 5267 if (sbt != dbt) { 5268 sf = is_float(sbt); 5269 df = is_float(dbt); 5270 c = (vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 5271 p = (vtop->r & (0x003f | 0x0100 | 0x0200)) == (0x0030 | 0x0200); 5272 5273 5274 5275 if (c) { 5276 5277 5278 if (sbt == 8) 5279 vtop->c.ld = vtop->c.f; 5280 else if (sbt == 9) 5281 vtop->c.ld = vtop->c.d; 5282 5283 if (df) { 5284 if ((sbt & 0x000f) == 4) { 5285 if ((sbt & 0x0010) || !(vtop->c.i >> 63)) 5286 vtop->c.ld = vtop->c.i; 5287 else 5288 vtop->c.ld = -(long double)-vtop->c.i; 5289 } else if(!sf) { 5290 if ((sbt & 0x0010) || !(vtop->c.i >> 31)) 5291 vtop->c.ld = (uint32_t)vtop->c.i; 5292 else 5293 vtop->c.ld = -(long double)-(uint32_t)vtop->c.i; 5294 } 5295 5296 if (dbt == 8) 5297 vtop->c.f = (float)vtop->c.ld; 5298 else if (dbt == 9) 5299 vtop->c.d = (double)vtop->c.ld; 5300 } else if (sf && dbt == (4|0x0010)) { 5301 vtop->c.i = vtop->c.ld; 5302 } else if (sf && dbt == 11) { 5303 vtop->c.i = (vtop->c.ld != 0); 5304 } else { 5305 if(sf) 5306 vtop->c.i = vtop->c.ld; 5307 else if (sbt == (4|0x0010)) 5308 ; 5309 else if (sbt & 0x0010) 5310 vtop->c.i = (uint32_t)vtop->c.i; 5311 5312 else if (sbt == 5) 5313 ; 5314 5315 else if (sbt != 4) 5316 vtop->c.i = ((uint32_t)vtop->c.i | 5317 -(vtop->c.i & 0x80000000)); 5318 5319 if (dbt == (4|0x0010)) 5320 ; 5321 else if (dbt == 11) 5322 vtop->c.i = (vtop->c.i != 0); 5323 5324 else if (dbt == 5) 5325 ; 5326 5327 else if (dbt != 4) { 5328 uint32_t m = ((dbt & 0x000f) == 1 ? 0xff : 5329 (dbt & 0x000f) == 2 ? 0xffff : 5330 0xffffffff); 5331 vtop->c.i &= m; 5332 if (!(dbt & 0x0010)) 5333 vtop->c.i |= -(vtop->c.i & ((m >> 1) + 1)); 5334 } 5335 } 5336 } else if (p && dbt == 11) { 5337 vtop->r = 0x0030; 5338 vtop->c.i = 1; 5339 } else { 5340 5341 if (sf && df) { 5342 5343 gen_cvt_ftof(dbt); 5344 } else if (df) { 5345 5346 gen_cvt_itof1(dbt); 5347 } else if (sf) { 5348 5349 if (dbt == 11) { 5350 vpushi(0); 5351 gen_op(0x95); 5352 } else { 5353 5354 if (dbt != (3 | 0x0010) && 5355 dbt != (4 | 0x0010) && 5356 dbt != 4) 5357 dbt = 3; 5358 gen_cvt_ftoi1(dbt); 5359 if (dbt == 3 && (type->t & (0x000f | 0x0010)) != dbt) { 5360 5361 vtop->type.t = dbt; 5362 gen_cast(type); 5363 } 5364 } 5365# 2602 "tccgen.c" 5366 } else if ((dbt & 0x000f) == 4 || 5367 (dbt & 0x000f) == 5 || 5368 (dbt & 0x000f) == 6) { 5369 if ((sbt & 0x000f) != 4 && 5370 (sbt & 0x000f) != 5 && 5371 (sbt & 0x000f) != 6) { 5372 5373 gv(0x0001); 5374 if (sbt != (3 | 0x0010)) { 5375 5376 5377 5378 int r = gv(0x0001); 5379 5380 o(0x6348); 5381 o(0xc0 + (((r) & 7) << 3) + ((r) & 7)); 5382 5383 5384 5385 } 5386 } 5387 5388 } else if (dbt == 11) { 5389 5390 vpushi(0); 5391 gen_op(0x95); 5392 } else if ((dbt & 0x000f) == 1 || 5393 (dbt & 0x000f) == 2) { 5394 if (sbt == 5) { 5395 vtop->type.t = 3; 5396 tcc_warning("nonportable conversion from pointer to char/short"); 5397 } 5398 force_charshort_cast(dbt); 5399# 2647 "tccgen.c" 5400 } 5401 } 5402 } else if ((dbt & 0x000f) == 5 && !(vtop->r & 0x0100)) { 5403 5404 5405 vtop->r = (vtop->r & ~(0x1000 | 0x2000 | 0x4000)) 5406 | (lvalue_type(type->ref->type.t) & (0x1000 | 0x2000 | 0x4000)); 5407 } 5408 vtop->type = *type; 5409} 5410 5411 5412static int type_size(CType *type, int *a) 5413{ 5414 Sym *s; 5415 int bt; 5416 5417 bt = type->t & 0x000f; 5418 if (bt == 7) { 5419 5420 s = type->ref; 5421 *a = s->r; 5422 return s->c; 5423 } else if (bt == 5) { 5424 if (type->t & 0x0040) { 5425 int ts; 5426 5427 s = type->ref; 5428 ts = type_size(&s->type, a); 5429 5430 if (ts < 0 && s->c < 0) 5431 ts = -ts; 5432 5433 return ts * s->c; 5434 } else { 5435 *a = 8; 5436 return 8; 5437 } 5438 } else if (((type->t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20)) && type->ref->c == -1) { 5439 return -1; 5440 } else if (bt == 10) { 5441 *a = 16; 5442 return 16; 5443 } else if (bt == 9 || bt == 4) { 5444# 2704 "tccgen.c" 5445 *a = 8; 5446 5447 return 8; 5448 } else if (bt == 3 || bt == 8) { 5449 *a = 4; 5450 return 4; 5451 } else if (bt == 2) { 5452 *a = 2; 5453 return 2; 5454 } else if (bt == 13 || bt == 14) { 5455 *a = 8; 5456 return 16; 5457 } else { 5458 5459 *a = 1; 5460 return 1; 5461 } 5462} 5463 5464 5465 5466static void vla_runtime_type_size(CType *type, int *a) 5467{ 5468 if (type->t & 0x0400) { 5469 type_size(&type->ref->type, a); 5470 vset(&int_type, 0x0032|0x0100, type->ref->c); 5471 } else { 5472 vpushi(type_size(type, a)); 5473 } 5474} 5475 5476static void vla_sp_restore(void) { 5477 if (vlas_in_scope) { 5478 gen_vla_sp_restore(vla_sp_loc); 5479 } 5480} 5481 5482static void vla_sp_restore_root(void) { 5483 if (vlas_in_scope) { 5484 gen_vla_sp_restore(vla_sp_root_loc); 5485 } 5486} 5487 5488 5489static inline CType *pointed_type(CType *type) 5490{ 5491 return &type->ref->type; 5492} 5493 5494 5495static void mk_pointer(CType *type) 5496{ 5497 Sym *s; 5498 s = sym_push(0x20000000, type, 0, -1); 5499 type->t = 5 | (type->t & (0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)); 5500 type->ref = s; 5501} 5502 5503 5504static int is_compatible_func(CType *type1, CType *type2) 5505{ 5506 Sym *s1, *s2; 5507 5508 s1 = type1->ref; 5509 s2 = type2->ref; 5510 if (!is_compatible_types(&s1->type, &s2->type)) 5511 return 0; 5512 5513 if (s1->f.func_call != s2->f.func_call) 5514 return 0; 5515 5516 if (s1->f.func_type == 2 || s2->f.func_type == 2) 5517 return 1; 5518 if (s1->f.func_type != s2->f.func_type) 5519 return 0; 5520 while (s1 != 0) { 5521 if (s2 == 0) 5522 return 0; 5523 if (!is_compatible_unqualified_types(&s1->type, &s2->type)) 5524 return 0; 5525 s1 = s1->next; 5526 s2 = s2->next; 5527 } 5528 if (s2) 5529 return 0; 5530 return 1; 5531} 5532 5533 5534 5535 5536 5537 5538static int compare_types(CType *type1, CType *type2, int unqualified) 5539{ 5540 int bt1, t1, t2; 5541 5542 t1 = type1->t & (~((0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)|(((1 << (6+6)) - 1) << 20 | 0x0080))); 5543 t2 = type2->t & (~((0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)|(((1 << (6+6)) - 1) << 20 | 0x0080))); 5544 if (unqualified) { 5545 5546 t1 &= ~(0x0100 | 0x0200); 5547 t2 &= ~(0x0100 | 0x0200); 5548 } 5549 5550 5551 if ((t1 & 0x000f) != 1) { 5552 t1 &= ~0x0020; 5553 t2 &= ~0x0020; 5554 } 5555 5556 if (t1 != t2) 5557 return 0; 5558 5559 bt1 = t1 & 0x000f; 5560 if (bt1 == 5) { 5561 type1 = pointed_type(type1); 5562 type2 = pointed_type(type2); 5563 return is_compatible_types(type1, type2); 5564 } else if (bt1 == 7) { 5565 return (type1->ref == type2->ref); 5566 } else if (bt1 == 6) { 5567 return is_compatible_func(type1, type2); 5568 } else { 5569 return 1; 5570 } 5571} 5572 5573 5574 5575 5576static int is_compatible_types(CType *type1, CType *type2) 5577{ 5578 return compare_types(type1,type2,0); 5579} 5580 5581 5582 5583static int is_compatible_unqualified_types(CType *type1, CType *type2) 5584{ 5585 return compare_types(type1,type2,1); 5586} 5587 5588 5589 5590 5591 5592static void type_to_str(char *buf, int buf_size, 5593 CType *type, const char *varstr) 5594{ 5595 int bt, v, t; 5596 Sym *s, *sa; 5597 char buf1[256]; 5598 const char *tstr; 5599 5600 t = type->t; 5601 bt = t & 0x000f; 5602 buf[0] = '\0'; 5603 5604 if (t & 0x00001000) 5605 pstrcat(buf, buf_size, "extern "); 5606 if (t & 0x00002000) 5607 pstrcat(buf, buf_size, "static "); 5608 if (t & 0x00004000) 5609 pstrcat(buf, buf_size, "typedef "); 5610 if (t & 0x00008000) 5611 pstrcat(buf, buf_size, "inline "); 5612 if (t & 0x0200) 5613 pstrcat(buf, buf_size, "volatile "); 5614 if (t & 0x0100) 5615 pstrcat(buf, buf_size, "const "); 5616 5617 if (((t & 0x0020) && bt == 1) 5618 || ((t & 0x0010) 5619 && (bt == 2 || bt == 3 || bt == 4) 5620 && !((t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20)) 5621 )) 5622 pstrcat(buf, buf_size, (t & 0x0010) ? "unsigned " : "signed "); 5623 5624 buf_size -= strlen(buf); 5625 buf += strlen(buf); 5626 5627 switch(bt) { 5628 case 0: 5629 tstr = "void"; 5630 goto add_tstr; 5631 case 11: 5632 tstr = "_Bool"; 5633 goto add_tstr; 5634 case 1: 5635 tstr = "char"; 5636 goto add_tstr; 5637 case 2: 5638 tstr = "short"; 5639 goto add_tstr; 5640 case 3: 5641 tstr = "int"; 5642 goto maybe_long; 5643 case 4: 5644 tstr = "long long"; 5645 maybe_long: 5646 if (t & 0x0800) 5647 tstr = "long"; 5648 if (!((t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20))) 5649 goto add_tstr; 5650 tstr = "enum "; 5651 goto tstruct; 5652 case 8: 5653 tstr = "float"; 5654 goto add_tstr; 5655 case 9: 5656 tstr = "double"; 5657 goto add_tstr; 5658 case 10: 5659 tstr = "long double"; 5660 add_tstr: 5661 pstrcat(buf, buf_size, tstr); 5662 break; 5663 case 7: 5664 tstr = "struct "; 5665 if (((t & ((((1 << (6+6)) - 1) << 20 | 0x0080)|0x000f)) == (1 << 20 | 7))) 5666 tstr = "union "; 5667 tstruct: 5668 pstrcat(buf, buf_size, tstr); 5669 v = type->ref->v & ~0x40000000; 5670 if (v >= 0x10000000) 5671 pstrcat(buf, buf_size, "<anonymous>"); 5672 else 5673 pstrcat(buf, buf_size, get_tok_str(v, 0)); 5674 break; 5675 case 6: 5676 s = type->ref; 5677 type_to_str(buf, buf_size, &s->type, varstr); 5678 pstrcat(buf, buf_size, "("); 5679 sa = s->next; 5680 while (sa != 0) { 5681 type_to_str(buf1, sizeof(buf1), &sa->type, 0); 5682 pstrcat(buf, buf_size, buf1); 5683 sa = sa->next; 5684 if (sa) 5685 pstrcat(buf, buf_size, ", "); 5686 } 5687 pstrcat(buf, buf_size, ")"); 5688 goto no_var; 5689 case 5: 5690 s = type->ref; 5691 if (t & 0x0040) { 5692 snprintf(buf1, sizeof(buf1), "%s[%d]", varstr ? varstr : "", s->c); 5693 type_to_str(buf, buf_size, &s->type, buf1); 5694 goto no_var; 5695 } 5696 pstrcpy(buf1, sizeof(buf1), "*"); 5697 if (t & 0x0100) 5698 pstrcat(buf1, buf_size, "const "); 5699 if (t & 0x0200) 5700 pstrcat(buf1, buf_size, "volatile "); 5701 if (varstr) 5702 pstrcat(buf1, sizeof(buf1), varstr); 5703 type_to_str(buf, buf_size, &s->type, buf1); 5704 goto no_var; 5705 } 5706 if (varstr) { 5707 pstrcat(buf, buf_size, " "); 5708 pstrcat(buf, buf_size, varstr); 5709 } 5710 no_var: ; 5711} 5712 5713 5714 5715static void gen_assign_cast(CType *dt) 5716{ 5717 CType *st, *type1, *type2; 5718 char buf1[256], buf2[256]; 5719 int dbt, sbt; 5720 5721 st = &vtop->type; 5722 dbt = dt->t & 0x000f; 5723 sbt = st->t & 0x000f; 5724 if (sbt == 0 || dbt == 0) { 5725 if (sbt == 0 && dbt == 0) 5726 ; 5727# 2994 "tccgen.c" 5728 else 5729 tcc_error("cannot cast from/to void"); 5730 } 5731 if (dt->t & 0x0100) 5732 tcc_warning("assignment of read-only location"); 5733 switch(dbt) { 5734 case 5: 5735 5736 5737 if (is_null_pointer(vtop)) 5738 goto type_ok; 5739 5740 if (is_integer_btype(sbt)) { 5741 tcc_warning("assignment makes pointer from integer without a cast"); 5742 goto type_ok; 5743 } 5744 type1 = pointed_type(dt); 5745 5746 if (sbt == 6) { 5747 if ((type1->t & 0x000f) != 0 && 5748 !is_compatible_types(pointed_type(dt), st)) 5749 tcc_warning("assignment from incompatible pointer type"); 5750 goto type_ok; 5751 } 5752 if (sbt != 5) 5753 goto error; 5754 type2 = pointed_type(st); 5755 if ((type1->t & 0x000f) == 0 || 5756 (type2->t & 0x000f) == 0) { 5757 5758 } else { 5759 5760 5761 if (!is_compatible_unqualified_types(type1, type2)) { 5762 5763 5764 5765 5766 if ((type1->t & (0x000f|0x0800)) != (type2->t & (0x000f|0x0800)) 5767 || ((type1->t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20)) || ((type2->t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20)) 5768 ) 5769 tcc_warning("assignment from incompatible pointer type"); 5770 } 5771 } 5772 5773 if ((!(type1->t & 0x0100) && (type2->t & 0x0100)) || 5774 (!(type1->t & 0x0200) && (type2->t & 0x0200))) 5775 tcc_warning("assignment discards qualifiers from pointer target type"); 5776 break; 5777 case 1: 5778 case 2: 5779 case 3: 5780 case 4: 5781 if (sbt == 5 || sbt == 6) { 5782 tcc_warning("assignment makes integer from pointer without a cast"); 5783 } else if (sbt == 7) { 5784 goto case_VT_STRUCT; 5785 } 5786 5787 break; 5788 case 7: 5789 case_VT_STRUCT: 5790 if (!is_compatible_unqualified_types(dt, st)) { 5791 error: 5792 type_to_str(buf1, sizeof(buf1), st, 0); 5793 type_to_str(buf2, sizeof(buf2), dt, 0); 5794 tcc_error("cannot cast '%s' to '%s'", buf1, buf2); 5795 } 5796 break; 5797 } 5798 type_ok: 5799 gen_cast(dt); 5800} 5801 5802 5803static void vstore(void) 5804{ 5805 int sbt, dbt, ft, r, t, size, align, bit_size, bit_pos, rc, delayed_cast; 5806 5807 ft = vtop[-1].type.t; 5808 sbt = vtop->type.t & 0x000f; 5809 dbt = ft & 0x000f; 5810 if ((((sbt == 3 || sbt == 2) && dbt == 1) || 5811 (sbt == 3 && dbt == 2)) 5812 && !(vtop->type.t & 0x0080)) { 5813 5814 delayed_cast = 0x0400; 5815 vtop->type.t = ft & (~((0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)|(((1 << (6+6)) - 1) << 20 | 0x0080))); 5816 5817 if (ft & 0x0100) 5818 tcc_warning("assignment of read-only location"); 5819 } else { 5820 delayed_cast = 0; 5821 if (!(ft & 0x0080)) 5822 gen_assign_cast(&vtop[-1].type); 5823 } 5824 5825 if (sbt == 7) { 5826 5827 5828 5829 size = type_size(&vtop->type, &align); 5830 5831 5832 vswap(); 5833 vtop->type.t = 5; 5834 gaddrof(); 5835# 3111 "tccgen.c" 5836 vpush_global_sym(&func_old_type, TOK_memmove); 5837 5838 vswap(); 5839 5840 vpushv(vtop - 2); 5841 vtop->type.t = 5; 5842 gaddrof(); 5843 5844 vpushi(size); 5845 gfunc_call(3); 5846 5847 5848 } else if (ft & 0x0080) { 5849 5850 5851 5852 vdup(), vtop[-1] = vtop[-2]; 5853 5854 bit_pos = (((ft) >> 20) & 0x3f); 5855 bit_size = (((ft) >> (20 + 6)) & 0x3f); 5856 5857 vtop[-1].type.t = ft & ~(((1 << (6+6)) - 1) << 20 | 0x0080); 5858 5859 if ((ft & 0x000f) == 11) { 5860 gen_cast(&vtop[-1].type); 5861 vtop[-1].type.t = (vtop[-1].type.t & ~0x000f) | (1 | 0x0010); 5862 } 5863 5864 r = adjust_bf(vtop - 1, bit_pos, bit_size); 5865 if (r == 7) { 5866 gen_cast_s((ft & 0x000f) == 4 ? 4 : 3); 5867 store_packed_bf(bit_pos, bit_size); 5868 } else { 5869 unsigned long long mask = (1ULL << bit_size) - 1; 5870 if ((ft & 0x000f) != 11) { 5871 5872 if ((vtop[-1].type.t & 0x000f) == 4) 5873 vpushll(mask); 5874 else 5875 vpushi((unsigned)mask); 5876 gen_op('&'); 5877 } 5878 5879 vpushi(bit_pos); 5880 gen_op(0x01); 5881 vswap(); 5882 5883 vdup(); 5884 vrott(3); 5885 5886 if ((vtop->type.t & 0x000f) == 4) 5887 vpushll(~(mask << bit_pos)); 5888 else 5889 vpushi(~((unsigned)mask << bit_pos)); 5890 gen_op('&'); 5891 gen_op('|'); 5892 5893 vstore(); 5894 5895 vpop(); 5896 } 5897 } else if (dbt == 0) { 5898 --vtop; 5899 } else { 5900 5901 5902 if (vtop[-1].r & 0x0800) { 5903 vswap(); 5904 gbound(); 5905 vswap(); 5906 } 5907 5908 rc = 0x0001; 5909 if (is_float(ft)) { 5910 rc = 0x0002; 5911 5912 if ((ft & 0x000f) == 10) { 5913 rc = 0x0080; 5914 } else if ((ft & 0x000f) == 14) { 5915 rc = 0x1000; 5916 } 5917 5918 } 5919 r = gv(rc); 5920 5921 if ((vtop[-1].r & 0x003f) == 0x0031) { 5922 SValue sv; 5923 t = get_reg(0x0001); 5924 5925 sv.type.t = 5; 5926 5927 5928 5929 sv.r = 0x0032 | 0x0100; 5930 sv.c.i = vtop[-1].c.i; 5931 load(t, &sv); 5932 vtop[-1].r = t | 0x0100; 5933 } 5934 5935 5936 if (((ft & 0x000f) == 13) || ((ft & 0x000f) == 14)) { 5937 int addr_type = 4, load_size = 8, load_type = ((vtop->type.t & 0x000f) == 13) ? 4 : 9; 5938 5939 5940 5941 5942 vtop[-1].type.t = load_type; 5943 store(r, vtop - 1); 5944 vswap(); 5945 5946 vtop->type.t = addr_type; 5947 gaddrof(); 5948 vpushi(load_size); 5949 gen_op('+'); 5950 vtop->r |= 0x0100; 5951 vswap(); 5952 vtop[-1].type.t = load_type; 5953 5954 store(vtop->r2, vtop - 1); 5955 } else { 5956 store(r, vtop - 1); 5957 } 5958 5959 vswap(); 5960 vtop--; 5961 vtop->r |= delayed_cast; 5962 } 5963} 5964 5965 5966static void inc(int post, int c) 5967{ 5968 test_lvalue(); 5969 vdup(); 5970 if (post) { 5971 gv_dup(); 5972 vrotb(3); 5973 vrotb(3); 5974 } 5975 5976 vpushi(c - 0xa3); 5977 gen_op('+'); 5978 vstore(); 5979 if (post) 5980 vpop(); 5981} 5982 5983static void parse_mult_str (CString *astr, const char *msg) 5984{ 5985 5986 if (tok != 0xb9) 5987 expect(msg); 5988 cstr_new(astr); 5989 while (tok == 0xb9) { 5990 5991 cstr_cat(astr, tokc.str.data, -1); 5992 next(); 5993 } 5994 cstr_ccat(astr, '\0'); 5995} 5996 5997 5998 5999static int exact_log2p1(int i) 6000{ 6001 int ret; 6002 if (!i) 6003 return 0; 6004 for (ret = 1; i >= 1 << 8; ret += 8) 6005 i >>= 8; 6006 if (i >= 1 << 4) 6007 ret += 4, i >>= 4; 6008 if (i >= 1 << 2) 6009 ret += 2, i >>= 2; 6010 if (i >= 1 << 1) 6011 ret++; 6012 return ret; 6013} 6014 6015 6016static void parse_attribute(AttributeDef *ad) 6017{ 6018 int t, n; 6019 CString astr; 6020 6021redo: 6022 if (tok != TOK_ATTRIBUTE1 && tok != TOK_ATTRIBUTE2) 6023 return; 6024 next(); 6025 skip('('); 6026 skip('('); 6027 while (tok != ')') { 6028 if (tok < 256) 6029 expect("attribute name"); 6030 t = tok; 6031 next(); 6032 switch(t) { 6033 case TOK_SECTION1: 6034 case TOK_SECTION2: 6035 skip('('); 6036 parse_mult_str(&astr, "section name"); 6037 ad->section = find_section(tcc_state, (char *)astr.data); 6038 skip(')'); 6039 cstr_free(&astr); 6040 break; 6041 case TOK_ALIAS1: 6042 case TOK_ALIAS2: 6043 skip('('); 6044 parse_mult_str(&astr, "alias(\"target\")"); 6045 ad->alias_target = 6046 tok_alloc((char*)astr.data, astr.size-1)->tok; 6047 skip(')'); 6048 cstr_free(&astr); 6049 break; 6050 case TOK_VISIBILITY1: 6051 case TOK_VISIBILITY2: 6052 skip('('); 6053 parse_mult_str(&astr, 6054 "visibility(\"default|hidden|internal|protected\")"); 6055 if (!strcmp (astr.data, "default")) 6056 ad->a.visibility = 0; 6057 else if (!strcmp (astr.data, "hidden")) 6058 ad->a.visibility = 2; 6059 else if (!strcmp (astr.data, "internal")) 6060 ad->a.visibility = 1; 6061 else if (!strcmp (astr.data, "protected")) 6062 ad->a.visibility = 3; 6063 else 6064 expect("visibility(\"default|hidden|internal|protected\")"); 6065 skip(')'); 6066 cstr_free(&astr); 6067 break; 6068 case TOK_ALIGNED1: 6069 case TOK_ALIGNED2: 6070 if (tok == '(') { 6071 next(); 6072 n = expr_const(); 6073 if (n <= 0 || (n & (n - 1)) != 0) 6074 tcc_error("alignment must be a positive power of two"); 6075 skip(')'); 6076 } else { 6077 n = 16; 6078 } 6079 ad->a.aligned = exact_log2p1(n); 6080 if (n != 1 << (ad->a.aligned - 1)) 6081 tcc_error("alignment of %d is larger than implemented", n); 6082 break; 6083 case TOK_PACKED1: 6084 case TOK_PACKED2: 6085 ad->a.packed = 1; 6086 break; 6087 case TOK_WEAK1: 6088 case TOK_WEAK2: 6089 ad->a.weak = 1; 6090 break; 6091 case TOK_UNUSED1: 6092 case TOK_UNUSED2: 6093 6094 6095 break; 6096 case TOK_NORETURN1: 6097 case TOK_NORETURN2: 6098 6099 6100 break; 6101 case TOK_CDECL1: 6102 case TOK_CDECL2: 6103 case TOK_CDECL3: 6104 ad->f.func_call = 0; 6105 break; 6106 case TOK_STDCALL1: 6107 case TOK_STDCALL2: 6108 case TOK_STDCALL3: 6109 ad->f.func_call = 1; 6110 break; 6111# 3405 "tccgen.c" 6112 case TOK_MODE: 6113 skip('('); 6114 switch(tok) { 6115 case TOK_MODE_DI: 6116 ad->attr_mode = 4 + 1; 6117 break; 6118 case TOK_MODE_QI: 6119 ad->attr_mode = 1 + 1; 6120 break; 6121 case TOK_MODE_HI: 6122 ad->attr_mode = 2 + 1; 6123 break; 6124 case TOK_MODE_SI: 6125 case TOK_MODE_word: 6126 ad->attr_mode = 3 + 1; 6127 break; 6128 default: 6129 tcc_warning("__mode__(%s) not supported\n", get_tok_str(tok, 0)); 6130 break; 6131 } 6132 next(); 6133 skip(')'); 6134 break; 6135 case TOK_DLLEXPORT: 6136 ad->a.dllexport = 1; 6137 break; 6138 case TOK_DLLIMPORT: 6139 ad->a.dllimport = 1; 6140 break; 6141 default: 6142 if (tcc_state->warn_unsupported) 6143 tcc_warning("'%s' attribute ignored", get_tok_str(t, 0)); 6144 6145 if (tok == '(') { 6146 int parenthesis = 0; 6147 do { 6148 if (tok == '(') 6149 parenthesis++; 6150 else if (tok == ')') 6151 parenthesis--; 6152 next(); 6153 } while (parenthesis && tok != -1); 6154 } 6155 break; 6156 } 6157 if (tok != ',') 6158 break; 6159 next(); 6160 } 6161 skip(')'); 6162 skip(')'); 6163 goto redo; 6164} 6165 6166static Sym * find_field (CType *type, int v) 6167{ 6168 Sym *s = type->ref; 6169 v |= 0x20000000; 6170 while ((s = s->next) != 0) { 6171 if ((s->v & 0x20000000) && 6172 (s->type.t & 0x000f) == 7 && 6173 (s->v & ~0x20000000) >= 0x10000000) { 6174 Sym *ret = find_field (&s->type, v); 6175 if (ret) 6176 return ret; 6177 } 6178 if (s->v == v) 6179 break; 6180 } 6181 return s; 6182} 6183 6184static void struct_add_offset (Sym *s, int offset) 6185{ 6186 while ((s = s->next) != 0) { 6187 if ((s->v & 0x20000000) && 6188 (s->type.t & 0x000f) == 7 && 6189 (s->v & ~0x20000000) >= 0x10000000) { 6190 struct_add_offset(s->type.ref, offset); 6191 } else 6192 s->c += offset; 6193 } 6194} 6195 6196static void struct_layout(CType *type, AttributeDef *ad) 6197{ 6198 int size, align, maxalign, offset, c, bit_pos, bit_size; 6199 int packed, a, bt, prevbt, prev_bit_size; 6200 int pcc = !tcc_state->ms_bitfields; 6201 int pragma_pack = *tcc_state->pack_stack_ptr; 6202 Sym *f; 6203 6204 maxalign = 1; 6205 offset = 0; 6206 c = 0; 6207 bit_pos = 0; 6208 prevbt = 7; 6209 prev_bit_size = 0; 6210 6211 6212 6213 for (f = type->ref->next; f; f = f->next) { 6214 if (f->type.t & 0x0080) 6215 bit_size = (((f->type.t) >> (20 + 6)) & 0x3f); 6216 else 6217 bit_size = -1; 6218 size = type_size(&f->type, &align); 6219 a = f->a.aligned ? 1 << (f->a.aligned - 1) : 0; 6220 packed = 0; 6221 6222 if (pcc && bit_size == 0) { 6223 6224 6225 } else { 6226 6227 if (pcc && (f->a.packed || ad->a.packed)) 6228 align = packed = 1; 6229 6230 6231 if (pragma_pack) { 6232 packed = 1; 6233 if (pragma_pack < align) 6234 align = pragma_pack; 6235 6236 if (pcc && pragma_pack < a) 6237 a = 0; 6238 } 6239 } 6240 6241 if (a) 6242 align = a; 6243 6244 if (type->ref->type.t == (1 << 20 | 7)) { 6245 if (pcc && bit_size >= 0) 6246 size = (bit_size + 7) >> 3; 6247 offset = 0; 6248 if (size > c) 6249 c = size; 6250 6251 } else if (bit_size < 0) { 6252 if (pcc) 6253 c += (bit_pos + 7) >> 3; 6254 c = (c + align - 1) & -align; 6255 offset = c; 6256 if (size > 0) 6257 c += size; 6258 bit_pos = 0; 6259 prevbt = 7; 6260 prev_bit_size = 0; 6261 6262 } else { 6263 6264 6265 if (pcc) { 6266 6267 6268 6269 6270 6271 6272 if (bit_size == 0) { 6273 new_field: 6274 c = (c + ((bit_pos + 7) >> 3) + align - 1) & -align; 6275 bit_pos = 0; 6276 } else if (f->a.aligned) { 6277 goto new_field; 6278 } else if (!packed) { 6279 int a8 = align * 8; 6280 int ofs = ((c * 8 + bit_pos) % a8 + bit_size + a8 - 1) / a8; 6281 if (ofs > size / align) 6282 goto new_field; 6283 } 6284 6285 6286 if (size == 8 && bit_size <= 32) 6287 f->type.t = (f->type.t & ~0x000f) | 3, size = 4; 6288 6289 while (bit_pos >= align * 8) 6290 c += align, bit_pos -= align * 8; 6291 offset = c; 6292 6293 6294 6295 6296 if (f->v & 0x10000000 6297 6298 ) 6299 align = 1; 6300 6301 } else { 6302 bt = f->type.t & 0x000f; 6303 if ((bit_pos + bit_size > size * 8) 6304 || (bit_size > 0) == (bt != prevbt) 6305 ) { 6306 c = (c + align - 1) & -align; 6307 offset = c; 6308 bit_pos = 0; 6309 6310 6311 6312 6313 if (bit_size || prev_bit_size) 6314 c += size; 6315 } 6316 6317 6318 6319 6320 if (bit_size == 0 && prevbt != bt) 6321 align = 1; 6322 prevbt = bt; 6323 prev_bit_size = bit_size; 6324 } 6325 6326 f->type.t = (f->type.t & ~(0x3f << 20)) 6327 | (bit_pos << 20); 6328 bit_pos += bit_size; 6329 } 6330 if (align > maxalign) 6331 maxalign = align; 6332# 3638 "tccgen.c" 6333 if (f->v & 0x10000000 && (f->type.t & 0x000f) == 7) { 6334 Sym *ass; 6335 6336 6337 6338 6339 6340 6341 6342 int v2 = f->type.ref->v; 6343 if (!(v2 & 0x20000000) && 6344 (v2 & ~0x40000000) < 0x10000000) { 6345 Sym **pps; 6346 6347 6348 6349 6350 6351 ass = f->type.ref; 6352 f->type.ref = sym_push(anon_sym++ | 0x20000000, 6353 &f->type.ref->type, 0, 6354 f->type.ref->c); 6355 pps = &f->type.ref->next; 6356 while ((ass = ass->next) != 0) { 6357 *pps = sym_push(ass->v, &ass->type, 0, ass->c); 6358 pps = &((*pps)->next); 6359 } 6360 *pps = 0; 6361 } 6362 struct_add_offset(f->type.ref, offset); 6363 f->c = 0; 6364 } else { 6365 f->c = offset; 6366 } 6367 6368 f->r = 0; 6369 } 6370 6371 if (pcc) 6372 c += (bit_pos + 7) >> 3; 6373 6374 6375 a = bt = ad->a.aligned ? 1 << (ad->a.aligned - 1) : 1; 6376 if (a < maxalign) 6377 a = maxalign; 6378 type->ref->r = a; 6379 if (pragma_pack && pragma_pack < maxalign && 0 == pcc) { 6380 6381 6382 a = pragma_pack; 6383 if (a < bt) 6384 a = bt; 6385 } 6386 c = (c + a - 1) & -a; 6387 type->ref->c = c; 6388 6389 6390 6391 6392 6393 6394 for (f = type->ref->next; f; f = f->next) { 6395 int s, px, cx, c0; 6396 CType t; 6397 6398 if (0 == (f->type.t & 0x0080)) 6399 continue; 6400 f->type.ref = f; 6401 f->auxtype = -1; 6402 bit_size = (((f->type.t) >> (20 + 6)) & 0x3f); 6403 if (bit_size == 0) 6404 continue; 6405 bit_pos = (((f->type.t) >> 20) & 0x3f); 6406 size = type_size(&f->type, &align); 6407 if (bit_pos + bit_size <= size * 8 && f->c + size <= c) 6408 continue; 6409 6410 6411 c0 = -1, s = align = 1; 6412 for (;;) { 6413 px = f->c * 8 + bit_pos; 6414 cx = (px >> 3) & -align; 6415 px = px - (cx << 3); 6416 if (c0 == cx) 6417 break; 6418 s = (px + bit_size + 7) >> 3; 6419 if (s > 4) { 6420 t.t = 4; 6421 } else if (s > 2) { 6422 t.t = 3; 6423 } else if (s > 1) { 6424 t.t = 2; 6425 } else { 6426 t.t = 1; 6427 } 6428 s = type_size(&t, &align); 6429 c0 = cx; 6430 } 6431 6432 if (px + bit_size <= s * 8 && cx + s <= c) { 6433 6434 f->c = cx; 6435 bit_pos = px; 6436 f->type.t = (f->type.t & ~(0x3f << 20)) 6437 | (bit_pos << 20); 6438 if (s != size) 6439 f->auxtype = t.t; 6440 6441 6442 6443 6444 6445 6446 } else { 6447 6448 f->auxtype = 7; 6449 6450 6451 6452 6453 } 6454 } 6455} 6456 6457 6458static void struct_decl(CType *type, int u) 6459{ 6460 int v, c, size, align, flexible; 6461 int bit_size, bsize, bt; 6462 Sym *s, *ss, **ps; 6463 AttributeDef ad, ad1; 6464 CType type1, btype; 6465 6466 memset(&ad, 0, sizeof ad); 6467 next(); 6468 parse_attribute(&ad); 6469 if (tok != '{') { 6470 v = tok; 6471 next(); 6472 6473 if (v < 256) 6474 expect("struct/union/enum name"); 6475 s = struct_find(v); 6476 if (s && (s->sym_scope == local_scope || tok != '{')) { 6477 if (u == s->type.t) 6478 goto do_decl; 6479 if (u == (2 << 20) && ((s->type.t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20))) 6480 goto do_decl; 6481 tcc_error("redefinition of '%s'", get_tok_str(v, 0)); 6482 } 6483 } else { 6484 v = anon_sym++; 6485 } 6486 6487 type1.t = u == (2 << 20) ? u | 3 | 0x0010 : u; 6488 type1.ref = 0; 6489 6490 s = sym_push(v | 0x40000000, &type1, 0, -1); 6491 s->r = 0; 6492do_decl: 6493 type->t = s->type.t; 6494 type->ref = s; 6495 6496 if (tok == '{') { 6497 next(); 6498 if (s->c != -1) 6499 tcc_error("struct/union/enum already defined"); 6500 6501 6502 ps = &s->next; 6503 if (u == (2 << 20)) { 6504 long long ll = 0, pl = 0, nl = 0; 6505 CType t; 6506 t.ref = s; 6507 6508 t.t = 3|0x00002000|(3 << 20); 6509 for(;;) { 6510 v = tok; 6511 if (v < TOK_DEFINE) 6512 expect("identifier"); 6513 ss = sym_find(v); 6514 if (ss && !local_stack) 6515 tcc_error("redefinition of enumerator '%s'", 6516 get_tok_str(v, 0)); 6517 next(); 6518 if (tok == '=') { 6519 next(); 6520 ll = expr_const64(); 6521 } 6522 ss = sym_push(v, &t, 0x0030, 0); 6523 ss->enum_val = ll; 6524 *ps = ss, ps = &ss->next; 6525 if (ll < nl) 6526 nl = ll; 6527 if (ll > pl) 6528 pl = ll; 6529 if (tok != ',') 6530 break; 6531 next(); 6532 ll++; 6533 6534 if (tok == '}') 6535 break; 6536 } 6537 skip('}'); 6538 6539 t.t = 3; 6540 if (nl >= 0) { 6541 if (pl != (unsigned)pl) 6542 t.t = (8==8 ? 4|0x0800 : 4); 6543 t.t |= 0x0010; 6544 } else if (pl != (int)pl || nl != (int)nl) 6545 t.t = (8==8 ? 4|0x0800 : 4); 6546 s->type.t = type->t = t.t | (2 << 20); 6547 s->c = 0; 6548 6549 for (ss = s->next; ss; ss = ss->next) { 6550 ll = ss->enum_val; 6551 if (ll == (int)ll) 6552 continue; 6553 if (t.t & 0x0010) { 6554 ss->type.t |= 0x0010; 6555 if (ll == (unsigned)ll) 6556 continue; 6557 } 6558 ss->type.t = (ss->type.t & ~0x000f) 6559 | (8==8 ? 4|0x0800 : 4); 6560 } 6561 } else { 6562 c = 0; 6563 flexible = 0; 6564 while (tok != '}') { 6565 if (!parse_btype(&btype, &ad1)) { 6566 skip(';'); 6567 continue; 6568 } 6569 while (1) { 6570 if (flexible) 6571 tcc_error("flexible array member '%s' not at the end of struct", 6572 get_tok_str(v, 0)); 6573 bit_size = -1; 6574 v = 0; 6575 type1 = btype; 6576 if (tok != ':') { 6577 if (tok != ';') 6578 type_decl(&type1, &ad1, &v, 2); 6579 if (v == 0) { 6580 if ((type1.t & 0x000f) != 7) 6581 expect("identifier"); 6582 else { 6583 int v = btype.ref->v; 6584 if (!(v & 0x20000000) && (v & ~0x40000000) < 0x10000000) { 6585 if (tcc_state->ms_extensions == 0) 6586 expect("identifier"); 6587 } 6588 } 6589 } 6590 if (type_size(&type1, &align) < 0) { 6591 if ((u == 7) && (type1.t & 0x0040) && c) 6592 flexible = 1; 6593 else 6594 tcc_error("field '%s' has incomplete type", 6595 get_tok_str(v, 0)); 6596 } 6597 if ((type1.t & 0x000f) == 6 || 6598 (type1.t & (0x00001000 | 0x00002000 | 0x00004000 | 0x00008000))) 6599 tcc_error("invalid type for '%s'", 6600 get_tok_str(v, 0)); 6601 } 6602 if (tok == ':') { 6603 next(); 6604 bit_size = expr_const(); 6605 6606 if (bit_size < 0) 6607 tcc_error("negative width in bit-field '%s'", 6608 get_tok_str(v, 0)); 6609 if (v && bit_size == 0) 6610 tcc_error("zero width for bit-field '%s'", 6611 get_tok_str(v, 0)); 6612 parse_attribute(&ad1); 6613 } 6614 size = type_size(&type1, &align); 6615 if (bit_size >= 0) { 6616 bt = type1.t & 0x000f; 6617 if (bt != 3 && 6618 bt != 1 && 6619 bt != 2 && 6620 bt != 11 && 6621 bt != 4) 6622 tcc_error("bitfields must have scalar type"); 6623 bsize = size * 8; 6624 if (bit_size > bsize) { 6625 tcc_error("width of '%s' exceeds its type", 6626 get_tok_str(v, 0)); 6627 } else if (bit_size == bsize 6628 && !ad.a.packed && !ad1.a.packed) { 6629 6630 ; 6631 } else if (bit_size == 64) { 6632 tcc_error("field width 64 not implemented"); 6633 } else { 6634 type1.t = (type1.t & ~(((1 << (6+6)) - 1) << 20 | 0x0080)) 6635 | 0x0080 6636 | (bit_size << (20 + 6)); 6637 } 6638 } 6639 if (v != 0 || (type1.t & 0x000f) == 7) { 6640 6641 6642 c = 1; 6643 } 6644 6645 6646 if (v == 0 && 6647 ((type1.t & 0x000f) == 7 || 6648 bit_size >= 0)) { 6649 v = anon_sym++; 6650 } 6651 if (v) { 6652 ss = sym_push(v | 0x20000000, &type1, 0, 0); 6653 ss->a = ad1.a; 6654 *ps = ss; 6655 ps = &ss->next; 6656 } 6657 if (tok == ';' || tok == (-1)) 6658 break; 6659 skip(','); 6660 } 6661 skip(';'); 6662 } 6663 skip('}'); 6664 parse_attribute(&ad); 6665 struct_layout(type, &ad); 6666 } 6667 } 6668} 6669 6670static void sym_to_attr(AttributeDef *ad, Sym *s) 6671{ 6672 if (s->a.aligned && 0 == ad->a.aligned) 6673 ad->a.aligned = s->a.aligned; 6674 if (s->f.func_call && 0 == ad->f.func_call) 6675 ad->f.func_call = s->f.func_call; 6676 if (s->f.func_type && 0 == ad->f.func_type) 6677 ad->f.func_type = s->f.func_type; 6678 if (s->a.packed) 6679 ad->a.packed = 1; 6680} 6681 6682 6683 6684static void parse_btype_qualify(CType *type, int qualifiers) 6685{ 6686 while (type->t & 0x0040) { 6687 type->ref = sym_push(0x20000000, &type->ref->type, 0, type->ref->c); 6688 type = &type->ref->type; 6689 } 6690 type->t |= qualifiers; 6691} 6692 6693 6694 6695 6696static int parse_btype(CType *type, AttributeDef *ad) 6697{ 6698 int t, u, bt, st, type_found, typespec_found, g; 6699 Sym *s; 6700 CType type1; 6701 6702 memset(ad, 0, sizeof(AttributeDef)); 6703 type_found = 0; 6704 typespec_found = 0; 6705 t = 3; 6706 bt = st = -1; 6707 type->ref = 0; 6708 6709 while(1) { 6710 switch(tok) { 6711 case TOK_EXTENSION: 6712 6713 next(); 6714 continue; 6715 6716 6717 case TOK_CHAR: 6718 u = 1; 6719 basic_type: 6720 next(); 6721 basic_type1: 6722 if (u == 2 || u == 0x0800) { 6723 if (st != -1 || (bt != -1 && bt != 3)) 6724 tmbt: tcc_error("too many basic types"); 6725 st = u; 6726 } else { 6727 if (bt != -1 || (st != -1 && u != 3)) 6728 goto tmbt; 6729 bt = u; 6730 } 6731 if (u != 3) 6732 t = (t & ~(0x000f|0x0800)) | u; 6733 typespec_found = 1; 6734 break; 6735 case TOK_VOID: 6736 u = 0; 6737 goto basic_type; 6738 case TOK_SHORT: 6739 u = 2; 6740 goto basic_type; 6741 case TOK_INT: 6742 u = 3; 6743 goto basic_type; 6744 case TOK_LONG: 6745 if ((t & 0x000f) == 9) { 6746 t = (t & ~(0x000f|0x0800)) | 10; 6747 } else if ((t & (0x000f|0x0800)) == 0x0800) { 6748 t = (t & ~(0x000f|0x0800)) | 4; 6749 } else { 6750 u = 0x0800; 6751 goto basic_type; 6752 } 6753 next(); 6754 break; 6755 6756 6757 6758 6759 6760 6761 6762 case TOK_BOOL: 6763 u = 11; 6764 goto basic_type; 6765 case TOK_FLOAT: 6766 u = 8; 6767 goto basic_type; 6768 case TOK_DOUBLE: 6769 if ((t & (0x000f|0x0800)) == 0x0800) { 6770 t = (t & ~(0x000f|0x0800)) | 10; 6771 } else { 6772 u = 9; 6773 goto basic_type; 6774 } 6775 next(); 6776 break; 6777 case TOK_ENUM: 6778 struct_decl(&type1, (2 << 20)); 6779 basic_type2: 6780 u = type1.t; 6781 type->ref = type1.ref; 6782 goto basic_type1; 6783 case TOK_STRUCT: 6784 struct_decl(&type1, 7); 6785 goto basic_type2; 6786 case TOK_UNION: 6787 struct_decl(&type1, (1 << 20 | 7)); 6788 goto basic_type2; 6789 6790 6791 case TOK_CONST1: 6792 case TOK_CONST2: 6793 case TOK_CONST3: 6794 type->t = t; 6795 parse_btype_qualify(type, 0x0100); 6796 t = type->t; 6797 next(); 6798 break; 6799 case TOK_VOLATILE1: 6800 case TOK_VOLATILE2: 6801 case TOK_VOLATILE3: 6802 type->t = t; 6803 parse_btype_qualify(type, 0x0200); 6804 t = type->t; 6805 next(); 6806 break; 6807 case TOK_SIGNED1: 6808 case TOK_SIGNED2: 6809 case TOK_SIGNED3: 6810 if ((t & (0x0020|0x0010)) == (0x0020|0x0010)) 6811 tcc_error("signed and unsigned modifier"); 6812 t |= 0x0020; 6813 next(); 6814 typespec_found = 1; 6815 break; 6816 case TOK_REGISTER: 6817 case TOK_AUTO: 6818 case TOK_RESTRICT1: 6819 case TOK_RESTRICT2: 6820 case TOK_RESTRICT3: 6821 next(); 6822 break; 6823 case TOK_UNSIGNED: 6824 if ((t & (0x0020|0x0010)) == 0x0020) 6825 tcc_error("signed and unsigned modifier"); 6826 t |= 0x0020 | 0x0010; 6827 next(); 6828 typespec_found = 1; 6829 break; 6830 6831 6832 case TOK_EXTERN: 6833 g = 0x00001000; 6834 goto storage; 6835 case TOK_STATIC: 6836 g = 0x00002000; 6837 goto storage; 6838 case TOK_TYPEDEF: 6839 g = 0x00004000; 6840 goto storage; 6841 storage: 6842 if (t & (0x00001000|0x00002000|0x00004000) & ~g) 6843 tcc_error("multiple storage classes"); 6844 t |= g; 6845 next(); 6846 break; 6847 case TOK_INLINE1: 6848 case TOK_INLINE2: 6849 case TOK_INLINE3: 6850 t |= 0x00008000; 6851 next(); 6852 break; 6853 6854 6855 case TOK_ATTRIBUTE1: 6856 case TOK_ATTRIBUTE2: 6857 parse_attribute(ad); 6858 if (ad->attr_mode) { 6859 u = ad->attr_mode -1; 6860 t = (t & ~(0x000f|0x0800)) | u; 6861 } 6862 break; 6863 6864 case TOK_TYPEOF1: 6865 case TOK_TYPEOF2: 6866 case TOK_TYPEOF3: 6867 next(); 6868 parse_expr_type(&type1); 6869 6870 type1.t &= ~((0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)&~0x00004000); 6871 if (type1.ref) 6872 sym_to_attr(ad, type1.ref); 6873 goto basic_type2; 6874 default: 6875 if (typespec_found) 6876 goto the_end; 6877 s = sym_find(tok); 6878 if (!s || !(s->type.t & 0x00004000)) 6879 goto the_end; 6880 t &= ~(0x000f|0x0800); 6881 u = t & ~(0x0100 | 0x0200), t ^= u; 6882 type->t = (s->type.t & ~0x00004000) | u; 6883 type->ref = s->type.ref; 6884 if (t) 6885 parse_btype_qualify(type, t); 6886 t = type->t; 6887 6888 sym_to_attr(ad, s); 6889 next(); 6890 typespec_found = 1; 6891 st = bt = -2; 6892 break; 6893 } 6894 type_found = 1; 6895 } 6896the_end: 6897 if (tcc_state->char_is_unsigned) { 6898 if ((t & (0x0020|0x000f)) == 1) 6899 t |= 0x0010; 6900 } 6901 6902 bt = t & (0x000f|0x0800); 6903 if (bt == 0x0800) 6904 t |= 8 == 8 ? 4 : 3; 6905 6906 6907 6908 6909 type->t = t; 6910 return type_found; 6911} 6912 6913 6914 6915static inline void convert_parameter_type(CType *pt) 6916{ 6917 6918 6919 pt->t &= ~(0x0100 | 0x0200); 6920 6921 pt->t &= ~0x0040; 6922 if ((pt->t & 0x000f) == 6) { 6923 mk_pointer(pt); 6924 } 6925} 6926 6927static void parse_asm_str(CString *astr) 6928{ 6929 skip('('); 6930 parse_mult_str(astr, "string constant"); 6931} 6932 6933 6934static int asm_label_instr(void) 6935{ 6936 int v; 6937 CString astr; 6938 6939 next(); 6940 parse_asm_str(&astr); 6941 skip(')'); 6942 6943 6944 6945 v = tok_alloc(astr.data, astr.size - 1)->tok; 6946 cstr_free(&astr); 6947 return v; 6948} 6949 6950static int post_type(CType *type, AttributeDef *ad, int storage, int td) 6951{ 6952 int n, l, t1, arg_size, align; 6953 Sym **plast, *s, *first; 6954 AttributeDef ad1; 6955 CType pt; 6956 6957 if (tok == '(') { 6958 6959 next(); 6960 if (td && !(td & 1)) 6961 return 0; 6962 if (tok == ')') 6963 l = 0; 6964 else if (parse_btype(&pt, &ad1)) 6965 l = 1; 6966 else if (td) 6967 return 0; 6968 else 6969 l = 2; 6970 first = 0; 6971 plast = &first; 6972 arg_size = 0; 6973 if (l) { 6974 for(;;) { 6975 6976 if (l != 2) { 6977 if ((pt.t & 0x000f) == 0 && tok == ')') 6978 break; 6979 type_decl(&pt, &ad1, &n, 2 | 1); 6980 if ((pt.t & 0x000f) == 0) 6981 tcc_error("parameter declared as void"); 6982 arg_size += (type_size(&pt, &align) + 8 - 1) / 8; 6983 } else { 6984 n = tok; 6985 if (n < TOK_DEFINE) 6986 expect("identifier"); 6987 pt.t = 0; 6988 next(); 6989 } 6990 convert_parameter_type(&pt); 6991 s = sym_push(n | 0x20000000, &pt, 0, 0); 6992 *plast = s; 6993 plast = &s->next; 6994 if (tok == ')') 6995 break; 6996 skip(','); 6997 if (l == 1 && tok == 0xc8) { 6998 l = 3; 6999 next(); 7000 break; 7001 } 7002 if (l == 1 && !parse_btype(&pt, &ad1)) 7003 tcc_error("invalid type"); 7004 } 7005 } else 7006 7007 l = 2; 7008 skip(')'); 7009 7010 7011 type->t &= ~0x0100; 7012 7013 7014 7015 if (tok == '[') { 7016 next(); 7017 skip(']'); 7018 mk_pointer(type); 7019 } 7020 7021 ad->f.func_args = arg_size; 7022 ad->f.func_type = l; 7023 s = sym_push(0x20000000, type, 0, 0); 7024 s->a = ad->a; 7025 s->f = ad->f; 7026 s->next = first; 7027 type->t = 6; 7028 type->ref = s; 7029 } else if (tok == '[') { 7030 int saved_nocode_wanted = nocode_wanted; 7031 7032 next(); 7033 if (tok == TOK_RESTRICT1) 7034 next(); 7035 n = -1; 7036 t1 = 0; 7037 if (tok != ']') { 7038 if (!local_stack || (storage & 0x00002000)) 7039 vpushi(expr_const()); 7040 else { 7041 7042 7043 7044 7045 nocode_wanted = 0; 7046 gexpr(); 7047 } 7048 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030) { 7049 n = vtop->c.i; 7050 if (n < 0) 7051 tcc_error("invalid array size"); 7052 } else { 7053 if (!is_integer_btype(vtop->type.t & 0x000f)) 7054 tcc_error("size of variable length array should be an integer"); 7055 t1 = 0x0400; 7056 } 7057 } 7058 skip(']'); 7059 7060 post_type(type, ad, storage, 0); 7061 if (type->t == 6) 7062 tcc_error("declaration of an array of functions"); 7063 t1 |= type->t & 0x0400; 7064 7065 if (t1 & 0x0400) { 7066 loc -= type_size(&int_type, &align); 7067 loc &= -align; 7068 n = loc; 7069 7070 vla_runtime_type_size(type, &align); 7071 gen_op('*'); 7072 vset(&int_type, 0x0032|0x0100, n); 7073 vswap(); 7074 vstore(); 7075 } 7076 if (n != -1) 7077 vpop(); 7078 nocode_wanted = saved_nocode_wanted; 7079 7080 7081 7082 s = sym_push(0x20000000, type, 0, n); 7083 type->t = (t1 ? 0x0400 : 0x0040) | 5; 7084 type->ref = s; 7085 } 7086 return 1; 7087} 7088# 4401 "tccgen.c" 7089static CType *type_decl(CType *type, AttributeDef *ad, int *v, int td) 7090{ 7091 CType *post, *ret; 7092 int qualifiers, storage; 7093 7094 7095 storage = type->t & (0x00001000 | 0x00002000 | 0x00004000 | 0x00008000); 7096 type->t &= ~(0x00001000 | 0x00002000 | 0x00004000 | 0x00008000); 7097 post = ret = type; 7098 7099 while (tok == '*') { 7100 qualifiers = 0; 7101 redo: 7102 next(); 7103 switch(tok) { 7104 case TOK_CONST1: 7105 case TOK_CONST2: 7106 case TOK_CONST3: 7107 qualifiers |= 0x0100; 7108 goto redo; 7109 case TOK_VOLATILE1: 7110 case TOK_VOLATILE2: 7111 case TOK_VOLATILE3: 7112 qualifiers |= 0x0200; 7113 goto redo; 7114 case TOK_RESTRICT1: 7115 case TOK_RESTRICT2: 7116 case TOK_RESTRICT3: 7117 goto redo; 7118 7119 case TOK_ATTRIBUTE1: 7120 case TOK_ATTRIBUTE2: 7121 parse_attribute(ad); 7122 break; 7123 } 7124 mk_pointer(type); 7125 type->t |= qualifiers; 7126 if (ret == type) 7127 7128 ret = pointed_type(type); 7129 } 7130 7131 if (tok == '(') { 7132 7133 7134 if (!post_type(type, ad, 0, td)) { 7135 7136 7137 7138 7139 parse_attribute(ad); 7140 post = type_decl(type, ad, v, td); 7141 skip(')'); 7142 } 7143 } else if (tok >= 256 && (td & 2)) { 7144 7145 *v = tok; 7146 next(); 7147 } else { 7148 if (!(td & 1)) 7149 expect("identifier"); 7150 *v = 0; 7151 } 7152 post_type(post, ad, storage, 0); 7153 parse_attribute(ad); 7154 type->t |= storage; 7155 return ret; 7156} 7157 7158 7159static int lvalue_type(int t) 7160{ 7161 int bt, r; 7162 r = 0x0100; 7163 bt = t & 0x000f; 7164 if (bt == 1 || bt == 11) 7165 r |= 0x1000; 7166 else if (bt == 2) 7167 r |= 0x2000; 7168 else 7169 return r; 7170 if (t & 0x0010) 7171 r |= 0x4000; 7172 return r; 7173} 7174 7175 7176static void indir(void) 7177{ 7178 if ((vtop->type.t & 0x000f) != 5) { 7179 if ((vtop->type.t & 0x000f) == 6) 7180 return; 7181 expect("pointer"); 7182 } 7183 if (vtop->r & 0x0100) 7184 gv(0x0001); 7185 vtop->type = *pointed_type(&vtop->type); 7186 7187 if (!(vtop->type.t & 0x0040) && !(vtop->type.t & 0x0400) 7188 && (vtop->type.t & 0x000f) != 6) { 7189 vtop->r |= lvalue_type(vtop->type.t); 7190 7191 7192 if (tcc_state->do_bounds_check) 7193 vtop->r |= 0x0800; 7194 7195 } 7196} 7197 7198 7199static void gfunc_param_typed(Sym *func, Sym *arg) 7200{ 7201 int func_type; 7202 CType type; 7203 7204 func_type = func->f.func_type; 7205 if (func_type == 2 || 7206 (func_type == 3 && arg == 0)) { 7207 7208 if ((vtop->type.t & 0x000f) == 8) { 7209 gen_cast_s(9); 7210 } else if (vtop->type.t & 0x0080) { 7211 type.t = vtop->type.t & (0x000f | 0x0010); 7212 type.ref = vtop->type.ref; 7213 gen_cast(&type); 7214 } 7215 } else if (arg == 0) { 7216 tcc_error("too many arguments to function"); 7217 } else { 7218 type = arg->type; 7219 type.t &= ~0x0100; 7220 gen_assign_cast(&type); 7221 } 7222} 7223 7224 7225static void expr_type(CType *type, void (*expr_fn)(void)) 7226{ 7227 nocode_wanted++; 7228 expr_fn(); 7229 *type = vtop->type; 7230 vpop(); 7231 nocode_wanted--; 7232} 7233 7234 7235 7236static void parse_expr_type(CType *type) 7237{ 7238 int n; 7239 AttributeDef ad; 7240 7241 skip('('); 7242 if (parse_btype(type, &ad)) { 7243 type_decl(type, &ad, &n, 1); 7244 } else { 7245 expr_type(type, gexpr); 7246 } 7247 skip(')'); 7248} 7249 7250static void parse_type(CType *type) 7251{ 7252 AttributeDef ad; 7253 int n; 7254 7255 if (!parse_btype(type, &ad)) { 7256 expect("type"); 7257 } 7258 type_decl(type, &ad, &n, 1); 7259} 7260 7261static void parse_builtin_params(int nc, const char *args) 7262{ 7263 char c, sep = '('; 7264 CType t; 7265 if (nc) 7266 nocode_wanted++; 7267 next(); 7268 while ((c = *args++)) { 7269 skip(sep); 7270 sep = ','; 7271 switch (c) { 7272 case 'e': expr_eq(); continue; 7273 case 't': parse_type(&t); vpush(&t); continue; 7274 default: tcc_error("internal error"); break; 7275 } 7276 } 7277 skip(')'); 7278 if (nc) 7279 nocode_wanted--; 7280} 7281 7282static void unary(void) 7283{ 7284 int n, t, align, size, r, sizeof_caller; 7285 CType type; 7286 Sym *s; 7287 AttributeDef ad; 7288 7289 sizeof_caller = in_sizeof; 7290 in_sizeof = 0; 7291 type.ref = 0; 7292 7293 7294 tok_next: 7295 switch(tok) { 7296 case TOK_EXTENSION: 7297 next(); 7298 goto tok_next; 7299 case 0xb4: 7300 7301 7302 7303 7304 case 0xb5: 7305 case 0xb3: 7306 t = 3; 7307 push_tokc: 7308 type.t = t; 7309 vsetc(&type, 0x0030, &tokc); 7310 next(); 7311 break; 7312 case 0xb6: 7313 t = 3 | 0x0010; 7314 goto push_tokc; 7315 case 0xb7: 7316 t = 4; 7317 goto push_tokc; 7318 case 0xb8: 7319 t = 4 | 0x0010; 7320 goto push_tokc; 7321 case 0xbb: 7322 t = 8; 7323 goto push_tokc; 7324 case 0xbc: 7325 t = 9; 7326 goto push_tokc; 7327 case 0xbd: 7328 t = 10; 7329 goto push_tokc; 7330 case 0xce: 7331 t = (8 == 8 ? 4 : 3) | 0x0800; 7332 goto push_tokc; 7333 case 0xcf: 7334 t = (8 == 8 ? 4 : 3) | 0x0800 | 0x0010; 7335 goto push_tokc; 7336 case TOK___FUNCTION__: 7337 if (!gnu_ext) 7338 goto tok_identifier; 7339 7340 case TOK___FUNC__: 7341 { 7342 void *ptr; 7343 int len; 7344 7345 len = strlen(funcname) + 1; 7346 7347 type.t = 1; 7348 mk_pointer(&type); 7349 type.t |= 0x0040; 7350 type.ref->c = len; 7351 vpush_ref(&type, data_section, data_section->data_offset, len); 7352 if (!(nocode_wanted > 0)) { 7353 ptr = section_ptr_add(data_section, len); 7354 memcpy(ptr, funcname, len); 7355 } 7356 next(); 7357 } 7358 break; 7359 case 0xba: 7360 7361 7362 7363 t = 3; 7364 7365 goto str_init; 7366 case 0xb9: 7367 7368 t = 1; 7369 if (tcc_state->char_is_unsigned) 7370 t = 1 | 0x0010; 7371 str_init: 7372 if (tcc_state->warn_write_strings) 7373 t |= 0x0100; 7374 type.t = t; 7375 mk_pointer(&type); 7376 type.t |= 0x0040; 7377 memset(&ad, 0, sizeof(AttributeDef)); 7378 decl_initializer_alloc(&type, &ad, 0x0030, 2, 0, 0); 7379 break; 7380 case '(': 7381 next(); 7382 7383 if (parse_btype(&type, &ad)) { 7384 type_decl(&type, &ad, &n, 1); 7385 skip(')'); 7386 7387 if (tok == '{') { 7388 7389 if (global_expr) 7390 r = 0x0030; 7391 else 7392 r = 0x0032; 7393 7394 if (!(type.t & 0x0040)) 7395 r |= lvalue_type(type.t); 7396 memset(&ad, 0, sizeof(AttributeDef)); 7397 decl_initializer_alloc(&type, &ad, r, 1, 0, 0); 7398 } else { 7399 if (sizeof_caller) { 7400 vpush(&type); 7401 return; 7402 } 7403 unary(); 7404 gen_cast(&type); 7405 } 7406 } else if (tok == '{') { 7407 int saved_nocode_wanted = nocode_wanted; 7408 if (const_wanted) 7409 tcc_error("expected constant"); 7410 7411 save_regs(0); 7412 7413 7414 7415 7416 7417 block(0, 0, 1); 7418 nocode_wanted = saved_nocode_wanted; 7419 skip(')'); 7420 } else { 7421 gexpr(); 7422 skip(')'); 7423 } 7424 break; 7425 case '*': 7426 next(); 7427 unary(); 7428 indir(); 7429 break; 7430 case '&': 7431 next(); 7432 unary(); 7433 7434 7435 7436 7437 7438 if ((vtop->type.t & 0x000f) != 6 && 7439 !(vtop->type.t & 0x0040)) 7440 test_lvalue(); 7441 mk_pointer(&vtop->type); 7442 gaddrof(); 7443 break; 7444 case '!': 7445 next(); 7446 unary(); 7447 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030) { 7448 gen_cast_s(11); 7449 vtop->c.i = !vtop->c.i; 7450 } else if ((vtop->r & 0x003f) == 0x0033) 7451 vtop->c.i ^= 1; 7452 else { 7453 save_regs(1); 7454 vseti(0x0034, gvtst(1, 0)); 7455 } 7456 break; 7457 case '~': 7458 next(); 7459 unary(); 7460 vpushi(-1); 7461 gen_op('^'); 7462 break; 7463 case '+': 7464 next(); 7465 unary(); 7466 if ((vtop->type.t & 0x000f) == 5) 7467 tcc_error("pointer not accepted for unary plus"); 7468 7469 7470 7471 if (!is_float(vtop->type.t)) { 7472 vpushi(0); 7473 gen_op('+'); 7474 } 7475 break; 7476 case TOK_SIZEOF: 7477 case TOK_ALIGNOF1: 7478 case TOK_ALIGNOF2: 7479 t = tok; 7480 next(); 7481 in_sizeof++; 7482 expr_type(&type, unary); 7483 s = vtop[1].sym; 7484 size = type_size(&type, &align); 7485 if (s && s->a.aligned) 7486 align = 1 << (s->a.aligned - 1); 7487 if (t == TOK_SIZEOF) { 7488 if (!(type.t & 0x0400)) { 7489 if (size < 0) 7490 tcc_error("sizeof applied to an incomplete type"); 7491 vpushs(size); 7492 } else { 7493 vla_runtime_type_size(&type, &align); 7494 } 7495 } else { 7496 vpushs(align); 7497 } 7498 vtop->type.t |= 0x0010; 7499 break; 7500 7501 case TOK_builtin_expect: 7502 7503 parse_builtin_params(0, "ee"); 7504 vpop(); 7505 break; 7506 case TOK_builtin_types_compatible_p: 7507 parse_builtin_params(0, "tt"); 7508 vtop[-1].type.t &= ~(0x0100 | 0x0200); 7509 vtop[0].type.t &= ~(0x0100 | 0x0200); 7510 n = is_compatible_types(&vtop[-1].type, &vtop[0].type); 7511 vtop -= 2; 7512 vpushi(n); 7513 break; 7514 case TOK_builtin_choose_expr: 7515 { 7516 int64_t c; 7517 next(); 7518 skip('('); 7519 c = expr_const64(); 7520 skip(','); 7521 if (!c) { 7522 nocode_wanted++; 7523 } 7524 expr_eq(); 7525 if (!c) { 7526 vpop(); 7527 nocode_wanted--; 7528 } 7529 skip(','); 7530 if (c) { 7531 nocode_wanted++; 7532 } 7533 expr_eq(); 7534 if (c) { 7535 vpop(); 7536 nocode_wanted--; 7537 } 7538 skip(')'); 7539 } 7540 break; 7541 case TOK_builtin_constant_p: 7542 parse_builtin_params(1, "e"); 7543 n = (vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030; 7544 vtop--; 7545 vpushi(n); 7546 break; 7547 case TOK_builtin_frame_address: 7548 case TOK_builtin_return_address: 7549 { 7550 int tok1 = tok; 7551 int level; 7552 next(); 7553 skip('('); 7554 if (tok != 0xb5) { 7555 tcc_error("%s only takes positive integers", 7556 tok1 == TOK_builtin_return_address ? 7557 "__builtin_return_address" : 7558 "__builtin_frame_address"); 7559 } 7560 level = (uint32_t)tokc.i; 7561 next(); 7562 skip(')'); 7563 type.t = 0; 7564 mk_pointer(&type); 7565 vset(&type, 0x0032, 0); 7566 while (level--) { 7567 mk_pointer(&vtop->type); 7568 indir(); 7569 } 7570 if (tok1 == TOK_builtin_return_address) { 7571 7572 vpushi(8); 7573 gen_op('+'); 7574 mk_pointer(&vtop->type); 7575 indir(); 7576 } 7577 } 7578 break; 7579# 4906 "tccgen.c" 7580 case TOK_builtin_va_arg_types: 7581 parse_builtin_params(0, "t"); 7582 vpushi(classify_x86_64_va_arg(&vtop->type)); 7583 vswap(); 7584 vpop(); 7585 break; 7586# 4942 "tccgen.c" 7587 case 0xa4: 7588 case 0xa2: 7589 t = tok; 7590 next(); 7591 unary(); 7592 inc(0, t); 7593 break; 7594 case '-': 7595 next(); 7596 unary(); 7597 t = vtop->type.t & 0x000f; 7598 if (is_float(t)) { 7599 7600 7601 vpush(&vtop->type); 7602 if (t == 8) 7603 vtop->c.f = -1.0 * 0.0; 7604 else if (t == 9) 7605 vtop->c.d = -1.0 * 0.0; 7606 else 7607 vtop->c.ld = -1.0 * 0.0; 7608 } else 7609 vpushi(0); 7610 vswap(); 7611 gen_op('-'); 7612 break; 7613 case 0xa0: 7614 if (!gnu_ext) 7615 goto tok_identifier; 7616 next(); 7617 7618 if (tok < TOK_DEFINE) 7619 expect("label identifier"); 7620 s = label_find(tok); 7621 if (!s) { 7622 s = label_push(&global_label_stack, tok, 1); 7623 } else { 7624 if (s->r == 2) 7625 s->r = 1; 7626 } 7627 if (!s->type.t) { 7628 s->type.t = 0; 7629 mk_pointer(&s->type); 7630 s->type.t |= 0x00002000; 7631 } 7632 vpushsym(&s->type, s); 7633 next(); 7634 break; 7635 7636 case TOK_GENERIC: 7637 { 7638 CType controlling_type; 7639 int has_default = 0; 7640 int has_match = 0; 7641 int learn = 0; 7642 TokenString *str = 0; 7643 7644 next(); 7645 skip('('); 7646 expr_type(&controlling_type, expr_eq); 7647 controlling_type.t &= ~(0x0100 | 0x0200 | 0x0040); 7648 for (;;) { 7649 learn = 0; 7650 skip(','); 7651 if (tok == TOK_DEFAULT) { 7652 if (has_default) 7653 tcc_error("too many 'default'"); 7654 has_default = 1; 7655 if (!has_match) 7656 learn = 1; 7657 next(); 7658 } else { 7659 AttributeDef ad_tmp; 7660 int itmp; 7661 CType cur_type; 7662 parse_btype(&cur_type, &ad_tmp); 7663 type_decl(&cur_type, &ad_tmp, &itmp, 1); 7664 if (compare_types(&controlling_type, &cur_type, 0)) { 7665 if (has_match) { 7666 tcc_error("type match twice"); 7667 } 7668 has_match = 1; 7669 learn = 1; 7670 } 7671 } 7672 skip(':'); 7673 if (learn) { 7674 if (str) 7675 tok_str_free(str); 7676 skip_or_save_block(&str); 7677 } else { 7678 skip_or_save_block(0); 7679 } 7680 if (tok == ')') 7681 break; 7682 } 7683 if (!str) { 7684 char buf[60]; 7685 type_to_str(buf, sizeof buf, &controlling_type, 0); 7686 tcc_error("type '%s' does not match any association", buf); 7687 } 7688 begin_macro(str, 1); 7689 next(); 7690 expr_eq(); 7691 if (tok != (-1)) 7692 expect(","); 7693 end_macro(); 7694 next(); 7695 break; 7696 } 7697 7698 case TOK___NAN__: 7699 vpush64(9, 0x7ff8000000000000ULL); 7700 next(); 7701 break; 7702 case TOK___SNAN__: 7703 vpush64(9, 0x7ff0000000000001ULL); 7704 next(); 7705 break; 7706 case TOK___INF__: 7707 vpush64(9, 0x7ff0000000000000ULL); 7708 next(); 7709 break; 7710 7711 default: 7712 tok_identifier: 7713 t = tok; 7714 next(); 7715 if (t < TOK_DEFINE) 7716 expect("identifier"); 7717 s = sym_find(t); 7718 if (!s || (((s)->type.t & (0x000f | (0 | 0x0010))) == (0 | 0x0010))) { 7719 const char *name = get_tok_str(t, 0); 7720 if (tok != '(') 7721 tcc_error("'%s' undeclared", name); 7722 7723 7724 if (tcc_state->warn_implicit_function_declaration 7725 7726 7727 7728 7729 7730 ) 7731 tcc_warning("implicit declaration of function '%s'", name); 7732 s = external_global_sym(t, &func_old_type, 0); 7733 } 7734 7735 r = s->r; 7736 7737 7738 if ((r & 0x003f) < 0x0030) 7739 r = (r & ~0x003f) | 0x0032; 7740 7741 vset(&s->type, r, s->c); 7742 7743 7744 7745 vtop->sym = s; 7746 7747 if (r & 0x0200) { 7748 vtop->c.i = 0; 7749 } else if (r == 0x0030 && ((s->type.t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (3 << 20))) { 7750 vtop->c.i = s->enum_val; 7751 } 7752 break; 7753 } 7754 7755 7756 while (1) { 7757 if (tok == 0xa4 || tok == 0xa2) { 7758 inc(1, tok); 7759 next(); 7760 } else if (tok == '.' || tok == 0xc7 || tok == 0xbc) { 7761 int qualifiers; 7762 7763 if (tok == 0xc7) 7764 indir(); 7765 qualifiers = vtop->type.t & (0x0100 | 0x0200); 7766 test_lvalue(); 7767 gaddrof(); 7768 7769 if ((vtop->type.t & 0x000f) != 7) 7770 expect("struct or union"); 7771 if (tok == 0xbc) 7772 expect("field name"); 7773 next(); 7774 if (tok == 0xb5 || tok == 0xb6) 7775 expect("field name"); 7776 s = find_field(&vtop->type, tok); 7777 if (!s) 7778 tcc_error("field not found: %s", get_tok_str(tok & ~0x20000000, &tokc)); 7779 7780 vtop->type = char_pointer_type; 7781 vpushi(s->c); 7782 gen_op('+'); 7783 7784 vtop->type = s->type; 7785 vtop->type.t |= qualifiers; 7786 7787 if (!(vtop->type.t & 0x0040)) { 7788 vtop->r |= lvalue_type(vtop->type.t); 7789 7790 7791 if (tcc_state->do_bounds_check && (vtop->r & 0x003f) != 0x0032) 7792 vtop->r |= 0x0800; 7793 7794 } 7795 next(); 7796 } else if (tok == '[') { 7797 next(); 7798 gexpr(); 7799 gen_op('+'); 7800 indir(); 7801 skip(']'); 7802 } else if (tok == '(') { 7803 SValue ret; 7804 Sym *sa; 7805 int nb_args, ret_nregs, ret_align, regsize, variadic; 7806 7807 7808 if ((vtop->type.t & 0x000f) != 6) { 7809 7810 if ((vtop->type.t & (0x000f | 0x0040)) == 5) { 7811 vtop->type = *pointed_type(&vtop->type); 7812 if ((vtop->type.t & 0x000f) != 6) 7813 goto error_func; 7814 } else { 7815 error_func: 7816 expect("function pointer"); 7817 } 7818 } else { 7819 vtop->r &= ~0x0100; 7820 } 7821 7822 s = vtop->type.ref; 7823 next(); 7824 sa = s->next; 7825 nb_args = regsize = 0; 7826 ret.r2 = 0x0030; 7827 7828 if ((s->type.t & 0x000f) == 7) { 7829 variadic = (s->f.func_type == 3); 7830 ret_nregs = gfunc_sret(&s->type, variadic, &ret.type, 7831 &ret_align, ®size); 7832 if (!ret_nregs) { 7833 7834 size = type_size(&s->type, &align); 7835# 5199 "tccgen.c" 7836 loc = (loc - size) & -align; 7837 ret.type = s->type; 7838 ret.r = 0x0032 | 0x0100; 7839 7840 7841 vseti(0x0032, loc); 7842 ret.c = vtop->c; 7843 nb_args++; 7844 } 7845 } else { 7846 ret_nregs = 1; 7847 ret.type = s->type; 7848 } 7849 7850 if (ret_nregs) { 7851 7852 if (is_float(ret.type.t)) { 7853 ret.r = reg_fret(ret.type.t); 7854 7855 if ((ret.type.t & 0x000f) == 14) 7856 ret.r2 = TREG_XMM1; 7857 7858 } else { 7859 7860 7861 if ((ret.type.t & 0x000f) == 13) 7862 7863 7864 7865 ret.r2 = TREG_RDX; 7866 7867 ret.r = TREG_RAX; 7868 } 7869 ret.c.i = 0; 7870 } 7871 if (tok != ')') { 7872 for(;;) { 7873 expr_eq(); 7874 gfunc_param_typed(s, sa); 7875 nb_args++; 7876 if (sa) 7877 sa = sa->next; 7878 if (tok == ')') 7879 break; 7880 skip(','); 7881 } 7882 } 7883 if (sa) 7884 tcc_error("too few arguments to function"); 7885 skip(')'); 7886 gfunc_call(nb_args); 7887 7888 7889 for (r = ret.r + ret_nregs + !ret_nregs; r-- > ret.r;) { 7890 vsetc(&ret.type, r, &ret.c); 7891 vtop->r2 = ret.r2; 7892 } 7893 7894 7895 if (((s->type.t & 0x000f) == 7) && ret_nregs) { 7896 int addr, offset; 7897 7898 size = type_size(&s->type, &align); 7899 7900 7901 if (regsize > align) 7902 align = regsize; 7903 loc = (loc - size) & -align; 7904 addr = loc; 7905 offset = 0; 7906 for (;;) { 7907 vset(&ret.type, 0x0032 | 0x0100, addr + offset); 7908 vswap(); 7909 vstore(); 7910 vtop--; 7911 if (--ret_nregs == 0) 7912 break; 7913 offset += regsize; 7914 } 7915 vset(&s->type, 0x0032 | 0x0100, addr); 7916 } 7917 } else { 7918 break; 7919 } 7920 } 7921} 7922 7923static void expr_prod(void) 7924{ 7925 int t; 7926 7927 unary(); 7928 while (tok == '*' || tok == '/' || tok == '%') { 7929 t = tok; 7930 next(); 7931 unary(); 7932 gen_op(t); 7933 } 7934} 7935 7936static void expr_sum(void) 7937{ 7938 int t; 7939 7940 expr_prod(); 7941 while (tok == '+' || tok == '-') { 7942 t = tok; 7943 next(); 7944 expr_prod(); 7945 gen_op(t); 7946 } 7947} 7948 7949static void expr_shift(void) 7950{ 7951 int t; 7952 7953 expr_sum(); 7954 while (tok == 0x01 || tok == 0x02) { 7955 t = tok; 7956 next(); 7957 expr_sum(); 7958 gen_op(t); 7959 } 7960} 7961 7962static void expr_cmp(void) 7963{ 7964 int t; 7965 7966 expr_shift(); 7967 while ((tok >= 0x96 && tok <= 0x9f) || 7968 tok == 0x92 || tok == 0x93) { 7969 t = tok; 7970 next(); 7971 expr_shift(); 7972 gen_op(t); 7973 } 7974} 7975 7976static void expr_cmpeq(void) 7977{ 7978 int t; 7979 7980 expr_cmp(); 7981 while (tok == 0x94 || tok == 0x95) { 7982 t = tok; 7983 next(); 7984 expr_cmp(); 7985 gen_op(t); 7986 } 7987} 7988 7989static void expr_and(void) 7990{ 7991 expr_cmpeq(); 7992 while (tok == '&') { 7993 next(); 7994 expr_cmpeq(); 7995 gen_op('&'); 7996 } 7997} 7998 7999static void expr_xor(void) 8000{ 8001 expr_and(); 8002 while (tok == '^') { 8003 next(); 8004 expr_and(); 8005 gen_op('^'); 8006 } 8007} 8008 8009static void expr_or(void) 8010{ 8011 expr_xor(); 8012 while (tok == '|') { 8013 next(); 8014 expr_xor(); 8015 gen_op('|'); 8016 } 8017} 8018 8019static void expr_land(void) 8020{ 8021 expr_or(); 8022 if (tok == 0xa0) { 8023 int t = 0; 8024 for(;;) { 8025 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030) { 8026 gen_cast_s(11); 8027 if (vtop->c.i) { 8028 vpop(); 8029 } else { 8030 nocode_wanted++; 8031 while (tok == 0xa0) { 8032 next(); 8033 expr_or(); 8034 vpop(); 8035 } 8036 nocode_wanted--; 8037 if (t) 8038 gsym(t); 8039 gen_cast_s(3); 8040 break; 8041 } 8042 } else { 8043 if (!t) 8044 save_regs(1); 8045 t = gvtst(1, t); 8046 } 8047 if (tok != 0xa0) { 8048 if (t) 8049 vseti(0x0035, t); 8050 else 8051 vpushi(1); 8052 break; 8053 } 8054 next(); 8055 expr_or(); 8056 } 8057 } 8058} 8059 8060static void expr_lor(void) 8061{ 8062 expr_land(); 8063 if (tok == 0xa1) { 8064 int t = 0; 8065 for(;;) { 8066 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) == 0x0030) { 8067 gen_cast_s(11); 8068 if (!vtop->c.i) { 8069 vpop(); 8070 } else { 8071 nocode_wanted++; 8072 while (tok == 0xa1) { 8073 next(); 8074 expr_land(); 8075 vpop(); 8076 } 8077 nocode_wanted--; 8078 if (t) 8079 gsym(t); 8080 gen_cast_s(3); 8081 break; 8082 } 8083 } else { 8084 if (!t) 8085 save_regs(1); 8086 t = gvtst(0, t); 8087 } 8088 if (tok != 0xa1) { 8089 if (t) 8090 vseti(0x0034, t); 8091 else 8092 vpushi(0); 8093 break; 8094 } 8095 next(); 8096 expr_land(); 8097 } 8098 } 8099} 8100 8101 8102 8103 8104static int condition_3way(void) 8105{ 8106 int c = -1; 8107 if ((vtop->r & (0x003f | 0x0100)) == 0x0030 && 8108 (!(vtop->r & 0x0200) || !vtop->sym->a.weak)) { 8109 vdup(); 8110 gen_cast_s(11); 8111 c = vtop->c.i; 8112 vpop(); 8113 } 8114 return c; 8115} 8116 8117static void expr_cond(void) 8118{ 8119 int tt, u, r1, r2, rc, t1, t2, bt1, bt2, islv, c, g; 8120 SValue sv; 8121 CType type, type1, type2; 8122 8123 expr_lor(); 8124 if (tok == '?') { 8125 next(); 8126 c = condition_3way(); 8127 g = (tok == ':' && gnu_ext); 8128 if (c < 0) { 8129 8130 8131 if (is_float(vtop->type.t)) { 8132 rc = 0x0002; 8133 8134 if ((vtop->type.t & 0x000f) == 10) { 8135 rc = 0x0080; 8136 } 8137 8138 } else 8139 rc = 0x0001; 8140 gv(rc); 8141 save_regs(1); 8142 if (g) 8143 gv_dup(); 8144 tt = gvtst(1, 0); 8145 8146 } else { 8147 if (!g) 8148 vpop(); 8149 tt = 0; 8150 } 8151 8152 if (1) { 8153 if (c == 0) 8154 nocode_wanted++; 8155 if (!g) 8156 gexpr(); 8157 8158 type1 = vtop->type; 8159 sv = *vtop; 8160 vtop--; 8161 skip(':'); 8162 8163 u = 0; 8164 if (c < 0) 8165 u = gjmp(0); 8166 gsym(tt); 8167 8168 if (c == 0) 8169 nocode_wanted--; 8170 if (c == 1) 8171 nocode_wanted++; 8172 expr_cond(); 8173 if (c == 1) 8174 nocode_wanted--; 8175 8176 type2 = vtop->type; 8177 t1 = type1.t; 8178 bt1 = t1 & 0x000f; 8179 t2 = type2.t; 8180 bt2 = t2 & 0x000f; 8181 type.ref = 0; 8182 8183 8184 if (is_float(bt1) || is_float(bt2)) { 8185 if (bt1 == 10 || bt2 == 10) { 8186 type.t = 10; 8187 8188 } else if (bt1 == 9 || bt2 == 9) { 8189 type.t = 9; 8190 } else { 8191 type.t = 8; 8192 } 8193 } else if (bt1 == 4 || bt2 == 4) { 8194 8195 type.t = 4 | 0x0800; 8196 if (bt1 == 4) 8197 type.t &= t1; 8198 if (bt2 == 4) 8199 type.t &= t2; 8200 8201 if ((t1 & (0x000f | 0x0010 | 0x0080)) == (4 | 0x0010) || 8202 (t2 & (0x000f | 0x0010 | 0x0080)) == (4 | 0x0010)) 8203 type.t |= 0x0010; 8204 } else if (bt1 == 5 || bt2 == 5) { 8205 8206 8207 if (is_null_pointer (vtop)) 8208 type = type1; 8209 else if (is_null_pointer (&sv)) 8210 type = type2; 8211 8212 8213 else 8214 type = type1; 8215 } else if (bt1 == 6 || bt2 == 6) { 8216 8217 type = bt1 == 6 ? type1 : type2; 8218 } else if (bt1 == 7 || bt2 == 7) { 8219 8220 type = bt1 == 7 ? type1 : type2; 8221 } else if (bt1 == 0 || bt2 == 0) { 8222 8223 type.t = 0; 8224 } else { 8225 8226 type.t = 3 | (0x0800 & (t1 | t2)); 8227 8228 if ((t1 & (0x000f | 0x0010 | 0x0080)) == (3 | 0x0010) || 8229 (t2 & (0x000f | 0x0010 | 0x0080)) == (3 | 0x0010)) 8230 type.t |= 0x0010; 8231 } 8232 8233 8234 islv = (vtop->r & 0x0100) && (sv.r & 0x0100) && 7 == (type.t & 0x000f); 8235 islv &= c < 0; 8236 8237 8238 if (c != 1) { 8239 gen_cast(&type); 8240 if (islv) { 8241 mk_pointer(&vtop->type); 8242 gaddrof(); 8243 } else if (7 == (vtop->type.t & 0x000f)) 8244 gaddrof(); 8245 } 8246 8247 rc = 0x0001; 8248 if (is_float(type.t)) { 8249 rc = 0x0002; 8250 8251 if ((type.t & 0x000f) == 10) { 8252 rc = 0x0080; 8253 } 8254 8255 } else if ((type.t & 0x000f) == 4) { 8256 8257 8258 rc = 0x0004; 8259 } 8260 8261 tt = r2 = 0; 8262 if (c < 0) { 8263 r2 = gv(rc); 8264 tt = gjmp(0); 8265 } 8266 gsym(u); 8267 8268 8269 8270 if (c != 0) { 8271 *vtop = sv; 8272 gen_cast(&type); 8273 if (islv) { 8274 mk_pointer(&vtop->type); 8275 gaddrof(); 8276 } else if (7 == (vtop->type.t & 0x000f)) 8277 gaddrof(); 8278 } 8279 8280 if (c < 0) { 8281 r1 = gv(rc); 8282 move_reg(r2, r1, type.t); 8283 vtop->r = r2; 8284 gsym(tt); 8285 if (islv) 8286 indir(); 8287 } 8288 } 8289 } 8290} 8291 8292static void expr_eq(void) 8293{ 8294 int t; 8295 8296 expr_cond(); 8297 if (tok == '=' || 8298 (tok >= 0xa5 && tok <= 0xaf) || 8299 tok == 0xde || tok == 0xfc || 8300 tok == 0x81 || tok == 0x82) { 8301 test_lvalue(); 8302 t = tok; 8303 next(); 8304 if (t == '=') { 8305 expr_eq(); 8306 } else { 8307 vdup(); 8308 expr_eq(); 8309 gen_op(t & 0x7f); 8310 } 8311 vstore(); 8312 } 8313} 8314 8315static void gexpr(void) 8316{ 8317 while (1) { 8318 expr_eq(); 8319 if (tok != ',') 8320 break; 8321 vpop(); 8322 next(); 8323 } 8324} 8325 8326 8327static void expr_const1(void) 8328{ 8329 const_wanted++; 8330 nocode_wanted++; 8331 expr_cond(); 8332 nocode_wanted--; 8333 const_wanted--; 8334} 8335 8336 8337static inline int64_t expr_const64(void) 8338{ 8339 int64_t c; 8340 expr_const1(); 8341 if ((vtop->r & (0x003f | 0x0100 | 0x0200)) != 0x0030) 8342 expect("constant expression"); 8343 c = vtop->c.i; 8344 vpop(); 8345 return c; 8346} 8347 8348 8349 8350static int expr_const(void) 8351{ 8352 int c; 8353 int64_t wc = expr_const64(); 8354 c = wc; 8355 if (c != wc && (unsigned)c != wc) 8356 tcc_error("constant exceeds 32 bit"); 8357 return c; 8358} 8359 8360 8361 8362static int is_label(void) 8363{ 8364 int last_tok; 8365 8366 8367 if (tok < TOK_DEFINE) 8368 return 0; 8369 8370 last_tok = tok; 8371 next(); 8372 if (tok == ':') { 8373 return last_tok; 8374 } else { 8375 unget_tok(last_tok); 8376 return 0; 8377 } 8378} 8379 8380 8381static void gfunc_return(CType *func_type) 8382{ 8383 if ((func_type->t & 0x000f) == 7) { 8384 CType type, ret_type; 8385 int ret_align, ret_nregs, regsize; 8386 ret_nregs = gfunc_sret(func_type, func_var, &ret_type, 8387 &ret_align, ®size); 8388 if (0 == ret_nregs) { 8389 8390 8391 type = *func_type; 8392 mk_pointer(&type); 8393 vset(&type, 0x0032 | 0x0100, func_vc); 8394 indir(); 8395 vswap(); 8396 8397 vstore(); 8398 } else { 8399 8400 int r, size, addr, align; 8401 size = type_size(func_type,&align); 8402 if ((vtop->r != (0x0032 | 0x0100) || 8403 (vtop->c.i & (ret_align-1))) 8404 && (align & (ret_align-1))) { 8405 loc = (loc - size) & -ret_align; 8406 addr = loc; 8407 type = *func_type; 8408 vset(&type, 0x0032 | 0x0100, addr); 8409 vswap(); 8410 vstore(); 8411 vpop(); 8412 vset(&ret_type, 0x0032 | 0x0100, addr); 8413 } 8414 vtop->type = ret_type; 8415 if (is_float(ret_type.t)) 8416 r = rc_fret(ret_type.t); 8417 else 8418 r = 0x0004; 8419 8420 if (ret_nregs == 1) 8421 gv(r); 8422 else { 8423 for (;;) { 8424 vdup(); 8425 gv(r); 8426 vpop(); 8427 if (--ret_nregs == 0) 8428 break; 8429 8430 8431 8432 r <<= 1; 8433 vtop->c.i += regsize; 8434 } 8435 } 8436 } 8437 } else if (is_float(func_type->t)) { 8438 gv(rc_fret(func_type->t)); 8439 } else { 8440 gv(0x0004); 8441 } 8442 vtop--; 8443} 8444 8445 8446static int case_cmp(const void *pa, const void *pb) 8447{ 8448 int64_t a = (*(struct case_t**) pa)->v1; 8449 int64_t b = (*(struct case_t**) pb)->v1; 8450 return a < b ? -1 : a > b; 8451} 8452 8453static void gcase(struct case_t **base, int len, int *bsym) 8454{ 8455 struct case_t *p; 8456 int e; 8457 int ll = (vtop->type.t & 0x000f) == 4; 8458 gv(0x0001); 8459 while (len > 4) { 8460 8461 p = base[len/2]; 8462 vdup(); 8463 if (ll) 8464 vpushll(p->v2); 8465 else 8466 vpushi(p->v2); 8467 gen_op(0x9e); 8468 e = gtst(1, 0); 8469 vdup(); 8470 if (ll) 8471 vpushll(p->v1); 8472 else 8473 vpushi(p->v1); 8474 gen_op(0x9d); 8475 gtst_addr(0, p->sym); 8476 8477 gcase(base, len/2, bsym); 8478 if (cur_switch->def_sym) 8479 gjmp_addr(cur_switch->def_sym); 8480 else 8481 *bsym = gjmp(*bsym); 8482 8483 gsym(e); 8484 e = len/2 + 1; 8485 base += e; len -= e; 8486 } 8487 8488 while (len--) { 8489 p = *base++; 8490 vdup(); 8491 if (ll) 8492 vpushll(p->v2); 8493 else 8494 vpushi(p->v2); 8495 if (p->v1 == p->v2) { 8496 gen_op(0x94); 8497 gtst_addr(0, p->sym); 8498 } else { 8499 gen_op(0x9e); 8500 e = gtst(1, 0); 8501 vdup(); 8502 if (ll) 8503 vpushll(p->v1); 8504 else 8505 vpushi(p->v1); 8506 gen_op(0x9d); 8507 gtst_addr(0, p->sym); 8508 gsym(e); 8509 } 8510 } 8511} 8512 8513static void block(int *bsym, int *csym, int is_expr) 8514{ 8515 int a, b, c, d, cond; 8516 Sym *s; 8517 8518 8519 if (tcc_state->do_debug) 8520 tcc_debug_line(tcc_state); 8521 8522 if (is_expr) { 8523 8524 vpushi(0); 8525 vtop->type.t = 0; 8526 } 8527 8528 if (tok == TOK_IF) { 8529 8530 int saved_nocode_wanted = nocode_wanted; 8531 next(); 8532 skip('('); 8533 gexpr(); 8534 skip(')'); 8535 cond = condition_3way(); 8536 if (cond == 1) 8537 a = 0, vpop(); 8538 else 8539 a = gvtst(1, 0); 8540 if (cond == 0) 8541 nocode_wanted |= 0x20000000; 8542 block(bsym, csym, 0); 8543 if (cond != 1) 8544 nocode_wanted = saved_nocode_wanted; 8545 c = tok; 8546 if (c == TOK_ELSE) { 8547 next(); 8548 d = gjmp(0); 8549 gsym(a); 8550 if (cond == 1) 8551 nocode_wanted |= 0x20000000; 8552 block(bsym, csym, 0); 8553 gsym(d); 8554 if (cond != 0) 8555 nocode_wanted = saved_nocode_wanted; 8556 } else 8557 gsym(a); 8558 } else if (tok == TOK_WHILE) { 8559 int saved_nocode_wanted; 8560 nocode_wanted &= ~0x20000000; 8561 next(); 8562 d = ind; 8563 vla_sp_restore(); 8564 skip('('); 8565 gexpr(); 8566 skip(')'); 8567 a = gvtst(1, 0); 8568 b = 0; 8569 ++local_scope; 8570 saved_nocode_wanted = nocode_wanted; 8571 block(&a, &b, 0); 8572 nocode_wanted = saved_nocode_wanted; 8573 --local_scope; 8574 gjmp_addr(d); 8575 gsym(a); 8576 gsym_addr(b, d); 8577 } else if (tok == '{') { 8578 Sym *llabel; 8579 int block_vla_sp_loc = vla_sp_loc, saved_vlas_in_scope = vlas_in_scope; 8580 8581 next(); 8582 8583 s = local_stack; 8584 llabel = local_label_stack; 8585 ++local_scope; 8586 8587 8588 if (tok == TOK_LABEL) { 8589 next(); 8590 for(;;) { 8591 if (tok < TOK_DEFINE) 8592 expect("label identifier"); 8593 label_push(&local_label_stack, tok, 2); 8594 next(); 8595 if (tok == ',') { 8596 next(); 8597 } else { 8598 skip(';'); 8599 break; 8600 } 8601 } 8602 } 8603 while (tok != '}') { 8604 if ((a = is_label())) 8605 unget_tok(a); 8606 else 8607 decl(0x0032); 8608 if (tok != '}') { 8609 if (is_expr) 8610 vpop(); 8611 block(bsym, csym, is_expr); 8612 } 8613 } 8614 8615 label_pop(&local_label_stack, llabel, is_expr); 8616 8617 --local_scope; 8618 8619 8620 8621 8622 8623 8624 8625 sym_pop(&local_stack, s, is_expr); 8626 8627 8628 if (vlas_in_scope > saved_vlas_in_scope) { 8629 vla_sp_loc = saved_vlas_in_scope ? block_vla_sp_loc : vla_sp_root_loc; 8630 vla_sp_restore(); 8631 } 8632 vlas_in_scope = saved_vlas_in_scope; 8633 8634 next(); 8635 } else if (tok == TOK_RETURN) { 8636 next(); 8637 if (tok != ';') { 8638 gexpr(); 8639 gen_assign_cast(&func_vt); 8640 if ((func_vt.t & 0x000f) == 0) 8641 vtop--; 8642 else 8643 gfunc_return(&func_vt); 8644 } 8645 skip(';'); 8646 8647 if (tok != '}' || local_scope != 1) 8648 rsym = gjmp(rsym); 8649 nocode_wanted |= 0x20000000; 8650 } else if (tok == TOK_BREAK) { 8651 8652 if (!bsym) 8653 tcc_error("cannot break"); 8654 *bsym = gjmp(*bsym); 8655 next(); 8656 skip(';'); 8657 nocode_wanted |= 0x20000000; 8658 } else if (tok == TOK_CONTINUE) { 8659 8660 if (!csym) 8661 tcc_error("cannot continue"); 8662 vla_sp_restore_root(); 8663 *csym = gjmp(*csym); 8664 next(); 8665 skip(';'); 8666 } else if (tok == TOK_FOR) { 8667 int e; 8668 int saved_nocode_wanted; 8669 nocode_wanted &= ~0x20000000; 8670 next(); 8671 skip('('); 8672 s = local_stack; 8673 ++local_scope; 8674 if (tok != ';') { 8675 8676 if (!decl0(0x0032, 1, 0)) { 8677 8678 gexpr(); 8679 vpop(); 8680 } 8681 } 8682 skip(';'); 8683 d = ind; 8684 c = ind; 8685 vla_sp_restore(); 8686 a = 0; 8687 b = 0; 8688 if (tok != ';') { 8689 gexpr(); 8690 a = gvtst(1, 0); 8691 } 8692 skip(';'); 8693 if (tok != ')') { 8694 e = gjmp(0); 8695 c = ind; 8696 vla_sp_restore(); 8697 gexpr(); 8698 vpop(); 8699 gjmp_addr(d); 8700 gsym(e); 8701 } 8702 skip(')'); 8703 saved_nocode_wanted = nocode_wanted; 8704 block(&a, &b, 0); 8705 nocode_wanted = saved_nocode_wanted; 8706 gjmp_addr(c); 8707 gsym(a); 8708 gsym_addr(b, c); 8709 --local_scope; 8710 sym_pop(&local_stack, s, 0); 8711 8712 } else 8713 if (tok == TOK_DO) { 8714 int saved_nocode_wanted; 8715 nocode_wanted &= ~0x20000000; 8716 next(); 8717 a = 0; 8718 b = 0; 8719 d = ind; 8720 vla_sp_restore(); 8721 saved_nocode_wanted = nocode_wanted; 8722 block(&a, &b, 0); 8723 skip(TOK_WHILE); 8724 skip('('); 8725 gsym(b); 8726 gexpr(); 8727 c = gvtst(0, 0); 8728 gsym_addr(c, d); 8729 nocode_wanted = saved_nocode_wanted; 8730 skip(')'); 8731 gsym(a); 8732 skip(';'); 8733 } else 8734 if (tok == TOK_SWITCH) { 8735 struct switch_t *saved, sw; 8736 int saved_nocode_wanted = nocode_wanted; 8737 SValue switchval; 8738 next(); 8739 skip('('); 8740 gexpr(); 8741 skip(')'); 8742 switchval = *vtop--; 8743 a = 0; 8744 b = gjmp(0); 8745 sw.p = 0; sw.n = 0; sw.def_sym = 0; 8746 saved = cur_switch; 8747 cur_switch = &sw; 8748 block(&a, csym, 0); 8749 nocode_wanted = saved_nocode_wanted; 8750 a = gjmp(a); 8751 8752 gsym(b); 8753 qsort(sw.p, sw.n, sizeof(void*), case_cmp); 8754 for (b = 1; b < sw.n; b++) 8755 if (sw.p[b - 1]->v2 >= sw.p[b]->v1) 8756 tcc_error("duplicate case value"); 8757 8758 8759 if ((switchval.type.t & 0x000f) == 4) 8760 switchval.type.t &= ~0x0010; 8761 vpushv(&switchval); 8762 gcase(sw.p, sw.n, &a); 8763 vpop(); 8764 if (sw.def_sym) 8765 gjmp_addr(sw.def_sym); 8766 dynarray_reset(&sw.p, &sw.n); 8767 cur_switch = saved; 8768 8769 gsym(a); 8770 } else 8771 if (tok == TOK_CASE) { 8772 struct case_t *cr = tcc_malloc(sizeof(struct case_t)); 8773 if (!cur_switch) 8774 expect("switch"); 8775 nocode_wanted &= ~0x20000000; 8776 next(); 8777 cr->v1 = cr->v2 = expr_const64(); 8778 if (gnu_ext && tok == 0xc8) { 8779 next(); 8780 cr->v2 = expr_const64(); 8781 if (cr->v2 < cr->v1) 8782 tcc_warning("empty case range"); 8783 } 8784 cr->sym = ind; 8785 dynarray_add(&cur_switch->p, &cur_switch->n, cr); 8786 skip(':'); 8787 is_expr = 0; 8788 goto block_after_label; 8789 } else 8790 if (tok == TOK_DEFAULT) { 8791 next(); 8792 skip(':'); 8793 if (!cur_switch) 8794 expect("switch"); 8795 if (cur_switch->def_sym) 8796 tcc_error("too many 'default'"); 8797 cur_switch->def_sym = ind; 8798 is_expr = 0; 8799 goto block_after_label; 8800 } else 8801 if (tok == TOK_GOTO) { 8802 next(); 8803 if (tok == '*' && gnu_ext) { 8804 8805 next(); 8806 gexpr(); 8807 if ((vtop->type.t & 0x000f) != 5) 8808 expect("pointer"); 8809 ggoto(); 8810 } else if (tok >= TOK_DEFINE) { 8811 s = label_find(tok); 8812 8813 if (!s) { 8814 s = label_push(&global_label_stack, tok, 1); 8815 } else { 8816 if (s->r == 2) 8817 s->r = 1; 8818 } 8819 vla_sp_restore_root(); 8820 if (s->r & 1) 8821 s->jnext = gjmp(s->jnext); 8822 else 8823 gjmp_addr(s->jnext); 8824 next(); 8825 } else { 8826 expect("label identifier"); 8827 } 8828 skip(';'); 8829 } else if (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3) { 8830 asm_instr(); 8831 } else { 8832 b = is_label(); 8833 if (b) { 8834 8835 next(); 8836 s = label_find(b); 8837 if (s) { 8838 if (s->r == 0) 8839 tcc_error("duplicate label '%s'", get_tok_str(s->v, 0)); 8840 gsym(s->jnext); 8841 s->r = 0; 8842 } else { 8843 s = label_push(&global_label_stack, b, 0); 8844 } 8845 s->jnext = ind; 8846 vla_sp_restore(); 8847 8848 block_after_label: 8849 nocode_wanted &= ~0x20000000; 8850 if (tok == '}') { 8851 tcc_warning("deprecated use of label at end of compound statement"); 8852 } else { 8853 if (is_expr) 8854 vpop(); 8855 block(bsym, csym, is_expr); 8856 } 8857 } else { 8858 8859 if (tok != ';') { 8860 if (is_expr) { 8861 vpop(); 8862 gexpr(); 8863 } else { 8864 gexpr(); 8865 vpop(); 8866 } 8867 } 8868 skip(';'); 8869 } 8870 } 8871} 8872 8873 8874 8875 8876 8877 8878static void skip_or_save_block(TokenString **str) 8879{ 8880 int braces = tok == '{'; 8881 int level = 0; 8882 if (str) 8883 *str = tok_str_alloc(); 8884 8885 while ((level > 0 || (tok != '}' && tok != ',' && tok != ';' && tok != ')'))) { 8886 int t; 8887 if (tok == (-1)) { 8888 if (str || level > 0) 8889 tcc_error("unexpected end of file"); 8890 else 8891 break; 8892 } 8893 if (str) 8894 tok_str_add_tok(*str); 8895 t = tok; 8896 next(); 8897 if (t == '{' || t == '(') { 8898 level++; 8899 } else if (t == '}' || t == ')') { 8900 level--; 8901 if (level == 0 && braces && t == '}') 8902 break; 8903 } 8904 } 8905 if (str) { 8906 tok_str_add(*str, -1); 8907 tok_str_add(*str, 0); 8908 } 8909} 8910 8911 8912 8913 8914static void parse_init_elem(int expr_type) 8915{ 8916 int saved_global_expr; 8917 switch(expr_type) { 8918 case 1: 8919 8920 saved_global_expr = global_expr; 8921 global_expr = 1; 8922 expr_const1(); 8923 global_expr = saved_global_expr; 8924 8925 8926 if (((vtop->r & (0x003f | 0x0100)) != 0x0030 8927 && ((vtop->r & (0x0200|0x0100)) != (0x0200|0x0100) 8928 || vtop->sym->v < 0x10000000)) 8929 8930 8931 8932 ) 8933 tcc_error("initializer element is not constant"); 8934 break; 8935 case 2: 8936 expr_eq(); 8937 break; 8938 } 8939} 8940 8941 8942static void init_putz(Section *sec, unsigned long c, int size) 8943{ 8944 if (sec) { 8945 8946 } else { 8947 vpush_global_sym(&func_old_type, TOK_memset); 8948 vseti(0x0032, c); 8949 8950 8951 8952 8953 vpushi(0); 8954 vpushs(size); 8955 8956 gfunc_call(3); 8957 } 8958} 8959 8960 8961 8962 8963 8964 8965 8966static int decl_designator(CType *type, Section *sec, unsigned long c, 8967 Sym **cur_field, int size_only, int al) 8968{ 8969 Sym *s, *f; 8970 int index, index_last, align, l, nb_elems, elem_size; 8971 unsigned long corig = c; 8972 8973 elem_size = 0; 8974 nb_elems = 1; 8975 if (gnu_ext && (l = is_label()) != 0) 8976 goto struct_field; 8977 8978 while (nb_elems == 1 && (tok == '[' || tok == '.')) { 8979 if (tok == '[') { 8980 if (!(type->t & 0x0040)) 8981 expect("array type"); 8982 next(); 8983 index = index_last = expr_const(); 8984 if (tok == 0xc8 && gnu_ext) { 8985 next(); 8986 index_last = expr_const(); 8987 } 8988 skip(']'); 8989 s = type->ref; 8990 if (index < 0 || (s->c >= 0 && index_last >= s->c) || 8991 index_last < index) 8992 tcc_error("invalid index"); 8993 if (cur_field) 8994 (*cur_field)->c = index_last; 8995 type = pointed_type(type); 8996 elem_size = type_size(type, &align); 8997 c += index * elem_size; 8998 nb_elems = index_last - index + 1; 8999 } else { 9000 next(); 9001 l = tok; 9002 struct_field: 9003 next(); 9004 if ((type->t & 0x000f) != 7) 9005 expect("struct/union type"); 9006 f = find_field(type, l); 9007 if (!f) 9008 expect("field"); 9009 if (cur_field) 9010 *cur_field = f; 9011 type = &f->type; 9012 c += f->c; 9013 } 9014 cur_field = 0; 9015 } 9016 if (!cur_field) { 9017 if (tok == '=') { 9018 next(); 9019 } else if (!gnu_ext) { 9020 expect("="); 9021 } 9022 } else { 9023 if (type->t & 0x0040) { 9024 index = (*cur_field)->c; 9025 if (type->ref->c >= 0 && index >= type->ref->c) 9026 tcc_error("index too large"); 9027 type = pointed_type(type); 9028 c += index * type_size(type, &align); 9029 } else { 9030 f = *cur_field; 9031 while (f && (f->v & 0x10000000) && (f->type.t & 0x0080)) 9032 *cur_field = f = f->next; 9033 if (!f) 9034 tcc_error("too many field init"); 9035 type = &f->type; 9036 c += f->c; 9037 } 9038 } 9039 9040 9041 if (!size_only && c - corig > al) 9042 init_putz(sec, corig + al, c - corig - al); 9043 decl_initializer(type, sec, c, 0, size_only); 9044 9045 9046 if (!size_only && nb_elems > 1) { 9047 unsigned long c_end; 9048 uint8_t *src, *dst; 9049 int i; 9050 9051 if (!sec) { 9052 vset(type, 0x0032|0x0100, c); 9053 for (i = 1; i < nb_elems; i++) { 9054 vset(type, 0x0032|0x0100, c + elem_size * i); 9055 vswap(); 9056 vstore(); 9057 } 9058 vpop(); 9059 } else if (!(nocode_wanted > 0)) { 9060 c_end = c + nb_elems * elem_size; 9061 if (c_end > sec->data_allocated) 9062 section_realloc(sec, c_end); 9063 src = sec->data + c; 9064 dst = src; 9065 for(i = 1; i < nb_elems; i++) { 9066 dst += elem_size; 9067 memcpy(dst, src, elem_size); 9068 } 9069 } 9070 } 9071 c += nb_elems * type_size(type, &align); 9072 if (c - corig > al) 9073 al = c - corig; 9074 return al; 9075} 9076 9077 9078static void init_putv(CType *type, Section *sec, unsigned long c) 9079{ 9080 int bt; 9081 void *ptr; 9082 CType dtype; 9083 9084 dtype = *type; 9085 dtype.t &= ~0x0100; 9086 9087 if (sec) { 9088 int size, align; 9089 9090 9091 gen_assign_cast(&dtype); 9092 bt = type->t & 0x000f; 9093 9094 if ((vtop->r & 0x0200) 9095 && bt != 5 9096 && bt != 6 9097 && (bt != (8 == 8 ? 4 : 3) 9098 || (type->t & 0x0080)) 9099 && !((vtop->r & 0x0030) && vtop->sym->v >= 0x10000000) 9100 ) 9101 tcc_error("initializer element is not computable at load time"); 9102 9103 if ((nocode_wanted > 0)) { 9104 vtop--; 9105 return; 9106 } 9107 9108 size = type_size(type, &align); 9109 section_reserve(sec, c + size); 9110 ptr = sec->data + c; 9111 9112 9113 if ((vtop->r & (0x0200|0x0030)) == (0x0200|0x0030) && 9114 vtop->sym->v >= 0x10000000 && 9115# 6488 "tccgen.c" 9116 (vtop->type.t & 0x000f) != 5) { 9117 9118 Section *ssec; 9119 Elf64_Sym *esym; 9120 Elf64_Rela *rel; 9121 esym = elfsym(vtop->sym); 9122 ssec = tcc_state->sections[esym->st_shndx]; 9123 memmove (ptr, ssec->data + esym->st_value, size); 9124 if (ssec->reloc) { 9125 9126 9127 9128 9129 int num_relocs = ssec->reloc->data_offset / sizeof(*rel); 9130 rel = (Elf64_Rela*)(ssec->reloc->data + ssec->reloc->data_offset); 9131 while (num_relocs--) { 9132 rel--; 9133 if (rel->r_offset >= esym->st_value + size) 9134 continue; 9135 if (rel->r_offset < esym->st_value) 9136 break; 9137 9138 9139 9140 9141 9142 9143 put_elf_reloca(symtab_section, sec, 9144 c + rel->r_offset - esym->st_value, 9145 ((rel->r_info) & 0xffffffff), 9146 ((rel->r_info) >> 32), 9147 9148 rel->r_addend 9149 9150 9151 9152 ); 9153 } 9154 } 9155 } else { 9156 if (type->t & 0x0080) { 9157 int bit_pos, bit_size, bits, n; 9158 unsigned char *p, v, m; 9159 bit_pos = (((vtop->type.t) >> 20) & 0x3f); 9160 bit_size = (((vtop->type.t) >> (20 + 6)) & 0x3f); 9161 p = (unsigned char*)ptr + (bit_pos >> 3); 9162 bit_pos &= 7, bits = 0; 9163 while (bit_size) { 9164 n = 8 - bit_pos; 9165 if (n > bit_size) 9166 n = bit_size; 9167 v = vtop->c.i >> bits << bit_pos; 9168 m = ((1 << n) - 1) << bit_pos; 9169 *p = (*p & ~m) | (v & m); 9170 bits += n, bit_size -= n, bit_pos = 0, ++p; 9171 } 9172 } else 9173 switch(bt) { 9174 9175 9176 9177 case 11: 9178 vtop->c.i = vtop->c.i != 0; 9179 case 1: 9180 *(char *)ptr |= vtop->c.i; 9181 break; 9182 case 2: 9183 *(short *)ptr |= vtop->c.i; 9184 break; 9185 case 8: 9186 *(float*)ptr = vtop->c.f; 9187 break; 9188 case 9: 9189 *(double *)ptr = vtop->c.d; 9190 break; 9191 case 10: 9192 9193 if (sizeof (long double) >= 10) 9194 memcpy(ptr, &vtop->c.ld, 10); 9195 9196 9197 9198 9199 else if (vtop->c.ld == 0.0) 9200 ; 9201 else 9202 9203 if (sizeof(long double) == 16) 9204 *(long double*)ptr = vtop->c.ld; 9205 else if (sizeof(double) == 16) 9206 *(double *)ptr = (double)vtop->c.ld; 9207 else 9208 tcc_error("can't cross compile long double constants"); 9209 break; 9210 9211 9212 9213 9214 9215 case 4: 9216 9217 case 5: 9218 { 9219 Elf64_Addr val = vtop->c.i; 9220 9221 if (vtop->r & 0x0200) 9222 greloca(sec, vtop->sym, c, 1, val); 9223 else 9224 *(Elf64_Addr *)ptr |= val; 9225 9226 9227 9228 9229 9230 break; 9231 } 9232 default: 9233 { 9234 int val = vtop->c.i; 9235 9236 if (vtop->r & 0x0200) 9237 greloca(sec, vtop->sym, c, 1, val); 9238 else 9239 *(int *)ptr |= val; 9240 9241 9242 9243 9244 9245 break; 9246 } 9247 } 9248 } 9249 vtop--; 9250 } else { 9251 vset(&dtype, 0x0032|0x0100, c); 9252 vswap(); 9253 vstore(); 9254 vpop(); 9255 } 9256} 9257 9258 9259 9260 9261 9262 9263static void decl_initializer(CType *type, Section *sec, unsigned long c, 9264 int first, int size_only) 9265{ 9266 int len, n, no_oblock, nb, i; 9267 int size1, align1; 9268 int have_elem; 9269 Sym *s, *f; 9270 Sym indexsym; 9271 CType *t1; 9272 9273 9274 9275 have_elem = tok == '}' || tok == ','; 9276 if (!have_elem && tok != '{' && 9277 9278 9279 9280 tok != 0xba && tok != 0xb9 && 9281 !size_only) { 9282 parse_init_elem(!sec ? 2 : 1); 9283 have_elem = 1; 9284 } 9285 9286 if (have_elem && 9287 !(type->t & 0x0040) && 9288 9289 9290 9291 is_compatible_unqualified_types(type, &vtop->type)) { 9292 init_putv(type, sec, c); 9293 } else if (type->t & 0x0040) { 9294 s = type->ref; 9295 n = s->c; 9296 t1 = pointed_type(type); 9297 size1 = type_size(t1, &align1); 9298 9299 no_oblock = 1; 9300 if ((first && tok != 0xba && tok != 0xb9) || 9301 tok == '{') { 9302 if (tok != '{') 9303 tcc_error("character array initializer must be a literal," 9304 " optionally enclosed in braces"); 9305 skip('{'); 9306 no_oblock = 0; 9307 } 9308 9309 9310 9311 if ((tok == 0xba && 9312 9313 9314 9315 (t1->t & 0x000f) == 3 9316 9317 ) || (tok == 0xb9 && (t1->t & 0x000f) == 1)) { 9318 len = 0; 9319 while (tok == 0xb9 || tok == 0xba) { 9320 int cstr_len, ch; 9321 9322 9323 if (tok == 0xb9) 9324 cstr_len = tokc.str.size; 9325 else 9326 cstr_len = tokc.str.size / sizeof(nwchar_t); 9327 cstr_len--; 9328 nb = cstr_len; 9329 if (n >= 0 && nb > (n - len)) 9330 nb = n - len; 9331 if (!size_only) { 9332 if (cstr_len > nb) 9333 tcc_warning("initializer-string for array is too long"); 9334 9335 9336 9337 if (sec && tok == 0xb9 && size1 == 1) { 9338 if (!(nocode_wanted > 0)) 9339 memcpy(sec->data + c + len, tokc.str.data, nb); 9340 } else { 9341 for(i=0;i<nb;i++) { 9342 if (tok == 0xb9) 9343 ch = ((unsigned char *)tokc.str.data)[i]; 9344 else 9345 ch = ((nwchar_t *)tokc.str.data)[i]; 9346 vpushi(ch); 9347 init_putv(t1, sec, c + (len + i) * size1); 9348 } 9349 } 9350 } 9351 len += nb; 9352 next(); 9353 } 9354 9355 9356 if (n < 0 || len < n) { 9357 if (!size_only) { 9358 vpushi(0); 9359 init_putv(t1, sec, c + (len * size1)); 9360 } 9361 len++; 9362 } 9363 len *= size1; 9364 } else { 9365 indexsym.c = 0; 9366 f = &indexsym; 9367 9368 do_init_list: 9369 len = 0; 9370 while (tok != '}' || have_elem) { 9371 len = decl_designator(type, sec, c, &f, size_only, len); 9372 have_elem = 0; 9373 if (type->t & 0x0040) { 9374 ++indexsym.c; 9375 9376 9377 9378 if (no_oblock && len >= n*size1) 9379 break; 9380 } else { 9381 if (s->type.t == (1 << 20 | 7)) 9382 f = 0; 9383 else 9384 f = f->next; 9385 if (no_oblock && f == 0) 9386 break; 9387 } 9388 9389 if (tok == '}') 9390 break; 9391 skip(','); 9392 } 9393 } 9394 9395 if (!size_only && len < n*size1) 9396 init_putz(sec, c + len, n*size1 - len); 9397 if (!no_oblock) 9398 skip('}'); 9399 9400 if (n < 0) 9401 s->c = size1 == 1 ? len : ((len + size1 - 1)/size1); 9402 } else if ((type->t & 0x000f) == 7) { 9403 size1 = 1; 9404 no_oblock = 1; 9405 if (first || tok == '{') { 9406 skip('{'); 9407 no_oblock = 0; 9408 } 9409 s = type->ref; 9410 f = s->next; 9411 n = s->c; 9412 goto do_init_list; 9413 } else if (tok == '{') { 9414 next(); 9415 decl_initializer(type, sec, c, first, size_only); 9416 skip('}'); 9417 } else if (size_only) { 9418 9419 9420 9421 9422 9423 9424 9425 skip_or_save_block(0); 9426 } else { 9427 if (!have_elem) { 9428 9429 9430 9431 if (tok != 0xb9 && tok != 0xba) 9432 expect("string constant"); 9433 parse_init_elem(!sec ? 2 : 1); 9434 } 9435 init_putv(type, sec, c); 9436 } 9437} 9438# 6818 "tccgen.c" 9439static void decl_initializer_alloc(CType *type, AttributeDef *ad, int r, 9440 int has_init, int v, int scope) 9441{ 9442 int size, align, addr; 9443 TokenString *init_str = 0; 9444 9445 Section *sec; 9446 Sym *flexible_array; 9447 Sym *sym = 0; 9448 int saved_nocode_wanted = nocode_wanted; 9449 9450 int bcheck = tcc_state->do_bounds_check && !(nocode_wanted > 0); 9451 9452 9453 if (type->t & 0x00002000) 9454 nocode_wanted |= (nocode_wanted > 0) ? 0x40000000 : 0x80000000; 9455 9456 flexible_array = 0; 9457 if ((type->t & 0x000f) == 7) { 9458 Sym *field = type->ref->next; 9459 if (field) { 9460 while (field->next) 9461 field = field->next; 9462 if (field->type.t & 0x0040 && field->type.ref->c < 0) 9463 flexible_array = field; 9464 } 9465 } 9466 9467 size = type_size(type, &align); 9468 9469 9470 9471 9472 9473 9474 if (size < 0 || (flexible_array && has_init)) { 9475 if (!has_init) 9476 tcc_error("unknown type size"); 9477 9478 if (has_init == 2) { 9479 init_str = tok_str_alloc(); 9480 9481 while (tok == 0xb9 || tok == 0xba) { 9482 tok_str_add_tok(init_str); 9483 next(); 9484 } 9485 tok_str_add(init_str, -1); 9486 tok_str_add(init_str, 0); 9487 } else { 9488 skip_or_save_block(&init_str); 9489 } 9490 unget_tok(0); 9491 9492 9493 begin_macro(init_str, 1); 9494 next(); 9495 decl_initializer(type, 0, 0, 1, 1); 9496 9497 macro_ptr = init_str->str; 9498 next(); 9499 9500 9501 size = type_size(type, &align); 9502 if (size < 0) 9503 tcc_error("unknown type size"); 9504 } 9505 9506 9507 if (flexible_array && 9508 flexible_array->type.ref->c > 0) 9509 size += flexible_array->type.ref->c 9510 * pointed_size(&flexible_array->type); 9511 9512 if (ad->a.aligned) { 9513 int speca = 1 << (ad->a.aligned - 1); 9514 if (speca > align) 9515 align = speca; 9516 } else if (ad->a.packed) { 9517 align = 1; 9518 } 9519 9520 if ((nocode_wanted > 0)) 9521 size = 0, align = 1; 9522 9523 if ((r & 0x003f) == 0x0032) { 9524 sec = 0; 9525 9526 if (bcheck && (type->t & 0x0040)) { 9527 loc--; 9528 } 9529 9530 loc = (loc - size) & -align; 9531 addr = loc; 9532 9533 9534 9535 9536 if (bcheck && (type->t & 0x0040)) { 9537 Elf64_Addr *bounds_ptr; 9538 9539 loc--; 9540 9541 bounds_ptr = section_ptr_add(lbounds_section, 2 * sizeof(Elf64_Addr)); 9542 bounds_ptr[0] = addr; 9543 bounds_ptr[1] = size; 9544 } 9545 9546 if (v) { 9547 9548 9549 if (ad->asm_label) { 9550 int reg = asm_parse_regvar(ad->asm_label); 9551 if (reg >= 0) 9552 r = (r & ~0x003f) | reg; 9553 } 9554 9555 sym = sym_push(v, type, r, addr); 9556 sym->a = ad->a; 9557 } else { 9558 9559 vset(type, r, addr); 9560 } 9561 } else { 9562 if (v && scope == 0x0030) { 9563 9564 sym = sym_find(v); 9565 if (sym) { 9566 patch_storage(sym, ad, type); 9567 9568 if (!has_init && sym->c && elfsym(sym)->st_shndx != 0) 9569 goto no_alloc; 9570 } 9571 } 9572 9573 9574 sec = ad->section; 9575 if (!sec) { 9576 if (has_init) 9577 sec = data_section; 9578 else if (tcc_state->nocommon) 9579 sec = bss_section; 9580 } 9581 9582 if (sec) { 9583 addr = section_add(sec, size, align); 9584 9585 9586 if (bcheck) 9587 section_add(sec, 1, 1); 9588 9589 } else { 9590 addr = align; 9591 sec = common_section; 9592 } 9593 9594 if (v) { 9595 if (!sym) { 9596 sym = sym_push(v, type, r | 0x0200, 0); 9597 patch_storage(sym, ad, 0); 9598 } 9599 9600 9601 sym->sym_scope = 0; 9602 9603 put_extern_sym(sym, sec, addr, size); 9604 } else { 9605 9606 sym = get_sym_ref(type, sec, addr, size); 9607 vpushsym(type, sym); 9608 vtop->r |= r; 9609 } 9610 9611 9612 9613 9614 if (bcheck) { 9615 Elf64_Addr *bounds_ptr; 9616 9617 greloca(bounds_section, sym, bounds_section->data_offset, 1, 0); 9618 9619 bounds_ptr = section_ptr_add(bounds_section, 2 * sizeof(Elf64_Addr)); 9620 bounds_ptr[0] = 0; 9621 bounds_ptr[1] = size; 9622 } 9623 9624 } 9625 9626 if (type->t & 0x0400) { 9627 int a; 9628 9629 if ((nocode_wanted > 0)) 9630 goto no_alloc; 9631 9632 9633 if (vlas_in_scope == 0) { 9634 if (vla_sp_root_loc == -1) 9635 vla_sp_root_loc = (loc -= 8); 9636 gen_vla_sp_save(vla_sp_root_loc); 9637 } 9638 9639 vla_runtime_type_size(type, &a); 9640 gen_vla_alloc(type, a); 9641 9642 9643 9644 9645 9646 gen_vla_sp_save(addr); 9647 vla_sp_loc = addr; 9648 vlas_in_scope++; 9649 9650 } else if (has_init) { 9651 size_t oldreloc_offset = 0; 9652 if (sec && sec->reloc) 9653 oldreloc_offset = sec->reloc->data_offset; 9654 decl_initializer(type, sec, addr, 1, 0); 9655 if (sec && sec->reloc) 9656 squeeze_multi_relocs(sec, oldreloc_offset); 9657 9658 9659 if (flexible_array) 9660 flexible_array->type.ref->c = -1; 9661 } 9662 9663 no_alloc: 9664 9665 if (init_str) { 9666 end_macro(); 9667 next(); 9668 } 9669 9670 nocode_wanted = saved_nocode_wanted; 9671} 9672 9673 9674 9675static void gen_function(Sym *sym) 9676{ 9677 nocode_wanted = 0; 9678 ind = cur_text_section->data_offset; 9679 9680 put_extern_sym(sym, cur_text_section, ind, 0); 9681 funcname = get_tok_str(sym->v, 0); 9682 func_ind = ind; 9683 9684 vla_sp_loc = -1; 9685 vla_sp_root_loc = -1; 9686 9687 tcc_debug_funcstart(tcc_state, sym); 9688 9689 sym_push2(&local_stack, 0x20000000, 0, 0); 9690 local_scope = 1; 9691 gfunc_prolog(&sym->type); 9692 local_scope = 0; 9693 rsym = 0; 9694 block(0, 0, 0); 9695 nocode_wanted = 0; 9696 gsym(rsym); 9697 gfunc_epilog(); 9698 cur_text_section->data_offset = ind; 9699 label_pop(&global_label_stack, 0, 0); 9700 9701 local_scope = 0; 9702 sym_pop(&local_stack, 0, 0); 9703 9704 9705 elfsym(sym)->st_size = ind - func_ind; 9706 tcc_debug_funcend(tcc_state, ind - func_ind); 9707 9708 cur_text_section = 0; 9709 funcname = ""; 9710 func_vt.t = 0; 9711 func_var = 0; 9712 ind = 0; 9713 nocode_wanted = 0x80000000; 9714 check_vstack(); 9715} 9716 9717static void gen_inline_functions(TCCState *s) 9718{ 9719 Sym *sym; 9720 int inline_generated, i, ln; 9721 struct InlineFunc *fn; 9722 9723 ln = file->line_num; 9724 9725 do { 9726 inline_generated = 0; 9727 for (i = 0; i < s->nb_inline_fns; ++i) { 9728 fn = s->inline_fns[i]; 9729 sym = fn->sym; 9730 if (sym && sym->c) { 9731 9732 9733 fn->sym = 0; 9734 if (file) 9735 pstrcpy(file->filename, sizeof file->filename, fn->filename); 9736 sym->type.t &= ~0x00008000; 9737 9738 begin_macro(fn->func_str, 1); 9739 next(); 9740 cur_text_section = text_section; 9741 gen_function(sym); 9742 end_macro(); 9743 9744 inline_generated = 1; 9745 } 9746 } 9747 } while (inline_generated); 9748 file->line_num = ln; 9749} 9750 9751static void free_inline_functions(TCCState *s) 9752{ 9753 int i; 9754 9755 for (i = 0; i < s->nb_inline_fns; ++i) { 9756 struct InlineFunc *fn = s->inline_fns[i]; 9757 if (fn->sym) 9758 tok_str_free(fn->func_str); 9759 } 9760 dynarray_reset(&s->inline_fns, &s->nb_inline_fns); 9761} 9762 9763 9764 9765static int decl0(int l, int is_for_loop_init, Sym *func_sym) 9766{ 9767 int v, has_init, r; 9768 CType type, btype; 9769 Sym *sym; 9770 AttributeDef ad; 9771 9772 while (1) { 9773 if (!parse_btype(&btype, &ad)) { 9774 if (is_for_loop_init) 9775 return 0; 9776 9777 if (tok == ';' && l != 0x0033) { 9778 next(); 9779 continue; 9780 } 9781 if (l != 0x0030) 9782 break; 9783 if (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3) { 9784 9785 asm_global_instr(); 9786 continue; 9787 } 9788 if (tok >= TOK_DEFINE) { 9789 9790 9791 btype.t = 3; 9792 } else { 9793 if (tok != (-1)) 9794 expect("declaration"); 9795 break; 9796 } 9797 } 9798 if (tok == ';') { 9799 if ((btype.t & 0x000f) == 7) { 9800 int v = btype.ref->v; 9801 if (!(v & 0x20000000) && (v & ~0x40000000) >= 0x10000000) 9802 tcc_warning("unnamed struct/union that defines no instances"); 9803 next(); 9804 continue; 9805 } 9806 if (((btype.t & (((1 << (6+6)) - 1) << 20 | 0x0080)) == (2 << 20))) { 9807 next(); 9808 continue; 9809 } 9810 } 9811 while (1) { 9812 type = btype; 9813 9814 9815 9816 9817 9818 if ((type.t & 0x0040) && type.ref->c < 0) { 9819 type.ref = sym_push(0x20000000, &type.ref->type, 0, type.ref->c); 9820 } 9821 type_decl(&type, &ad, &v, 2); 9822 9823 9824 9825 9826 9827 9828 9829 if ((type.t & 0x000f) == 6) { 9830 if ((type.t & 0x00002000) && (l == 0x0032)) { 9831 tcc_error("function without file scope cannot be static"); 9832 } 9833 9834 9835 sym = type.ref; 9836 if (sym->f.func_type == 2 && l == 0x0030) 9837 decl0(0x0033, 0, sym); 9838 } 9839 9840 if (gnu_ext && (tok == TOK_ASM1 || tok == TOK_ASM2 || tok == TOK_ASM3)) { 9841 ad.asm_label = asm_label_instr(); 9842 9843 parse_attribute(&ad); 9844 if (tok == '{') 9845 expect(";"); 9846 } 9847# 7239 "tccgen.c" 9848 if (tok == '{') { 9849 if (l != 0x0030) 9850 tcc_error("cannot use local functions"); 9851 if ((type.t & 0x000f) != 6) 9852 expect("function definition"); 9853 9854 9855 9856 sym = type.ref; 9857 while ((sym = sym->next) != 0) { 9858 if (!(sym->v & ~0x20000000)) 9859 expect("identifier"); 9860 if (sym->type.t == 0) 9861 sym->type = int_type; 9862 } 9863 9864 9865 if ((type.t & (0x00001000 | 0x00008000)) == (0x00001000 | 0x00008000)) 9866 type.t = (type.t & ~0x00001000) | 0x00002000; 9867 9868 9869 sym = external_global_sym(v, &type, 0); 9870 type.t &= ~0x00001000; 9871 patch_storage(sym, &ad, &type); 9872 9873 9874 9875 9876 if ((type.t & (0x00008000 | 0x00002000)) == 9877 (0x00008000 | 0x00002000)) { 9878 struct InlineFunc *fn; 9879 const char *filename; 9880 9881 filename = file ? file->filename : ""; 9882 fn = tcc_malloc(sizeof *fn + strlen(filename)); 9883 strcpy(fn->filename, filename); 9884 fn->sym = sym; 9885 skip_or_save_block(&fn->func_str); 9886 dynarray_add(&tcc_state->inline_fns, 9887 &tcc_state->nb_inline_fns, fn); 9888 } else { 9889 9890 cur_text_section = ad.section; 9891 if (!cur_text_section) 9892 cur_text_section = text_section; 9893 gen_function(sym); 9894 } 9895 break; 9896 } else { 9897 if (l == 0x0033) { 9898 9899 for (sym = func_sym->next; sym; sym = sym->next) 9900 if ((sym->v & ~0x20000000) == v) 9901 goto found; 9902 tcc_error("declaration for parameter '%s' but no such parameter", 9903 get_tok_str(v, 0)); 9904found: 9905 if (type.t & (0x00001000 | 0x00002000 | 0x00004000 | 0x00008000)) 9906 tcc_error("storage class specified for '%s'", 9907 get_tok_str(v, 0)); 9908 if (sym->type.t != 0) 9909 tcc_error("redefinition of parameter '%s'", 9910 get_tok_str(v, 0)); 9911 convert_parameter_type(&type); 9912 sym->type = type; 9913 } else if (type.t & 0x00004000) { 9914 9915 9916 sym = sym_find(v); 9917 if (sym && sym->sym_scope == local_scope) { 9918 if (!is_compatible_types(&sym->type, &type) 9919 || !(sym->type.t & 0x00004000)) 9920 tcc_error("incompatible redefinition of '%s'", 9921 get_tok_str(v, 0)); 9922 sym->type = type; 9923 } else { 9924 sym = sym_push(v, &type, 0, 0); 9925 } 9926 sym->a = ad.a; 9927 sym->f = ad.f; 9928 } else { 9929 r = 0; 9930 if ((type.t & 0x000f) == 6) { 9931 9932 9933 type.ref->f = ad.f; 9934 } else if (!(type.t & 0x0040)) { 9935 9936 r |= lvalue_type(type.t); 9937 } 9938 has_init = (tok == '='); 9939 if (has_init && (type.t & 0x0400)) 9940 tcc_error("variable length array cannot be initialized"); 9941 if (((type.t & 0x00001000) && (!has_init || l != 0x0030)) || 9942 ((type.t & 0x000f) == 6) || 9943 ((type.t & 0x0040) && (type.t & 0x00002000) && 9944 !has_init && l == 0x0030 && type.ref->c < 0)) { 9945 9946 9947 9948 9949 type.t |= 0x00001000; 9950 sym = external_sym(v, &type, r, &ad); 9951 if (ad.alias_target) { 9952 Elf64_Sym *esym; 9953 Sym *alias_target; 9954 alias_target = sym_find(ad.alias_target); 9955 esym = elfsym(alias_target); 9956 if (!esym) 9957 tcc_error("unsupported forward __alias__ attribute"); 9958 9959 9960 sym->sym_scope = 0; 9961 put_extern_sym2(sym, esym->st_shndx, esym->st_value, esym->st_size, 0); 9962 } 9963 } else { 9964 if (type.t & 0x00002000) 9965 r |= 0x0030; 9966 else 9967 r |= l; 9968 if (has_init) 9969 next(); 9970 else if (l == 0x0030) 9971 9972 type.t |= 0x00001000; 9973 decl_initializer_alloc(&type, &ad, r, has_init, v, l); 9974 } 9975 } 9976 if (tok != ',') { 9977 if (is_for_loop_init) 9978 return 1; 9979 skip(';'); 9980 break; 9981 } 9982 next(); 9983 } 9984 ad.a.aligned = 0; 9985 } 9986 } 9987 return 0; 9988} 9989 9990static void decl(int l) 9991{ 9992 decl0(l, 0, 0); 9993} 9994