This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch binutils/ld]: Fix name-issue in def-file parser PR /13657


Hi,

this patch fixes for dlltool and ld the name-parsing in .y-files.

ChangeLog binutils

2012-02-11  Kai Tietz  <ktietz@redhat.com>

	PR binutils/13657
	* defparse.y (%union): New type id_const.
	(opt_name2): New rule.
	(keyword_as_name): New rule.
	(opt_name): Adjust rule.
	(opt_import_name): Likewise.
	(opt_equal_name): Likewise.

ChangeLog binutils/testsuite

2012-02-11  Kai Tietz  <ktietz@redhat.com>

	* binutils-all/version.def: New file.
	* binutils-all/dlltool.exp: Add version-dll test.

ChangeLog ld

2012-02-11  Kai Tietz  <ktietz@redhat.com>

	* deffilep.y (%union): New type id_const.
	(opt_name2): New rule.
	(keyword_as_name): New rule.
	(dot_name): Replaced by opt_name2 rule.
	(opt_name): Adjust rule.
	(opt_equal_name): Likewise.

Tested for i686-w64-mingw32, x86_64-w64-mingw32, and i686-pc-cygwin.
Ok for apply?

Regards,
Kai

Index: src/binutils/defparse.y
===================================================================
--- src.orig/binutils/defparse.y
+++ src/binutils/defparse.y
@@ -28,6 +28,7 @@

 %union {
   char *id;
+  const char *id_const;
   int number;
 };

@@ -40,7 +41,8 @@
 %token <number> NUMBER
 %type  <number> opt_base opt_ordinal opt_NONAME opt_CONSTANT opt_DATA
opt_PRIVATE
 %type  <number> attr attr_list opt_number
-%type  <id> opt_name opt_equal_name opt_import_name
+%type  <id> opt_name opt_name2 opt_equal_name opt_import_name
+%type  <id_const> keyword_as_name

 %%

@@ -150,13 +152,61 @@ opt_PRIVATE:
 	|		{ $$ = 0; }
 	;

-opt_name: ID		{ $$ =$1; }
-	| ID '.' ID	
+keyword_as_name: NAME { $$ = "NAME"; }
+	| LIBRARY { $$ = "LIBRARY"; }
+	| DESCRIPTION { $$ = "DESCRIPTION"; }
+	| STACKSIZE { $$ = "STACKSIZE"; }
+	| HEAPSIZE { $$ = "HEAPSIZE"; }
+	| CODE { $$ = "CODE"; }
+	| DATA { $$ = "DATA"; }
+	| SECTIONS { $$ = "SECTIONS"; }
+	| EXPORTS { $$ = "EXPORTS"; }
+	| IMPORTS { $$ = "IMPORTS"; }
+	| VERSIONK { $$ = "VERSION"; }
+	| BASE { $$ = "BASE"; }
+	| CONSTANT { $$ = "CONSTANT"; }
+	| NONAME { $$ = "NONAME"; }
+	| PRIVATE { $$ = "PRIVATE"; }
+	| READ { $$ = "READ"; }
+	| WRITE { $$ = "WRITE"; }
+	| EXECUTE { $$ = "EXECUTE"; }
+	| SHARED { $$ = "SHARED"; }
+	| NONSHARED { $$ = "NONSHARED"; }
+	| SINGLE { $$ = "SINGLE"; }
+	| MULTIPLE { $$ = "MULTIPLE"; }
+	| INITINSTANCE { $$ = "INITINSTANCE"; }
+	| INITGLOBAL { $$ = "INITGLOBAL"; }
+	| TERMINSTANCE { $$ = "TERMINSTANCE"; }
+	| TERMGLOBAL { $$ = "TERMGLOBAL"; }
+	;
+
+opt_name2: ID { $$ = $1; }
+	| '.' keyword_as_name
+	  {
+	    char *name = xmalloc (strlen ($2) + 2);
+	    sprintf (name, ".%s", $2);
+	    $$ = name;
+	  }
+	| '.' opt_name2
+	  {
+	    char *name = xmalloc (strlen ($2) + 2);
+	    sprintf (name, ".%s", $2);
+	    $$ = name;
+	  }
+	| keyword_as_name '.' opt_name2
+	  {
+	    char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1);
+	    sprintf (name, "%s.%s", $1, $3);
+	    $$ = name;
+	  }
+	| ID '.' opt_name2
 	  {
 	    char *name = xmalloc (strlen ($1) + 1 + strlen ($3) + 1);
 	    sprintf (name, "%s.%s", $1, $3);
 	    $$ = name;
 	  }
