⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldgram.y

📁 基于4个mips核的noc设计
💻 Y
📖 第 1 页 / 共 2 页
字号:
/* A YACC grammar to parse a superset of the AT&T linker scripting language.   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,   2001 Free Software Foundation, Inc.   Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).This file is part of GNU ld.This program is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */%{/* */#define DONTDECLARE_MALLOC#include "bfd.h"#include "sysdep.h"#include "bfdlink.h"#include "ld.h"    #include "ldexp.h"#include "ldver.h"#include "ldlang.h"#include "ldfile.h"#include "ldemul.h"#include "ldmisc.h"#include "ldmain.h"#include "mri.h"#include "ldctor.h"#include "ldlex.h"#ifndef YYDEBUG#define YYDEBUG 1#endifstatic enum section_type sectype;lang_memory_region_type *region;struct wildcard_spec current_file;boolean ldgram_want_filename = true;boolean had_script = false;boolean force_make_executable = false;boolean ldgram_in_script = false;boolean ldgram_had_equals = false;boolean ldgram_had_keep = false;char *ldgram_vers_current_lang = NULL;#define ERROR_NAME_MAX 20static char *error_names[ERROR_NAME_MAX];static int error_index;#define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;#define POP_ERROR()   error_index--;%}%union {  bfd_vma integer;  char *name;  const char *cname;  struct wildcard_spec wildcard;  struct name_list *name_list;  int token;  union etree_union *etree;  struct phdr_info    {      boolean filehdr;      boolean phdrs;      union etree_union *at;      union etree_union *flags;    } phdr;  struct lang_nocrossref *nocrossref;  struct lang_output_section_phdr_list *section_phdr;  struct bfd_elf_version_deps *deflist;  struct bfd_elf_version_expr *versyms;  struct bfd_elf_version_tree *versnode;}%type <etree> exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val%type <etree> opt_exp_without_type%type <integer> fill_opt%type <name_list> exclude_name_list%type <name> memspec_opt casesymlist%type <name> memspec_at_opt%type <cname> wildcard_name%type <wildcard> wildcard_spec%token <integer> INT  %token <name> NAME LNAME%type <integer> length%type <phdr> phdr_qualifiers%type <nocrossref> nocrossref_list%type <section_phdr> phdr_opt%type <integer> opt_nocrossrefs%right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ  '=' LSHIFTEQ RSHIFTEQ   ANDEQ OREQ %right <token> '?' ':'%left <token> OROR%left <token>  ANDAND%left <token> '|'%left <token>  '^'%left  <token> '&'%left <token>  EQ NE%left  <token> '<' '>' LE GE%left  <token> LSHIFT RSHIFT%left  <token> '+' '-'%left  <token> '*' '/' '%'%right UNARY%token END %left <token> '('%token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE%token SECTIONS PHDRS SORT%token '{' '}'%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH%token SIZEOF_HEADERS%token INCLUDE%token MEMORY DEFSYMEND%token NOLOAD DSECT COPY INFO OVERLAY%token NAME LNAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY%token <integer> NEXT%token SIZEOF ADDR LOADADDR MAX_K MIN_K%token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS%token ORIGIN FILL%token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS%token ALIGNMOD AT PROVIDE%type <token> assign_op atype attributes_opt%type <name>  filename%token CHIP LIST SECT ABSOLUTE  LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START%token <name> VERS_TAG VERS_IDENTIFIER%token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT%token KEEP%token EXCLUDE_FILE%type <versyms> vers_defns%type <versnode> vers_tag%type <deflist> verdep%%file:			INPUT_SCRIPT script_file	|	INPUT_MRI_SCRIPT mri_script_file	|	INPUT_VERSION_SCRIPT version_script_file	|	INPUT_DEFSYM defsym_expr	;filename:  NAME;defsym_expr:		{ ldlex_defsym(); }		NAME '=' exp		{		  ldlex_popstate();		  lang_add_assignment(exp_assop($3,$2,$4));		}/* 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_command NEWLINE          |	;mri_script_command:		CHIP  exp 	|	CHIP  exp ',' exp	|	NAME 	{			einfo(_("%P%F: unrecognised keyword in MRI style script '%s'\n"),$1);			}	|	LIST  	{			config.map_filename = "-";			}        |       ORDER ordernamelist	|       ENDWORD         |       PUBLIC NAME '=' exp 			{ mri_public($2, $4); }        |       PUBLIC NAME ',' exp 			{ mri_public($2, $4); }        |       PUBLIC NAME  exp  			{ mri_public($2, $3); }	| 	FORMAT NAME			{ mri_format($2); }	|	SECT NAME ',' exp			{ mri_output_section($2, $4);}	|	SECT NAME  exp			{ mri_output_section($2, $3);}	|	SECT NAME '=' exp			{ mri_output_section($2, $4);}	|	ALIGN_K NAME '=' exp			{ mri_align($2,$4); }	|	ALIGN_K NAME ',' exp			{ mri_align($2,$4); }	|	ALIGNMOD NAME '=' exp			{ mri_alignmod($2,$4); }	|	ALIGNMOD NAME ',' exp			{ mri_alignmod($2,$4); }	|	ABSOLUTE mri_abs_name_list	|	LOAD	 mri_load_name_list	|       NAMEWORD NAME 			{ mri_name($2); }   	|	ALIAS NAME ',' NAME			{ mri_alias($2,$4,0);}	|	ALIAS NAME ',' INT			{ mri_alias($2,0,(int) $4);}	|	BASE     exp			{ mri_base($2); }        |       TRUNCATE INT		{  mri_truncate((unsigned int) $2); }	|	CASE casesymlist	|	EXTERN extern_name_list	|	INCLUDE filename		{ ldfile_open_command_file ($2); } mri_script_lines END	|	START NAME		{ lang_add_entry ($2, false); }        |	;ordernamelist:	      ordernamelist ',' NAME         { mri_order($3); }	|     ordernamelist  NAME         { mri_order($2); }      	|	;mri_load_name_list:		NAME			{ mri_load($1); }	|	mri_load_name_list ',' NAME { mri_load($3); }	;mri_abs_name_list: 		NAME 			{ mri_only_load($1); }	|	mri_abs_name_list ','  NAME 			{ mri_only_load($3); }	;casesymlist:	  /* empty */ { $$ = NULL; }	| NAME	| casesymlist ',' NAME	;extern_name_list:	  NAME			{ ldlang_add_undef ($1); }	| extern_name_list NAME			{ ldlang_add_undef ($2); }	| extern_name_list ',' NAME			{ ldlang_add_undef ($3); }	;script_file:	{	 ldlex_both();	}       ifile_list	{	ldlex_popstate();	}        ;ifile_list:       ifile_list ifile_p1        |	;ifile_p1:		memory	|	sections	|	phdrs	|	startup	|	high_level_library	|	low_level_library	|	floating_point_support	|	statement_anywhere	|	version        |	 ';'	|	TARGET_K '(' NAME ')'		{ lang_add_target($3); }	|	SEARCH_DIR '(' filename ')'		{ ldfile_add_library_path ($3, false); }	|	OUTPUT '(' filename ')'		{ lang_add_output($3, 1); }        |	OUTPUT_FORMAT '(' NAME ')'		  { lang_add_output_format ($3, (char *) NULL,					    (char *) NULL, 1); }	|	OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'		  { lang_add_output_format ($3, $5, $7, 1); }        |	OUTPUT_ARCH '(' NAME ')'		  { ldfile_set_output_arch($3); }	|	FORCE_COMMON_ALLOCATION		{ command_line.force_common_definition = true ; }	|	INPUT '(' input_list ')'	|	GROUP		  { lang_enter_group (); }		    '(' input_list ')'		  { lang_leave_group (); }     	|	MAP '(' filename ')'		{ lang_add_map($3); }	|	INCLUDE filename 		{ ldfile_open_command_file($2); } ifile_list END	|	NOCROSSREFS '(' nocrossref_list ')'		{		  lang_add_nocrossref ($3);		}	|	EXTERN '(' extern_name_list ')'	;input_list:		NAME		{ lang_add_input_file($1,lang_input_file_is_search_file_enum,				 (char *)NULL); }	|	input_list ',' NAME		{ lang_add_input_file($3,lang_input_file_is_search_file_enum,				 (char *)NULL); }	|	input_list 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_list ',' LNAME		{ lang_add_input_file($3,lang_input_file_is_l_enum,				 (char *)NULL); }	|	input_list LNAME		{ lang_add_input_file($2,lang_input_file_is_l_enum,				 (char *)NULL); }	;sections:		SECTIONS '{' sec_or_group_p1 '}'	;sec_or_group_p1:		sec_or_group_p1 section	|	sec_or_group_p1 statement_anywhere	|	;statement_anywhere:		ENTRY '(' NAME ')'		{ lang_add_entry ($3, false); }	|	assignment end	;/* The '*' and '?' cases are there because the lexer returns them as   separate tokens rather than as NAME.  */wildcard_name:		NAME			{			  $$ = $1;			}	|	'*'			{			  $$ = "*";			}	|	'?'			{			  $$ = "?";			}	;wildcard_spec:		wildcard_name			{			  $$.name = $1;			  $$.sorted = false;			  $$.exclude_name_list = NULL;			}	| 	EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name			{			  $$.name = $5;			  $$.sorted = false;			  $$.exclude_name_list = $3;			}	|	SORT '(' wildcard_name ')'			{			  $$.name = $3;			  $$.sorted = true;			  $$.exclude_name_list = NULL;			}	|	SORT '(' EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name ')'			{			  $$.name = $7;			  $$.sorted = true;			  $$.exclude_name_list = $5;			}	;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;			}	;file_NAME_list:		wildcard_spec			{			  lang_add_wild ($1.name, $1.sorted,					 current_file.name,					 current_file.sorted,					 ldgram_had_keep, $1.exclude_name_list);			}	|	file_NAME_list opt_comma wildcard_spec			{			  lang_add_wild ($3.name, $3.sorted,					 current_file.name,					 current_file.sorted,					 ldgram_had_keep, $3.exclude_name_list);			}	;input_section_spec_no_keep:		NAME			{			  lang_add_wild (NULL, false, $1, false,					 ldgram_had_keep, NULL);			}        |	'['			{			  current_file.name = NULL;			  current_file.sorted = false;			}		file_NAME_list ']'	|	wildcard_spec			{			  current_file = $1;			  /* '*' matches any file name.  */			  if (strcmp (current_file.name, "*") == 0)			    current_file.name = NULL;			}		'(' file_NAME_list ')'	;input_section_spec:		input_section_spec_no_keep	|	KEEP '('			{ ldgram_had_keep = true; }		input_section_spec_no_keep ')'			{ ldgram_had_keep = false; }	;statement:	  	assignment end	|	CREATE_OBJECT_SYMBOLS		{ 		lang_add_attribute(lang_object_symbols_statement_enum); 	      	}        |	';'        |	CONSTRUCTORS		{ 				  lang_add_attribute(lang_constructors_statement_enum); 		}	| SORT '(' CONSTRUCTORS ')'		{		  constructors_sorted = true;		  lang_add_attribute (lang_constructors_statement_enum);		}	| input_section_spec        | length '(' mustbe_exp ')'        	        {			lang_add_data((int) $1,$3);			}  	| FILL '(' mustbe_exp ')'			{			  lang_add_fill			    (exp_get_value_int($3,					       0,					       "fill value",					       lang_first_phase_enum));			}	;statement_list:		statement_list statement  	|  	statement	;  statement_list_opt:		/* empty */	|	statement_list	;length:		QUAD			{ $$ = $1; }	|	SQUAD			{ $$ = $1; }	|	LONG			{ $$ = $1; }	| 	SHORT			{ $$ = $1; }	|	BYTE			{ $$ = $1; }	;fill_opt:          '=' mustbe_exp		{		  $$ =	 exp_get_value_int($2,					   0,					   "fill value",					   lang_first_phase_enum);		}	| 	{ $$ = 0; }	;		assign_op:		PLUSEQ			{ $$ = '+'; }	|	MINUSEQ			{ $$ = '-'; }	| 	MULTEQ			{ $$ = '*'; }	| 	DIVEQ			{ $$ = '/'; }	| 	LSHIFTEQ			{ $$ = LSHIFT; }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -