aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-07-22 21:41:15 +0930
committerAlan Modra <amodra@gmail.com>2021-07-24 17:35:59 +0930
commit553dd76c7e49e3e6afb528ff865589da8f6f3e1c (patch)
tree1e437ebfcf9298b4e5d26a5116d83c0221859873 /ld
parent77db4723ddda2a5eb20876e8a818f77ffa7dafc8 (diff)
downloadgdb-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.y38
-rw-r--r--ld/testsuite/ld-elf/overlay.s4
-rw-r--r--ld/testsuite/ld-elf/overlay.t6
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")
}