[08/16] libcpu: Change calls for tsearch/tfind to eu_tsearch/eu_tfind.

Message ID 20231010134300.53830-8-mark@klomp.org
State Changes Requested
Headers
Series [01/16] lib: Add new once_define and once macros to eu-config.h |

Commit Message

Mark Wielaard Oct. 10, 2023, 1:42 p.m. UTC
  From: Heather McIntyre <hsm2@rice.edu>

	* libcpu/Makefile.am: Add USE_LOCKS condition for -pthread.
	* libcpu/i386_parse.y: Add eu-search.h and remove search.h.
	Change calls for tsearch/tfind to eu_tsearch/eu_tfind.

Signed-off-by: Heather S. McIntyre <hsm2@rice.edu>
Signed-off-by: Mark Wielaard <mark@klomp.org>
---
 libcpu/Makefile.am  |  3 +++
 libcpu/i386_parse.y | 48 ++++++++++++++++++++++-----------------------
 2 files changed, 27 insertions(+), 24 deletions(-)
  

Comments

Mark Wielaard Oct. 10, 2023, 9:10 p.m. UTC | #1
Hi Heather,

On Tue, Oct 10, 2023 at 03:42:52PM +0200, Mark Wielaard wrote:
> From: Heather McIntyre <hsm2@rice.edu>
> 
> 	* libcpu/Makefile.am: Add USE_LOCKS condition for -pthread.
> 	* libcpu/i386_parse.y: Add eu-search.h and remove search.h.
> 	Change calls for tsearch/tfind to eu_tsearch/eu_tfind.

So in theory this looks like a simple obvious change to use eu-search
instead of search. But I am not sure ths bison parser can even be used
concurrently. It looks like it is using a lot of statics. Also
i386_parse.y uses twalk, which also would have to be wrapped (no other
part of elfutils uses twalk).

I think I would advise to skip the i386 assembler. It isn't really
complete at the moment and it is probably a lot of work to get a
concurrent bison parser.

Cheers,

Mark