+	;
+opt_name: opt_name2 { $$ =$1; }
 	|		{ $$=""; }
 	;

@@ -166,18 +216,12 @@ opt_ordinal:
 	;

 opt_import_name:
-	  EQUAL ID	{ $$ = $2; }
+	  EQUAL opt_name2	{ $$ = $2; }
 	|		{ $$ = 0; }
 	;

 opt_equal_name:
-          '=' ID	{ $$ = $2; }
-	| '=' ID '.' ID	
-	  {
-	    char *name = xmalloc (strlen ($2) + 1 + strlen ($4) + 1);
-	    sprintf (name, "%s.%s", $2, $4);
-	    $$ = name;
-	  }
+          '=' opt_name2	{ $$ = $2; }
         | 		{ $$ =  0; }			
 	;

Index: src/binutils/testsuite/binutils-all/dlltool.exp
===================================================================
--- src.orig/binutils/testsuite/binutils-all/dlltool.exp
+++ src/binutils/testsuite/binutils-all/dlltool.exp
@@ -53,6 +53,17 @@ if { "$target_xfail" == "yes" } {
     setup_xfail *-*
 }

+verbose "$DLLTOOL -l libversion.a --def $srcdir/$subdir/version.def" 1
+catch "exec $DLLTOOL -l libersion.a --def $srcdir/$subdir/version.def" err
+
+if ![string match "" $err] then {
+    send_log "$err\n"
+    verbose "$err" 1
+    fail "dlltool (version.dll)"
+} else {
+    pass "dlltool (version.dll)"
+}
+
 verbose "$DLLTOOL -p prefix --leading-underscore -l tmpdir/libalias.a
-d $srcdir/$subdir/alias.def $dlltool_gas_flag" 1
 catch "exec $DLLTOOL -p prefix --leading-underscore -l
tmpdir/libalias.a -d $srcdir/$subdir/alias.def $dlltool_gas_flag" err

Index: src/binutils/testsuite/binutils-all/version.def
===================================================================
--- /dev/null
+++ src/binutils/testsuite/binutils-all/version.def
@@ -0,0 +1,17 @@
+LIBRARY VERSION.dll
+EXPORTS
+GetFileVersionInfoA1
+GetFileVersionInfoSizeA2
+GetFileVersionInfoSizeW3
+GetFileVersionInfoW4
+VerFindFileA5
+VerFindFileW6
+VerInstallFileA7
+VerInstallFileW8
+VerLanguageNameA9
+VerLanguageNameW10
+VerQueryValueA11
+VerQueryValueIndexA12
+VerQueryValueIndexW13
+VerQueryValueW14
+
Index: src/ld/deffilep.y
===================================================================
--- src.orig/ld/deffilep.y
+++ src/ld/deffilep.y
@@ -113,6 +113,7 @@ static const char *lex_parse_string_end

 %union {
   char *id;
+  const char *id_const;
   int number;
   char *digits;
 };
@@ -127,8 +128,9 @@ static const char *lex_parse_string_end
 %type  <digits> opt_digits
 %type  <number> opt_base opt_ordinal
 %type  <number> attr attr_list opt_number exp_opt_list exp_opt
-%type  <id> opt_name opt_equal_name dot_name anylang_id opt_id
+%type  <id> opt_name opt_name2 opt_equal_name anylang_id opt_id
 %type  <id> opt_equalequal_name
+%type  <id_const> keyword_as_name

 %%

