Index: src/binutils/defparse.y =================================================================== --- src.orig/binutils/defparse.y 2009-10-23 16:53:56.000000000 +0200 +++ src/binutils/defparse.y 2010-07-10 16:22:06.425767500 +0200 @@ -40,7 +40,7 @@ %token NUMBER %type opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE %type attr attr_list opt_number -%type opt_name opt_equal_name opt_import_name +%type opt_name opt_equal_name opt_import_name all_id allids_nobase %% @@ -52,7 +52,7 @@ NAME opt_name opt_base { def_name ($2, $3); } | LIBRARY opt_name opt_base option_list { def_library ($2, $3); } | EXPORTS explist - | DESCRIPTION ID { def_description ($2);} + | DESCRIPTION all_id { def_description ($2);} | STACKSIZE NUMBER opt_number { def_stacksize ($2, $3);} | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} | CODE attr_list { def_code ($2);} @@ -70,7 +70,7 @@ ; expline: - ID opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE + all_id opt_equal_name opt_ordinal opt_NONAME opt_CONSTANT opt_DATA opt_PRIVATE opt_import_name { def_exports ($1, $2, $3, $4, $5, $6, $7, $8);} ; @@ -80,21 +80,21 @@ ; impline: - ID '=' ID '.' ID '.' ID opt_import_name + all_id '=' all_id '.' all_id '.' all_id opt_import_name { def_import ($1,$3,$5,$7, 0, $8); } - | ID '=' ID '.' ID '.' NUMBER opt_import_name + | all_id '=' all_id '.' all_id '.' NUMBER opt_import_name { def_import ($1,$3,$5, 0,$7, $8); } - | ID '=' ID '.' ID opt_import_name + | all_id '=' all_id '.' all_id opt_import_name { def_import ($1,$3, 0,$5, 0, $6); } - | ID '=' ID '.' NUMBER opt_import_name + | all_id '=' all_id '.' NUMBER opt_import_name { def_import ($1,$3, 0, 0,$5, $6); } - | ID '.' ID '.' ID opt_import_name + | all_id '.' all_id '.' all_id opt_import_name { def_import ( 0,$1,$3,$5, 0, $6); } - | ID '.' ID '.' NUMBER opt_import_name + | all_id '.' all_id '.' NUMBER opt_import_name { def_import ( 0,$1,$3, 0,$5, $6); } - | ID '.' ID opt_import_name + | all_id '.' all_id opt_import_name { def_import ( 0,$1, 0,$3, 0, $4); } - | ID '.' NUMBER opt_import_name + | all_id '.' NUMBER opt_import_name { def_import ( 0,$1, 0, 0,$3, $4); } ; @@ -104,7 +104,7 @@ ; secline: - ID attr_list { def_section ($1,$2);} + all_id attr_list { def_section ($1,$2);} ; attr_list: @@ -150,14 +150,20 @@ | { $$ = 0; } ; -opt_name: ID { $$ =$1; } - | ID '.' ID +opt_name: allids_nobase { $$ = $1; } + | '.' allids_nobase + { + char *name = xmalloc (strlen ($2) + 2); + sprintf (name, ".%s", $2); + $$ = name; + } + | all_id '.' allids_nobase { char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); sprintf (name, "%s.%s", $1, $3); $$ = name; } - | { $$=""; } + | { $$ = ""; } ; opt_ordinal: @@ -166,13 +172,13 @@ ; opt_import_name: - EQUAL ID { $$ = $2; } + EQUAL all_id { $$ = $2; } | { $$ = 0; } ; opt_equal_name: - '=' ID { $$ = $2; } - | '=' ID '.' ID + '=' all_id { $$ = $2; } + | '=' all_id '.' all_id { char *name = xmalloc (strlen ($2) + 1 + strlen ($4) + 1); sprintf (name, "%s.%s", $2, $4); @@ -196,3 +202,35 @@ | TERMINSTANCE | TERMGLOBAL ; + +all_id: allids_nobase { $$ = $1; } + | BASE { $$ = xstrdup ("BASE"); } + ; + +allids_nobase: ID { $$ = $1; } + | NAME { $$ = xstrdup ("NAME"); } + | LIBRARY { $$ = xstrdup ("LIBRARY"); } + | DESCRIPTION { $$ = xstrdup ("DESCRIPTION"); } + | STACKSIZE { $$ = xstrdup ("STACKSIZE"); } + | HEAPSIZE { $$ = xstrdup ("HEAPSIZE"); } + | CODE { $$ = xstrdup ("CODE"); } + | DATA { $$ = xstrdup ("DATA"); } + | SECTIONS { $$ = xstrdup ("SECTIONS"); } + | EXPORTS { $$ = xstrdup ("EXPORTS"); } + | IMPORTS { $$ = xstrdup ("IMPORTS"); } + | VERSIONK { $$ = xstrdup ("VERSION"); } + | CONSTANT { $$ = xstrdup ("CONSTANT"); } + | NONAME { $$ = xstrdup ("NONAME"); } + | PRIVATE { $$ = xstrdup ("PRIVATE"); } + | READ { $$ = xstrdup ("READ"); } + | WRITE { $$ = xstrdup ("WRITE"); } + | EXECUTE { $$ = xstrdup ("EXECUTE"); } + | SHARED { $$ = xstrdup ("SHARED"); } + | NONSHARED { $$ = xstrdup ("NONSHARED"); } + | SINGLE { $$ = xstrdup ("SINGLE"); } + | MULTIPLE { $$ = xstrdup ("MULTIPLE"); } + | INITINSTANCE { $$ = xstrdup ("INITINSTANCE"); } + | INITGLOBAL { $$ = xstrdup ("INITGLOBAL"); } + | TERMINSTANCE { $$ = xstrdup ("TERMINSTANCE"); } + | TERMGLOBAL { $$ = xstrdup ("TERMGLOBAL"); } + ; Index: src/ld/deffilep.y =================================================================== --- src.orig/ld/deffilep.y 2010-05-25 12:04:08.000000000 +0200 +++ src/ld/deffilep.y 2010-07-10 16:15:41.727764000 +0200 @@ -107,7 +107,7 @@ }; %token NAME LIBRARY DESCRIPTION STACKSIZE_K HEAPSIZE CODE DATAU DATAL -%token SECTIONS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL +%token SECTIONS SEGMENTS EXPORTS IMPORTS VERSIONK BASE CONSTANTU CONSTANTL %token PRIVATEU PRIVATEL ALIGNCOMM %token READ WRITE EXECUTE SHARED NONAMEU NONAMEL DIRECTIVE EQUAL %token ID @@ -117,6 +117,7 @@ %type opt_base opt_ordinal %type attr attr_list opt_number exp_opt_list exp_opt %type opt_name opt_equal_name dot_name anylang_id opt_id +%type allids allids_noattrib allids_nobase %type opt_equalequal_name %% @@ -128,17 +129,18 @@ command: NAME opt_name opt_base { def_image_name ($2, $3, 0); } | LIBRARY opt_name opt_base { def_image_name ($2, $3, 1); } - | DESCRIPTION ID { def_description ($2);} + | DESCRIPTION allids { def_description ($2);} | STACKSIZE_K NUMBER opt_number { def_stacksize ($2, $3);} | HEAPSIZE NUMBER opt_number { def_heapsize ($2, $3);} | CODE attr_list { def_section ("CODE", $2);} | DATAU attr_list { def_section ("DATA", $2);} | SECTIONS seclist + | SEGMENTS seclist | EXPORTS explist | IMPORTS implist | VERSIONK NUMBER { def_version ($2, 0);} | VERSIONK NUMBER '.' NUMBER { def_version ($2, $4);} - | DIRECTIVE ID { def_directive ($2);} + | DIRECTIVE allids { def_directive ($2);} | ALIGNCOMM anylang_id ',' NUMBER { def_aligncomm ($2, $4);} ; @@ -179,17 +181,17 @@ ; impline: - ID '=' ID '.' ID '.' ID opt_equalequal_name + allids '=' allids '.' allids '.' allids opt_equalequal_name { def_import ($1, $3, $5, $7, -1, $8); } - | ID '=' ID '.' ID '.' NUMBER opt_equalequal_name + | allids '=' allids '.' allids '.' NUMBER opt_equalequal_name { def_import ($1, $3, $5, 0, $7, $8); } - | ID '=' ID '.' ID opt_equalequal_name + | allids '=' allids '.' allids opt_equalequal_name { def_import ($1, $3, 0, $5, -1, $6); } - | ID '=' ID '.' NUMBER opt_equalequal_name + | allids '=' allids '.' NUMBER opt_equalequal_name { def_import ($1, $3, 0, 0, $5, $6); } - | ID '.' ID '.' ID opt_equalequal_name + | allids '.' allids '.' allids opt_equalequal_name { def_import( 0, $1, $3, $5, -1, $6); } - | ID '.' ID opt_equalequal_name + | allids '.' allids opt_equalequal_name { def_import ( 0, $1, 0, $3, -1, $4); } ; @@ -199,8 +201,8 @@ ; secline: - ID attr_list { def_section ($1, $2);} - | ID ID { def_section_alt ($1, $2);} + allids attr_list { def_section ($1, $2);} + | allids allids_noattrib { def_section_alt ($1, $2);} ; attr_list: @@ -223,14 +225,14 @@ | SHARED { $$=8;} ; -opt_name: ID { $$ = $1; } - | '.' ID +opt_name: allids_nobase { $$ = $1; } + | '.' allids_nobase { char *name = xmalloc (strlen ($2) + 2); sprintf (name, ".%s", $2); $$ = name; } - | ID '.' ID + | allids '.' allids_nobase { char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); sprintf (name, "%s.%s", $1, $3); @@ -239,7 +241,7 @@ | { $$ = ""; } ; -opt_equalequal_name: EQUAL ID { $$ = $2; } +opt_equalequal_name: EQUAL allids { $$ = $2; } | { $$ = 0; } ; @@ -257,14 +259,14 @@ | { $$ = -1;} ; -dot_name: ID { $$ = $1; } - | '.' ID +dot_name: allids { $$ = $1; } + | '.' allids { char *name = xmalloc (strlen ($2) + 2); sprintf (name, ".%s", $2); $$ = name; } - | dot_name '.' ID + | dot_name '.' allids { char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1); sprintf (name, "%s.%s", $1, $3); @@ -272,8 +274,8 @@ } ; -anylang_id: ID { $$ = $1; } - | '.' ID +anylang_id: allids { $$ = $1; } + | '.' allids { char *id = xmalloc (strlen ($2) + 2); sprintf (id, ".%s", $2); @@ -291,12 +293,67 @@ | { $$ = ""; } ; -opt_id: ID { $$ = $1; } +opt_id: allids { $$ = $1; } | { $$ = ""; } ; NUMBER: DIGITS { $$ = strtoul ($1, 0, 0); } +allids: allids_nobase { $$ = $1; } + | BASE { $$ = xstrdup ("BASE"); } +; + +allids_nobase: ID { $$ = $1; } + | CODE { $$ = xstrdup ("CODE"); } + | CONSTANTU { $$ = xstrdup ("CONSTANT"); } + | CONSTANTL { $$ = xstrdup ("constant"); } + | DATAU { $$ = xstrdup ("DATA"); } + | DATAL { $$ = xstrdup ("data"); } + | DESCRIPTION { $$ = xstrdup ("DESCRIPTION"); } + | DIRECTIVE { $$ = xstrdup ("DIRECTIVE"); } + | EXECUTE { $$ = xstrdup ("EXECUTE"); } + | EXPORTS { $$ = xstrdup ("EXPORTS"); } + | HEAPSIZE { $$ = xstrdup ("HEAPSIZE"); } + | IMPORTS { $$ = xstrdup ("IMPORTS"); } + | LIBRARY { $$ = xstrdup ("LIBRARY"); } + | NAME { $$ = xstrdup ("NAME"); } + | NONAMEU { $$ = "NONAME"; } + | NONAMEL { $$ = xstrdup ("noname"); } + | PRIVATEU { $$ = xstrdup ("PRIVATE"); } + | PRIVATEL { $$ = xstrdup ("private"); } + | READ { $$ = xstrdup ("READ"); } + | SECTIONS { $$ = xstrdup ("SECTIONS"); } + | SEGMENTS { $$ = xstrdup ("SEGMENTS"); } + | SHARED { $$ = xstrdup ("SHARED"); } + | STACKSIZE_K { $$ = xstrdup ("STACKSIZE"); } + | VERSIONK { $$ = xstrdup ("VERSION"); } + | WRITE { $$ = xstrdup ("WRITE"); } +; + +allids_noattrib: ID { $$ = $1; } + | BASE { $$ = xstrdup ("BASE"); } + | CODE { $$ = xstrdup ("CODE"); } + | CONSTANTU { $$ = xstrdup ("CONSTANT"); } + | CONSTANTL { $$ = xstrdup ("constant"); } + | DATAU { $$ = xstrdup ("DATA"); } + | DATAL { $$ = xstrdup ("data"); } + | DESCRIPTION { $$ = xstrdup ("DESCRIPTION"); } + | DIRECTIVE { $$ = xstrdup ("DIRECTIVE"); } + | EXPORTS { $$ = xstrdup ("EXPORTS"); } + | HEAPSIZE { $$ = xstrdup ("HEAPSIZE"); } + | IMPORTS { $$ = xstrdup ("IMPORTS"); } + | LIBRARY { $$ = xstrdup ("LIBRARY"); } + | NAME { $$ = xstrdup ("NAME"); } + | NONAMEU { $$ = "NONAME"; } + | NONAMEL { $$ = xstrdup ("noname"); } + | PRIVATEU { $$ = xstrdup ("PRIVATE"); } + | PRIVATEL { $$ = xstrdup ("private"); } + | SECTIONS { $$ = xstrdup ("SECTIONS"); } + | SEGMENTS { $$ = xstrdup ("SEGMENTS"); } + | STACKSIZE_K { $$ = xstrdup ("STACKSIZE"); } + | VERSIONK { $$ = xstrdup ("VERSION"); } +; + %% /***************************************************************************** @@ -957,6 +1014,7 @@ char *name; int token; } + tokens[] = { { "BASE", BASE }, @@ -979,7 +1037,7 @@ { "private", PRIVATEL }, { "READ", READ }, { "SECTIONS", SECTIONS }, - { "SEGMENTS", SECTIONS }, + { "SEGMENTS", SEGMENTS }, { "SHARED", SHARED }, { "STACKSIZE", STACKSIZE_K }, { "VERSION", VERSIONK }, @@ -1109,7 +1167,7 @@ } if (c != EOF) def_ungetc (c); - if (ISALPHA (q)) /* Check for tokens. */ + if (ISALPHA (q) && (c != EOF && c != '.')) /* Check for tokens. */ { for (i = 0; tokens[i].name; i++) if (strcmp (tokens[i].name, buffer) == 0)