mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 11:00:01 +08:00
ld script fill pattern expression
It turns out we do need to backtrack when parsing after all. The fill_opt component in the section rule swiches to EXPRESSION and back to SCRIPT, and to find the end of an expression it is necessary to look ahead one token. * ldgram.y (section): Throw away lookahead NAME token. (overlay_section): Likewise. * testsuite/ld-elf/overlay.t: Add fill pattern on overlays. Test fill pattern before stupidly named normal sections too, and before /DISCARD/.
This commit is contained in:
22
ld/ldgram.y
22
ld/ldgram.y
@ -1063,6 +1063,18 @@ section: NAME
|
|||||||
{ ldlex_popstate (); }
|
{ ldlex_popstate (); }
|
||||||
memspec_opt memspec_at_opt phdr_opt fill_opt
|
memspec_opt memspec_at_opt phdr_opt fill_opt
|
||||||
{
|
{
|
||||||
|
/* fill_opt may have switched the lexer into
|
||||||
|
expression state, and back again, but in
|
||||||
|
order to find the end of the fill
|
||||||
|
expression the parser must look ahead one
|
||||||
|
token. If it is a NAME, throw it away as
|
||||||
|
it will have been lexed in the wrong
|
||||||
|
state. */
|
||||||
|
if (yychar == NAME)
|
||||||
|
{
|
||||||
|
yyclearin;
|
||||||
|
ldlex_backup ();
|
||||||
|
}
|
||||||
lang_leave_output_section_statement ($17, $14,
|
lang_leave_output_section_statement ($17, $14,
|
||||||
$16, $15);
|
$16, $15);
|
||||||
}
|
}
|
||||||
@ -1079,6 +1091,11 @@ section: NAME
|
|||||||
'}'
|
'}'
|
||||||
memspec_opt memspec_at_opt phdr_opt fill_opt
|
memspec_opt memspec_at_opt phdr_opt fill_opt
|
||||||
{
|
{
|
||||||
|
if (yychar == NAME)
|
||||||
|
{
|
||||||
|
yyclearin;
|
||||||
|
ldlex_backup ();
|
||||||
|
}
|
||||||
lang_leave_overlay ($5, (int) $4,
|
lang_leave_overlay ($5, (int) $4,
|
||||||
$15, $12, $14, $13);
|
$15, $12, $14, $13);
|
||||||
}
|
}
|
||||||
@ -1179,6 +1196,11 @@ overlay_section:
|
|||||||
{ ldlex_popstate (); }
|
{ ldlex_popstate (); }
|
||||||
phdr_opt fill_opt
|
phdr_opt fill_opt
|
||||||
{
|
{
|
||||||
|
if (yychar == NAME)
|
||||||
|
{
|
||||||
|
yyclearin;
|
||||||
|
ldlex_backup ();
|
||||||
|
}
|
||||||
lang_leave_overlay_section ($9, $8);
|
lang_leave_overlay_section ($9, $8);
|
||||||
}
|
}
|
||||||
opt_comma
|
opt_comma
|
||||||
|
@ -6,9 +6,11 @@ SECTIONS
|
|||||||
{
|
{
|
||||||
.text1 {*(.text1)}
|
.text1 {*(.text1)}
|
||||||
.text2 {*(.text2)}
|
.text2 {*(.text2)}
|
||||||
.silly-name1 { *(.silly-name1) }
|
.silly-name1 { *(.silly-name1) } = 0
|
||||||
.silly-name2 { *(.silly-name2) }
|
.silly-name2 { *(.silly-name2) } = 0
|
||||||
}
|
} = 0
|
||||||
|
.silly-name3 : { *(.silly-name3) } = 0
|
||||||
|
.silly-name4 : { *(.silly-name4) } = 0
|
||||||
/DISCARD/ : { *(.*) }
|
/DISCARD/ : { *(.*) }
|
||||||
ASSERT(ADDR(.text1)==ADDR(.text2), "overlay error")
|
ASSERT(ADDR(.text1)==ADDR(.text2), "overlay error")
|
||||||
ASSERT(ADDR(.silly-name1)==ADDR(.silly-name2), "silly overlay error")
|
ASSERT(ADDR(.silly-name1)==ADDR(.silly-name2), "silly overlay error")
|
||||||
|
Reference in New Issue
Block a user