aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--GnuLdParser.g41591
1 files changed, 458 insertions, 1133 deletions
diff --git a/GnuLdParser.g4 b/GnuLdParser.g4
index 1ed1119..68734fe 100644
--- a/GnuLdParser.g4
+++ b/GnuLdParser.g4
@@ -21,694 +21,337 @@ TODO: check right associative annotations
file:
- /*INPUT_SCRIPT*/ script_file
- | /*INPUT_MRI_SCRIPT*/ mri_script_file
- | /*INPUT_VERSION_SCRIPT*/ version_script_file
- | /*INPUT_DYNAMIC_LIST*/ dynamic_list_file
- | /*INPUT_DEFSYM*/ defsym_expr
- ;
-
-filename: NAME;
+ /*INPUT_SCRIPT*/ script_file
+ | /*INPUT_MRI_SCRIPT*/ mri_script_file
+ | /*INPUT_VERSION_SCRIPT*/ version_script_file
+ | /*INPUT_DYNAMIC_LIST*/ dynamic_list_file
+ | /*INPUT_DEFSYM*/ defsym_expr
+ ;
+filename: NAME;
defsym_expr:
-// { ldlex_defsym(); }
- NAME EQ exp
-// {
-// ldlex_popstate();
-// lang_add_assignment (exp_defsym ($2, $4));
-// }
- ;
+ NAME EQ exp
+ ;
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
mri_script_file:
-// {
-// ldlex_mri_script ();
-// PUSH_ERROR (_("MRI style script"));
-// }
- mri_script_lines
-// {
-// ldlex_popstate ();
-// mri_draw_tree ();
-// POP_ERROR ();
-// }
- ;
+ mri_script_lines
+ ;
mri_script_lines:
- mri_script_lines mri_script_command NEWLINE
- |
- ;
+ mri_script_lines mri_script_command NEWLINE
+ |
+ ;
mri_script_command:
- CHIP exp
- | CHIP exp COMMA exp
- | NAME /*{
- einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);
- }*/
- | LIST /*{
- config.map_filename = "-";
- }*/
- | ORDER ordernamelist
- | ENDWORD
- | PUBLIC NAME EQ exp
- // { mri_public($2, $4); }
- | PUBLIC NAME COMMA exp
- // { mri_public($2, $4); }
- | PUBLIC NAME exp
- // { mri_public($2, $3); }
- | FORMAT NAME
- // { mri_format($2); }
- | SECT NAME COMMA exp
- // { mri_output_section($2, $4);}
- | SECT NAME exp
- // { mri_output_section($2, $3);}
- | SECT NAME EQ exp
- // { mri_output_section($2, $4);}
- | ALIGN_K NAME EQ exp
- // { mri_align($2,$4); }
- | ALIGN_K NAME COMMA exp
- // { mri_align($2,$4); }
- | ALIGNMOD NAME EQ exp
- // { mri_alignmod($2,$4); }
- | ALIGNMOD NAME COMMA exp
- // { mri_alignmod($2,$4); }
- | ABSOLUTE mri_abs_name_list
- | LOAD mri_load_name_list
- | NAMEWORD NAME
- // { mri_name($2); }
- | ALIAS NAME COMMA NAME
- // { mri_alias($2,$4,0);}
- | ALIAS NAME COMMA INT
- // { mri_alias ($2, 0, (int) $4.integer); }
- | BASE exp
- // { mri_base($2); }
- | TRUNCATE INT
- // { mri_truncate ((unsigned int) $2.integer); }
- | CASE casesymlist
- | EXTERN extern_name_list
- | INCLUDE filename
- // { ldlex_script (); ldfile_open_command_file($2); }
- mri_script_lines END
- // { ldlex_popstate (); }
- | START NAME
- // { lang_add_entry ($2, FALSE); }
- |
- ;
+ CHIP exp
+ | CHIP exp COMMA exp
+ | NAME
+ | LIST
+ | ORDER ordernamelist
+ | ENDWORD
+ | PUBLIC NAME EQ exp
+ | PUBLIC NAME COMMA exp
+ | PUBLIC NAME exp
+ | FORMAT NAME
+ | SECT NAME COMMA exp
+ | SECT NAME exp
+ | SECT NAME EQ exp
+ | ALIGN_K NAME EQ exp
+ | ALIGN_K NAME COMMA exp
+ | ALIGNMOD NAME EQ exp
+ | ALIGNMOD NAME COMMA exp
+ | ABSOLUTE mri_abs_name_list
+ | LOAD mri_load_name_list
+ | NAMEWORD NAME
+ | ALIAS NAME COMMA NAME
+ | ALIAS NAME COMMA INT
+ | BASE exp
+ | TRUNCATE INT
+ | CASE casesymlist
+ | EXTERN extern_name_list
+ | INCLUDE filename mri_script_lines END
+ | START NAME
+ |
+ ;
ordernamelist:
- ordernamelist COMMA NAME // { mri_order($3); }
- | ordernamelist NAME // { mri_order($2); }
- |
- ;
+ ordernamelist COMMA NAME
+ | ordernamelist NAME
+ |
+ ;
mri_load_name_list:
- NAME
- // { mri_load($1); }
- | mri_load_name_list COMMA NAME // { mri_load($3); }
- ;
+ NAME
+ | mri_load_name_list COMMA NAME
+ ;
mri_abs_name_list:
- NAME
- // { mri_only_load($1); }
- | mri_abs_name_list COMMA NAME
- // { mri_only_load($3); }
- ;
+ NAME
+ | mri_abs_name_list COMMA NAME
+ ;
casesymlist:
- /* empty */ // { $$ = NULL; }
- | NAME
- | casesymlist COMMA NAME
- ;
+ /* empty */
+ | NAME
+ | casesymlist COMMA NAME
+ ;
/* Parsed as expressions so that commas separate entries */
extern_name_list:
- // { ldlex_expression (); }
- extern_name_list_body
- // { ldlex_popstate (); }
+ extern_name_list_body
;
extern_name_list_body:
- NAME
- // { ldlang_add_undef ($1, FALSE); }
- | extern_name_list_body NAME
- // { ldlang_add_undef ($2, FALSE); }
- | extern_name_list_body COMMA NAME
- // { ldlang_add_undef ($3, FALSE); }
- ;
+ NAME
+ | extern_name_list_body NAME
+ | extern_name_list_body COMMA NAME
+ ;
script_file:
- // { ldlex_both(); }
- ifile_list
- // { ldlex_popstate(); }
- ;
+ ifile_list
+ ;
ifile_list:
- ifile_list ifile_p1
- |
- ;
+ ifile_list ifile_p1
+ |
+ ;
ifile_p1:
- memory
- | sections
- | phdrs
- | startup
- | high_level_library
- | low_level_library
- | floating_point_support
- | statement_anywhere
- | version
- | SEMICOLON
- | TARGET_K LPAREN NAME RPAREN
- // { lang_add_target($3); }
- | SEARCH_DIR LPAREN filename RPAREN
- // { ldfile_add_library_path ($3, FALSE); }
- | OUTPUT LPAREN filename RPAREN
- // { lang_add_output($3, 1); }
- | OUTPUT_FORMAT LPAREN NAME RPAREN
- // { lang_add_output_format ($3, (char *) NULL,
- // (char *) NULL, 1); }
- | OUTPUT_FORMAT LPAREN NAME COMMA NAME COMMA NAME RPAREN
- // { lang_add_output_format ($3, $5, $7, 1); }
- | OUTPUT_ARCH LPAREN NAME RPAREN
- // { ldfile_set_output_arch ($3, bfd_arch_unknown); }
- | FORCE_COMMON_ALLOCATION
- // { command_line.force_common_definition = TRUE ; }
- | INHIBIT_COMMON_ALLOCATION
- // { command_line.inhibit_common_definition = TRUE ; }
- | INPUT LPAREN input_list RPAREN
- | GROUP
- // { lang_enter_group (); }
- LPAREN input_list RPAREN
- // { lang_leave_group (); }
- | MAP LPAREN filename RPAREN
- // { lang_add_map($3); }
- | INCLUDE filename
- // { ldlex_script (); ldfile_open_command_file($2); }
- ifile_list END
- // { ldlex_popstate (); }
- | NOCROSSREFS LPAREN nocrossref_list RPAREN
- // {
- // lang_add_nocrossref ($3);
- // }
- | NOCROSSREFS_TO LPAREN nocrossref_list RPAREN
- // {
- // lang_add_nocrossref_to ($3);
- // }
- | EXTERN LPAREN extern_name_list RPAREN
- | INSERT_K AFTER NAME
- // { lang_add_insert ($3, 0); }
- | INSERT_K BEFORE NAME
- // { lang_add_insert ($3, 1); }
- | REGION_ALIAS LPAREN NAME COMMA NAME RPAREN
- // { lang_memory_region_alias ($3, $5); }
- | LD_FEATURE LPAREN NAME RPAREN
- // { lang_ld_feature ($3); }
- ;
+ memory
+ | sections
+ | phdrs
+ | startup
+ | high_level_library
+ | low_level_library
+ | floating_point_support
+ | statement_anywhere
+ | version
+ | SEMICOLON
+ | TARGET_K LPAREN NAME RPAREN
+ | SEARCH_DIR LPAREN filename RPAREN
+ | OUTPUT LPAREN filename RPAREN
+ | OUTPUT_FORMAT LPAREN NAME RPAREN
+ | OUTPUT_FORMAT LPAREN NAME COMMA NAME COMMA NAME RPAREN
+ | OUTPUT_ARCH LPAREN NAME RPAREN
+ | FORCE_COMMON_ALLOCATION
+ | INHIBIT_COMMON_ALLOCATION
+ | INPUT LPAREN input_list RPAREN
+ | GROUP LPAREN input_list RPAREN
+ | MAP LPAREN filename RPAREN
+ | INCLUDE filename ifile_list END
+ | NOCROSSREFS LPAREN nocrossref_list RPAREN
+ | NOCROSSREFS_TO LPAREN nocrossref_list RPAREN
+ | EXTERN LPAREN extern_name_list RPAREN
+ | INSERT_K AFTER NAME
+ | INSERT_K BEFORE NAME
+ | REGION_ALIAS LPAREN NAME COMMA NAME RPAREN
+ | LD_FEATURE LPAREN NAME RPAREN
+ ;
input_list:
- // { ldlex_inputlist(); }
- input_list1
- // { ldlex_popstate(); }
+ input_list1
;
input_list1:
- NAME
- // { lang_add_input_file($1,lang_input_file_is_search_file_enum,
- // (char *)NULL); }
- | input_list1 COMMA NAME
- // { lang_add_input_file($3,lang_input_file_is_search_file_enum,
- // (char *)NULL); }
- | input_list1 NAME
- // { lang_add_input_file($2,lang_input_file_is_search_file_enum,
- // (char *)NULL); }
- | LNAME
- // { lang_add_input_file($1,lang_input_file_is_l_enum,
- // (char *)NULL); }
- | input_list1 COMMA LNAME
- // { lang_add_input_file($3,lang_input_file_is_l_enum,
- // (char *)NULL); }
- | input_list1 LNAME
- // { lang_add_input_file($2,lang_input_file_is_l_enum,
- // (char *)NULL); }
- | AS_NEEDED LPAREN
- // { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- // input_flags.add_DT_NEEDED_for_regular = TRUE; }
- // input_list1 RPAREN
- // { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
- | input_list1 COMMA AS_NEEDED LPAREN
- // { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- // input_flags.add_DT_NEEDED_for_regular = TRUE; }
- // input_list1 RPAREN
- // { input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
- | input_list1 AS_NEEDED LPAREN
- // { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
- // input_flags.add_DT_NEEDED_for_regular = TRUE; }
- // input_list1 RPAREN
- // { input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
- ;
+ NAME
+ | input_list1 COMMA NAME
+ | input_list1 NAME
+ | LNAME
+ | input_list1 COMMA LNAME
+ | input_list1 LNAME
+ | AS_NEEDED LPAREN
+ | input_list1 COMMA AS_NEEDED LPAREN
+ | input_list1 AS_NEEDED LPAREN
+ ;
sections:
- SECTIONS LBRACE sec_or_group_p1 RBRACE
- ;
+ SECTIONS LBRACE sec_or_group_p1 RBRACE
+ ;
sec_or_group_p1:
- sec_or_group_p1 section
- | sec_or_group_p1 statement_anywhere
- |
- ;
+ sec_or_group_p1 section
+ | sec_or_group_p1 statement_anywhere
+ |
+ ;
statement_anywhere:
- ENTRY LPAREN NAME RPAREN
- // { lang_add_entry ($3, FALSE); }
- | assignment end
- | ASSERT_K /*{ldlex_expression ();}*/ LPAREN exp COMMA string RPAREN
- // { ldlex_popstate ();
- // lang_add_assignment (exp_assert ($4, $6)); }
- ;
+ ENTRY LPAREN NAME RPAREN
+ | assignment end
+ | ASSERT_K LPAREN exp COMMA string RPAREN
+ ;
/* The '*' and '?' cases are there because the lexer returns them as
separate tokens rather than as name. */
wildcard_name:
- NAME
- // {
- // $$ = $1;
- // }
- | STAR
- // {
- // $$ = "*";
- // }
- | QUESTION
- // {
- // $$ = "?";
- // }
- ;
+ NAME
+ | STAR
+ | QUESTION
+ ;
wildcard_spec:
- wildcard_name
-// {
-// $$.name = $1;
-// $$.sorted = none;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | EXCLUDE_FILE LPAREN exclude_name_list RPAREN wildcard_name
-// {
-// $$.name = $5;
-// $$.sorted = none;
-// $$.exclude_name_list = $3;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_NAME LPAREN wildcard_name RPAREN
-// {
-// $$.name = $3;
-// $$.sorted = by_name;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN
-// {
-// $$.name = $3;
-// $$.sorted = by_alignment;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_NONE LPAREN wildcard_name RPAREN
-// {
-// $$.name = $3;
-// $$.sorted = by_none;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_NAME LPAREN SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN RPAREN
-// {
-// $$.name = $5;
-// $$.sorted = by_name_alignment;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_NAME LPAREN SORT_BY_NAME LPAREN wildcard_name RPAREN RPAREN
-// {
-// $$.name = $5;
-// $$.sorted = by_name;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_ALIGNMENT LPAREN SORT_BY_NAME LPAREN wildcard_name RPAREN RPAREN
-// {
-// $$.name = $5;
-// $$.sorted = by_alignment_name;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_ALIGNMENT LPAREN SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN RPAREN
-// {
-// $$.name = $5;
-// $$.sorted = by_alignment;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_NAME LPAREN EXCLUDE_FILE LPAREN exclude_name_list RPAREN wildcard_name RPAREN
-// {
-// $$.name = $7;
-// $$.sorted = by_name;
-// $$.exclude_name_list = $5;
-// $$.section_flag_list = NULL;
-// }
- | SORT_BY_INIT_PRIORITY LPAREN wildcard_name RPAREN
-// {
-// $$.name = $3;
-// $$.sorted = by_init_priority;
-// $$.exclude_name_list = NULL;
-// $$.section_flag_list = NULL;
-// }
- ;
-
-sect_flag_list: NAME
-// {
-// struct flag_info_list *n;
-// n = ((struct flag_info_list *) xmalloc (sizeof *n));
-// if ($1[0] == '!')
-// {
-// n->with = without_flags;
-// n->name = &$1[1];
-// }
-// else
-// {
-// n->with = with_flags;
-// n->name = $1;
-// }
-// n->valid = FALSE;
-// n->next = NULL;
-// $$ = n;
-// }
- | sect_flag_list AMPERSAND NAME
-// {
-// struct flag_info_list *n;
-// n = ((struct flag_info_list *) xmalloc (sizeof *n));
-// if ($3[0] == '!')
-// {
-// n->with = without_flags;
-// n->name = &$3[1];
-// }
-// else
-// {
-// n->with = with_flags;
-// n->name = $3;
-// }
-// n->valid = FALSE;
-// n->next = $1;
-// $$ = n;
-// }
- ;
+ wildcard_name
+ | EXCLUDE_FILE LPAREN exclude_name_list RPAREN wildcard_name
+ | SORT_BY_NAME LPAREN wildcard_name RPAREN
+ | SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN
+ | SORT_NONE LPAREN wildcard_name RPAREN
+ | SORT_BY_NAME LPAREN SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN RPAREN
+ | SORT_BY_NAME LPAREN SORT_BY_NAME LPAREN wildcard_name RPAREN RPAREN
+ | SORT_BY_ALIGNMENT LPAREN SORT_BY_NAME LPAREN wildcard_name RPAREN RPAREN
+ | SORT_BY_ALIGNMENT LPAREN SORT_BY_ALIGNMENT LPAREN wildcard_name RPAREN RPAREN
+ | SORT_BY_NAME LPAREN EXCLUDE_FILE LPAREN exclude_name_list RPAREN wildcard_name RPAREN
+ | SORT_BY_INIT_PRIORITY LPAREN wildcard_name RPAREN
+ ;
+
+sect_flag_list:
+ NAME
+ | sect_flag_list AMPERSAND NAME
+ ;
sect_flags:
- /*not used by antlr: INPUT_SECTION_FLAGS*/ LPAREN sect_flag_list RPAREN
-// {
-// struct flag_info *n;
-// n = ((struct flag_info *) xmalloc (sizeof *n));
-// n->flag_list = $3;
-// n->flags_initialized = FALSE;
-// n->not_with_flags = 0;
-// n->only_with_flags = 0;
-// $$ = n;
-// }
- ;
+ /*not used by antlr: INPUT_SECTION_FLAGS*/ LPAREN sect_flag_list RPAREN
+ ;
exclude_name_list:
- exclude_name_list wildcard_name
-// {
-// struct name_list *tmp;
-// tmp = (struct name_list *) xmalloc (sizeof *tmp);
-// tmp->name = $2;
-// tmp->next = $1;
-// $$ = tmp;
-// }
- |
- wildcard_name
-// {
-// struct name_list *tmp;
-// tmp = (struct name_list *) xmalloc (sizeof *tmp);
-// tmp->name = $1;
-// tmp->next = NULL;
-// $$ = tmp;
-// }
- ;
+ exclude_name_list wildcard_name
+ | wildcard_name
+ ;
file_name_list:
- file_name_list opt_comma wildcard_spec
-// {
-// struct wildcard_list *tmp;
-// tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
-// tmp->next = $1;
-// tmp->spec = $3;
-// $$ = tmp;
-// }
- |
- wildcard_spec
-// {
-// struct wildcard_list *tmp;
-// tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
-// tmp->next = NULL;
-// tmp->spec = $1;
-// $$ = tmp;
-// }
- ;
+ file_name_list opt_comma wildcard_spec
+ | wildcard_spec
+ ;
input_section_spec_no_keep:
- NAME
-// {
-// struct wildcard_spec tmp;
-// tmp.name = $1;
-// tmp.exclude_name_list = NULL;
-// tmp.sorted = none;
-// tmp.section_flag_list = NULL;
-// lang_add_wild (&tmp, NULL, ldgram_had_keep);
-// }
- | sect_flags NAME
-// {
-// struct wildcard_spec tmp;
-// tmp.name = $2;
-// tmp.exclude_name_list = NULL;
-// tmp.sorted = none;
-// tmp.section_flag_list = $1;
-// lang_add_wild (&tmp, NULL, ldgram_had_keep);
-// }
- | LBRACKET file_name_list RBRACKET
-// {
-// lang_add_wild (NULL, $2, ldgram_had_keep);
-// }
- | sect_flags LBRACKET file_name_list RBRACKET
-// {
-// struct wildcard_spec tmp;
-// tmp.name = NULL;
-// tmp.exclude_name_list = NULL;
-// tmp.sorted = none;
-// tmp.section_flag_list = $1;
-// lang_add_wild (&tmp, $3, ldgram_had_keep);
-// }
- | wildcard_spec LPAREN file_name_list RPAREN
-// {
-// lang_add_wild (&$1, $3, ldgram_had_keep);
-// }
- | sect_flags wildcard_spec LPAREN file_name_list RPAREN
-// {
-// $2.section_flag_list = $1;
-// lang_add_wild (&$2, $4, ldgram_had_keep);
-// }
- ;
+ NAME
+ | sect_flags NAME
+ | LBRACKET file_name_list RBRACKET
+ | sect_flags LBRACKET file_name_list RBRACKET
+ | wildcard_spec LPAREN file_name_list RPAREN
+ | sect_flags wildcard_spec LPAREN file_name_list RPAREN
+ ;
input_section_spec:
- input_section_spec_no_keep
- | KEEP LPAREN
-// { ldgram_had_keep = TRUE; }
- input_section_spec_no_keep RPAREN
-// { ldgram_had_keep = FALSE; }
- ;
+ input_section_spec_no_keep
+ | KEEP LPAREN input_section_spec_no_keep RPAREN
+ ;
statement:
- assignment end
- | CREATE_OBJECT_SYMBOLS
-// {
-// lang_add_attribute(lang_object_symbols_statement_enum);
-// }
- | SEMICOLON
- | CONSTRUCTORS
-// {
-//
-// lang_add_attribute(lang_constructors_statement_enum);
-// }
- | SORT_BY_NAME LPAREN CONSTRUCTORS RPAREN
-// {
-// constructors_sorted = TRUE;
-// lang_add_attribute (lang_constructors_statement_enum);
-// }
- | input_section_spec
- | length LPAREN mustbe_exp RPAREN
-// {
-// lang_add_data ((int) $1, $3);
-// }
-
- | FILL LPAREN fill_exp RPAREN
-// {
-// lang_add_fill ($3);
-// }
- | ASSERT_K /*{ldlex_expression ();}*/ LPAREN exp COMMA NAME RPAREN end
-// { ldlex_popstate ();
-// lang_add_assignment (exp_assert ($4, $6)); }
- | INCLUDE filename
-// { ldlex_script (); ldfile_open_command_file($2); }
- statement_list_opt END
-// { ldlex_popstate (); }
- ;
+ assignment end
+ | CREATE_OBJECT_SYMBOLS
+ | SEMICOLON
+ | CONSTRUCTORS
+ | SORT_BY_NAME LPAREN CONSTRUCTORS RPAREN
+ | input_section_spec
+ | length LPAREN mustbe_exp RPAREN
+ | FILL LPAREN fill_exp RPAREN
+ | ASSERT_K LPAREN exp COMMA NAME RPAREN end
+ | INCLUDE filename statement_list_opt END
+ ;
statement_list:
- statement_list statement
- | statement
- ;
+ statement_list statement
+ | statement
+ ;
statement_list_opt:
- /* empty */
- | statement_list
- ;
+ /* empty */
+ | statement_list
+ ;
length:
- QUAD
-// { $$ = $1; }
- | SQUAD
-// { $$ = $1; }
- | LONG
-// { $$ = $1; }
- | SHORT
-// { $$ = $1; }
- | BYTE
-// { $$ = $1; }
- ;
+ QUAD
+ | SQUAD
+ | LONG
+ | SHORT
+ | BYTE
+ ;
fill_exp:
- mustbe_exp
-// {
-// $$ = exp_get_fill ($1, 0, "fill value");
-// }
- ;
+ mustbe_exp
+ ;
fill_opt:
- EQ fill_exp
- // { $$ = $2; }
- | // { $$ = (fill_type *) 0; }
- ;
+ EQ fill_exp
+ |
+ ;
assign_op:
- PLUSEQ
-// { $$ = '+'; }
- | MINUSEQ
-// { $$ = '-'; }
- | MULTEQ
-// { $$ = '*'; }
- | DIVEQ
-// { $$ = '/'; }
- | LSHIFTEQ
-// { $$ = LSHIFT; }
- | RSHIFTEQ
-// { $$ = RSHIFT; }
- | ANDEQ
-// { $$ = '&'; }
- | OREQ
-// { $$ = '|'; }
-
- ;
-
-end: SEMICOLON | COMMA
- ;
+ PLUSEQ
+ | MINUSEQ
+ | MULTEQ
+ | DIVEQ
+ | LSHIFTEQ
+ | RSHIFTEQ
+ | ANDEQ
+ | OREQ
+ ;
+
+end:
+ SEMICOLON
+ | COMMA
+ ;
assignment:
- NAME EQ mustbe_exp
-// {
-// lang_add_assignment (exp_assign ($1, $3, FALSE));
-// }
- | NAME assign_op mustbe_exp
-// {
-// lang_add_assignment (exp_assign ($1,
-// exp_binop ($2,
-// exp_nameop (NAME,
-// $1),
-// $3), FALSE));
-// }
- | HIDDEN_ LPAREN NAME EQ mustbe_exp RPAREN
-// {
-// lang_add_assignment (exp_assign ($3, $5, TRUE));
-// }
- | PROVIDE LPAREN NAME EQ mustbe_exp RPAREN
-// {
-// lang_add_assignment (exp_provide ($3, $5, FALSE));
-// }
- | PROVIDE_HIDDEN LPAREN NAME EQ mustbe_exp RPAREN
-// {
-// lang_add_assignment (exp_provide ($3, $5, TRUE));
-// }
- ;
+ NAME EQ mustbe_exp
+ | NAME assign_op mustbe_exp
+ | HIDDEN_ LPAREN NAME EQ mustbe_exp RPAREN
+ | PROVIDE LPAREN NAME EQ mustbe_exp RPAREN
+ | PROVIDE_HIDDEN LPAREN NAME EQ mustbe_exp RPAREN
+ ;
opt_comma:
- COMMA | ;
+ COMMA
+ |
+ ;
memory:
- MEMORY LBRACE memory_spec_list_opt RBRACE
- ;
+ MEMORY LBRACE memory_spec_list_opt RBRACE
+ ;
-memory_spec_list_opt: memory_spec_list | ;
+memory_spec_list_opt:
+ memory_spec_list
+ |
+ ;
memory_spec_list:
- memory_spec_list opt_comma memory_spec
- | memory_spec
- ;
-
-
-memory_spec: NAME
-// { region = lang_memory_region_lookup ($1, TRUE); }
- attributes_opt COLON
- origin_spec opt_comma length_spec
-// {}
- | INCLUDE filename
-// { ldlex_script (); ldfile_open_command_file($2); }
- memory_spec_list_opt END
-// { ldlex_popstate (); }
- ;
+ memory_spec_list opt_comma memory_spec
+ | memory_spec
+ ;
+
+memory_spec:
+ NAME
+ attributes_opt COLON
+ origin_spec opt_comma length_spec
+ | INCLUDE filename memory_spec_list_opt END
+ ;
origin_spec:
- ORIGIN EQ mustbe_exp
-// {
-// region->origin_exp = $3;
-// region->current = region->origin;
-// }
- ;
+ ORIGIN EQ mustbe_exp
+ ;
length_spec:
- LENGTH EQ mustbe_exp
-// {
-// region->length_exp = $3;
-// }
- ;
+ LENGTH EQ mustbe_exp
+ ;
attributes_opt:
- /* empty */
- /* { *//* dummy action to avoid bison 1.25 error message *//* }
- |*/ LPAREN attributes_list RPAREN
- ;
+ LPAREN attributes_list RPAREN
+ ;
attributes_list:
- attributes_string
- | attributes_list attributes_string
- ;
+ attributes_string
+ | attributes_list attributes_string
+ ;
attributes_string:
- NAME # attributeNormal
-// { lang_set_flags (region, $1, 0); }
- | EXLAMATION NAME # attributeInverted
-// { lang_set_flags (region, $2, 1); }
- ;
+ NAME # attributeNormal
+ | EXLAMATION NAME # attributeInverted
+ ;
/*
This would be best but the tokenizer would have to be made context sensitive which is too much work given how
@@ -722,624 +365,306 @@ attributes_string :
attribute: 'r' | 'w' | 'x' | 'a' | 'i' | 'l' ;
*/
startup:
- STARTUP LPAREN filename RPAREN
-// { lang_startup($3); }
- ;
+ STARTUP LPAREN filename RPAREN
+ ;
high_level_library:
- HLL LPAREN high_level_library_NAME_list RPAREN
- | HLL LPAREN RPAREN
-// { ldemul_hll((char *)NULL); }
- ;
+ HLL LPAREN high_level_library_NAME_list RPAREN
+ | HLL LPAREN RPAREN
+ ;
high_level_library_NAME_list:
- high_level_library_NAME_list opt_comma filename
-// { ldemul_hll($3); }
- | filename
-// { ldemul_hll($1); }
+ high_level_library_NAME_list opt_comma filename
+ | filename
- ;
+ ;
low_level_library:
- SYSLIB LPAREN low_level_library_NAME_list RPAREN
- ; low_level_library_NAME_list:
- low_level_library_NAME_list opt_comma filename
-// { ldemul_syslib($3); }
- |
- ;
+ SYSLIB LPAREN low_level_library_NAME_list RPAREN
+ ;
+
+low_level_library_NAME_list:
+ low_level_library_NAME_list opt_comma filename
+ |
+ ;
floating_point_support:
- FLOAT
-// { lang_float(TRUE); }
- | NOFLOAT
-// { lang_float(FALSE); }
- ;
+ FLOAT
+ | NOFLOAT
+ ;
nocrossref_list:
- /* empty */
-// {
-// $$ = NULL;
-// }
- | NAME nocrossref_list
-// {
-// struct lang_nocrossref *n;
-//
-// n = (struct lang_nocrossref *) xmalloc (sizeof *n);
-// n->name = $1;
-// n->next = $2;
-// $$ = n;
-// }
- | NAME COMMA nocrossref_list
-// {
-// struct lang_nocrossref *n;
-//
-// n = (struct lang_nocrossref *) xmalloc (sizeof *n);
-// n->name = $1;
-// n->next = $3;
-// $$ = n;
-// }
- ;
-
-mustbe_exp: // { ldlex_expression (); }
- exp
- // { ldlex_popstate (); $$=$2;}
- ;
-
-exp :
- DASH exp # expNegate // TODO: %prec UNARY
-// { $$ = exp_unop ('-', $2); }
- | LPAREN exp RPAREN # expParen
-// { $$ = $2; }
- | NEXT LPAREN exp RPAREN # expNextParen // TODO: %prec UNARY
-// { $$ = exp_unop ((int) $1,$3); }
- | EXLAMATION exp # expInvert // TODO: %prec UNARY
-// { $$ = exp_unop ('!', $2); }
- | PLUS exp # expPlus // TODO: %prec UNARY
-// { $$ = $2; }
- | TILDE exp # expMinus // TODO: %prec UNARY
-// { $$ = exp_unop ('~', $2);}
- | exp STAR exp # expMul
-// { $$ = exp_binop ('*', $1, $3); }
- | exp SLASH exp # expDiv
-// { $$ = exp_binop ('/', $1, $3); }
- | exp MOD exp # expMod
-// { $$ = exp_binop ('%', $1, $3); }
- | exp PLUS exp # expAdd
-// { $$ = exp_binop ('+', $1, $3); }
- | exp DASH exp # expSub
-// { $$ = exp_binop ('-' , $1, $3); }
- | exp LSHIFT exp # expLshift
-// { $$ = exp_binop (LSHIFT , $1, $3); }
- | exp RSHIFT exp # expRshift
-// { $$ = exp_binop (RSHIFT , $1, $3); }
- | exp EQEQ exp # expEq
-// { $$ = exp_binop (EQ , $1, $3); }
- | exp NE exp # expNe
-// { $$ = exp_binop (NE , $1, $3); }
- | exp LE exp # expLe
-// { $$ = exp_binop (LE , $1, $3); }
- | exp GE exp # expGe
-// { $$ = exp_binop (GE , $1, $3); }
- | exp LT exp # expLt
-// { $$ = exp_binop ('<' , $1, $3); }
- | exp GT exp # expGt
-// { $$ = exp_binop ('>' , $1, $3); }
- | exp AMPERSAND exp # expAnd
-// { $$ = exp_binop ('&' , $1, $3); }
- | exp HAT exp # expXor
-// { $$ = exp_binop ('^' , $1, $3); }
- | exp BAR exp # expOr
-// { $$ = exp_binop ('|' , $1, $3); }
- | exp QUESTION exp COLON exp # expTrinary
-// { $$ = exp_trinop ('?' , $1, $3, $5); }
- | exp ANDAND exp # expAndand
-// { $$ = exp_binop (ANDAND , $1, $3); }
- | exp OROR exp # expOror
-// { $$ = exp_binop (OROR , $1, $3); }
- | DEFINED LPAREN NAME RPAREN # expDefined
-// { $$ = exp_nameop (DEFINED, $3); }
- | INT # expInt
-// { $$ = exp_bigintop ($1.integer, $1.str); }
- | SIZEOF_HEADERS # expSizeofHeaders
-// { $$ = exp_nameop (SIZEOF_HEADERS,0); }
- | ALIGNOF LPAREN NAME RPAREN # expAlignof
-// { $$ = exp_nameop (ALIGNOF,$3); }
- | SIZEOF LPAREN NAME RPAREN # expSizeof
-// { $$ = exp_nameop (SIZEOF,$3); }
- | ADDR LPAREN NAME RPAREN # expAddr
-// { $$ = exp_nameop (ADDR,$3); }
- | LOADADDR LPAREN NAME RPAREN # expLoadaddr
-// { $$ = exp_nameop (LOADADDR,$3); }
- | CONSTANT LPAREN NAME RPAREN # expConstant
-// { $$ = exp_nameop (CONSTANT,$3); }
- | ABSOLUTE LPAREN exp RPAREN # expAbsolute
-// { $$ = exp_unop (ABSOLUTE, $3); }
- | ALIGN_K LPAREN exp RPAREN # expAlign
-// { $$ = exp_unop (ALIGN_K,$3); }
- | ALIGN_K LPAREN exp COMMA exp RPAREN # expAlignK
-// { $$ = exp_binop (ALIGN_K,$3,$5); }
- | DATA_SEGMENT_ALIGN LPAREN exp COMMA exp RPAREN # expDataSegmentAlign
-// { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
- | DATA_SEGMENT_RELRO_END LPAREN exp COMMA exp RPAREN # expDataSegmentRelRoEnd
-// { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3);
- | DATA_SEGMENT_END LPAREN exp RPAREN # expDataSegmentEnd
-// { $$ = exp_unop (DATA_SEGMENT_END, $3); }
- | SEGMENT_START LPAREN NAME COMMA exp RPAREN # expSegmentStart
-// { /* 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)); }
- | BLOCK LPAREN exp RPAREN # expBlock
-// { $$ = exp_unop (ALIGN_K,$3); }
- | NAME # expName
-// { $$ = exp_nameop (NAME,$1); }
- | MAX_K LPAREN exp COMMA exp RPAREN # expMax
-// { $$ = exp_binop (MAX_K, $3, $5 ); }
- | MIN_K LPAREN exp COMMA exp RPAREN # expMin
-// { $$ = exp_binop (MIN_K, $3, $5 ); }
- | ASSERT_K LPAREN exp COMMA NAME RPAREN # expAssert
-// { $$ = exp_assert ($3, $5); }
- | ORIGIN LPAREN NAME RPAREN # expOrigin
-// { $$ = exp_nameop (ORIGIN, $3); }
- | LENGTH LPAREN NAME RPAREN # expLengthExp
-// { $$ = exp_nameop (LENGTH, $3); }
- | LOG2CEIL LPAREN exp RPAREN # expLog2ceil
-// { $$ = exp_unop (LOG2CEIL, $3); }
- ;
+ /* empty */
+ | NAME nocrossref_list
+ | NAME COMMA nocrossref_list
+ ;
+mustbe_exp:
+ exp
+ ;
+
+exp:
+ DASH exp # expNegate // TODO: %prec UNARY
+ | LPAREN exp RPAREN # expParen
+ | NEXT LPAREN exp RPAREN # expNextParen // TODO: %prec UNARY
+ | EXLAMATION exp # expInvert // TODO: %prec UNARY
+ | PLUS exp # expPlus // TODO: %prec UNARY
+ | TILDE exp # expMinus // TODO: %prec UNARY
+ | exp STAR exp # expMul
+ | exp SLASH exp # expDiv
+ | exp MOD exp # expMod
+ | exp PLUS exp # expAdd
+ | exp DASH exp # expSub
+ | exp LSHIFT exp # expLshift
+ | exp RSHIFT exp # expRshift
+ | exp EQEQ exp # expEq
+ | exp NE exp # expNe
+ | exp LE exp # expLe
+ | exp GE exp # expGe
+ | exp LT exp # expLt
+ | exp GT exp # expGt
+ | exp AMPERSAND exp # expAnd
+ | exp HAT exp # expXor
+ | exp BAR exp # expOr
+ | exp QUESTION exp COLON exp # expTrinary
+ | exp ANDAND exp # expAndand
+ | exp OROR exp # expOror
+ | DEFINED LPAREN NAME RPAREN # expDefined
+ | INT # expInt
+ | SIZEOF_HEADERS # expSizeofHeaders
+ | ALIGNOF LPAREN NAME RPAREN # expAlignof
+ | SIZEOF LPAREN NAME RPAREN # expSizeof
+ | ADDR LPAREN NAME RPAREN # expAddr
+ | LOADADDR LPAREN NAME RPAREN # expLoadaddr
+ | CONSTANT LPAREN NAME RPAREN # expConstant
+ | ABSOLUTE LPAREN exp RPAREN # expAbsolute
+ | ALIGN_K LPAREN exp RPAREN # expAlign
+ | ALIGN_K LPAREN exp COMMA exp RPAREN # expAlignK
+ | DATA_SEGMENT_ALIGN LPAREN exp COMMA exp RPAREN # expDataSegmentAlign
+ | DATA_SEGMENT_RELRO_END LPAREN exp COMMA exp RPAREN # expDataSegmentRelRoEnd
+ | DATA_SEGMENT_END LPAREN exp RPAREN # expDataSegmentEnd
+ | SEGMENT_START LPAREN NAME COMMA exp RPAREN # expSegmentStart
+ | BLOCK LPAREN exp RPAREN # expBlock
+ | NAME # expName
+ | MAX_K LPAREN exp COMMA exp RPAREN # expMax
+ | MIN_K LPAREN exp COMMA exp RPAREN # expMin
+ | ASSERT_K LPAREN exp COMMA NAME RPAREN # expAssert
+ | ORIGIN LPAREN NAME RPAREN # expOrigin
+ | LENGTH LPAREN NAME RPAREN # expLengthExp
+ | LOG2CEIL LPAREN exp RPAREN # expLog2ceil
+ ;
memspec_at_opt:
- AT GT NAME // { $$ = $3; }
- | // { $$ = 0; }
- ;
+ AT GT NAME
+ |
+ ;
opt_at:
- AT LPAREN exp RPAREN // { $$ = $3; }
- | // { $$ = 0; }
- ;
+ AT LPAREN exp RPAREN
+ |
+ ;
opt_align:
- ALIGN_K LPAREN exp RPAREN // { $$ = $3; }
- | // { $$ = 0; }
- ;
+ ALIGN_K LPAREN exp RPAREN
+ |
+ ;
opt_align_with_input:
- ALIGN_WITH_INPUT // { $$ = ALIGN_WITH_INPUT; }
- | // { $$ = 0; }
- ;
+ ALIGN_WITH_INPUT
+ |
+ ;
opt_subalign:
- SUBALIGN LPAREN exp RPAREN // { $$ = $3; }
- | // { $$ = 0; }
- ;
+ SUBALIGN LPAREN exp RPAREN
+ |
+ ;
sect_constraint:
- ONLY_IF_RO // { $$ = ONLY_IF_RO; }
- | ONLY_IF_RW // { $$ = ONLY_IF_RW; }
- | SPECIAL // { $$ = SPECIAL; }
- | // { $$ = 0; }
- ;
-
-section: NAME // { ldlex_expression(); }
- opt_exp_with_type
- opt_at
- opt_align
- opt_align_with_input
- opt_subalign // { ldlex_popstate (); ldlex_script (); }
- sect_constraint
- LBRACE
-// {
-// lang_enter_output_section_statement($1, $3,
-// sectype,
-// $5, $7, $4, $9, $6);
-// }
- statement_list_opt
- RBRACE // { ldlex_popstate (); ldlex_expression (); }
- memspec_opt memspec_at_opt phdr_opt fill_opt
-// {
-// ldlex_popstate ();
-// lang_leave_output_section_statement ($18, $15, $17, $16);
-// }
- opt_comma
- {}
- | OVERLAY
-// { ldlex_expression (); }
- opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
-// { ldlex_popstate (); ldlex_script (); }
- LBRACE
-// {
-// lang_enter_overlay ($3, $6);
-// }
- overlay_section
- RBRACE
-// { ldlex_popstate (); ldlex_expression (); }
- memspec_opt memspec_at_opt phdr_opt fill_opt
-// {
-// ldlex_popstate ();
-// lang_leave_overlay ($5, (int) $4,
-// $16, $13, $15, $14);
-// }
- opt_comma
- | /* The GROUP case is just enough to support the gcc
- svr3.ifile script. It is not intended to be full
- support. I'm not even sure what GROUP is supposed
- to mean. */
- GROUP // { ldlex_expression (); }
- opt_exp_with_type
-// {
-// ldlex_popstate ();
-// lang_add_assignment (exp_assign (".", $3, FALSE));
-// }
- LBRACE sec_or_group_p1 RBRACE
- | INCLUDE filename
- // { ldlex_script (); ldfile_open_command_file($2); }
- sec_or_group_p1 END
- // { ldlex_popstate (); }
- ;
+ ONLY_IF_RO
+ | ONLY_IF_RW
+ | SPECIAL
+ |
+ ;
+
+section:
+ NAME
+ opt_exp_with_type
+ opt_at
+ opt_align
+ opt_align_with_input
+ opt_subalign
+ sect_constraint LBRACE statement_list_opt RBRACE
+ memspec_opt memspec_at_opt phdr_opt fill_opt
+ opt_comma
+ {}
+ | OVERLAY
+ opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
+ LBRACE overlay_section RBRACE
+ memspec_opt memspec_at_opt phdr_opt fill_opt
+ opt_comma
+ | /* The GROUP case is just enough to support the gcc
+ svr3.ifile script. It is not intended to be full
+ support. I'm not even sure what GROUP is supposed
+ to mean. */
+ GROUP opt_exp_with_type LBRACE sec_or_group_p1 RBRACE
+ | INCLUDE filename sec_or_group_p1 END
+ ;
type:
- NOLOAD // { sectype = noload_section; }
- | DSECT // { sectype = noalloc_section; }
- | COPY // { sectype = noalloc_section; }
- | INFO // { sectype = noalloc_section; }
- | OVERLAY // { sectype = noalloc_section; }
- ;
+ NOLOAD
+ | DSECT
+ | COPY
+ | INFO
+ | OVERLAY
+ ;
atype:
- LPAREN type RPAREN
- | /* EMPTY */ // { sectype = normal_section; }
- | LPAREN RPAREN // { sectype = normal_section; }
- ;
+ LPAREN type RPAREN
+ | /* EMPTY */
+ | LPAREN RPAREN
+ ;
opt_exp_with_type:
- exp atype COLON // { $$ = $1; }
- | atype COLON // { $$ = (etree_type *)NULL; }
- | /* The BIND cases are to support the gcc svr3.ifile
- script. They aren't intended to implement full
- support for the BIND keyword. I'm not even sure
- what BIND is supposed to mean. */
- BIND LPAREN exp RPAREN atype COLON // { $$ = $3; }
- | BIND LPAREN exp RPAREN BLOCK LPAREN exp RPAREN atype COLON
- // { $$ = $3; }
- ;
+ exp atype COLON
+ | atype COLON
+ | /* The BIND cases are to support the gcc svr3.ifile
+ script. They aren't intended to implement full
+ support for the BIND keyword. I'm not even sure
+ what BIND is supposed to mean. */
+ BIND LPAREN exp RPAREN atype COLON
+ | BIND LPAREN exp RPAREN BLOCK LPAREN exp RPAREN atype COLON
+ ;
opt_exp_without_type:
- exp COLON // { $$ = $1; }
- | COLON // { $$ = (etree_type *) NULL; }
- ;
+ exp COLON
+ | COLON
+ ;
opt_nocrossrefs:
- /* empty */
-// { $$ = 0; }
- | NOCROSSREFS
-// { $$ = 1; }
- ;
+ /* empty */
+ | NOCROSSREFS
+ ;
memspec_opt:
- GT NAME
- // { $$ = $2; }
- | // { $$ = DEFAULT_MEMORY_REGION; }
- ;
+ GT NAME
+ |
+ ;
phdr_opt:
- /* empty */
-// {
-// $$ = NULL;
-// }
- | phdr_opt COLON NAME
-// {
-// struct lang_output_section_phdr_list *n;
-//
-// n = ((struct lang_output_section_phdr_list *)
-// xmalloc (sizeof *n));
-// n->name = $3;
-// n->used = FALSE;
-// n->next = $1;
-// $$ = n;
-// }
- ;
+ /* empty */
+ | phdr_opt COLON NAME
+ ;
overlay_section:
- /* empty */
- | overlay_section
- NAME
-// {
-// ldlex_script ();
-// lang_enter_overlay_section ($2);
-// }
- LBRACE statement_list_opt RBRACE
-// { ldlex_popstate (); ldlex_expression (); }
- phdr_opt fill_opt
-// {
-// ldlex_popstate ();
-// lang_leave_overlay_section ($9, $8);
-// }
- opt_comma
- ;
+ /* empty */
+ | overlay_section
+ NAME
+ LBRACE statement_list_opt RBRACE
+ phdr_opt fill_opt
+ opt_comma
+ ;
phdrs:
- PHDRS LBRACE phdr_list RBRACE
- ;
+ PHDRS LBRACE phdr_list RBRACE
+ ;
phdr_list:
- /* empty */
- | phdr_list phdr
- ;
+ /* empty */
+ | phdr_list phdr
+ ;
phdr:
- NAME // { ldlex_expression (); }
- phdr_type phdr_qualifiers // { ldlex_popstate (); }
- SEMICOLON
-// {
-// lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
-// $4.flags);
-// }
- ;
+ NAME phdr_type phdr_qualifiers SEMICOLON
+ ;
phdr_type:
- exp
-// {
-// $$ = $1;
-//
-// if ($1->type.node_class == etree_name
-// && $1->type.node_code ==name)
-// {
-// const char *s;
-// unsigned int i;
-// static const char * const phdr_types[] =
-// {
-// "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
-// "PT_INTERP", "PT_NOTE", "PT_SHLIB",
-// "PT_PHDR", "PT_TLS"
-// };
-//
-// s = $1->name.name;
-// for (i = 0;
-// i < sizeof phdr_types / sizeof phdr_types[0];
-// i++)
-// if (strcmp (s, phdr_types[i]) == 0)
-// {
-// $$ = exp_intop (i);
-// break;
-// }
-// if (i == sizeof phdr_types / sizeof phdr_types[0])
-// {
-// if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
-// $$ = exp_intop (0x6474e550);
-// else if (strcmp (s, "PT_GNU_STACK") == 0)
-// $$ = exp_intop (0x6474e551);
-// else
-// {
-// einfo (_("\
-//%X%P:%S: unknown phdr type `%s' (try integer literal)\n"),
-// NULL, s);
-// $$ = exp_intop (0);
-// }
-// }
-// }
-// }
- ;
+ exp
+ ;
phdr_qualifiers:
- /* empty */
-// {
-// memset (&$$, 0, sizeof (struct phdr_info));
-// }
- | NAME phdr_val phdr_qualifiers
-// {
-// $$ = $3;
-// if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
-// $$.filehdr = TRUE;
-// else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
-// $$.phdrs = TRUE;
-// else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
-// $$.flags = $2;
-// else
-// einfo (_("%X%P:%S: PHDRS syntax error at `%s'\n"),
-// NULL, $1);
-// }
- | AT LPAREN exp RPAREN phdr_qualifiers
-// {
-// $$ = $5;
-// $$.at = $3;
-// }
- ;
+ /* empty */
+ | NAME phdr_val phdr_qualifiers
+ | AT LPAREN exp RPAREN phdr_qualifiers
+ ;
phdr_val:
- /* empty */
-// {
-// $$ = NULL;
-// }
- | LPAREN exp RPAREN
-// {
-// $$ = $2;
-// }
- ;
+ /* empty */
+ | LPAREN exp RPAREN
+ ;
dynamic_list_file:
-// {
-// ldlex_version_file ();
-// PUSH_ERROR (_("dynamic list"));
-// }
- dynamic_list_nodes
-// {
-// ldlex_popstate ();
-// POP_ERROR ();
-// }
- ;
+ dynamic_list_nodes
+ ;
dynamic_list_nodes:
- dynamic_list_node
- | dynamic_list_nodes dynamic_list_node
- ;
+ dynamic_list_node
+ | dynamic_list_nodes dynamic_list_node
+ ;
dynamic_list_node:
- LBRACE dynamic_list_tag RBRACE SEMICOLON
- ;
+ LBRACE dynamic_list_tag RBRACE SEMICOLON
+ ;
dynamic_list_tag:
- vers_defns SEMICOLON
-// {
-// lang_append_dynamic_list ($1);
-// }
- ;
+ vers_defns SEMICOLON
+ ;
/* This syntax is used within an external version script file. */
version_script_file:
-// {
-// ldlex_version_file ();
-// PUSH_ERROR (_("VERSION script"));
-// }
- vers_nodes
-// {
-// ldlex_popstate ();
-// POP_ERROR ();
-// }
- ;
+ vers_nodes
+ ;
/* This is used within a normal linker script file. */
version:
-// {
-// ldlex_version_script ();
-// }
- VERSIONK LBRACE vers_nodes RBRACE
-// {
-// ldlex_popstate ();
-// }
- ;
+ VERSIONK LBRACE vers_nodes RBRACE
+ ;
vers_nodes:
- vers_node
- | vers_nodes vers_node
- ;
+ vers_node
+ | vers_nodes vers_node
+ ;
vers_node:
- LBRACE vers_tag RBRACE SEMICOLON
-// {
-// lang_register_vers_node (NULL, $2, NULL);
-// }
- | VERS_TAG LBRACE vers_tag RBRACE SEMICOLON
-// {
-// lang_register_vers_node ($1, $3, NULL);
-// }
- | VERS_TAG LBRACE vers_tag RBRACE verdep SEMICOLON
-// {
-// lang_register_vers_node ($1, $3, $5);
-// }
- ;
+ LBRACE vers_tag RBRACE SEMICOLON
+ | VERS_TAG LBRACE vers_tag RBRACE SEMICOLON
+ | VERS_TAG LBRACE vers_tag RBRACE verdep SEMICOLON
+ ;
verdep:
- VERS_TAG
-// {
-// $$ = lang_add_vers_depend (NULL, $1);
-// }
- | verdep VERS_TAG
-// {
-// $$ = lang_add_vers_depend ($1, $2);
-// }
- ;
+ VERS_TAG
+ | verdep VERS_TAG
+ ;
vers_tag:
- /* empty */
-// {
-// $$ = lang_new_vers_node (NULL, NULL);
-// }
- | vers_defns SEMICOLON
-// {
-// $$ = lang_new_vers_node ($1, NULL);
-// }
- | GLOBAL COLON vers_defns SEMICOLON
-// {
-// $$ = lang_new_vers_node ($3, NULL);
-// }
- | LOCAL COLON vers_defns SEMICOLON
-// {
-// $$ = lang_new_vers_node (NULL, $3);
-// }
- | GLOBAL COLON vers_defns SEMICOLON LOCAL COLON vers_defns SEMICOLON
-// {
-// $$ = lang_new_vers_node ($3, $7);
-// }
- ;
+ /* empty */
+ | vers_defns SEMICOLON
+ | GLOBAL COLON vers_defns SEMICOLON
+ | LOCAL COLON vers_defns SEMICOLON
+ | GLOBAL COLON vers_defns SEMICOLON LOCAL COLON vers_defns SEMICOLON
+ ;
vers_defns:
- VERS_IDENTIFIER
-// {
-// $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, FALSE);
-// }
- | NAME
-// {
-// $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, TRUE);
-// }
- | vers_defns SEMICOLON VERS_IDENTIFIER
-// {
-// $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, FALSE);
-// }
- | vers_defns SEMICOLON NAME
-// {
-// $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, TRUE);
-// }
- | vers_defns SEMICOLON EXTERN NAME LBRACE
-// {
-// $<name>$ = ldgram_vers_current_lang;
-// ldgram_vers_current_lang = $4;
-// }
- vers_defns opt_semicolon RBRACE
-// {
-// struct bfd_elf_version_expr *pat;
-// for (pat = $7; pat->next != NULL; pat = pat->next);
-// pat->next = $1;
-// $$ = $7;
-// ldgram_vers_current_lang = $<name>6;
-// }
- | EXTERN NAME LBRACE
-// {
-// $<name>$ = ldgram_vers_current_lang;
-// ldgram_vers_current_lang = $2;
-// }
- vers_defns opt_semicolon RBRACE
-// {
-// $$ = $5;
-// ldgram_vers_current_lang = $<name>4;
-// }
- | GLOBAL
-// {
-// $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, FALSE);
-// }
- | vers_defns SEMICOLON GLOBAL
-// {
-// $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, FALSE);
-// }
- | LOCAL
-// {
-// $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, FALSE);
-// }
- | vers_defns SEMICOLON LOCAL
-// {
-// $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, FALSE);
-// }
- | EXTERN
-// {
-// $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, FALSE);
-// }
- | vers_defns SEMICOLON EXTERN
-// {
-// $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, FALSE);
-// }
- ;
+ VERS_IDENTIFIER
+ | NAME
+ | vers_defns SEMICOLON VERS_IDENTIFIER
+ | vers_defns SEMICOLON NAME
+ | vers_defns SEMICOLON EXTERN NAME LBRACE
+ vers_defns opt_semicolon RBRACE
+ | EXTERN NAME LBRACE
+ vers_defns opt_semicolon RBRACE
+ | GLOBAL
+ | vers_defns SEMICOLON GLOBAL
+ | LOCAL
+ | vers_defns SEMICOLON LOCAL
+ | EXTERN
+ | vers_defns SEMICOLON EXTERN
+ ;
opt_semicolon:
- /* empty */
- | SEMICOLON
- ;
-
-//name
-// : NAME;
+ /* empty */
+ | SEMICOLON
+ ;
string: STRING_ANY*;