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