1 %{ /* defparse.y - parser for .def files */ 2 3 /* Copyright (C) 1995-2014 Free Software Foundation, Inc. 4 5 This file is part of GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 #include "sysdep.h" 23 #include "bfd.h" 24 #include "libiberty.h" 25 #include "dlltool.h" 26 %} 27 28 %union { 29 char *id; 30 const char *id_const; 31 int number; 32 }; 33 34 %token NAME LIBRARY DESCRIPTION STACKSIZE HEAPSIZE CODE DATA 35 %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANT 36 %token READ WRITE EXECUTE SHARED NONSHARED NONAME PRIVATE 37 %token SINGLE MULTIPLE INITINSTANCE INITGLOBAL TERMINSTANCE TERMGLOBAL 38 %token EQUAL 39 %token <id> ID 40 %token <number> NUMBER 41 %type <number> opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE 42 %type <number> attr attr_list opt_number 43 %type <id> opt_name opt_name2 opt_equal_name opt_import_name 44 %type <id_const> keyword_as_name 45 46 %% 47 48 start: start command 49 | command 50 ; 51 52 command: 53 NAME opt_name opt_base { def_name ($2, $3); } 54 | LIBRARY opt_name opt_base option_list { def_library ($2, $3); } 55 | EXPORTS explist 56 | DESCRIPTION ID { def_description ($2);} 57 | STACKSIZE NUMBER opt_number { def_stacksize ($2, $3);} 58 | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} 59 | CODE attr_list { def_code ($2);} 60 | DATA attr_list { def_data ($2);} 61 | SECTIONS seclist 62 | IMPORTS implist 63 | VERSIONK NUMBER { def_version ($2,0);} 64 | VERSIONK NUMBER '.' NUMBER { def_version ($2,$4);} 65 ; 66 67 68 explist: 69 /* EMPTY */ 70 | explist expline 71 ; 72 73 expline: 74 ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE 75 opt_import_name 76 { def_exports ($1, $2, $3, $4, $5, $6, $7, $8);} 77 ; 78 implist: 79 implist impline 80 | impline 81 ; 82 83 impline: 84 ID '=' ID '.' ID '.' ID opt_import_name 85 { def_import ($1,$3,$5,$7, 0, $8); } 86 | ID '=' ID '.' ID '.' NUMBER opt_import_name 87 { def_import ($1,$3,$5, 0,$7, $8); } 88 | ID '=' ID '.' ID opt_import_name 89 { def_import ($1,$3, 0,$5, 0, $6); } 90 | ID '=' ID '.' NUMBER opt_import_name 91 { def_import ($1,$3, 0, 0,$5, $6); } 92 | ID '.' ID '.' ID opt_import_name 93 { def_import ( 0,$1,$3,$5, 0, $6); } 94 | ID '.' ID '.' NUMBER opt_import_name 95 { def_import ( 0,$1,$3, 0,$5, $6); } 96 | ID '.' ID opt_import_name 97 { def_import ( 0,$1, 0,$3, 0, $4); } 98 | ID '.' NUMBER opt_import_name 99 { def_import ( 0,$1, 0, 0,$3, $4); } 100 ; 101 102 seclist: 103 seclist secline 104 | secline 105 ; 106 107 secline: 108 ID attr_list { def_section ($1,$2);} 109 ; 110 111 attr_list: 112 attr_list opt_comma attr 113 | attr 114 ; 115 116 opt_comma: 117 ',' 118 | 119 ; 120 opt_number: ',' NUMBER { $$=$2;} 121 | { $$=-1;} 122 ; 123 124 attr: 125 READ { $$ = 1; } 126 | WRITE { $$ = 2; } 127 | EXECUTE { $$ = 4; } 128 | SHARED { $$ = 8; } 129 | NONSHARED { $$ = 0; } 130 | SINGLE { $$ = 0; } 131 | MULTIPLE { $$ = 0; } 132 ; 133 134 opt_CONSTANT: 135 CONSTANT {$$=1;} 136 | {$$=0;} 137 ; 138 139 opt_NONAME: 140 NONAME {$$=1;} 141 | {$$=0;} 142 ; 143 144 opt_DATA: 145 DATA { $$ = 1; } 146 | { $$ = 0; } 147 ; 148 149 opt_PRIVATE: 150 PRIVATE { $$ = 1; } 151 | { $$ = 0; } 152 ; 153 154 keyword_as_name: NAME { $$ = "NAME"; } 155 /* Disabled LIBRARY keyword for a quirk in libtool. It places LIBRARY 156 command after EXPORTS list, which is illegal by specification. 157 See PR binutils/13710 158 | LIBRARY { $$ = "LIBRARY"; } */ 159 | DESCRIPTION { $$ = "DESCRIPTION"; } 160 | STACKSIZE { $$ = "STACKSIZE"; } 161 | HEAPSIZE { $$ = "HEAPSIZE"; } 162 | CODE { $$ = "CODE"; } 163 | DATA { $$ = "DATA"; } 164 | SECTIONS { $$ = "SECTIONS"; } 165 | EXPORTS { $$ = "EXPORTS"; } 166 | IMPORTS { $$ = "IMPORTS"; } 167 | VERSIONK { $$ = "VERSION"; } 168 | BASE { $$ = "BASE"; } 169 | CONSTANT { $$ = "CONSTANT"; } 170 | NONAME { $$ = "NONAME"; } 171 | PRIVATE { $$ = "PRIVATE"; } 172 | READ { $$ = "READ"; } 173 | WRITE { $$ = "WRITE"; } 174 | EXECUTE { $$ = "EXECUTE"; } 175 | SHARED { $$ = "SHARED"; } 176 | NONSHARED { $$ = "NONSHARED"; } 177 | SINGLE { $$ = "SINGLE"; } 178 | MULTIPLE { $$ = "MULTIPLE"; } 179 | INITINSTANCE { $$ = "INITINSTANCE"; } 180 | INITGLOBAL { $$ = "INITGLOBAL"; } 181 | TERMINSTANCE { $$ = "TERMINSTANCE"; } 182 | TERMGLOBAL { $$ = "TERMGLOBAL"; } 183 ; 184 185 opt_name2: ID { $$ = $1; } 186 | '.' keyword_as_name 187 { 188 char *name = xmalloc (strlen ($2) + 2); 189 sprintf (name, ".%s", $2); 190 $$ = name; 191 } 192 | '.' opt_name2 193 { 194 char *name = xmalloc (strlen ($2) + 2); 195 sprintf (name, ".%s", $2); 196 $$ = name; 197 } 198 | keyword_as_name '.' opt_name2 199 { 200 char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); 201 sprintf (name, "%s.%s", $1, $3); 202 $$ = name; 203 } 204 | ID '.' opt_name2 205 { 206 char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); 207 sprintf (name, "%s.%s", $1, $3); 208 $$ = name; 209 } 210 ; 211 opt_name: opt_name2 { $$ =$1; } 212 | { $$=""; } 213 ; 214 215 opt_ordinal: 216 '@' NUMBER { $$=$2;} 217 | { $$=-1;} 218 ; 219 220 opt_import_name: 221 EQUAL opt_name2 { $$ = $2; } 222 | { $$ = 0; } 223 ; 224 225 opt_equal_name: 226 '=' opt_name2 { $$ = $2; } 227 | { $$ = 0; } 228 ; 229 230 opt_base: BASE '=' NUMBER { $$= $3;} 231 | { $$=-1;} 232 ; 233 234 option_list: 235 /* empty */ 236 | option_list opt_comma option 237 ; 238 239 option: 240 INITINSTANCE 241 | INITGLOBAL 242 | TERMINSTANCE 243 | TERMGLOBAL 244 ; 245