@@ -164,7 +166,7 @@ expline:
 		/* The opt_comma is necessary to support both the usual
 		  DEF file syntax as well as .drectve syntax which
 		  mandates <expsym>,<expoptlist>.  */
-		dot_name opt_equal_name opt_ordinal opt_comma exp_opt_list
opt_comma opt_equalequal_name
+		opt_name2 opt_equal_name opt_ordinal opt_comma exp_opt_list
opt_comma opt_equalequal_name
 			{ def_exports ($1, $2, $3, $5, $7); }
 	;
 exp_opt_list:
@@ -234,19 +236,60 @@ attr:
 	|	SHARED	{ $$=8;}
 	;

-opt_name: ID		{ $$ = $1; }
-	| '.' ID
+
+keyword_as_name: BASE { $$ = "BASE"; }
+	 | CODE { $$ = "CODE"; }
+	 | CONSTANTU { $$ = "CONSTANT"; }
+	 | CONSTANTL { $$ = "constant"; }
+	 | DATAU { $$ = "DATA"; }
+	 | DATAL { $$ = "data"; }
+	 | DESCRIPTION { $$ = "DESCRIPTION"; }
+	 | DIRECTIVE { $$ = "DIRECTIVE"; }
+	 | EXECUTE { $$ = "EXECUTE"; }
+	 | EXPORTS { $$ = "EXPORTS"; }
+	 | HEAPSIZE { $$ = "HEAPSIZE"; }
+	 | IMPORTS { $$ = "IMPORTS"; }
+	 | LIBRARY { $$ = "LIBRARY"; }
+	 | NAME { $$ = "NAME"; }
+	 | NONAMEU { $$ = "NONAME"; }
+	 | NONAMEL { $$ = "noname"; }
+	 | PRIVATEU { $$ = "PRIVATE"; }
+	 | PRIVATEL { $$ = "private"; }
+	 | READ { $$ = "READ"; }
+	 | SHARED  { $$ = "SHARED"; }
+	 | STACKSIZE_K { $$ = "STACKSIZE"; }
+	 | VERSIONK { $$ = "VERSION"; }
+	 | WRITE { $$ = "WRITE"; }
+	 ;
+
+opt_name2: ID { $$ = $1; }
+	| '.' keyword_as_name
 	  {
+	    char *name = xmalloc (strlen ($2) + 2);
+	    sprintf (name, ".%s", $2);
+	    $$ = name;
+	  }
+	| '.' opt_name2
+	  {
 	    char *name = def_pool_alloc (strlen ($2) + 2);
 	    sprintf (name, ".%s", $2);
 	    $$ = name;
 	  }
-	| ID '.' ID	
+	| keyword_as_name '.' opt_name2
 	  {
 	    char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
 	    sprintf (name, "%s.%s", $1, $3);
 	    $$ = name;
 	  }
+	| ID '.' opt_name2
+	  {
+	    char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
+	    sprintf (name, "%s.%s", $1, $3);
+	    $$ = name;
+	  }
+	;
+
+opt_name: opt_name2 { $$ = $1; }
 	|		{ $$ = ""; }
 	;

@@ -260,7 +303,7 @@ opt_ordinal:
 	;

 opt_equal_name:
-          '=' dot_name	{ $$ = $2; }
+          '=' opt_name2	{ $$ = $2; }
         | 		{ $$ =  0; }			
 	;

@@ -268,21 +311,6 @@ opt_base: BASE	'=' NUMBER	{ $$ = $3;}
 	|	{ $$ = -1;}
 	;

-dot_name: ID		{ $$ = $1; }
-	| '.' ID
-	  {
-	    char *name = def_pool_alloc (strlen ($2) + 2);
-	    sprintf (name, ".%s", $2);
-	    $$ = name;
-	  }
-	| dot_name '.' ID	
-	  {
-	    char *name = def_pool_alloc (strlen ($1) + 1 + strlen ($3) + 1);
-	    sprintf (name, "%s.%s", $1, $3);
-	    $$ = name;
-	  }
-	;
-
 anylang_id: ID		{ $$ = $1; }
 	| '.' ID
 	  {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]