| @@ -331,24 +331,23 @@ static void asm_parse_directive(TCCState *s1) · 330 unmodified lines |
| 331 | 331 | uint8_t *ptr; |
| 332 | 332 | |
| 333 | 333 | /* assembler directive */ |
| 334 | | − next(); |
| 335 | 334 | sec = cur_text_section; |
| 336 | 335 | switch(tok) { |
| 337 | | − case TOK_ASM_align: |
| 338 | | − case TOK_ASM_p2align: |
| 339 | | − case TOK_ASM_skip: |
| 340 | | − case TOK_ASM_space: |
| 336 | + case TOK_ASMDIR_align: |
| 337 | + case TOK_ASMDIR_p2align: |
| 338 | + case TOK_ASMDIR_skip: |
| 339 | + case TOK_ASMDIR_space: |
| 341 | 340 | tok1 = tok; |
| 342 | 341 | next(); |
| 343 | 342 | n = asm_int_expr(s1); |
| 344 | | − if (tok1 == TOK_ASM_p2align) |
| 343 | + if (tok1 == TOK_ASMDIR_p2align) |
| 345 | 344 | { |
| 346 | 345 | if (n < 0 || n > 30) |
| 347 | 346 | tcc_error("invalid p2align, must be between 0 and 30"); |
| 348 | 347 | n = 1 << n; |
| 349 | | − tok1 = TOK_ASM_align; |
| 348 | + tok1 = TOK_ASMDIR_align; |
| 350 | 349 | } |
| 351 | | − if (tok1 == TOK_ASM_align) { |
| 350 | + if (tok1 == TOK_ASMDIR_align) { |
| 352 | 351 | if (n < 0 || (n & (n-1)) != 0) |
| 353 | 352 | tcc_error("alignment must be a positive power of two"); |
| 354 | 353 | offset = (ind + n - 1) & -n; |
| @@ -372,7 +371,7 @@ static void asm_parse_directive(TCCState *s1) · 17 unmodified lines |
| 372 | 371 | } |
| 373 | 372 | ind += size; |
| 374 | 373 | break; |
| 375 | | − case TOK_ASM_quad: |
| 374 | + case TOK_ASMDIR_quad: |
| 376 | 375 | next(); |
| 377 | 376 | for(;;) { |
| 378 | 377 | uint64_t vl; |
| @@ -399,15 +398,15 @@ static void asm_parse_directive(TCCState *s1) · 20 unmodified lines |
| 399 | 398 | next(); |
| 400 | 399 | } |
| 401 | 400 | break; |
| 402 | | − case TOK_ASM_byte: |
| 401 | + case TOK_ASMDIR_byte: |
| 403 | 402 | size = 1; |
| 404 | 403 | goto asm_data; |
| 405 | | − case TOK_ASM_word: |
| 406 | | − case TOK_SHORT: |
| 404 | + case TOK_ASMDIR_word: |
| 405 | + case TOK_ASMDIR_short: |
| 407 | 406 | size = 2; |
| 408 | 407 | goto asm_data; |
| 409 | | − case TOK_LONG: |
| 410 | | − case TOK_INT: |
| 408 | + case TOK_ASMDIR_long: |
| 409 | + case TOK_ASMDIR_int: |
| 411 | 410 | size = 4; |
| 412 | 411 | asm_data: |
| 413 | 412 | next(); |
| @@ -433,7 +432,7 @@ static void asm_parse_directive(TCCState *s1) · 19 unmodified lines |
| 433 | 432 | next(); |
| 434 | 433 | } |
| 435 | 434 | break; |
| 436 | | − case TOK_ASM_fill: |
| 435 | + case TOK_ASMDIR_fill: |
| 437 | 436 | { |
| 438 | 437 | int repeat, size, val, i, j; |
| 439 | 438 | uint8_t repeat_buf[8]; |
| @@ -475,7 +474,7 @@ static void asm_parse_directive(TCCState *s1) · 35 unmodified lines |
| 475 | 474 | } |
| 476 | 475 | } |
| 477 | 476 | break; |
| 478 | | − case TOK_ASM_org: |
| 477 | + case TOK_ASMDIR_org: |
| 479 | 478 | { |
| 480 | 479 | unsigned long n; |
| 481 | 480 | next(); |
| @@ -488,10 +487,10 @@ static void asm_parse_directive(TCCState *s1) · 6 unmodified lines |
| 488 | 487 | goto zero_pad; |
| 489 | 488 | } |
| 490 | 489 | break; |
| 491 | | − case TOK_ASM_globl: |
| 492 | | − case TOK_ASM_global: |
| 493 | | − case TOK_ASM_weak: |
| 494 | | − case TOK_ASM_hidden: |
| 490 | + case TOK_ASMDIR_globl: |
| 491 | + case TOK_ASMDIR_global: |
| 492 | + case TOK_ASMDIR_weak: |
| 493 | + case TOK_ASMDIR_hidden: |
| 495 | 494 | tok1 = tok; |
| 496 | 495 | do { |
| 497 | 496 | Sym *sym; |
| @@ -502,18 +501,18 @@ static void asm_parse_directive(TCCState *s1) · 4 unmodified lines |
| 502 | 501 | sym = label_push(&s1->asm_labels, tok, 0); |
| 503 | 502 | sym->type.t = VT_VOID; |
| 504 | 503 | } |
| 505 | | − if (tok1 != TOK_ASM_hidden) |
| 504 | + if (tok1 != TOK_ASMDIR_hidden) |
| 506 | 505 | sym->type.t &= ~VT_STATIC; |
| 507 | | − if (tok1 == TOK_ASM_weak) |
| 506 | + if (tok1 == TOK_ASMDIR_weak) |
| 508 | 507 | sym->type.t |= VT_WEAK; |
| 509 | | − else if (tok1 == TOK_ASM_hidden) |
| 508 | + else if (tok1 == TOK_ASMDIR_hidden) |
| 510 | 509 | sym->type.t |= STV_HIDDEN << VT_VIS_SHIFT; |
| 511 | 510 | next(); |
| 512 | 511 | } while (tok == ','); |
| 513 | 512 | break; |
| 514 | | − case TOK_ASM_string: |
| 515 | | − case TOK_ASM_ascii: |
| 516 | | − case TOK_ASM_asciz: |
| 513 | + case TOK_ASMDIR_string: |
| 514 | + case TOK_ASMDIR_ascii: |
| 515 | + case TOK_ASMDIR_asciz: |
| 517 | 516 | { |
| 518 | 517 | const uint8_t *p; |
| 519 | 518 | int i, size, t; |
| @@ -525,7 +524,7 @@ static void asm_parse_directive(TCCState *s1) · 5 unmodified lines |
| 525 | 524 | expect("string constant"); |
| 526 | 525 | p = tokc.str.data; |
| 527 | 526 | size = tokc.str.size; |
| 528 | | − if (t == TOK_ASM_ascii && size > 0) |
| 527 | + if (t == TOK_ASMDIR_ascii && size > 0) |
| 529 | 528 | size--; |
| 530 | 529 | for(i = 0; i < size; i++) |
| 531 | 530 | g(p[i]); |
| @@ -538,9 +537,9 @@ static void asm_parse_directive(TCCState *s1) · 6 unmodified lines |
| 538 | 537 | } |
| 539 | 538 | } |
| 540 | 539 | break; |
| 541 | | − case TOK_ASM_text: |
| 542 | | − case TOK_ASM_data: |
| 543 | | − case TOK_ASM_bss: |
| 540 | + case TOK_ASMDIR_text: |
| 541 | + case TOK_ASMDIR_data: |
| 542 | + case TOK_ASMDIR_bss: |
| 544 | 543 | { |
| 545 | 544 | char sname[64]; |
| 546 | 545 | tok1 = tok; |
| @@ -557,7 +556,7 @@ static void asm_parse_directive(TCCState *s1) · 10 unmodified lines |
| 557 | 556 | use_section(s1, sname); |
| 558 | 557 | } |
| 559 | 558 | break; |
| 560 | | − case TOK_ASM_file: |
| 559 | + case TOK_ASMDIR_file: |
| 561 | 560 | { |
| 562 | 561 | char filename[512]; |
| 563 | 562 | |
| @@ -575,7 +574,7 @@ static void asm_parse_directive(TCCState *s1) · 11 unmodified lines |
| 575 | 574 | next(); |
| 576 | 575 | } |
| 577 | 576 | break; |
| 578 | | − case TOK_ASM_ident: |
| 577 | + case TOK_ASMDIR_ident: |
| 579 | 578 | { |
| 580 | 579 | char ident[256]; |
| 581 | 580 | |
| @@ -593,7 +592,7 @@ static void asm_parse_directive(TCCState *s1) · 11 unmodified lines |
| 593 | 592 | next(); |
| 594 | 593 | } |
| 595 | 594 | break; |
| 596 | | − case TOK_ASM_size: |
| 595 | + case TOK_ASMDIR_size: |
| 597 | 596 | { |
| 598 | 597 | Sym *sym; |
| 599 | 598 | |
| @@ -614,7 +613,7 @@ static void asm_parse_directive(TCCState *s1) · 14 unmodified lines |
| 614 | 613 | } |
| 615 | 614 | } |
| 616 | 615 | break; |
| 617 | | − case TOK_ASM_type: |
| 616 | + case TOK_ASMDIR_type: |
| 618 | 617 | { |
| 619 | 618 | Sym *sym; |
| 620 | 619 | const char *newtype; |
| @@ -632,7 +631,7 @@ static void asm_parse_directive(TCCState *s1) · 11 unmodified lines |
| 632 | 631 | newtype = tokc.str.data; |
| 633 | 632 | } else { |
| 634 | 633 | if (tok == '@' || tok == '%') |
| 635 | | − skip(tok); |
| 634 | + next(); |
| 636 | 635 | newtype = get_tok_str(tok, NULL); |
| 637 | 636 | } |
| 638 | 637 | |
| @@ -646,7 +645,7 @@ static void asm_parse_directive(TCCState *s1) · 7 unmodified lines |
| 646 | 645 | next(); |
| 647 | 646 | } |
| 648 | 647 | break; |
| 649 | | − case TOK_SECTION1: |
| 648 | + case TOK_ASMDIR_section: |
| 650 | 649 | { |
| 651 | 650 | char sname[256]; |
| 652 | 651 | |
| @@ -666,12 +665,18 @@ static void asm_parse_directive(TCCState *s1) · 13 unmodified lines |
| 666 | 665 | if (tok != TOK_STR) |
| 667 | 666 | expect("string constant"); |
| 668 | 667 | next(); |
| 668 | + if (tok == ',') { |
| 669 | + next(); |
| 670 | + if (tok == '@' || tok == '%') |
| 671 | + next(); |
| 672 | + next(); |
| 673 | + } |
| 669 | 674 | } |
| 670 | 675 | last_text_section = cur_text_section; |
| 671 | 676 | use_section(s1, sname); |
| 672 | 677 | } |
| 673 | 678 | break; |
| 674 | | − case TOK_ASM_previous: |
| 679 | + case TOK_ASMDIR_previous: |
| 675 | 680 | { |
| 676 | 681 | Section *sec; |
| 677 | 682 | next(); |
| @@ -683,13 +688,13 @@ static void asm_parse_directive(TCCState *s1) · 5 unmodified lines |
| 683 | 688 | } |
| 684 | 689 | break; |
| 685 | 690 | #ifdef TCC_TARGET_I386 |
| 686 | | − case TOK_ASM_code16: |
| 691 | + case TOK_ASMDIR_code16: |
| 687 | 692 | { |
| 688 | 693 | next(); |
| 689 | 694 | s1->seg_size = 16; |
| 690 | 695 | } |
| 691 | 696 | break; |
| 692 | | − case TOK_ASM_code32: |
| 697 | + case TOK_ASMDIR_code32: |
| 693 | 698 | { |
| 694 | 699 | next(); |
| 695 | 700 | s1->seg_size = 32; |
| @@ -698,7 +703,7 @@ static void asm_parse_directive(TCCState *s1) · 2 unmodified lines |
| 698 | 703 | #endif |
| 699 | 704 | #ifdef TCC_TARGET_X86_64 |
| 700 | 705 | /* added for compatibility with GAS */ |
| 701 | | − case TOK_ASM_code64: |
| 706 | + case TOK_ASMDIR_code64: |
| 702 | 707 | next(); |
| 703 | 708 | break; |
| 704 | 709 | #endif |
| @@ -763,7 +768,7 @@ static int tcc_assemble_internal(TCCState *s1, int do_preprocess) · 58 unmodified lines |
| 763 | 768 | /* horrible gas comment */ |
| 764 | 769 | while (tok != TOK_LINEFEED) |
| 765 | 770 | next(); |
| 766 | | − } else if (tok == '.') { |
| 771 | + } else if (tok >= TOK_ASMDIR_FIRST && tok <= TOK_ASMDIR_LAST) { |
| 767 | 772 | asm_parse_directive(s1); |
| 768 | 773 | } else if (tok == TOK_PPNUM) { |
| 769 | 774 | const char *p; |