diff options
author | Alan Modra <amodra@gmail.com> | 2021-07-22 21:41:15 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-07-24 17:35:59 +0930 |
commit | 553dd76c7e49e3e6afb528ff865589da8f6f3e1c (patch) | |
tree | 1e437ebfcf9298b4e5d26a5116d83c0221859873 /ld | |
parent | 77db4723ddda2a5eb20876e8a818f77ffa7dafc8 (diff) | |
download | gdb-553dd76c7e49e3e6afb528ff865589da8f6f3e1c.zip gdb-553dd76c7e49e3e6afb528ff865589da8f6f3e1c.tar.gz gdb-553dd76c7e49e3e6afb528ff865589da8f6f3e1c.tar.bz2 |
Re: ld script expression parsing
Commit 40726f16a8d7 broke references to sections within ADDR(), and
overlays with weird section names.
* ldgram.y (paren_script_name): New rule.
(exp): Use it for ALIGNOF, SIZEOF, ADDR, and LOADADDR. Similarly
ensure script mode parsing for section name in SEGMENT_START.
(overlay_section): Delete unnecessary ldlex_script call. Backup
on a lookahead NAME parsed in expression mode.
* testsuite/ld-elf/overlay.s: Add more sections.
* testsuite/ld-elf/overlay.t: Test '-' in section names.
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ldgram.y | 38 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/overlay.s | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/overlay.t | 6 |
3 files changed, 32 insertions, 16 deletions
diff --git a/ld/ldgram.y b/ld/ldgram.y index 31e0071..2f9de59 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -96,8 +96,7 @@ static int error_index; %type <wildcard_list> section_name_list %type <flag_info_list> sect_flag_list %type <flag_info> sect_flags -%type <name> memspec_opt casesymlist -%type <name> memspec_at_opt +%type <name> memspec_opt memspec_at_opt paren_script_name casesymlist %type <cname> wildcard_name %type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude %token <bigint> INT @@ -906,6 +905,10 @@ nocrossref_list: } ; +paren_script_name: + { ldlex_script (); } '(' NAME { ldlex_popstate (); } ')' + { $$ = $3; } + mustbe_exp: { ldlex_expression (); } exp { ldlex_popstate (); $$=$2;} @@ -970,14 +973,14 @@ exp : | SIZEOF_HEADERS { $$ = exp_nameop (SIZEOF_HEADERS,0); } - | ALIGNOF '(' NAME ')' - { $$ = exp_nameop (ALIGNOF,$3); } - | SIZEOF '(' NAME ')' - { $$ = exp_nameop (SIZEOF,$3); } - | ADDR '(' NAME ')' - { $$ = exp_nameop (ADDR,$3); } - | LOADADDR '(' NAME ')' - { $$ = exp_nameop (LOADADDR,$3); } + | ALIGNOF paren_script_name + { $$ = exp_nameop (ALIGNOF, $2); } + | SIZEOF paren_script_name + { $$ = exp_nameop (SIZEOF, $2); } + | ADDR paren_script_name + { $$ = exp_nameop (ADDR, $2); } + | LOADADDR paren_script_name + { $$ = exp_nameop (LOADADDR, $2); } | CONSTANT '(' NAME ')' { $$ = exp_nameop (CONSTANT,$3); } | ABSOLUTE '(' exp ')' @@ -992,15 +995,16 @@ exp : { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); } | DATA_SEGMENT_END '(' exp ')' { $$ = exp_unop (DATA_SEGMENT_END, $3); } - | SEGMENT_START '(' NAME ',' exp ')' + | SEGMENT_START { ldlex_script (); } '(' NAME + { ldlex_popstate (); } ',' exp ')' { /* The operands to the expression node are placed in the opposite order from the way in which they appear in the script as that allows us to reuse more code in fold_binary. */ $$ = exp_binop (SEGMENT_START, - $5, - exp_nameop (NAME, $3)); } + $7, + exp_nameop (NAME, $4)); } | BLOCK '(' exp ')' { $$ = exp_unop (ALIGN_K,$3); } | NAME @@ -1186,13 +1190,17 @@ overlay_section: | overlay_section NAME { - ldlex_script (); lang_enter_overlay_section ($2); } '{' statement_list_opt '}' - { ldlex_popstate (); ldlex_expression (); } + { ldlex_expression (); } phdr_opt fill_opt { + if (yychar == NAME) + { + yyclearin; + ldlex_backup (); + } ldlex_popstate (); lang_leave_overlay_section ($9, $8); } diff --git a/ld/testsuite/ld-elf/overlay.s b/ld/testsuite/ld-elf/overlay.s index f153044..20d8f41 100644 --- a/ld/testsuite/ld-elf/overlay.s +++ b/ld/testsuite/ld-elf/overlay.s @@ -2,5 +2,9 @@ .space 0x10 .section .text2,"ax",%progbits .space 0x20 + .section .silly-name1,"ax",%progbits + .space 0x10 + .section .silly-name2,"ax",%progbits + .space 0x20 .text .space 0x30 diff --git a/ld/testsuite/ld-elf/overlay.t b/ld/testsuite/ld-elf/overlay.t index dd374bb..2c50a6b 100644 --- a/ld/testsuite/ld-elf/overlay.t +++ b/ld/testsuite/ld-elf/overlay.t @@ -6,6 +6,10 @@ SECTIONS { .text1 {*(.text1)} .text2 {*(.text2)} - } + .silly-name1 { *(.silly-name1) } + .silly-name2 { *(.silly-name2) } + } /DISCARD/ : { *(.*) } + ASSERT(ADDR(.text1)==ADDR(.text2), "overlay error") + ASSERT(ADDR(.silly-name1)==ADDR(.silly-name2), "silly overlay error") } |