1 %
{ /* deffilep.y - parser for .def files */
3 /* Copyright 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
4 Free Software Foundation, Inc.
6 This file is part of GNU Binutils.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23 #include "libiberty.h"
24 #include "safe-ctype.h"
32 #define ROUND_UP(a, b) (((a)+((b)-1))&~((b)-1))
34 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
35 as well as gratuitiously global symbol names, so we can have multiple
36 yacc generated parsers in ld. Note that these are only the variables
37 produced by yacc. If other parser generators (bison, byacc, etc) produce
38 additional global names that conflict at link time, then those parser
39 generators need to be fixed instead of adding those names to this list. */
41 #define yymaxdepth def_maxdepth
42 #define yyparse def_parse
44 #define yyerror def_error
45 #define yylval def_lval
46 #define yychar def_char
47 #define yydebug def_debug
48 #define yypact def_pact
55 #define yyexca def_exca
56 #define yyerrflag def_errflag
57 #define yynerrs def_nerrs
61 #define yy_yys def_yys
62 #define yystate def_state
65 #define yy_yyv def_yyv
67 #define yylloc def_lloc
68 #define yyreds def_reds /* With YYDEBUG defined. */
69 #define yytoks def_toks /* With YYDEBUG defined. */
70 #define yylhs def_yylhs
71 #define yylen def_yylen
72 #define yydefred def_yydefred
73 #define yydgoto def_yydgoto
74 #define yysindex def_yysindex
75 #define yyrindex def_yyrindex
76 #define yygindex def_yygindex
77 #define yytable def_yytable
78 #define yycheck def_yycheck
80 static void def_description
(const char *);
81 static void def_exports
(const char *, const char *, int, int);
82 static void def_heapsize
(int, int);
83 static void def_import
(const char *, const char *, const char *, const char *,
85 static void def_image_name
(const char *, int, int);
86 static void def_section
(const char *, int);
87 static void def_section_alt
(const char *, const char *);
88 static void def_stacksize
(int, int);
89 static void def_version
(int, int);
90 static void def_directive
(char *);
91 static int def_parse
(void);
92 static int def_error
(const char *);
93 static int def_lex
(void);
95 static int lex_forced_token
= 0;
96 static const char *lex_parse_string
= 0;
97 static const char *lex_parse_string_end
= 0;
106 %token NAME LIBRARY DESCRIPTION STACKSIZE HEAPSIZE CODE DATAU DATAL
107 %token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL
108 %token PRIVATEU PRIVATEL
109 %token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE
111 %token
<number
> NUMBER
112 %type
<number
> opt_base opt_ordinal
113 %type
<number
> attr attr_list opt_number exp_opt_list exp_opt
114 %type
<id
> opt_name opt_equal_name dot_name
123 NAME opt_name opt_base
{ def_image_name
($2, $3, 0); }
124 | LIBRARY opt_name opt_base
{ def_image_name
($2, $3, 1); }
125 | DESCRIPTION ID
{ def_description
($2);}
126 | STACKSIZE NUMBER opt_number
{ def_stacksize
($2, $3);}
127 | HEAPSIZE NUMBER opt_number
{ def_heapsize
($2, $3);}
128 | CODE attr_list
{ def_section
("CODE", $2);}
129 | DATAU attr_list
{ def_section
("DATA", $2);}
133 | VERSIONK NUMBER
{ def_version
($2, 0);}
134 | VERSIONK NUMBER
'.' NUMBER
{ def_version
($2, $4);}
135 | DIRECTIVE ID
{ def_directive
($2);}
146 /* The opt_comma is necessary to support both the usual
147 DEF file syntax as well as .drectve syntax which
148 mandates <expsym>,<expoptlist>. */
149 dot_name opt_equal_name opt_ordinal opt_comma exp_opt_list
150 { def_exports
($1, $2, $3, $5); }
153 /* The opt_comma is necessary to support both the usual
154 DEF file syntax as well as .drectve syntax which
155 allows for comma separated opt list. */
156 exp_opt opt_comma exp_opt_list
{ $$
= $1 |
$3; }
161 | NONAMEL
{ $$
= 1; }
162 | CONSTANTU
{ $$
= 2; }
163 | CONSTANTL
{ $$
= 2; }
166 | PRIVATEU
{ $$
= 8; }
167 | PRIVATEL
{ $$
= 8; }
175 ID
'=' ID
'.' ID
'.' ID
{ def_import
($1, $3, $5, $7, -1); }
176 | ID
'=' ID
'.' ID
'.' NUMBER
{ def_import
($1, $3, $5, 0, $7); }
177 | ID
'=' ID
'.' ID
{ def_import
($1, $3, 0, $5, -1); }
178 | ID
'=' ID
'.' NUMBER
{ def_import
($1, $3, 0, 0, $5); }
179 | ID
'.' ID
'.' ID
{ def_import
( 0, $1, $3, $5, -1); }
180 | ID
'.' ID
{ def_import
( 0, $1, 0, $3, -1); }
189 ID attr_list
{ def_section
($1, $2);}
190 | ID ID
{ def_section_alt
($1, $2);}
194 attr_list opt_comma attr
{ $$
= $1 |
$3; }
202 opt_number: ',' NUMBER
{ $$
=$2;}
213 opt_name: ID
{ $$
= $1; }
216 char *name
= xmalloc
(strlen
($1) + 1 + strlen
($3) + 1);
217 sprintf
(name
, "%s.%s", $1, $3);
224 '@' NUMBER
{ $$
= $2;}
229 '=' dot_name
{ $$
= $2; }
233 opt_base: BASE
'=' NUMBER
{ $$
= $3;}
237 dot_name: ID
{ $$
= $1; }
240 char *name
= xmalloc
(strlen
($1) + 1 + strlen
($3) + 1);
241 sprintf
(name
, "%s.%s", $1, $3);
249 /*****************************************************************************
251 *****************************************************************************/
253 static FILE *the_file
;
254 static const char *def_filename
;
255 static int linenumber
;
256 static def_file
*def
;
257 static int saw_newline
;
261 struct directive
*next
;
266 static struct directive
*directives
= 0;
269 def_file_empty
(void)
271 def_file
*rv
= xmalloc
(sizeof
(def_file
));
272 memset
(rv
, 0, sizeof
(def_file
));
274 rv
->base_address
= (bfd_vma
) -1;
275 rv
->stack_reserve
= rv
->stack_commit
= -1;
276 rv
->heap_reserve
= rv
->heap_commit
= -1;
277 rv
->version_major
= rv
->version_minor
= -1;
282 def_file_parse
(const char *filename
, def_file
*add_to
)
286 the_file
= fopen
(filename
, "r");
287 def_filename
= filename
;
300 def
= def_file_empty
();
313 for
(d
= directives
; d
; d
= d
->next
)
316 printf
("Adding directive %08x `%s'\n", d
->name
, d
->name
);
318 def_file_add_directive
(def
, d
->name
, d
->len
);
325 def_file_free
(def_file
*def
)
333 if
(def
->description
)
334 free
(def
->description
);
336 if
(def
->section_defs
)
338 for
(i
= 0; i
< def
->num_section_defs
; i
++)
340 if
(def
->section_defs
[i
].name
)
341 free
(def
->section_defs
[i
].name
);
342 if
(def
->section_defs
[i
].class
)
343 free
(def
->section_defs
[i
].class
);
345 free
(def
->section_defs
);
350 for
(i
= 0; i
< def
->num_exports
; i
++)
352 if
(def
->exports
[i
].internal_name
353 && def
->exports
[i
].internal_name
!= def
->exports
[i
].name
)
354 free
(def
->exports
[i
].internal_name
);
355 if
(def
->exports
[i
].name
)
356 free
(def
->exports
[i
].name
);
363 for
(i
= 0; i
< def
->num_imports
; i
++)
365 if
(def
->imports
[i
].internal_name
366 && def
->imports
[i
].internal_name
!= def
->imports
[i
].name
)
367 free
(def
->imports
[i
].internal_name
);
368 if
(def
->imports
[i
].name
)
369 free
(def
->imports
[i
].name
);
376 def_file_module
*m
= def
->modules
;
377 def
->modules
= def
->modules
->next
;
384 #ifdef DEF_FILE_PRINT
386 def_file_print
(FILE *file
, def_file
*def
)
390 fprintf
(file
, ">>>> def_file at 0x%08x\n", def
);
392 fprintf
(file
, " name: %s\n", def
->name ? def
->name
: "(unspecified)");
393 if
(def
->is_dll
!= -1)
394 fprintf
(file
, " is dll: %s\n", def
->is_dll ?
"yes" : "no");
395 if
(def
->base_address
!= (bfd_vma
) -1)
396 fprintf
(file
, " base address: 0x%08x\n", def
->base_address
);
397 if
(def
->description
)
398 fprintf
(file
, " description: `%s'\n", def
->description
);
399 if
(def
->stack_reserve
!= -1)
400 fprintf
(file
, " stack reserve: 0x%08x\n", def
->stack_reserve
);
401 if
(def
->stack_commit
!= -1)
402 fprintf
(file
, " stack commit: 0x%08x\n", def
->stack_commit
);
403 if
(def
->heap_reserve
!= -1)
404 fprintf
(file
, " heap reserve: 0x%08x\n", def
->heap_reserve
);
405 if
(def
->heap_commit
!= -1)
406 fprintf
(file
, " heap commit: 0x%08x\n", def
->heap_commit
);
408 if
(def
->num_section_defs
> 0)
410 fprintf
(file
, " section defs:\n");
412 for
(i
= 0; i
< def
->num_section_defs
; i
++)
414 fprintf
(file
, " name: `%s', class: `%s', flags:",
415 def
->section_defs
[i
].name
, def
->section_defs
[i
].class
);
416 if
(def
->section_defs
[i
].flag_read
)
417 fprintf
(file
, " R");
418 if
(def
->section_defs
[i
].flag_write
)
419 fprintf
(file
, " W");
420 if
(def
->section_defs
[i
].flag_execute
)
421 fprintf
(file
, " X");
422 if
(def
->section_defs
[i
].flag_shared
)
423 fprintf
(file
, " S");
424 fprintf
(file
, "\n");
428 if
(def
->num_exports
> 0)
430 fprintf
(file
, " exports:\n");
432 for
(i
= 0; i
< def
->num_exports
; i
++)
434 fprintf
(file
, " name: `%s', int: `%s', ordinal: %d, flags:",
435 def
->exports
[i
].name
, def
->exports
[i
].internal_name
,
436 def
->exports
[i
].ordinal
);
437 if
(def
->exports
[i
].flag_private
)
438 fprintf
(file
, " P");
439 if
(def
->exports
[i
].flag_constant
)
440 fprintf
(file
, " C");
441 if
(def
->exports
[i
].flag_noname
)
442 fprintf
(file
, " N");
443 if
(def
->exports
[i
].flag_data
)
444 fprintf
(file
, " D");
445 fprintf
(file
, "\n");
449 if
(def
->num_imports
> 0)
451 fprintf
(file
, " imports:\n");
453 for
(i
= 0; i
< def
->num_imports
; i
++)
455 fprintf
(file
, " int: %s, from: `%s', name: `%s', ordinal: %d\n",
456 def
->imports
[i
].internal_name
,
457 def
->imports
[i
].module
,
458 def
->imports
[i
].name
,
459 def
->imports
[i
].ordinal
);
463 if
(def
->version_major
!= -1)
464 fprintf
(file
, " version: %d.%d\n", def
->version_major
, def
->version_minor
);
466 fprintf
(file
, "<<<< def_file at 0x%08x\n", def
);
471 def_file_add_export
(def_file
*def
,
472 const char *external_name
,
473 const char *internal_name
,
477 int max_exports
= ROUND_UP
(def
->num_exports
, 32);
479 if
(def
->num_exports
>= max_exports
)
481 max_exports
= ROUND_UP
(def
->num_exports
+ 1, 32);
483 def
->exports
= xrealloc
(def
->exports
,
484 max_exports
* sizeof
(def_file_export
));
486 def
->exports
= xmalloc
(max_exports
* sizeof
(def_file_export
));
488 e
= def
->exports
+ def
->num_exports
;
489 memset
(e
, 0, sizeof
(def_file_export
));
490 if
(internal_name
&& !external_name
)
491 external_name
= internal_name
;
492 if
(external_name
&& !internal_name
)
493 internal_name
= external_name
;
494 e
->name
= xstrdup
(external_name
);
495 e
->internal_name
= xstrdup
(internal_name
);
496 e
->ordinal
= ordinal
;
502 def_get_module
(def_file
*def
, const char *name
)
506 for
(s
= def
->modules
; s
; s
= s
->next
)
507 if
(strcmp
(s
->name
, name
) == 0)
513 static def_file_module
*
514 def_stash_module
(def_file
*def
, const char *name
)
518 if
((s
= def_get_module
(def
, name
)) != NULL
)
520 s
= xmalloc
(sizeof
(def_file_module
) + strlen
(name
));
521 s
->next
= def
->modules
;
524 strcpy
(s
->name
, name
);
529 def_file_add_import
(def_file
*def
,
533 const char *internal_name
)
536 int max_imports
= ROUND_UP
(def
->num_imports
, 16);
538 if
(def
->num_imports
>= max_imports
)
540 max_imports
= ROUND_UP
(def
->num_imports
+1, 16);
543 def
->imports
= xrealloc
(def
->imports
,
544 max_imports
* sizeof
(def_file_import
));
546 def
->imports
= xmalloc
(max_imports
* sizeof
(def_file_import
));
548 i
= def
->imports
+ def
->num_imports
;
549 memset
(i
, 0, sizeof
(def_file_import
));
551 i
->name
= xstrdup
(name
);
553 i
->module
= def_stash_module
(def
, module
);
554 i
->ordinal
= ordinal
;
556 i
->internal_name
= xstrdup
(internal_name
);
558 i
->internal_name
= i
->name
;
571 { "-heap", HEAPSIZE
},
572 { "-stack", STACKSIZE
},
573 { "-attr", SECTIONS
},
574 { "-export", EXPORTS
},
579 def_file_add_directive
(def_file
*my_def
, const char *param
, int len
)
581 def_file
*save_def
= def
;
582 const char *pend
= param
+ len
;
583 char * tend
= (char *) param
;
591 && (ISSPACE
(*param
) ||
*param
== '\n' ||
*param
== 0))
597 /* Scan forward until we encounter any of:
598 - the end of the buffer
599 - the start of a new option
600 - a newline seperating options
601 - a NUL seperating options. */
602 for
(tend
= (char *) (param
+ 1);
604 && !(ISSPACE
(tend
[-1]) && *tend
== '-')
605 && *tend
!= '\n' && *tend
!= 0);
609 for
(i
= 0; diropts
[i
].param
; i
++)
611 int len
= strlen
(diropts
[i
].param
);
613 if
(tend
- param
>= len
614 && strncmp
(param
, diropts
[i
].param
, len
) == 0
615 && (param
[len
] == ':' || param
[len
] == ' '))
617 lex_parse_string_end
= tend
;
618 lex_parse_string
= param
+ len
+ 1;
619 lex_forced_token
= diropts
[i
].token
;
627 if
(!diropts
[i
].param
)
633 /* xgettext:c-format */
634 einfo
(_
("Warning: .drectve `%s' unrecognized\n"), param
);
638 lex_parse_string
= 0;
645 /* Parser Callbacks. */
648 def_image_name
(const char *name
, int base
, int is_dll
)
650 /* If a LIBRARY or NAME statement is specified without a name, there is nothing
651 to do here. We retain the output filename specified on command line. */
654 const char* image_name
= lbasename
(name
);
655 if
(image_name
!= name
)
656 einfo
("%s:%d: Warning: path components stripped from %s, '%s'\n",
657 def_filename
, linenumber
, is_dll ?
"LIBRARY" : "NAME",
661 /* Append the default suffix, if none specified. */
662 if
(strchr
(image_name
, '.') == 0)
664 const char * suffix
= is_dll ?
".dll" : ".exe";
666 def
->name
= xmalloc
(strlen
(image_name
) + strlen
(suffix
) + 1);
667 sprintf
(def
->name
, "%s%s", image_name
, suffix
);
670 def
->name
= xstrdup
(image_name
);
673 /* Honor a BASE address statement, even if LIBRARY string is empty. */
674 def
->base_address
= base
;
675 def
->is_dll
= is_dll
;
679 def_description
(const char *text
)
681 int len
= def
->description ? strlen
(def
->description
) : 0;
683 len
+= strlen
(text
) + 1;
684 if
(def
->description
)
686 def
->description
= xrealloc
(def
->description
, len
);
687 strcat
(def
->description
, text
);
691 def
->description
= xmalloc
(len
);
692 strcpy
(def
->description
, text
);
697 def_stacksize
(int reserve
, int commit
)
699 def
->stack_reserve
= reserve
;
700 def
->stack_commit
= commit
;
704 def_heapsize
(int reserve
, int commit
)
706 def
->heap_reserve
= reserve
;
707 def
->heap_commit
= commit
;
711 def_section
(const char *name
, int attr
)
714 int max_sections
= ROUND_UP
(def
->num_section_defs
, 4);
716 if
(def
->num_section_defs
>= max_sections
)
718 max_sections
= ROUND_UP
(def
->num_section_defs
+1, 4);
720 if
(def
->section_defs
)
721 def
->section_defs
= xrealloc
(def
->section_defs
,
722 max_sections
* sizeof
(def_file_import
));
724 def
->section_defs
= xmalloc
(max_sections
* sizeof
(def_file_import
));
726 s
= def
->section_defs
+ def
->num_section_defs
;
727 memset
(s
, 0, sizeof
(def_file_section
));
728 s
->name
= xstrdup
(name
);
738 def
->num_section_defs
++;
742 def_section_alt
(const char *name
, const char *attr
)
746 for
(; *attr
; attr
++)
768 def_section
(name
, aval
);
772 def_exports
(const char *external_name
,
773 const char *internal_name
,
777 def_file_export
*dfe
;
779 if
(!internal_name
&& external_name
)
780 internal_name
= external_name
;
782 printf
("def_exports, ext=%s int=%s\n", external_name
, internal_name
);
785 dfe
= def_file_add_export
(def
, external_name
, internal_name
, ordinal
);
787 dfe
->flag_noname
= 1;
789 dfe
->flag_constant
= 1;
793 dfe
->flag_private
= 1;
797 def_import
(const char *internal_name
,
804 const char *ext
= dllext ? dllext
: "dll";
806 buf
= xmalloc
(strlen
(module
) + strlen
(ext
) + 2);
807 sprintf
(buf
, "%s.%s", module
, ext
);
810 def_file_add_import
(def
, name
, module
, ordinal
, internal_name
);
816 def_version
(int major
, int minor
)
818 def
->version_major
= major
;
819 def
->version_minor
= minor
;
823 def_directive
(char *str
)
825 struct directive
*d
= xmalloc
(sizeof
(struct directive
));
827 d
->next
= directives
;
829 d
->name
= xstrdup
(str
);
830 d
->len
= strlen
(str
);
834 def_error
(const char *err
)
836 einfo
("%P: %s:%d: %s\n",
837 def_filename ? def_filename
: "<unknown-file>", linenumber
, err
);
842 /* Lexical Scanner. */
847 /* Never freed, but always reused as needed, so no real leak. */
848 static char *buffer
= 0;
849 static int buflen
= 0;
850 static int bufptr
= 0;
855 if
(bufptr
== buflen
)
857 buflen
+= 50; /* overly reasonable, eh? */
859 buffer
= xrealloc
(buffer
, buflen
+ 1);
861 buffer
= xmalloc
(buflen
+ 1);
863 buffer
[bufptr
++] = c
;
864 buffer
[bufptr
] = 0; /* not optimal, but very convenient. */
876 { "CONSTANT", CONSTANTU
},
877 { "constant", CONSTANTL
},
880 { "DESCRIPTION", DESCRIPTION
},
881 { "DIRECTIVE", DIRECTIVE
},
882 { "EXECUTE", EXECUTE
},
883 { "EXPORTS", EXPORTS
},
884 { "HEAPSIZE", HEAPSIZE
},
885 { "IMPORTS", IMPORTS
},
886 { "LIBRARY", LIBRARY
},
888 { "NONAME", NONAMEU
},
889 { "noname", NONAMEL
},
890 { "PRIVATE", PRIVATEU
},
891 { "private", PRIVATEL
},
893 { "SECTIONS", SECTIONS
},
894 { "SEGMENTS", SECTIONS
},
895 { "SHARED", SHARED
},
896 { "STACKSIZE", STACKSIZE
},
897 { "VERSION", VERSIONK
},
907 if
(lex_parse_string
)
909 if
(lex_parse_string
>= lex_parse_string_end
)
912 rv
= *lex_parse_string
++;
916 rv
= fgetc
(the_file
);
926 if
(lex_parse_string
)
932 return ungetc
(c
, the_file
);
940 if
(lex_forced_token
)
942 i
= lex_forced_token
;
943 lex_forced_token
= 0;
945 printf
("lex: forcing token %d\n", i
);
952 /* Trim leading whitespace. */
953 while
(c
!= EOF
&& (c
== ' ' || c
== '\t') && saw_newline
)
959 printf
("lex: EOF\n");
964 if
(saw_newline
&& c
== ';')
970 while
(c
!= EOF
&& c
!= '\n');
976 /* Must be something else. */
982 while
(c
!= EOF
&& (ISXDIGIT
(c
) ||
(c
== 'x')))
989 yylval.number
= strtoul
(buffer
, 0, 0);
991 printf
("lex: `%s' returns NUMBER %d\n", buffer
, yylval.number
);
996 if
(ISALPHA
(c
) || strchr
("$:-_?@", c
))
1005 if
(ISBLANK
(c
) ) /* '@' followed by whitespace. */
1007 else if
(ISDIGIT
(c
)) /* '@' followed by digit. */
1013 printf
("lex: @ returns itself\n");
1017 while
(c
!= EOF
&& (ISALNUM
(c
) || strchr
("$:-_?/@", c
)))
1024 if
(ISALPHA
(q
)) /* Check for tokens. */
1026 for
(i
= 0; tokens
[i
].name
; i
++)
1027 if
(strcmp
(tokens
[i
].name
, buffer
) == 0)
1030 printf
("lex: `%s' is a string token\n", buffer
);
1032 return tokens
[i
].token
;
1036 printf
("lex: `%s' returns ID\n", buffer
);
1038 yylval.id
= xstrdup
(buffer
);
1042 if
(c
== '\'' || c
== '"')
1048 while
(c
!= EOF
&& c
!= q
)
1053 yylval.id
= xstrdup
(buffer
);
1055 printf
("lex: `%s' returns ID\n", buffer
);
1060 if
(c
== '=' || c
== '.' || c
== ',')
1063 printf
("lex: `%c' returns itself\n", c
);
1074 /*printf ("lex: 0x%02x ignored\n", c); */