> Signed-off-by: Heather S. McIntyre <hsm2@rice.edu>
> Signed-off-by: Mark Wielaard <mark@klomp.org>
> ---
>  libcpu/Makefile.am  |  3 +++
>  libcpu/i386_parse.y | 48 ++++++++++++++++++++++-----------------------
>  2 files changed, 27 insertions(+), 24 deletions(-)
> 
> diff --git a/libcpu/Makefile.am b/libcpu/Makefile.am
> index 4ba1be56..a51334b5 100644
> --- a/libcpu/Makefile.am
> +++ b/libcpu/Makefile.am
> @@ -33,6 +33,9 @@ AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
>  if BUILD_STATIC
>  AM_CFLAGS += $(fpic_CFLAGS)
>  endif
> +if USE_LOCKS
> +  AM_CFLAGS += -pthread
> +endif
>  AM_CFLAGS += -fdollars-in-identifiers
>  LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -P$(<F:lex.l=)
>  LEX_OUTPUT_ROOT = lex.$(<F:lex.l=)
> diff --git a/libcpu/i386_parse.y b/libcpu/i386_parse.y
> index 459684c6..3d7cb89e 100644
> --- a/libcpu/i386_parse.y
> +++ b/libcpu/i386_parse.y
> @@ -37,7 +37,7 @@
>  #include <inttypes.h>
>  #include <math.h>
>  #include <obstack.h>
> -#include <search.h>
> +#include <eu-search.h>
>  #include <stdbool.h>
>  #include <stdio.h>
>  #include <stdlib.h>
> @@ -269,12 +269,12 @@ mask:		  kMASK kBITFIELD kNUMBER
>  		      struct synonym *newp = xmalloc (sizeof (*newp));
>  		      newp->from = $2;
>  		      newp->to = $3;
> -		      if (tfind (newp, &synonyms, compare_syn) != NULL)
> +		      if (eu_tfind (newp, &synonyms, compare_syn) != NULL)
>  			error (0, 0,
>  			       "%d: duplicate definition for synonym '%s'",
>  			       i386_lineno, $2);
> -		      else if (tsearch ( newp, &synonyms, compare_syn) == NULL)
> -			error (EXIT_FAILURE, 0, "tsearch");
> +		      else if (eu_tsearch ( newp, &synonyms, compare_syn) == NULL)
> +			error (EXIT_FAILURE, 0, "eu_tsearch");
>  		    }
>  		|
>  		;
> @@ -308,12 +308,12 @@ instr:		  bytes ':' bitfieldopt kID bitfieldopt optargs
>  			  newp->bytes = $1;
>  			  newp->mnemonic = $4;
>  			  if (newp->mnemonic != (void *) -1l
> -			      && tfind ($4, &mnemonics,
> +			      && eu_tfind ($4, &mnemonics,
>  					(int (*)(const void *, const void *)) strcmp) == NULL)
>  			    {
> -			      if (tsearch ($4, &mnemonics,
> +			      if (eu_tsearch ($4, &mnemonics,
>  					   (int (*)(const void *, const void *)) strcmp) == NULL)
> -				error (EXIT_FAILURE, errno, "tsearch");
> +				error (EXIT_FAILURE, errno, "eu_tsearch");
>  			      ++nmnemonics;
>  			    }
>  
> @@ -339,15 +339,15 @@ instr:		  bytes ':' bitfieldopt kID bitfieldopt optargs
>  				       infname, i386_lineno - 1, $5->name);
>  
>  			      struct suffix search = { .name = $5->name };
> -			      if (tfind (&search, &suffixes, compare_suf)
> +			      if (eu_tfind (&search, &suffixes, compare_suf)
>  				  == NULL)
>  				{
>  				  struct suffix *ns = xmalloc (sizeof (*ns));
>  				  ns->name = $5->name;
>  				  ns->idx = ++nsuffixes;
> -				  if (tsearch (ns, &suffixes, compare_suf)
> +				  if (eu_tsearch (ns, &suffixes, compare_suf)
>  				      == NULL)
> -				    error (EXIT_FAILURE, errno, "tsearch");
> +				    error (EXIT_FAILURE, errno, "eu_tsearch");
>  				}
>  			    }
>  
> @@ -374,7 +374,7 @@ bitfieldopt:	  kBITFIELD
>  		      struct known_bitfield search;
>  		      search.name = $1;
>  		      struct known_bitfield **res;
> -		      res = tfind (&search, &bitfields, bitfield_compare);
> +		      res = eu_tfind (&search, &bitfields, bitfield_compare);
>  		      if (res == NULL)
>  			{
>  			  error (0, 0, "%d: unknown bitfield '%s'",
> @@ -437,7 +437,7 @@ bit:		  '0'
>  		      struct known_bitfield search;
>  		      search.name = $1;
>  		      struct known_bitfield **res;
> -		      res = tfind (&search, &bitfields, bitfield_compare);
> +		      res = eu_tfind (&search, &bitfields, bitfield_compare);
>  		      if (res == NULL)
>  			{
>  			  error (0, 0, "%d: unknown bitfield '%s'",
> @@ -497,7 +497,7 @@ argcomp:	  kBITFIELD
>  		      struct known_bitfield search;
>  		      search.name = $1;
>  		      struct known_bitfield **res;
> -		      res = tfind (&search, &bitfields, bitfield_compare);
> +		      res = eu_tfind (&search, &bitfields, bitfield_compare);
>  		      if (res == NULL)
>  			{
>  			  if (strcmp ($1, "ax") == 0)
> @@ -575,7 +575,7 @@ new_bitfield (char *name, unsigned long int num)
>    newp->bits = num;
>    newp->tmp = 0;
>  
> -  if (tfind (newp, &bitfields, bitfield_compare) != NULL)
> +  if (eu_tfind (newp, &bitfields, bitfield_compare) != NULL)
>      {
>        error (0, 0, "%d: duplicated definition of bitfield '%s'",
>  	     i386_lineno, name);
> @@ -584,7 +584,7 @@ new_bitfield (char *name, unsigned long int num)
>        return;
>      }
>  
> -  if (tsearch (newp, &bitfields, bitfield_compare) == NULL)
> +  if (eu_tsearch (newp, &bitfields, bitfield_compare) == NULL)
>      error (EXIT_FAILURE, errno, "%d: cannot insert new bitfield '%s'",
>  	   i386_lineno, name);
>  }
> @@ -813,7 +813,7 @@ fillin_arg (struct bitvalue *bytes, struct argname *name,
>  
>  	      struct synonym search = { .from = fieldname };
>  
> -	      struct synonym **res = tfind (&search, &synonyms, compare_syn);
> +	      struct synonym **res = eu_tfind (&search, &synonyms, compare_syn);
>  	      if (res != NULL)
>  		fieldname = (*res)->to;
>  
> @@ -914,26 +914,26 @@ find_numbers (void)
>  	if (runp->operands[i].fct != NULL)
>  	  {
>  	    struct argstring search = { .str = runp->operands[i].fct };
> -	    if (tfind (&search, &fct_names[i], compare_argstring) == NULL)
> +	    if (eu_tfind (&search, &fct_names[i], compare_argstring) == NULL)
>  	      {
>  		struct argstring *newp = xmalloc (sizeof (*newp));
>  		newp->str = runp->operands[i].fct;
>  		newp->idx = 0;
> -		if (tsearch (newp, &fct_names[i], compare_argstring) == NULL)
> -		  error (EXIT_FAILURE, errno, "tsearch");
> +		if (eu_tsearch (newp, &fct_names[i], compare_argstring) == NULL)
> +		  error (EXIT_FAILURE, errno, "eu_tsearch");
>  		++nfct_names[i];
>  	      }
>  
>  	    if (runp->operands[i].str != NULL)
>  	      {
>  		search.str = runp->operands[i].str;
> -		if (tfind (&search, &strs[i], compare_argstring) == NULL)
> +		if (eu_tfind (&search, &strs[i], compare_argstring) == NULL)
>  		  {
>  		    struct argstring *newp = xmalloc (sizeof (*newp));
>  		    newp->str = runp->operands[i].str;
>  		    newp->idx = 0;
> -		    if (tsearch (newp, &strs[i], compare_argstring) == NULL)
> -		      error (EXIT_FAILURE, errno, "tsearch");
> +		    if (eu_tsearch (newp, &strs[i], compare_argstring) == NULL)
> +		      error (EXIT_FAILURE, errno, "eu_tsearch");
>  		    ++nstrs[i];
>  		  }
>  	      }
> @@ -1206,7 +1206,7 @@ instrtable_out (void)
>  	  if (instr->operands[i].fct != NULL)
>  	    {
>  	      struct argstring search = { .str = instr->operands[i].fct };
> -	      struct argstring **res = tfind (&search, &fct_names[i],
> +	      struct argstring **res = eu_tfind (&search, &fct_names[i],
>  					      compare_argstring);
>  	      assert (res != NULL);
>  	      idx = (*res)->idx;
> @@ -1217,7 +1217,7 @@ instrtable_out (void)
>  	  if (instr->operands[i].str != NULL)
>  	    {
>  	      struct argstring search = { .str = instr->operands[i].str };
> -	      struct argstring **res = tfind (&search, &strs[i],
> +	      struct argstring **res = eu_tfind (&search, &strs[i],
>  					      compare_argstring);
>  	      assert (res != NULL);
>  	      idx = (*res)->idx;
> -- 
> 2.41.0
>
  

Patch

diff --git a/libcpu/Makefile.am b/libcpu/Makefile.am
index 4ba1be56..a51334b5 100644
--- a/libcpu/Makefile.am
+++ b/libcpu/Makefile.am
@@ -33,6 +33,9 @@  AM_CPPFLAGS += -I$(srcdir)/../libelf -I$(srcdir)/../libebl \
 if BUILD_STATIC
 AM_CFLAGS += $(fpic_CFLAGS)
 endif
+if USE_LOCKS
+  AM_CFLAGS += -pthread
+endif
 AM_CFLAGS += -fdollars-in-identifiers
 LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) -P$(<F:lex.l=)
 LEX_OUTPUT_ROOT = lex.$(<F:lex.l=)
diff --git a/libcpu/i386_parse.y b/libcpu/i386_parse.y
index 459684c6..3d7cb89e 100644
--- a/libcpu/i386_parse.y
+++ b/libcpu/i386_parse.y
@@ -37,7 +37,7 @@ 
 #include <inttypes.h>
 #include <math.h>
 #include <obstack.h>
-#include <search.h>
+#include <eu-search.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -269,12 +269,12 @@  mask:		  kMASK kBITFIELD kNUMBER
 		      struct synonym *newp = xmalloc (sizeof (*newp));
 		      newp->from = $2;
 		      newp->to = $3;
-		      if (tfind (newp, &synonyms, compare_syn) != NULL)
+		      if (eu_tfind (newp, &synonyms, compare_syn) != NULL)
 			error (0, 0,
 			       "%d: duplicate definition for synonym '%s'",
 			       i386_lineno, $2);
-		      else if (tsearch ( newp, &synonyms, compare_syn) == NULL)
-			error (EXIT_FAILURE, 0, "tsearch");
+		      else if (eu_tsearch ( newp, &synonyms, compare_syn) == NULL)
+			error (EXIT_FAILURE, 0, "eu_tsearch");
 		    }
 		|
 		;
@@ -308,12 +308,12 @@  instr:		  bytes ':' bitfieldopt kID bitfieldopt optargs
 			  newp->bytes = $1;
 			  newp->mnemonic = $4;
 			  if (newp->mnemonic != (void *) -1l
-			      && tfind ($4, &mnemonics,
+			      && eu_tfind ($4, &mnemonics,
 					(int (*)(const void *, const void *)) strcmp) == NULL)
 			    {
-			      if (tsearch ($4, &mnemonics,
+			      if (eu_tsearch ($4, &mnemonics,
 					   (int (*)(const void *, const void *)) strcmp) == NULL)
-				error (EXIT_FAILURE, errno, "tsearch");
+				error (EXIT_FAILURE, errno, "eu_tsearch");
 			      ++nmnemonics;
 			    }
 
@@ -339,15 +339,15 @@  instr:		  bytes ':' bitfieldopt kID bitfieldopt optargs
 				       infname, i386_lineno - 1, $5->name);
 
 			      struct suffix search = { .name = $5->name };
-			      if (tfind (&search, &suffixes, compare_suf)
+			      if (eu_tfind (&search, &suffixes, compare_suf)
 				  == NULL)
 				{
 				  struct suffix *ns = xmalloc (sizeof (*ns));
 				  ns->name = $5->name;
 				  ns->idx = ++nsuffixes;
-				  if (tsearch (ns, &suffixes, compare_suf)
+				  if (eu_tsearch (ns, &suffixes, compare_suf)
 				      == NULL)
-				    error (EXIT_FAILURE, errno, "tsearch");
+				    error (EXIT_FAILURE, errno, "eu_tsearch");
 				}
 			    }
 
@@ -374,7 +374,7 @@  bitfieldopt:	  kBITFIELD
 		      struct known_bitfield search;
 		      search.name = $1;
 		      struct known_bitfield **res;
-		      res = tfind (&search, &bitfields, bitfield_compare);
+		      res = eu_tfind (&search, &bitfields, bitfield_compare);
 		      if (res == NULL)
 			{
 			  error (0, 0, "%d: unknown bitfield '%s'",
@@ -437,7 +437,7 @@  bit:		  '0'
 		      struct known_bitfield search;
 		      search.name = $1;
 		      struct known_bitfield **res;
-		      res = tfind (&search, &bitfields, bitfield_compare);
+		      res = eu_tfind (&search, &bitfields, bitfield_compare);
 		      if (res == NULL)
 			{
 			  error (0, 0, "%d: unknown bitfield '%s'",
@@ -497,7 +497,7 @@  argcomp:	  kBITFIELD
 		      struct known_bitfield search;
 		      search.name = $1;
 		      struct known_bitfield **res;
-		      res = tfind (&search, &bitfields, bitfield_compare);
+		      res = eu_tfind (&search, &bitfields, bitfield_compare);
 		      if (res == NULL)
 			{
 			  if (strcmp ($1, "ax") == 0)
@@ -575,7 +575,7 @@  new_bitfield (char *name, unsigned long int num)
   newp->bits = num;
   newp->tmp = 0;
 
-  if (tfind (newp, &bitfields, bitfield_compare) != NULL)
+  if (eu_tfind (newp, &bitfields, bitfield_compare) != NULL)
     {
       error (0, 0, "%d: duplicated definition of bitfield '%s'",
 	     i386_lineno, name);
@@ -584,7 +584,7 @@  new_bitfield (char *name, unsigned long int num)
       return;
     }
 
-  if (tsearch (newp, &bitfields, bitfield_compare) == NULL)
+  if (eu_tsearch (newp, &bitfields, bitfield_compare) == NULL)
     error (EXIT_FAILURE, errno, "%d: cannot insert new bitfield '%s'",
 	   i386_lineno, name);
 }
@@ -813,7 +813,7 @@  fillin_arg (struct bitvalue *bytes, struct argname *name,
 
 	      struct synonym search = { .from = fieldname };
 
-	      struct synonym **res = tfind (&search, &synonyms, compare_syn);
+	      struct synonym **res = eu_tfind (&search, &synonyms, compare_syn);
 	      if (res != NULL)
 		fieldname = (*res)->to;
 
@@ -914,26 +914,26 @@  find_numbers (void)
 	if (runp->operands[i].fct != NULL)
 	  {
 	    struct argstring search = { .str = runp->operands[i].fct };
-	    if (tfind (&search, &fct_names[i], compare_argstring) == NULL)
+	    if (eu_tfind (&search, &fct_names[i], compare_argstring) == NULL)
 	      {
 		struct argstring *newp = xmalloc (sizeof (*newp));
 		newp->str = runp->operands[i].fct;
 		newp->idx = 0;
-		if (tsearch (newp, &fct_names[i], compare_argstring) == NULL)
-		  error (EXIT_FAILURE, errno, "tsearch");
+		if (eu_tsearch (newp, &fct_names[i], compare_argstring) == NULL)
+		  error (EXIT_FAILURE, errno, "eu_tsearch");
 		++nfct_names[i];
 	      }
 
 	    if (runp->operands[i].str != NULL)
 	      {
 		search.str = runp->operands[i].str;
-		if (tfind (&search, &strs[i], compare_argstring) == NULL)
+		if (eu_tfind (&search, &strs[i], compare_argstring) == NULL)
 		  {
 		    struct argstring *newp = xmalloc (sizeof (*newp));
 		    newp->str = runp->operands[i].str;
 		    newp->idx = 0;
-		    if (tsearch (newp, &strs[i], compare_argstring) == NULL)
-		      error (EXIT_FAILURE, errno, "tsearch");
+		    if (eu_tsearch (newp, &strs[i], compare_argstring) == NULL)
+		      error (EXIT_FAILURE, errno, "eu_tsearch");
 		    ++nstrs[i];
 		  }
 	      }
@@ -1206,7 +1206,7 @@  instrtable_out (void)
 	  if (instr->operands[i].fct != NULL)
 	    {
 	      struct argstring search = { .str = instr->operands[i].fct };
-	      struct argstring **res = tfind (&search, &fct_names[i],
+	      struct argstring **res = eu_tfind (&search, &fct_names[i],
 					      compare_argstring);
 	      assert (res != NULL);
 	      idx = (*res)->idx;
@@ -1217,7 +1217,7 @@  instrtable_out (void)
 	  if (instr->operands[i].str != NULL)
 	    {
 	      struct argstring search = { .str = instr->operands[i].str };
-	      struct argstring **res = tfind (&search, &strs[i],
+	      struct argstring **res = eu_tfind (&search, &strs[i],
 					      compare_argstring);
 	      assert (res != NULL);
 	      idx = (*res)->idx;