1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%{
2441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Parser for linker scripts.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc.
4cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
6441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
9cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
10441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
26cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifdef HAVE_CONFIG_H
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# include <config.h>
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <assert.h>
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <error.h>
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libintl.h>
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdint.h>
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdlib.h>
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <string.h>
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <system.h>
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <ld.h>
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* The error handler.  */
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void yyerror (const char *s);
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Some helper functions we need to construct the data structures
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   describing information from the file.  */
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct expression *new_expr (int tag);
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct input_section_name *new_input_section_name (const char *name,
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project							  bool sort_flag);
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct input_rule *new_input_rule (int tag);
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct output_rule *new_output_rule (int tag);
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct assignment *new_assignment (const char *variable,
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  struct expression *expression,
56441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  bool provide_flag);
57441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void new_segment (int mode, struct output_rule *output_rule);
58441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct filename_list *new_filename_listelem (const char *string);
59441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void add_inputfiles (struct filename_list *fnames);
60441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct id_list *new_id_listelem (const char *str);
61cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng static struct filename_list *mark_as_needed (struct filename_list *listp);
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct version *new_version (struct id_list *local,
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    struct id_list *global);
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct version *merge_versions (struct version *one,
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				       struct version *two);
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void add_versions (struct version *versions);
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int yylex (void);
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%}
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%union {
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  uintmax_t num;
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  enum expression_tag op;
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *str;
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct expression *expr;
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_section_name *sectionname;
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct filemask_section_name *filemask_section_name;
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_rule *input_rule;
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_rule *output_rule;
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct assignment *assignment;
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct filename_list *filename_list;
82441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct version *version;
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *id_list;
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kADD_OP
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kALIGN
88cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng%token kAS_NEEDED
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kENTRY
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kEXCLUDE_FILE
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token <str> kFILENAME
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kGLOBAL
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kGROUP
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token <str> kID
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kINPUT
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kINTERP
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kKEEP
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kLOCAL
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token <num> kMODE
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kMUL_OP
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token <num> kNUM
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kOUTPUT_FORMAT
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kPAGESIZE
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kPROVIDE
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kSEARCH_DIR
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kSEGMENT
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kSIZEOF_HEADERS
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kSORT
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kVERSION
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%token kVERSION_SCRIPT
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%left '|'
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%left '&'
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%left ADD_OP
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%left MUL_OP '*'
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <op> kADD_OP
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <op> kMUL_OP
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <str> filename_id
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <str> filename_id_star
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <str> exclude_opt
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <expr> expr
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <sectionname> sort_opt_name
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <filemask_section_name> sectionname
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <input_rule> inputsection
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <input_rule> inputsections
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <output_rule> outputsection
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <output_rule> outputsections
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <assignment> assignment
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <filename_list> filename_id_list
131cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng%type <filename_list> filename_id_listelem
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <version> versionlist
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <version> version
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <version> version_stmt_list
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <version> version_stmt
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%type <id_list> filename_id_star_list
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%expect 16
139441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%%
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectscript_or_version:
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  file
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kVERSION_SCRIPT versionlist
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { add_versions ($2); }
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectfile:		  file content
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| content
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectcontent:	  kENTRY '(' kID ')' ';'
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      if (likely (ld_state.entry == NULL))
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			ld_state.entry = $3;
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kSEARCH_DIR '(' filename_id ')' ';'
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      ld_new_searchdir ($3);
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kPAGESIZE '(' kNUM ')' ';'
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      if (likely (ld_state.pagesize == 0))
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			ld_state.pagesize = $3;
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kINTERP '(' filename_id ')' ';'
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
168cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      if (likely (ld_state.interp == NULL)
169cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  && ld_state.file_type != dso_file_type)
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			ld_state.interp = $3;
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kSEGMENT kMODE '{' outputsections '}'
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      new_segment ($2, $4);
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kSEGMENT error '{' outputsections '}'
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      fputs_unlocked (gettext ("mode for segment invalid\n"),
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      stderr);
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      new_segment (0, $4);
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kGROUP '(' filename_id_list ')'
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      /* First little optimization.  If there is only one
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			 file in the group don't do anything.  */
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      if ($3 != $3->next)
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			{
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  $3->next->group_start = 1;
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  $3->group_end = 1;
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			}
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      add_inputfiles ($3);
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kINPUT '(' filename_id_list ')'
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { add_inputfiles ($3); }
195cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		| kAS_NEEDED '(' filename_id_list ')'
196cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    { add_inputfiles (mark_as_needed ($3)); }
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kVERSION '{' versionlist '}'
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { add_versions ($3); }
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kOUTPUT_FORMAT '(' filename_id ')'
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { /* XXX TODO */ }
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectoutputsections:	  outputsections outputsection
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $2->next = $1->next;
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $1->next = $2;
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| outputsection
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectoutputsection:	  assignment ';'
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_output_rule (output_assignment);
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.assignment = $1;
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kID '{' inputsections '}'
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_output_rule (output_section);
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.name = $1;
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input = $3->next;
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      if (ld_state.strip == strip_debug
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  && ebl_debugscn_p (ld_state.ebl, $1))
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			$$->val.section.ignored = true;
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      else
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			$$->val.section.ignored = false;
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->next = NULL;
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kID ';'
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      /* This is a short cut for "ID { *(ID) }".  */
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_output_rule (output_section);
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.name = $1;
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input = new_input_rule (input_section);
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->next = NULL;
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->val.section =
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			(struct filemask_section_name *)
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  obstack_alloc (&ld_state.smem,
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					 sizeof (struct filemask_section_name));
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->val.section->filemask = NULL;
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->val.section->excludemask = NULL;
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->val.section->section_name =
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			new_input_section_name ($1, false);
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section.input->val.section->keep_flag = false;
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      if (ld_state.strip == strip_debug
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			  && ebl_debugscn_p (ld_state.ebl, $1))
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			$$->val.section.ignored = true;
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      else
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			$$->val.section.ignored = false;
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectassignment:	  kID '=' expr
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_assignment ($1, $3, false); }
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kPROVIDE '(' kID '=' expr ')'
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_assignment ($3, $5, true); }
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectinputsections:	  inputsections inputsection
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $2->next = $1->next;
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $1->next = $2;
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| inputsection
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectinputsection:	  sectionname
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_input_rule (input_section);
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section = $1;
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kKEEP '(' sectionname ')'
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->keep_flag = true;
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_input_rule (input_section);
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.section = $3;
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| assignment ';'
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_input_rule (input_assignment);
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.assignment = $1;
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectsectionname:	  filename_id_star '(' exclude_opt sort_opt_name ')'
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = (struct filemask_section_name *)
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project			obstack_alloc (&ld_state.smem, sizeof (*$$));
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->filemask = $1;
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->excludemask = $3;
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->section_name = $4;
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->keep_flag = false;
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectsort_opt_name:	  kID
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_input_section_name ($1, false); }
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kSORT '(' kID ')'
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_input_section_name ($3, true); }
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectexclude_opt:	  kEXCLUDE_FILE '(' filename_id ')'
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $3; }
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		|
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = NULL; }
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectexpr:		  kALIGN '(' expr ')'
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_align);
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.child = $3;
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| '(' expr ')'
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $2; }
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| expr '*' expr
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_mult);
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.left = $1;
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.right = $3;
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| expr kMUL_OP expr
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr ($2);
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.left = $1;
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.right = $3;
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| expr kADD_OP expr
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr ($2);
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.left = $1;
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.right = $3;
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| expr '&' expr
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_and);
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.left = $1;
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.right = $3;
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| expr '|' expr
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_or);
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.left = $1;
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.binary.right = $3;
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kNUM
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_num);
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.num = $1;
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kID
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = new_expr (exp_id);
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$->val.str = $1;
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kSIZEOF_HEADERS
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_expr (exp_sizeof_headers); }
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kPAGESIZE
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_expr (exp_pagesize); }
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
362441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
363cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfilename_id_list: filename_id_list comma_opt filename_id_listelem
364441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
365cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      $3->next = $1->next;
366cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      $$ = $1->next = $3;
367441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
368cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		| filename_id_listelem
369cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    { $$ = $1; }
370441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
371441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
372441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectcomma_opt:	  ','
373441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		|
374441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
375441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
376cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengfilename_id_listelem: kGROUP '(' filename_id_list ')'
377cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    {
378cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      /* First little optimization.  If there is only one
379cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			 file in the group don't do anything.  */
380cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      if ($3 != $3->next)
381cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			{
382cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  $3->next->group_start = 1;
383cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			  $3->group_end = 1;
384cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			}
385cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		      $$ = $3;
386cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    }
387cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		| kAS_NEEDED '(' filename_id_list ')'
388cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    { $$ = mark_as_needed ($3); }
389cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		| filename_id
390cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		    { $$ = new_filename_listelem ($1); }
391cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng		;
392cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
393cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
394441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectversionlist:	  versionlist version
395441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
396441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $2->next = $1->next;
397441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $1->next = $2;
398441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
399441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| version
400441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
401441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
402441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
403441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectversion:	  '{' version_stmt_list '}' ';'
404441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
405441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $2->versionname = "";
406441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $2->parentname = NULL;
407441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $2;
408441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
409441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| filename_id '{' version_stmt_list '}' ';'
410441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
411441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->versionname = $1;
412441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->parentname = NULL;
413441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $3;
414441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
415441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| filename_id '{' version_stmt_list '}' filename_id ';'
416441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
417441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->versionname = $1;
418441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $3->parentname = $5;
419441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $3;
420441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
421441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
422441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
423441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectversion_stmt_list:
424441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  version_stmt_list version_stmt
425441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = merge_versions ($1, $2); }
426441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| version_stmt
427441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
428441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
429441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
430441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectversion_stmt:	  kGLOBAL filename_id_star_list
431441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_version (NULL, $2); }
432441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kLOCAL filename_id_star_list
433441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_version ($2, NULL); }
434441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
435441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
436441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectfilename_id_star_list:
437441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  filename_id_star_list filename_id_star ';'
438441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    {
439441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      struct id_list *newp = new_id_listelem ($2);
440441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      newp->next = $1->next;
441441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		      $$ = $1->next = newp;
442441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    }
443441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| filename_id_star ';'
444441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = new_id_listelem ($1); }
445441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
446441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
447441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectfilename_id:	  kFILENAME
448441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
449441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| kID
450441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
451441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
452441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
453441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectfilename_id_star: filename_id
454441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = $1; }
455441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		| '*'
456441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    { $$ = NULL; }
457441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		;
458441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
459441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%%
460441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
461441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
462441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectyyerror (const char *s)
463441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
464441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  error (0, 0, (ld_scan_version_script
465441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		? gettext ("while reading version script '%s': %s at line %d")
466441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		: gettext ("while reading linker script '%s': %s at line %d")),
467441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 ldin_fname, gettext (s), ldlineno);
468441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
469441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
470441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
471441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct expression *
472441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_expr (int tag)
473441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
474441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct expression *newp = (struct expression *)
475441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    obstack_alloc (&ld_state.smem, sizeof (*newp));
476441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
477441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->tag = tag;
478441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
479441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
480441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
481441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
482441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct input_section_name *
483441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_input_section_name (const char *name, bool sort_flag)
484441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
485441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_section_name *newp = (struct input_section_name *)
486441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    obstack_alloc (&ld_state.smem, sizeof (*newp));
487441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
488441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->name = name;
489441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->sort_flag = sort_flag;
490441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
491441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
492441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
493441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
494441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct input_rule *
495441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_input_rule (int tag)
496441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
497441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct input_rule *newp = (struct input_rule *)
498441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    obstack_alloc (&ld_state.smem, sizeof (*newp));
499441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
500441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->tag = tag;
501441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
502441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
503441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
504441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
505441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
506441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct output_rule *
507441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_output_rule (int tag)
508441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
509441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_rule *newp = (struct output_rule *)
510441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    memset (obstack_alloc (&ld_state.smem, sizeof (*newp)),
511441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    '\0', sizeof (*newp));
512441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
513441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->tag = tag;
514441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
515441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
516441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
517441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
518441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
519441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct assignment *
520441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_assignment (const char *variable, struct expression *expression,
521441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		bool provide_flag)
522441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
523441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct assignment *newp = (struct assignment *)
524441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    obstack_alloc (&ld_state.smem, sizeof (*newp));
525441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
526441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->variable = variable;
527441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->expression = expression;
528441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->sym = NULL;
529441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->provide_flag = provide_flag;
530441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
531441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Insert the symbol into a hash table.  We will later have to matc*/
532441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
533441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
534441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
535441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
536441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
537441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_segment (int mode, struct output_rule *output_rule)
538441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
539441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct output_segment *newp;
540441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
541441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp
542441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    = (struct output_segment *) obstack_alloc (&ld_state.smem, sizeof (*newp));
543441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->mode = mode;
544441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
545441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
546441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->output_rules = output_rule->next;
547441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  output_rule->next = NULL;
548441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
549441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Enqueue the output segment description.  */
550441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (ld_state.output_segments == NULL)
551441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    ld_state.output_segments = newp;
552441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
553441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
554441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      newp->next = ld_state.output_segments->next;
555441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      ld_state.output_segments = ld_state.output_segments->next = newp;
556441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
557441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
558441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* If the output file should be stripped of all symbol set the flag
559441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project     in the structures of all output sections.  */
560441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (mode == 0 && ld_state.strip == strip_all)
561441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
562441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct output_rule *runp;
563441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
564441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      for (runp = newp->output_rules; runp != NULL; runp = runp->next)
565441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	if (runp->tag == output_section)
566441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  runp->val.section.ignored = true;
567441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
568441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
569441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
570441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
571441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct filename_list *
572441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_filename_listelem (const char *string)
573441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
574441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct filename_list *newp;
575441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
576441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* We use calloc and not the obstack since this object can be freed soon.  */
577441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp = (struct filename_list *) xcalloc (1, sizeof (*newp));
578441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->name = string;
579441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
580441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
581441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
582441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
583441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
584cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengstatic struct filename_list *
585cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Chengmark_as_needed (struct filename_list *listp)
586cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng{
587cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  struct filename_list *runp = listp;
588cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  do
589cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    {
590cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      runp->as_needed = true;
591cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng      runp = runp->next;
592cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng    }
593cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  while (runp != listp);
594cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
595cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng  return listp;
596cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng}
597cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
598cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
599441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
600441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectadd_inputfiles (struct filename_list *fnames)
601441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
602441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  assert (fnames != NULL);
603441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
604441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (ld_state.srcfiles == NULL)
605441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    ld_state.srcfiles = fnames;
606441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
607441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
608441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct filename_list *first = ld_state.srcfiles->next;
609441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
610441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      ld_state.srcfiles->next = fnames->next;
611441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      fnames->next = first;
612441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      ld_state.srcfiles->next = fnames;
613441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
614441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
615441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
616441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
617441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic _Bool
618441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectspecial_char_p (const char *str)
619441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
620441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (*str != '\0')
621441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
622441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (__builtin_expect (*str == '*', 0)
623441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || __builtin_expect (*str == '?', 0)
624441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  || __builtin_expect (*str == '[', 0))
625441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	return true;
626441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
627441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      ++str;
628441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
629441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
630441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return false;
631441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
632441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
633441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
634441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct id_list *
635441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_id_listelem (const char *str)
636441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
637441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *newp;
638441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
639441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp = (struct id_list *) obstack_alloc (&ld_state.smem, sizeof (*newp));
640441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (str == NULL)
641441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    newp->u.id_type = id_all;
642441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else if (__builtin_expect (special_char_p (str), false))
643441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    newp->u.id_type = id_wild;
644441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
645441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    newp->u.id_type = id_str;
646441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->id = str;
647441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
648441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
649441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
650441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
651441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
652441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
653441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct version *
654441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectnew_version (struct id_list *local, struct id_list *global)
655441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
656441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct version *newp;
657441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
658441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp = (struct version *) obstack_alloc (&ld_state.smem, sizeof (*newp));
659441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->next = newp;
660441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->local_names = local;
661441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->global_names = global;
662441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->versionname = NULL;
663441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  newp->parentname = NULL;
664441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
665441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return newp;
666441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
667441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
668441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
669441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic struct version *
670441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectmerge_versions (struct version *one, struct version *two)
671441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
672441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  assert (two->local_names == NULL || two->global_names == NULL);
673441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
674441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (two->local_names != NULL)
675441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
676441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (one->local_names == NULL)
677441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	one->local_names = two->local_names;
678441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else
679441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
680441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  two->local_names->next = one->local_names->next;
681441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  one->local_names = one->local_names->next = two->local_names;
682441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
683441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
684441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
685441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
686441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (one->global_names == NULL)
687441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	one->global_names = two->global_names;
688441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      else
689441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
690441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  two->global_names->next = one->global_names->next;
691441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  one->global_names = one->global_names->next = two->global_names;
692441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
693441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
694441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
695441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return one;
696441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
697441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
698441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
699441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
700441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectadd_id_list (const char *versionname, struct id_list *runp, _Bool local)
701441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
702441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct id_list *lastp = runp;
703441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
704441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (runp == NULL)
705441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    /* Nothing to do.  */
706441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    return;
707441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
708441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Convert into a simple single-linked list.  */
709441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  runp = runp->next;
710441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  assert (runp != NULL);
711441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  lastp->next = NULL;
712441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
713441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  do
714441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    if (runp->u.id_type == id_str)
715441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {
716441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	struct id_list *curp;
717441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	struct id_list *defp;
718441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	unsigned long int hval = elf_hash (runp->id);
719441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
720441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	curp = runp;
721441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	runp = runp->next;
722441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
723441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	defp = ld_version_str_tab_find (&ld_state.version_str_tab, hval, curp);
724441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	if (defp != NULL)
725441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  {
726441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    /* There is already a version definition for this symbol.  */
727441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    while (strcmp (defp->u.s.versionname, versionname) != 0)
728441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      {
729441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		if (defp->next == NULL)
730441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  {
731441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    /* No version like this so far.  */
732441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    defp->next = curp;
733441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    curp->u.s.local = local;
734441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    curp->u.s.versionname = versionname;
735441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    curp->next = NULL;
736441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    defp = NULL;
737441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		    break;
738441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		  }
739441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
740441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		defp = defp->next;
741441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      }
742441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
743441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    if (defp != NULL && defp->u.s.local != local)
744441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      error (EXIT_FAILURE, 0, versionname[0] == '\0'
745441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		     ? gettext ("\
746441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectsymbol '%s' in declared both local and global for unnamed version")
747441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		     : gettext ("\
748441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectsymbol '%s' in declared both local and global for version '%s'"),
749441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		     runp->id, versionname);
750441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  }
751441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	else
752441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  {
753441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    /* This is the first version definition for this symbol.  */
754441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    ld_version_str_tab_insert (&ld_state.version_str_tab, hval, curp);
755441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
756441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    curp->u.s.local = local;
757441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    curp->u.s.versionname = versionname;
758441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    curp->next = NULL;
759441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  }
760441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }
761441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    else if (runp->u.id_type == id_all)
762441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {
763441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	if (local)
764441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  {
765441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    if (ld_state.default_bind_global)
766441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      error (EXIT_FAILURE, 0,
767441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		     gettext ("default visibility set as local and global"));
768441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    ld_state.default_bind_local = true;
769441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  }
770441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	else
771441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  {
772441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    if (ld_state.default_bind_local)
773441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	      error (EXIT_FAILURE, 0,
774441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		     gettext ("default visibility set as local and global"));
775441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    ld_state.default_bind_global = true;
776441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  }
777441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
778441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	runp = runp->next;
779441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }
780441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    else
781441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      {
782441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	assert (runp->u.id_type == id_wild);
783441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	/* XXX TBI */
784441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	abort ();
785441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      }
786441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (runp != NULL);
787441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
788441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
789441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
790441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
791441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectadd_versions (struct version *versions)
792441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
793441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  struct version *lastp = versions;
794441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
795441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (versions == NULL)
796441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    return;
797441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
798441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* Convert into a simple single-linked list.  */
799441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  versions = versions->next;
800441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  assert (versions != NULL);
801441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  lastp->next = NULL;
802441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
803441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  do
804441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
805441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      struct version *oldp;
806441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
807441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      add_id_list (versions->versionname, versions->local_names, true);
808441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      add_id_list (versions->versionname, versions->global_names, false);
809441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
810441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      oldp = versions;
811441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      versions = versions->next;
812441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
813441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (versions != NULL);
814441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
815