This is the mail archive of the binutils@sourceware.cygnus.com 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]

patch for c++filt



This patch is meant to solve a problem reported by Joe Buck back in
February, and forwarded by Jeff Law to the GDB group.

If you think this change is overkill, I have a milder approach in mind
(simply adding an (current_demangling_style == hp_demangling) to the
big hairy `if' condition in main), which I would be happy to prepare
an alternative patch to implement.

binutils/libiberty/ChangeLog:

1999-05-11  Jim Blandy  <jimb@zwingli.cygnus.com>

	* cplus-dem.c (main): Use table lookup to distinguish identifier
	characters from non-identifier characters.
	(standard_symbol_alphabet, hp_symbol_alphabet): New functions.

Index: cplus-dem.c
===================================================================
RCS file: /cvs/binutils/binutils/libiberty/cplus-dem.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 cplus-dem.c
*** cplus-dem.c	1999/05/03 07:28:54	1.1.1.1
--- cplus-dem.c	1999/05/11 16:18:09
***************
*** 4379,4384 ****
--- 4379,4444 ----
    fatal ("Internal gcc abort.");
  }
  
+ 
+ /* Fill in TABLE so that TABLE[C] is true iff C (as an unsigned char)
+    is a valid symbol component, in the standard assembler symbol
+    syntax.  */
+ void
+ standard_symbol_alphabet (char *table)
+ {
+   int c;
+ 
+   for (c = 0; c < 256; c++)
+     table[c] = isalnum(c);
+ 
+   table['_'] = 1;
+   table['$'] = 1;
+   table['.'] = 1;
+ }
+ 
+ 
+ /* Fill in TABLE so that TABLE[C] is true iff C (as an unsigned char)
+    is a valid symbol name component in an HP object file.
+ 
+    Note that, since HP's compiler generates object code straight from
+    C++ source, without going through an assembler, its mangled
+    identifiers can use all sorts of characters that no assembler would
+    tolerate, so the alphabet this function creates is a little odd.
+    Here are some sample mangled identifiers offered by HP:
+ 
+ 	typeid*__XT24AddressIndExpClassMember_
+ 	[Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv
+ 	__ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv
+ 
+    This still seems really weird to me, since nowhere else in this
+    file is there anything to recognize curly brackets, parens, etc.
+    I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me
+    this is right, but I still strongly suspect that there's a
+    misunderstanding here.
+ 
+    If we decide it's better for c++filt to use HP's assembler syntax
+    to scrape identifiers out of its input, here's the definition of
+    the symbol name syntax from the HP assembler manual:
+ 
+        Symbols are composed of uppercase and lowercase letters, decimal
+        digits, dollar symbol, period (.), ampersand (&), pound sign(#) and
+        underscore (_). A symbol can begin with a letter, digit underscore or
+        dollar sign. If a symbol begins with a digit, it must contain a
+        non-digit character.
+ 
+    So have fun.  */
+ void
+ hp_symbol_alphabet (char *table)
+ {
+   char *c;
+ 
+   standard_symbol_alphabet (table);
+ 
+   for (c = "<>#,*&[]:(){}"; *c; c++)
+     table[(unsigned char) *c] = 1;
+ }
+ 
+ 
  int
  main (argc, argv)
       int argc;
***************
*** 4386,4391 ****
--- 4446,4452 ----
  {
    char *result;
    int c;
+   char symbol_alphabet[256];
  
    program_name = argv[0];
  
***************
*** 4452,4467 ****
      }
    else
      {
        for (;;)
  	{
  	  int i = 0;
  	  c = getchar ();
  	  /* Try to read a label.  */
! 	  while (c != EOF && (isalnum(c) || c == '_' || c == '$' || c == '.' ||
!                               c == '<' || c == '>' || c == '#' || c == ',' || c == '*' || c == '&' ||
!                               c == '[' || c == ']' || c == ':' || c == '(' || c == ')'))
!                               /* the ones in the 2nd & 3rd lines were added to handle
!                                  HP aCC template specialization manglings */
  	    {
  	      if (i >= MBUF_SIZE-1)
  		break;
--- 4513,4542 ----
      }
    else
      {
+       switch (current_demangling_style)
+ 	{
+ 	case gnu_demangling:
+ 	case lucid_demangling:
+ 	case arm_demangling:
+ 	case edg_demangling:
+ 	  standard_symbol_alphabet (symbol_alphabet);
+ 	  break;
+ 	case hp_demangling:
+ 	  hp_symbol_alphabet (symbol_alphabet);
+ 	  break;
+ 	default:
+ 	  /* Folks should explicitly indicate the appropriate alphabet for
+ 	     each demangling.  Providing a default would allow the
+ 	     question to go unconsidered.  */
+ 	  abort ();
+ 	}
+ 
        for (;;)
  	{
  	  int i = 0;
  	  c = getchar ();
  	  /* Try to read a label.  */
! 	  while (c != EOF && symbol_alphabet[c])
  	    {
  	      if (i >= MBUF_SIZE-1)
  		break;

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