ldgram.y 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511
  1. /* A YACC grammar to parse a superset of the AT&T linker scripting language.
  2. Copyright (C) 1991-2022 Free Software Foundation, Inc.
  3. Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com).
  4. This file is part of the GNU Binutils.
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  16. MA 02110-1301, USA. */
  17. %{
  18. /*
  19. */
  20. #define DONTDECLARE_MALLOC
  21. #include "sysdep.h"
  22. #include "bfd.h"
  23. #include "bfdlink.h"
  24. #include "ctf-api.h"
  25. #include "ld.h"
  26. #include "ldexp.h"
  27. #include "ldver.h"
  28. #include "ldlang.h"
  29. #include "ldfile.h"
  30. #include "ldemul.h"
  31. #include "ldmisc.h"
  32. #include "ldmain.h"
  33. #include "mri.h"
  34. #include "ldctor.h"
  35. #include "ldlex.h"
  36. #ifndef YYDEBUG
  37. #define YYDEBUG 1
  38. #endif
  39. static enum section_type sectype;
  40. static etree_type *sectype_value;
  41. static lang_memory_region_type *region;
  42. static bool ldgram_had_keep = false;
  43. static char *ldgram_vers_current_lang = NULL;
  44. #define ERROR_NAME_MAX 20
  45. static char *error_names[ERROR_NAME_MAX];
  46. static int error_index;
  47. #define PUSH_ERROR(x) if (error_index < ERROR_NAME_MAX) error_names[error_index] = x; error_index++;
  48. #define POP_ERROR() error_index--;
  49. %}
  50. %union {
  51. bfd_vma integer;
  52. struct big_int
  53. {
  54. bfd_vma integer;
  55. char *str;
  56. } bigint;
  57. fill_type *fill;
  58. char *name;
  59. const char *cname;
  60. struct wildcard_spec wildcard;
  61. struct wildcard_list *wildcard_list;
  62. struct name_list *name_list;
  63. struct flag_info_list *flag_info_list;
  64. struct flag_info *flag_info;
  65. int token;
  66. union etree_union *etree;
  67. struct phdr_info
  68. {
  69. bool filehdr;
  70. bool phdrs;
  71. union etree_union *at;
  72. union etree_union *flags;
  73. } phdr;
  74. struct lang_nocrossref *nocrossref;
  75. struct lang_output_section_phdr_list *section_phdr;
  76. struct bfd_elf_version_deps *deflist;
  77. struct bfd_elf_version_expr *versyms;
  78. struct bfd_elf_version_tree *versnode;
  79. }
  80. %type <etree> exp opt_exp_with_type mustbe_exp opt_at phdr_type phdr_val
  81. %type <etree> opt_exp_without_type opt_subalign opt_align
  82. %type <fill> fill_opt fill_exp
  83. %type <name_list> exclude_name_list
  84. %type <wildcard_list> section_name_list
  85. %type <flag_info_list> sect_flag_list
  86. %type <flag_info> sect_flags
  87. %type <name> memspec_opt memspec_at_opt paren_script_name casesymlist
  88. %type <cname> wildcard_name
  89. %type <wildcard> section_name_spec filename_spec wildcard_maybe_exclude
  90. %token <bigint> INT
  91. %token <name> NAME LNAME
  92. %type <integer> length
  93. %type <phdr> phdr_qualifiers
  94. %type <nocrossref> nocrossref_list
  95. %type <section_phdr> phdr_opt
  96. %type <integer> opt_nocrossrefs
  97. %right <token> PLUSEQ MINUSEQ MULTEQ DIVEQ '=' LSHIFTEQ RSHIFTEQ ANDEQ OREQ
  98. %right <token> '?' ':'
  99. %left <token> OROR
  100. %left <token> ANDAND
  101. %left <token> '|'
  102. %left <token> '^'
  103. %left <token> '&'
  104. %left <token> EQ NE
  105. %left <token> '<' '>' LE GE
  106. %left <token> LSHIFT RSHIFT
  107. %left <token> '+' '-'
  108. %left <token> '*' '/' '%'
  109. %right UNARY
  110. %token END
  111. %left <token> '('
  112. %token <token> ALIGN_K BLOCK BIND QUAD SQUAD LONG SHORT BYTE
  113. %token SECTIONS PHDRS INSERT_K AFTER BEFORE
  114. %token DATA_SEGMENT_ALIGN DATA_SEGMENT_RELRO_END DATA_SEGMENT_END
  115. %token SORT_BY_NAME SORT_BY_ALIGNMENT SORT_NONE
  116. %token SORT_BY_INIT_PRIORITY
  117. %token '{' '}'
  118. %token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
  119. %token INHIBIT_COMMON_ALLOCATION FORCE_GROUP_ALLOCATION
  120. %token SEGMENT_START
  121. %token INCLUDE
  122. %token MEMORY
  123. %token REGION_ALIAS
  124. %token LD_FEATURE
  125. %token NOLOAD DSECT COPY INFO OVERLAY
  126. %token READONLY
  127. %token TYPE
  128. %token DEFINED TARGET_K SEARCH_DIR MAP ENTRY
  129. %token <integer> NEXT
  130. %token SIZEOF ALIGNOF ADDR LOADADDR MAX_K MIN_K
  131. %token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS NOCROSSREFS_TO
  132. %token ORIGIN FILL
  133. %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS
  134. %token ALIGNMOD AT SUBALIGN HIDDEN PROVIDE PROVIDE_HIDDEN AS_NEEDED
  135. %type <token> assign_op atype attributes_opt sect_constraint opt_align_with_input
  136. %type <name> filename
  137. %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K
  138. %token LOG2CEIL FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
  139. %token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM CASE EXTERN START
  140. %token <name> VERS_TAG VERS_IDENTIFIER
  141. %token GLOBAL LOCAL VERSIONK INPUT_VERSION_SCRIPT
  142. %token KEEP ONLY_IF_RO ONLY_IF_RW SPECIAL INPUT_SECTION_FLAGS ALIGN_WITH_INPUT
  143. %token EXCLUDE_FILE
  144. %token CONSTANT
  145. %type <versyms> vers_defns
  146. %type <versnode> vers_tag
  147. %type <deflist> verdep
  148. %token INPUT_DYNAMIC_LIST
  149. %%
  150. file:
  151. INPUT_SCRIPT script_file
  152. | INPUT_MRI_SCRIPT mri_script_file
  153. | INPUT_VERSION_SCRIPT version_script_file
  154. | INPUT_DYNAMIC_LIST dynamic_list_file
  155. | INPUT_DEFSYM defsym_expr
  156. ;
  157. filename: NAME;
  158. defsym_expr:
  159. { ldlex_expression(); }
  160. assignment
  161. { ldlex_popstate(); }
  162. ;
  163. /* SYNTAX WITHIN AN MRI SCRIPT FILE */
  164. mri_script_file:
  165. {
  166. ldlex_mri_script ();
  167. PUSH_ERROR (_("MRI style script"));
  168. }
  169. mri_script_lines
  170. {
  171. ldlex_popstate ();
  172. mri_draw_tree ();
  173. POP_ERROR ();
  174. }
  175. ;
  176. mri_script_lines:
  177. mri_script_lines mri_script_command NEWLINE
  178. |
  179. ;
  180. mri_script_command:
  181. CHIP exp
  182. | CHIP exp ',' exp
  183. | NAME {
  184. einfo(_("%F%P: unrecognised keyword in MRI style script '%s'\n"),$1);
  185. }
  186. | LIST {
  187. config.map_filename = "-";
  188. }
  189. | ORDER ordernamelist
  190. | ENDWORD
  191. | PUBLIC NAME '=' exp
  192. { mri_public($2, $4); }
  193. | PUBLIC NAME ',' exp
  194. { mri_public($2, $4); }
  195. | PUBLIC NAME exp
  196. { mri_public($2, $3); }
  197. | FORMAT NAME
  198. { mri_format($2); }
  199. | SECT NAME ',' exp
  200. { mri_output_section($2, $4);}
  201. | SECT NAME exp
  202. { mri_output_section($2, $3);}
  203. | SECT NAME '=' exp
  204. { mri_output_section($2, $4);}
  205. | ALIGN_K NAME '=' exp
  206. { mri_align($2,$4); }
  207. | ALIGN_K NAME ',' exp
  208. { mri_align($2,$4); }
  209. | ALIGNMOD NAME '=' exp
  210. { mri_alignmod($2,$4); }
  211. | ALIGNMOD NAME ',' exp
  212. { mri_alignmod($2,$4); }
  213. | ABSOLUTE mri_abs_name_list
  214. | LOAD mri_load_name_list
  215. | NAMEWORD NAME
  216. { mri_name($2); }
  217. | ALIAS NAME ',' NAME
  218. { mri_alias($2,$4,0);}
  219. | ALIAS NAME ',' INT
  220. { mri_alias ($2, 0, (int) $4.integer); }
  221. | BASE exp
  222. { mri_base($2); }
  223. | TRUNCATE INT
  224. { mri_truncate ((unsigned int) $2.integer); }
  225. | CASE casesymlist
  226. | EXTERN extern_name_list
  227. | INCLUDE filename
  228. { ldfile_open_command_file ($2); }
  229. mri_script_lines END
  230. | START NAME
  231. { lang_add_entry ($2, false); }
  232. |
  233. ;
  234. ordernamelist:
  235. ordernamelist ',' NAME { mri_order($3); }
  236. | ordernamelist NAME { mri_order($2); }
  237. |
  238. ;
  239. mri_load_name_list:
  240. NAME
  241. { mri_load($1); }
  242. | mri_load_name_list ',' NAME { mri_load($3); }
  243. ;
  244. mri_abs_name_list:
  245. NAME
  246. { mri_only_load($1); }
  247. | mri_abs_name_list ',' NAME
  248. { mri_only_load($3); }
  249. ;
  250. casesymlist:
  251. /* empty */ { $$ = NULL; }
  252. | NAME
  253. | casesymlist ',' NAME
  254. ;
  255. extern_name_list:
  256. NAME
  257. { ldlang_add_undef ($1, false); }
  258. | extern_name_list NAME
  259. { ldlang_add_undef ($2, false); }
  260. | extern_name_list ',' NAME
  261. { ldlang_add_undef ($3, false); }
  262. ;
  263. script_file:
  264. { ldlex_script (); }
  265. ifile_list
  266. { ldlex_popstate (); }
  267. ;
  268. ifile_list:
  269. ifile_list ifile_p1
  270. |
  271. ;
  272. ifile_p1:
  273. memory
  274. | sections
  275. | phdrs
  276. | startup
  277. | high_level_library
  278. | low_level_library
  279. | floating_point_support
  280. | statement_anywhere
  281. | version
  282. | ';'
  283. | TARGET_K '(' NAME ')'
  284. { lang_add_target($3); }
  285. | SEARCH_DIR '(' filename ')'
  286. { ldfile_add_library_path ($3, false); }
  287. | OUTPUT '(' filename ')'
  288. { lang_add_output($3, 1); }
  289. | OUTPUT_FORMAT '(' NAME ')'
  290. { lang_add_output_format ($3, (char *) NULL,
  291. (char *) NULL, 1); }
  292. | OUTPUT_FORMAT '(' NAME ',' NAME ',' NAME ')'
  293. { lang_add_output_format ($3, $5, $7, 1); }
  294. | OUTPUT_ARCH '(' NAME ')'
  295. { ldfile_set_output_arch ($3, bfd_arch_unknown); }
  296. | FORCE_COMMON_ALLOCATION
  297. { command_line.force_common_definition = true ; }
  298. | FORCE_GROUP_ALLOCATION
  299. { command_line.force_group_allocation = true ; }
  300. | INHIBIT_COMMON_ALLOCATION
  301. { link_info.inhibit_common_definition = true ; }
  302. | INPUT '(' input_list ')'
  303. | GROUP
  304. { lang_enter_group (); }
  305. '(' input_list ')'
  306. { lang_leave_group (); }
  307. | MAP '(' filename ')'
  308. { lang_add_map($3); }
  309. | INCLUDE filename
  310. { ldfile_open_command_file ($2); }
  311. ifile_list END
  312. | NOCROSSREFS '(' nocrossref_list ')'
  313. {
  314. lang_add_nocrossref ($3);
  315. }
  316. | NOCROSSREFS_TO '(' nocrossref_list ')'
  317. {
  318. lang_add_nocrossref_to ($3);
  319. }
  320. | EXTERN '(' { ldlex_expression (); } extern_name_list ')'
  321. { ldlex_popstate (); }
  322. | INSERT_K AFTER NAME
  323. { lang_add_insert ($3, 0); }
  324. | INSERT_K BEFORE NAME
  325. { lang_add_insert ($3, 1); }
  326. | REGION_ALIAS '(' NAME ',' NAME ')'
  327. { lang_memory_region_alias ($3, $5); }
  328. | LD_FEATURE '(' NAME ')'
  329. { lang_ld_feature ($3); }
  330. ;
  331. input_list:
  332. { ldlex_inputlist(); }
  333. input_list1
  334. { ldlex_popstate(); }
  335. input_list1:
  336. NAME
  337. { lang_add_input_file($1,lang_input_file_is_search_file_enum,
  338. (char *)NULL); }
  339. | input_list1 ',' NAME
  340. { lang_add_input_file($3,lang_input_file_is_search_file_enum,
  341. (char *)NULL); }
  342. | input_list1 NAME
  343. { lang_add_input_file($2,lang_input_file_is_search_file_enum,
  344. (char *)NULL); }
  345. | LNAME
  346. { lang_add_input_file($1,lang_input_file_is_l_enum,
  347. (char *)NULL); }
  348. | input_list1 ',' LNAME
  349. { lang_add_input_file($3,lang_input_file_is_l_enum,
  350. (char *)NULL); }
  351. | input_list1 LNAME
  352. { lang_add_input_file($2,lang_input_file_is_l_enum,
  353. (char *)NULL); }
  354. | AS_NEEDED '('
  355. { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
  356. input_flags.add_DT_NEEDED_for_regular = true; }
  357. input_list1 ')'
  358. { input_flags.add_DT_NEEDED_for_regular = $<integer>3; }
  359. | input_list1 ',' AS_NEEDED '('
  360. { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
  361. input_flags.add_DT_NEEDED_for_regular = true; }
  362. input_list1 ')'
  363. { input_flags.add_DT_NEEDED_for_regular = $<integer>5; }
  364. | input_list1 AS_NEEDED '('
  365. { $<integer>$ = input_flags.add_DT_NEEDED_for_regular;
  366. input_flags.add_DT_NEEDED_for_regular = true; }
  367. input_list1 ')'
  368. { input_flags.add_DT_NEEDED_for_regular = $<integer>4; }
  369. ;
  370. sections:
  371. SECTIONS '{' sec_or_group_p1 '}'
  372. ;
  373. sec_or_group_p1:
  374. sec_or_group_p1 section
  375. | sec_or_group_p1 statement_anywhere
  376. |
  377. ;
  378. statement_anywhere:
  379. ENTRY '(' NAME ')'
  380. { lang_add_entry ($3, false); }
  381. | assignment separator
  382. | ASSERT_K {ldlex_expression ();} '(' exp ',' NAME ')'
  383. { ldlex_popstate ();
  384. lang_add_assignment (exp_assert ($4, $6)); }
  385. ;
  386. wildcard_name:
  387. NAME
  388. {
  389. $$ = $1;
  390. }
  391. ;
  392. wildcard_maybe_exclude:
  393. wildcard_name
  394. {
  395. $$.name = $1;
  396. $$.sorted = none;
  397. $$.exclude_name_list = NULL;
  398. $$.section_flag_list = NULL;
  399. }
  400. | EXCLUDE_FILE '(' exclude_name_list ')' wildcard_name
  401. {
  402. $$.name = $5;
  403. $$.sorted = none;
  404. $$.exclude_name_list = $3;
  405. $$.section_flag_list = NULL;
  406. }
  407. ;
  408. filename_spec:
  409. wildcard_maybe_exclude
  410. | SORT_BY_NAME '(' wildcard_maybe_exclude ')'
  411. {
  412. $$ = $3;
  413. $$.sorted = by_name;
  414. }
  415. | SORT_NONE '(' wildcard_maybe_exclude ')'
  416. {
  417. $$ = $3;
  418. $$.sorted = by_none;
  419. }
  420. ;
  421. section_name_spec:
  422. wildcard_maybe_exclude
  423. | SORT_BY_NAME '(' wildcard_maybe_exclude ')'
  424. {
  425. $$ = $3;
  426. $$.sorted = by_name;
  427. }
  428. | SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')'
  429. {
  430. $$ = $3;
  431. $$.sorted = by_alignment;
  432. }
  433. | SORT_NONE '(' wildcard_maybe_exclude ')'
  434. {
  435. $$ = $3;
  436. $$.sorted = by_none;
  437. }
  438. | SORT_BY_NAME '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
  439. {
  440. $$ = $5;
  441. $$.sorted = by_name_alignment;
  442. }
  443. | SORT_BY_NAME '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
  444. {
  445. $$ = $5;
  446. $$.sorted = by_name;
  447. }
  448. | SORT_BY_ALIGNMENT '(' SORT_BY_NAME '(' wildcard_maybe_exclude ')' ')'
  449. {
  450. $$ = $5;
  451. $$.sorted = by_alignment_name;
  452. }
  453. | SORT_BY_ALIGNMENT '(' SORT_BY_ALIGNMENT '(' wildcard_maybe_exclude ')' ')'
  454. {
  455. $$ = $5;
  456. $$.sorted = by_alignment;
  457. }
  458. | SORT_BY_INIT_PRIORITY '(' wildcard_maybe_exclude ')'
  459. {
  460. $$ = $3;
  461. $$.sorted = by_init_priority;
  462. }
  463. ;
  464. sect_flag_list: NAME
  465. {
  466. struct flag_info_list *n;
  467. n = ((struct flag_info_list *) xmalloc (sizeof *n));
  468. if ($1[0] == '!')
  469. {
  470. n->with = without_flags;
  471. n->name = &$1[1];
  472. }
  473. else
  474. {
  475. n->with = with_flags;
  476. n->name = $1;
  477. }
  478. n->valid = false;
  479. n->next = NULL;
  480. $$ = n;
  481. }
  482. | sect_flag_list '&' NAME
  483. {
  484. struct flag_info_list *n;
  485. n = ((struct flag_info_list *) xmalloc (sizeof *n));
  486. if ($3[0] == '!')
  487. {
  488. n->with = without_flags;
  489. n->name = &$3[1];
  490. }
  491. else
  492. {
  493. n->with = with_flags;
  494. n->name = $3;
  495. }
  496. n->valid = false;
  497. n->next = $1;
  498. $$ = n;
  499. }
  500. ;
  501. sect_flags:
  502. INPUT_SECTION_FLAGS '(' sect_flag_list ')'
  503. {
  504. struct flag_info *n;
  505. n = ((struct flag_info *) xmalloc (sizeof *n));
  506. n->flag_list = $3;
  507. n->flags_initialized = false;
  508. n->not_with_flags = 0;
  509. n->only_with_flags = 0;
  510. $$ = n;
  511. }
  512. ;
  513. exclude_name_list:
  514. exclude_name_list wildcard_name
  515. {
  516. struct name_list *tmp;
  517. tmp = (struct name_list *) xmalloc (sizeof *tmp);
  518. tmp->name = $2;
  519. tmp->next = $1;
  520. $$ = tmp;
  521. }
  522. |
  523. wildcard_name
  524. {
  525. struct name_list *tmp;
  526. tmp = (struct name_list *) xmalloc (sizeof *tmp);
  527. tmp->name = $1;
  528. tmp->next = NULL;
  529. $$ = tmp;
  530. }
  531. ;
  532. section_name_list:
  533. section_name_list opt_comma section_name_spec
  534. {
  535. struct wildcard_list *tmp;
  536. tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
  537. tmp->next = $1;
  538. tmp->spec = $3;
  539. $$ = tmp;
  540. }
  541. |
  542. section_name_spec
  543. {
  544. struct wildcard_list *tmp;
  545. tmp = (struct wildcard_list *) xmalloc (sizeof *tmp);
  546. tmp->next = NULL;
  547. tmp->spec = $1;
  548. $$ = tmp;
  549. }
  550. ;
  551. input_section_spec_no_keep:
  552. NAME
  553. {
  554. struct wildcard_spec tmp;
  555. tmp.name = $1;
  556. tmp.exclude_name_list = NULL;
  557. tmp.sorted = none;
  558. tmp.section_flag_list = NULL;
  559. lang_add_wild (&tmp, NULL, ldgram_had_keep);
  560. }
  561. | sect_flags NAME
  562. {
  563. struct wildcard_spec tmp;
  564. tmp.name = $2;
  565. tmp.exclude_name_list = NULL;
  566. tmp.sorted = none;
  567. tmp.section_flag_list = $1;
  568. lang_add_wild (&tmp, NULL, ldgram_had_keep);
  569. }
  570. | '[' section_name_list ']'
  571. {
  572. lang_add_wild (NULL, $2, ldgram_had_keep);
  573. }
  574. | sect_flags '[' section_name_list ']'
  575. {
  576. struct wildcard_spec tmp;
  577. tmp.name = NULL;
  578. tmp.exclude_name_list = NULL;
  579. tmp.sorted = none;
  580. tmp.section_flag_list = $1;
  581. lang_add_wild (&tmp, $3, ldgram_had_keep);
  582. }
  583. | filename_spec '(' section_name_list ')'
  584. {
  585. lang_add_wild (&$1, $3, ldgram_had_keep);
  586. }
  587. | sect_flags filename_spec '(' section_name_list ')'
  588. {
  589. $2.section_flag_list = $1;
  590. lang_add_wild (&$2, $4, ldgram_had_keep);
  591. }
  592. ;
  593. input_section_spec:
  594. input_section_spec_no_keep
  595. | KEEP '('
  596. { ldgram_had_keep = true; }
  597. input_section_spec_no_keep ')'
  598. { ldgram_had_keep = false; }
  599. ;
  600. statement:
  601. ';'
  602. | assignment separator
  603. | CREATE_OBJECT_SYMBOLS
  604. {
  605. lang_add_attribute (lang_object_symbols_statement_enum);
  606. }
  607. | CONSTRUCTORS
  608. {
  609. lang_add_attribute (lang_constructors_statement_enum);
  610. }
  611. | SORT_BY_NAME '(' CONSTRUCTORS ')'
  612. {
  613. constructors_sorted = true;
  614. lang_add_attribute (lang_constructors_statement_enum);
  615. }
  616. | input_section_spec
  617. | length '(' mustbe_exp ')'
  618. {
  619. lang_add_data ((int) $1, $3);
  620. }
  621. | FILL '(' fill_exp ')'
  622. {
  623. lang_add_fill ($3);
  624. }
  625. | ASSERT_K
  626. { ldlex_expression (); }
  627. '(' exp ',' NAME ')' separator
  628. {
  629. ldlex_popstate ();
  630. lang_add_assignment (exp_assert ($4, $6));
  631. }
  632. | INCLUDE filename
  633. {
  634. ldfile_open_command_file ($2);
  635. }
  636. statement_list_opt END
  637. ;
  638. statement_list:
  639. statement_list statement
  640. | statement
  641. ;
  642. statement_list_opt:
  643. /* empty */
  644. | statement_list
  645. ;
  646. length:
  647. QUAD
  648. { $$ = $1; }
  649. | SQUAD
  650. { $$ = $1; }
  651. | LONG
  652. { $$ = $1; }
  653. | SHORT
  654. { $$ = $1; }
  655. | BYTE
  656. { $$ = $1; }
  657. ;
  658. fill_exp:
  659. mustbe_exp
  660. {
  661. $$ = exp_get_fill ($1, 0, "fill value");
  662. }
  663. ;
  664. fill_opt:
  665. '=' fill_exp
  666. { $$ = $2; }
  667. | { $$ = (fill_type *) 0; }
  668. ;
  669. assign_op:
  670. PLUSEQ
  671. { $$ = '+'; }
  672. | MINUSEQ
  673. { $$ = '-'; }
  674. | MULTEQ
  675. { $$ = '*'; }
  676. | DIVEQ
  677. { $$ = '/'; }
  678. | LSHIFTEQ
  679. { $$ = LSHIFT; }
  680. | RSHIFTEQ
  681. { $$ = RSHIFT; }
  682. | ANDEQ
  683. { $$ = '&'; }
  684. | OREQ
  685. { $$ = '|'; }
  686. ;
  687. separator: ';' | ','
  688. ;
  689. assignment:
  690. NAME '=' mustbe_exp
  691. {
  692. lang_add_assignment (exp_assign ($1, $3, false));
  693. }
  694. | NAME assign_op mustbe_exp
  695. {
  696. lang_add_assignment (exp_assign ($1,
  697. exp_binop ($2,
  698. exp_nameop (NAME,
  699. $1),
  700. $3), false));
  701. }
  702. | HIDDEN '(' NAME '=' mustbe_exp ')'
  703. {
  704. lang_add_assignment (exp_assign ($3, $5, true));
  705. }
  706. | PROVIDE '(' NAME '=' mustbe_exp ')'
  707. {
  708. lang_add_assignment (exp_provide ($3, $5, false));
  709. }
  710. | PROVIDE_HIDDEN '(' NAME '=' mustbe_exp ')'
  711. {
  712. lang_add_assignment (exp_provide ($3, $5, true));
  713. }
  714. ;
  715. opt_comma:
  716. ',' | ;
  717. memory:
  718. MEMORY '{' memory_spec_list_opt '}'
  719. ;
  720. memory_spec_list_opt: memory_spec_list | ;
  721. memory_spec_list:
  722. memory_spec_list opt_comma memory_spec
  723. | memory_spec
  724. ;
  725. memory_spec: NAME
  726. { region = lang_memory_region_lookup ($1, true); }
  727. attributes_opt ':'
  728. origin_spec opt_comma length_spec
  729. {}
  730. | INCLUDE filename
  731. { ldfile_open_command_file ($2); }
  732. memory_spec_list_opt END
  733. ;
  734. origin_spec:
  735. ORIGIN '=' mustbe_exp
  736. {
  737. region->origin_exp = $3;
  738. }
  739. ;
  740. length_spec:
  741. LENGTH '=' mustbe_exp
  742. {
  743. if (yychar == NAME)
  744. {
  745. yyclearin;
  746. ldlex_backup ();
  747. }
  748. region->length_exp = $3;
  749. }
  750. ;
  751. attributes_opt:
  752. /* empty */
  753. { /* dummy action to avoid bison 1.25 error message */ }
  754. | '(' attributes_list ')'
  755. ;
  756. attributes_list:
  757. attributes_string
  758. | attributes_list attributes_string
  759. ;
  760. attributes_string:
  761. NAME
  762. { lang_set_flags (region, $1, 0); }
  763. | '!' NAME
  764. { lang_set_flags (region, $2, 1); }
  765. ;
  766. startup:
  767. STARTUP '(' filename ')'
  768. { lang_startup($3); }
  769. ;
  770. high_level_library:
  771. HLL '(' high_level_library_NAME_list ')'
  772. | HLL '(' ')'
  773. { ldemul_hll((char *)NULL); }
  774. ;
  775. high_level_library_NAME_list:
  776. high_level_library_NAME_list opt_comma filename
  777. { ldemul_hll($3); }
  778. | filename
  779. { ldemul_hll($1); }
  780. ;
  781. low_level_library:
  782. SYSLIB '(' low_level_library_NAME_list ')'
  783. ;
  784. low_level_library_NAME_list:
  785. low_level_library_NAME_list opt_comma filename
  786. { ldemul_syslib($3); }
  787. |
  788. ;
  789. floating_point_support:
  790. FLOAT
  791. { lang_float(true); }
  792. | NOFLOAT
  793. { lang_float(false); }
  794. ;
  795. nocrossref_list:
  796. /* empty */
  797. {
  798. $$ = NULL;
  799. }
  800. | NAME nocrossref_list
  801. {
  802. struct lang_nocrossref *n;
  803. n = (struct lang_nocrossref *) xmalloc (sizeof *n);
  804. n->name = $1;
  805. n->next = $2;
  806. $$ = n;
  807. }
  808. | NAME ',' nocrossref_list
  809. {
  810. struct lang_nocrossref *n;
  811. n = (struct lang_nocrossref *) xmalloc (sizeof *n);
  812. n->name = $1;
  813. n->next = $3;
  814. $$ = n;
  815. }
  816. ;
  817. paren_script_name: { ldlex_script (); }
  818. '(' NAME ')'
  819. { ldlex_popstate (); $$ = $3; }
  820. mustbe_exp: { ldlex_expression (); }
  821. exp
  822. { ldlex_popstate (); $$ = $2; }
  823. ;
  824. exp :
  825. '-' exp %prec UNARY
  826. { $$ = exp_unop ('-', $2); }
  827. | '(' exp ')'
  828. { $$ = $2; }
  829. | NEXT '(' exp ')' %prec UNARY
  830. { $$ = exp_unop ((int) $1,$3); }
  831. | '!' exp %prec UNARY
  832. { $$ = exp_unop ('!', $2); }
  833. | '+' exp %prec UNARY
  834. { $$ = $2; }
  835. | '~' exp %prec UNARY
  836. { $$ = exp_unop ('~', $2);}
  837. | exp '*' exp
  838. { $$ = exp_binop ('*', $1, $3); }
  839. | exp '/' exp
  840. { $$ = exp_binop ('/', $1, $3); }
  841. | exp '%' exp
  842. { $$ = exp_binop ('%', $1, $3); }
  843. | exp '+' exp
  844. { $$ = exp_binop ('+', $1, $3); }
  845. | exp '-' exp
  846. { $$ = exp_binop ('-' , $1, $3); }
  847. | exp LSHIFT exp
  848. { $$ = exp_binop (LSHIFT , $1, $3); }
  849. | exp RSHIFT exp
  850. { $$ = exp_binop (RSHIFT , $1, $3); }
  851. | exp EQ exp
  852. { $$ = exp_binop (EQ , $1, $3); }
  853. | exp NE exp
  854. { $$ = exp_binop (NE , $1, $3); }
  855. | exp LE exp
  856. { $$ = exp_binop (LE , $1, $3); }
  857. | exp GE exp
  858. { $$ = exp_binop (GE , $1, $3); }
  859. | exp '<' exp
  860. { $$ = exp_binop ('<' , $1, $3); }
  861. | exp '>' exp
  862. { $$ = exp_binop ('>' , $1, $3); }
  863. | exp '&' exp
  864. { $$ = exp_binop ('&' , $1, $3); }
  865. | exp '^' exp
  866. { $$ = exp_binop ('^' , $1, $3); }
  867. | exp '|' exp
  868. { $$ = exp_binop ('|' , $1, $3); }
  869. | exp '?' exp ':' exp
  870. { $$ = exp_trinop ('?' , $1, $3, $5); }
  871. | exp ANDAND exp
  872. { $$ = exp_binop (ANDAND , $1, $3); }
  873. | exp OROR exp
  874. { $$ = exp_binop (OROR , $1, $3); }
  875. | DEFINED '(' NAME ')'
  876. { $$ = exp_nameop (DEFINED, $3); }
  877. | INT
  878. { $$ = exp_bigintop ($1.integer, $1.str); }
  879. | SIZEOF_HEADERS
  880. { $$ = exp_nameop (SIZEOF_HEADERS,0); }
  881. | ALIGNOF paren_script_name
  882. { $$ = exp_nameop (ALIGNOF, $2); }
  883. | SIZEOF paren_script_name
  884. { $$ = exp_nameop (SIZEOF, $2); }
  885. | ADDR paren_script_name
  886. { $$ = exp_nameop (ADDR, $2); }
  887. | LOADADDR paren_script_name
  888. { $$ = exp_nameop (LOADADDR, $2); }
  889. | CONSTANT '(' NAME ')'
  890. { $$ = exp_nameop (CONSTANT,$3); }
  891. | ABSOLUTE '(' exp ')'
  892. { $$ = exp_unop (ABSOLUTE, $3); }
  893. | ALIGN_K '(' exp ')'
  894. { $$ = exp_unop (ALIGN_K,$3); }
  895. | ALIGN_K '(' exp ',' exp ')'
  896. { $$ = exp_binop (ALIGN_K,$3,$5); }
  897. | DATA_SEGMENT_ALIGN '(' exp ',' exp ')'
  898. { $$ = exp_binop (DATA_SEGMENT_ALIGN, $3, $5); }
  899. | DATA_SEGMENT_RELRO_END '(' exp ',' exp ')'
  900. { $$ = exp_binop (DATA_SEGMENT_RELRO_END, $5, $3); }
  901. | DATA_SEGMENT_END '(' exp ')'
  902. { $$ = exp_unop (DATA_SEGMENT_END, $3); }
  903. | SEGMENT_START { ldlex_script (); } '(' NAME
  904. { ldlex_popstate (); } ',' exp ')'
  905. { /* The operands to the expression node are
  906. placed in the opposite order from the way
  907. in which they appear in the script as
  908. that allows us to reuse more code in
  909. fold_binary. */
  910. $$ = exp_binop (SEGMENT_START,
  911. $7,
  912. exp_nameop (NAME, $4)); }
  913. | BLOCK '(' exp ')'
  914. { $$ = exp_unop (ALIGN_K,$3); }
  915. | NAME
  916. { $$ = exp_nameop (NAME,$1); }
  917. | MAX_K '(' exp ',' exp ')'
  918. { $$ = exp_binop (MAX_K, $3, $5 ); }
  919. | MIN_K '(' exp ',' exp ')'
  920. { $$ = exp_binop (MIN_K, $3, $5 ); }
  921. | ASSERT_K '(' exp ',' NAME ')'
  922. { $$ = exp_assert ($3, $5); }
  923. | ORIGIN paren_script_name
  924. { $$ = exp_nameop (ORIGIN, $2); }
  925. | LENGTH paren_script_name
  926. { $$ = exp_nameop (LENGTH, $2); }
  927. | LOG2CEIL '(' exp ')'
  928. { $$ = exp_unop (LOG2CEIL, $3); }
  929. ;
  930. memspec_at_opt:
  931. AT '>' NAME { $$ = $3; }
  932. | { $$ = 0; }
  933. ;
  934. opt_at:
  935. AT '(' exp ')' { $$ = $3; }
  936. | { $$ = 0; }
  937. ;
  938. opt_align:
  939. ALIGN_K '(' exp ')' { $$ = $3; }
  940. | { $$ = 0; }
  941. ;
  942. opt_align_with_input:
  943. ALIGN_WITH_INPUT { $$ = ALIGN_WITH_INPUT; }
  944. | { $$ = 0; }
  945. ;
  946. opt_subalign:
  947. SUBALIGN '(' exp ')' { $$ = $3; }
  948. | { $$ = 0; }
  949. ;
  950. sect_constraint:
  951. ONLY_IF_RO { $$ = ONLY_IF_RO; }
  952. | ONLY_IF_RW { $$ = ONLY_IF_RW; }
  953. | SPECIAL { $$ = SPECIAL; }
  954. | { $$ = 0; }
  955. ;
  956. section: NAME
  957. { ldlex_expression(); }
  958. opt_exp_with_type
  959. opt_at
  960. opt_align
  961. opt_align_with_input
  962. opt_subalign
  963. sect_constraint
  964. {
  965. ldlex_popstate ();
  966. ldlex_wild ();
  967. lang_enter_output_section_statement ($1, $3, sectype,
  968. sectype_value, $5, $7, $4, $8, $6);
  969. }
  970. '{'
  971. statement_list_opt
  972. '}'
  973. { ldlex_popstate (); }
  974. memspec_opt memspec_at_opt phdr_opt fill_opt
  975. {
  976. /* fill_opt may have switched the lexer into
  977. expression state, and back again, but in
  978. order to find the end of the fill
  979. expression the parser must look ahead one
  980. token. If it is a NAME, throw it away as
  981. it will have been lexed in the wrong
  982. state. */
  983. if (yychar == NAME)
  984. {
  985. yyclearin;
  986. ldlex_backup ();
  987. }
  988. lang_leave_output_section_statement ($17, $14,
  989. $16, $15);
  990. }
  991. opt_comma
  992. | OVERLAY
  993. { ldlex_expression (); }
  994. opt_exp_without_type opt_nocrossrefs opt_at opt_subalign
  995. { ldlex_popstate (); }
  996. '{'
  997. {
  998. lang_enter_overlay ($3, $6);
  999. }
  1000. overlay_section
  1001. '}'
  1002. memspec_opt memspec_at_opt phdr_opt fill_opt
  1003. {
  1004. if (yychar == NAME)
  1005. {
  1006. yyclearin;
  1007. ldlex_backup ();
  1008. }
  1009. lang_leave_overlay ($5, (int) $4,
  1010. $15, $12, $14, $13);
  1011. }
  1012. opt_comma
  1013. | /* The GROUP case is just enough to support the gcc
  1014. svr3.ifile script. It is not intended to be full
  1015. support. I'm not even sure what GROUP is supposed
  1016. to mean. */
  1017. GROUP
  1018. { ldlex_expression (); }
  1019. opt_exp_with_type
  1020. {
  1021. ldlex_popstate ();
  1022. lang_add_assignment (exp_assign (".", $3, false));
  1023. }
  1024. '{' sec_or_group_p1 '}'
  1025. | INCLUDE filename
  1026. {
  1027. ldfile_open_command_file ($2);
  1028. }
  1029. sec_or_group_p1 END
  1030. ;
  1031. type:
  1032. NOLOAD { sectype = noload_section; }
  1033. | DSECT { sectype = noalloc_section; }
  1034. | COPY { sectype = noalloc_section; }
  1035. | INFO { sectype = noalloc_section; }
  1036. | OVERLAY { sectype = noalloc_section; }
  1037. | READONLY '(' TYPE '=' exp ')' { sectype = typed_readonly_section; sectype_value = $5; }
  1038. | READONLY { sectype = readonly_section; }
  1039. | TYPE '=' exp { sectype = type_section; sectype_value = $3; }
  1040. ;
  1041. atype:
  1042. '(' type ')'
  1043. | /* EMPTY */ { sectype = normal_section; }
  1044. | '(' ')' { sectype = normal_section; }
  1045. ;
  1046. opt_exp_with_type:
  1047. exp atype ':' { $$ = $1; }
  1048. | atype ':' { $$ = (etree_type *)NULL; }
  1049. | /* The BIND cases are to support the gcc svr3.ifile
  1050. script. They aren't intended to implement full
  1051. support for the BIND keyword. I'm not even sure
  1052. what BIND is supposed to mean. */
  1053. BIND '(' exp ')' atype ':' { $$ = $3; }
  1054. | BIND '(' exp ')' BLOCK '(' exp ')' atype ':'
  1055. { $$ = $3; }
  1056. ;
  1057. opt_exp_without_type:
  1058. exp ':' { $$ = $1; }
  1059. | ':' { $$ = (etree_type *) NULL; }
  1060. ;
  1061. opt_nocrossrefs:
  1062. /* empty */
  1063. { $$ = 0; }
  1064. | NOCROSSREFS
  1065. { $$ = 1; }
  1066. ;
  1067. memspec_opt:
  1068. '>' NAME
  1069. { $$ = $2; }
  1070. | { $$ = DEFAULT_MEMORY_REGION; }
  1071. ;
  1072. phdr_opt:
  1073. /* empty */
  1074. {
  1075. $$ = NULL;
  1076. }
  1077. | phdr_opt ':' NAME
  1078. {
  1079. struct lang_output_section_phdr_list *n;
  1080. n = ((struct lang_output_section_phdr_list *)
  1081. xmalloc (sizeof *n));
  1082. n->name = $3;
  1083. n->used = false;
  1084. n->next = $1;
  1085. $$ = n;
  1086. }
  1087. ;
  1088. overlay_section:
  1089. /* empty */
  1090. | overlay_section
  1091. NAME
  1092. {
  1093. ldlex_wild ();
  1094. lang_enter_overlay_section ($2);
  1095. }
  1096. '{'
  1097. statement_list_opt
  1098. '}'
  1099. { ldlex_popstate (); }
  1100. phdr_opt fill_opt
  1101. {
  1102. if (yychar == NAME)
  1103. {
  1104. yyclearin;
  1105. ldlex_backup ();
  1106. }
  1107. lang_leave_overlay_section ($9, $8);
  1108. }
  1109. opt_comma
  1110. ;
  1111. phdrs:
  1112. PHDRS '{' phdr_list '}'
  1113. ;
  1114. phdr_list:
  1115. /* empty */
  1116. | phdr_list phdr
  1117. ;
  1118. phdr:
  1119. NAME { ldlex_expression (); }
  1120. phdr_type phdr_qualifiers { ldlex_popstate (); }
  1121. ';'
  1122. {
  1123. lang_new_phdr ($1, $3, $4.filehdr, $4.phdrs, $4.at,
  1124. $4.flags);
  1125. }
  1126. ;
  1127. phdr_type:
  1128. exp
  1129. {
  1130. $$ = $1;
  1131. if ($1->type.node_class == etree_name
  1132. && $1->type.node_code == NAME)
  1133. {
  1134. const char *s;
  1135. unsigned int i;
  1136. static const char * const phdr_types[] =
  1137. {
  1138. "PT_NULL", "PT_LOAD", "PT_DYNAMIC",
  1139. "PT_INTERP", "PT_NOTE", "PT_SHLIB",
  1140. "PT_PHDR", "PT_TLS"
  1141. };
  1142. s = $1->name.name;
  1143. for (i = 0;
  1144. i < sizeof phdr_types / sizeof phdr_types[0];
  1145. i++)
  1146. if (strcmp (s, phdr_types[i]) == 0)
  1147. {
  1148. $$ = exp_intop (i);
  1149. break;
  1150. }
  1151. if (i == sizeof phdr_types / sizeof phdr_types[0])
  1152. {
  1153. if (strcmp (s, "PT_GNU_EH_FRAME") == 0)
  1154. $$ = exp_intop (0x6474e550);
  1155. else if (strcmp (s, "PT_GNU_STACK") == 0)
  1156. $$ = exp_intop (0x6474e551);
  1157. else if (strcmp (s, "PT_GNU_RELRO") == 0)
  1158. $$ = exp_intop (0x6474e552);
  1159. else if (strcmp (s, "PT_GNU_PROPERTY") == 0)
  1160. $$ = exp_intop (0x6474e553);
  1161. else
  1162. {
  1163. einfo (_("\
  1164. %X%P:%pS: unknown phdr type `%s' (try integer literal)\n"),
  1165. NULL, s);
  1166. $$ = exp_intop (0);
  1167. }
  1168. }
  1169. }
  1170. }
  1171. ;
  1172. phdr_qualifiers:
  1173. /* empty */
  1174. {
  1175. memset (&$$, 0, sizeof (struct phdr_info));
  1176. }
  1177. | NAME phdr_val phdr_qualifiers
  1178. {
  1179. $$ = $3;
  1180. if (strcmp ($1, "FILEHDR") == 0 && $2 == NULL)
  1181. $$.filehdr = true;
  1182. else if (strcmp ($1, "PHDRS") == 0 && $2 == NULL)
  1183. $$.phdrs = true;
  1184. else if (strcmp ($1, "FLAGS") == 0 && $2 != NULL)
  1185. $$.flags = $2;
  1186. else
  1187. einfo (_("%X%P:%pS: PHDRS syntax error at `%s'\n"),
  1188. NULL, $1);
  1189. }
  1190. | AT '(' exp ')' phdr_qualifiers
  1191. {
  1192. $$ = $5;
  1193. $$.at = $3;
  1194. }
  1195. ;
  1196. phdr_val:
  1197. /* empty */
  1198. {
  1199. $$ = NULL;
  1200. }
  1201. | '(' exp ')'
  1202. {
  1203. $$ = $2;
  1204. }
  1205. ;
  1206. dynamic_list_file:
  1207. {
  1208. ldlex_version_file ();
  1209. PUSH_ERROR (_("dynamic list"));
  1210. }
  1211. dynamic_list_nodes
  1212. {
  1213. ldlex_popstate ();
  1214. POP_ERROR ();
  1215. }
  1216. ;
  1217. dynamic_list_nodes:
  1218. dynamic_list_node
  1219. | dynamic_list_nodes dynamic_list_node
  1220. ;
  1221. dynamic_list_node:
  1222. '{' dynamic_list_tag '}' ';'
  1223. ;
  1224. dynamic_list_tag:
  1225. vers_defns ';'
  1226. {
  1227. lang_append_dynamic_list (current_dynamic_list_p, $1);
  1228. }
  1229. ;
  1230. /* This syntax is used within an external version script file. */
  1231. version_script_file:
  1232. {
  1233. ldlex_version_file ();
  1234. PUSH_ERROR (_("VERSION script"));
  1235. }
  1236. vers_nodes
  1237. {
  1238. ldlex_popstate ();
  1239. POP_ERROR ();
  1240. }
  1241. ;
  1242. /* This is used within a normal linker script file. */
  1243. version:
  1244. {
  1245. ldlex_version_script ();
  1246. }
  1247. VERSIONK '{' vers_nodes '}'
  1248. {
  1249. ldlex_popstate ();
  1250. }
  1251. ;
  1252. vers_nodes:
  1253. vers_node
  1254. | vers_nodes vers_node
  1255. ;
  1256. vers_node:
  1257. '{' vers_tag '}' ';'
  1258. {
  1259. lang_register_vers_node (NULL, $2, NULL);
  1260. }
  1261. | VERS_TAG '{' vers_tag '}' ';'
  1262. {
  1263. lang_register_vers_node ($1, $3, NULL);
  1264. }
  1265. | VERS_TAG '{' vers_tag '}' verdep ';'
  1266. {
  1267. lang_register_vers_node ($1, $3, $5);
  1268. }
  1269. ;
  1270. verdep:
  1271. VERS_TAG
  1272. {
  1273. $$ = lang_add_vers_depend (NULL, $1);
  1274. }
  1275. | verdep VERS_TAG
  1276. {
  1277. $$ = lang_add_vers_depend ($1, $2);
  1278. }
  1279. ;
  1280. vers_tag:
  1281. /* empty */
  1282. {
  1283. $$ = lang_new_vers_node (NULL, NULL);
  1284. }
  1285. | vers_defns ';'
  1286. {
  1287. $$ = lang_new_vers_node ($1, NULL);
  1288. }
  1289. | GLOBAL ':' vers_defns ';'
  1290. {
  1291. $$ = lang_new_vers_node ($3, NULL);
  1292. }
  1293. | LOCAL ':' vers_defns ';'
  1294. {
  1295. $$ = lang_new_vers_node (NULL, $3);
  1296. }
  1297. | GLOBAL ':' vers_defns ';' LOCAL ':' vers_defns ';'
  1298. {
  1299. $$ = lang_new_vers_node ($3, $7);
  1300. }
  1301. ;
  1302. vers_defns:
  1303. VERS_IDENTIFIER
  1304. {
  1305. $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, false);
  1306. }
  1307. | NAME
  1308. {
  1309. $$ = lang_new_vers_pattern (NULL, $1, ldgram_vers_current_lang, true);
  1310. }
  1311. | vers_defns ';' VERS_IDENTIFIER
  1312. {
  1313. $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, false);
  1314. }
  1315. | vers_defns ';' NAME
  1316. {
  1317. $$ = lang_new_vers_pattern ($1, $3, ldgram_vers_current_lang, true);
  1318. }
  1319. | vers_defns ';' EXTERN NAME '{'
  1320. {
  1321. $<name>$ = ldgram_vers_current_lang;
  1322. ldgram_vers_current_lang = $4;
  1323. }
  1324. vers_defns opt_semicolon '}'
  1325. {
  1326. struct bfd_elf_version_expr *pat;
  1327. for (pat = $7; pat->next != NULL; pat = pat->next);
  1328. pat->next = $1;
  1329. $$ = $7;
  1330. ldgram_vers_current_lang = $<name>6;
  1331. }
  1332. | EXTERN NAME '{'
  1333. {
  1334. $<name>$ = ldgram_vers_current_lang;
  1335. ldgram_vers_current_lang = $2;
  1336. }
  1337. vers_defns opt_semicolon '}'
  1338. {
  1339. $$ = $5;
  1340. ldgram_vers_current_lang = $<name>4;
  1341. }
  1342. | GLOBAL
  1343. {
  1344. $$ = lang_new_vers_pattern (NULL, "global", ldgram_vers_current_lang, false);
  1345. }
  1346. | vers_defns ';' GLOBAL
  1347. {
  1348. $$ = lang_new_vers_pattern ($1, "global", ldgram_vers_current_lang, false);
  1349. }
  1350. | LOCAL
  1351. {
  1352. $$ = lang_new_vers_pattern (NULL, "local", ldgram_vers_current_lang, false);
  1353. }
  1354. | vers_defns ';' LOCAL
  1355. {
  1356. $$ = lang_new_vers_pattern ($1, "local", ldgram_vers_current_lang, false);
  1357. }
  1358. | EXTERN
  1359. {
  1360. $$ = lang_new_vers_pattern (NULL, "extern", ldgram_vers_current_lang, false);
  1361. }
  1362. | vers_defns ';' EXTERN
  1363. {
  1364. $$ = lang_new_vers_pattern ($1, "extern", ldgram_vers_current_lang, false);
  1365. }
  1366. ;
  1367. opt_semicolon:
  1368. /* empty */
  1369. | ';'
  1370. ;
  1371. %%
  1372. void
  1373. yyerror(arg)
  1374. const char *arg;
  1375. {
  1376. if (ldfile_assumed_script)
  1377. einfo (_("%P:%s: file format not recognized; treating as linker script\n"),
  1378. ldlex_filename ());
  1379. if (error_index > 0 && error_index < ERROR_NAME_MAX)
  1380. einfo ("%F%P:%pS: %s in %s\n", NULL, arg, error_names[error_index - 1]);
  1381. else
  1382. einfo ("%F%P:%pS: %s\n", NULL, arg);
  1383. }