Changeset 953
- Timestamp:
- Jan 11, 2004, 7:11:02 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/binutils/libiberty/cplus-dem.c
-
Property cvs2svn:cvs-rev
changed from
1.1.1.2
to1.2
r952 r953 505 505 506 506 static int 507 demangle_expression PARAMS ((struct work_stuff *, const char **, string *, 507 demangle_expression PARAMS ((struct work_stuff *, const char **, string *, 508 508 type_kind_t)); 509 509 … … 845 845 enum demangling_styles style; 846 846 { 847 const struct demangler_engine *demangler = libiberty_demanglers; 847 const struct demangler_engine *demangler = libiberty_demanglers; 848 848 849 849 for (; demangler->demangling_style != unknown_demangling; ++demangler) … … 863 863 const char *name; 864 864 { 865 const struct demangler_engine *demangler = libiberty_demanglers; 865 const struct demangler_engine *demangler = libiberty_demanglers; 866 866 867 867 for (; demangler->demangling_style != unknown_demangling; ++demangler) … … 980 980 int changed; 981 981 size_t demangled_size = 0; 982 982 983 983 changed = 0; 984 984 … … 988 988 changed = 1; 989 989 } 990 990 991 991 if (mangled[0] == '_' || mangled[0] == '<') 992 992 goto Suppress; 993 993 994 994 p = strstr (mangled, "___"); 995 995 if (p == NULL) … … 1005 1005 goto Suppress; 1006 1006 } 1007 1007 1008 1008 /* Make demangled big enough for possible expansion by operator name. */ 1009 1009 grow_vect (&demangled, 1010 1010 &demangled_size, 2 * len0 + 1, 1011 1011 sizeof (char)); 1012 1012 1013 1013 if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { 1014 1014 for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) … … 1025 1025 } 1026 1026 } 1027 1027 1028 1028 for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); 1029 1029 i += 1, j += 1) 1030 1030 demangled[j] = mangled[i]; 1031 1031 1032 1032 at_start_name = 1; 1033 1033 while (i < len0) 1034 1034 { 1035 1035 at_start_name = 0; 1036 1036 1037 1037 if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') 1038 1038 { … … 1048 1048 } 1049 1049 demangled[j] = '\000'; 1050 1050 1051 1051 for (i = 0; demangled[i] != '\0'; i += 1) 1052 1052 if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ') … … 1057 1057 else 1058 1058 return demangled; 1059 1059 1060 1060 Suppress: 1061 1061 grow_vect (&demangled, … … 1980 1980 if (**mangled == 'Q') 1981 1981 success = demangle_qualified (work, mangled, s, 1982 /*isfuncname=*/0, 1982 /*isfuncname=*/0, 1983 1983 /*append=*/1); 1984 1984 else … … 3645 3645 { 3646 3646 success = demangle_qualified (work, mangled, &decl, 3647 /*isfuncnam=*/0, 3647 /*isfuncnam=*/0, 3648 3648 /*append=*/0); 3649 3649 if (!success) … … 4890 4890 string_append (s, buf); 4891 4891 } 4892 4893 /* bird: This was put back since we're building some older gcc, remove 4894 when going for gcc which doesn't expect MAIN and main(). 4895 */ 4896 4897 /* To generate a standalone demangler program for testing purposes, 4898 just compile and link this file with -DMAIN and libiberty.a. When 4899 run, it demangles each command line arg, or each stdin string, and 4900 prints the result on stdout. */ 4901 4902 #ifdef MAIN 4903 4904 #include "getopt.h" 4905 4906 static const char *program_name; 4907 static const char *program_version = VERSION; 4908 static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE; 4909 4910 static void demangle_it PARAMS ((char *)); 4911 static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN; 4912 static void fatal PARAMS ((const char *)) ATTRIBUTE_NORETURN; 4913 static void print_demangler_list PARAMS ((FILE *)); 4914 4915 static void 4916 demangle_it (mangled_name) 4917 char *mangled_name; 4918 { 4919 char *result; 4920 4921 /* For command line args, also try to demangle type encodings. */ 4922 result = cplus_demangle (mangled_name, flags | DMGL_TYPES); 4923 if (result == NULL) 4924 { 4925 printf ("%s\n", mangled_name); 4926 } 4927 else 4928 { 4929 printf ("%s\n", result); 4930 free (result); 4931 } 4932 } 4933 4934 static void 4935 print_demangler_list (stream) 4936 FILE *stream; 4937 { 4938 const struct demangler_engine *demangler; 4939 4940 fprintf (stream, "{%s", libiberty_demanglers->demangling_style_name); 4941 4942 for (demangler = libiberty_demanglers + 1; 4943 demangler->demangling_style != unknown_demangling; 4944 ++demangler) 4945 fprintf (stream, ",%s", demangler->demangling_style_name); 4946 4947 fprintf (stream, "}"); 4948 } 4949 4950 static void 4951 usage (stream, status) 4952 FILE *stream; 4953 int status; 4954 { 4955 fprintf (stream, "\ 4956 Usage: %s [-_] [-n] [--strip-underscores] [--no-strip-underscores] \n", 4957 program_name); 4958 4959 fprintf (stream, "\ 4960 [-s "); 4961 print_demangler_list (stream); 4962 fprintf (stream, "]\n"); 4963 4964 fprintf (stream, "\ 4965 [--format "); 4966 print_demangler_list (stream); 4967 fprintf (stream, "]\n"); 4968 4969 fprintf (stream, "\ 4970 [--help] [--version] [arg...]\n"); 4971 exit (status); 4972 } 4973 4974 #define MBUF_SIZE 32767 4975 char mbuffer[MBUF_SIZE]; 4976 4977 /* Defined in the automatically-generated underscore.c. */ 4978 extern int prepends_underscore; 4979 4980 int strip_underscore = 0; 4981 4982 static const struct option long_options[] = { 4983 {"strip-underscores", no_argument, 0, '_'}, 4984 {"format", required_argument, 0, 's'}, 4985 {"help", no_argument, 0, 'h'}, 4986 {"no-strip-underscores", no_argument, 0, 'n'}, 4987 {"version", no_argument, 0, 'v'}, 4988 {0, no_argument, 0, 0} 4989 }; 4990 4991 /* More 'friendly' abort that prints the line and file. 4992 config.h can #define abort fancy_abort if you like that sort of thing. */ 4993 4994 void 4995 fancy_abort () 4996 { 4997 fatal ("Internal gcc abort."); 4998 } 4999 5000 5001 static const char * 5002 standard_symbol_characters PARAMS ((void)); 5003 5004 static const char * 5005 hp_symbol_characters PARAMS ((void)); 5006 5007 static const char * 5008 gnu_v3_symbol_characters PARAMS ((void)); 5009 5010 /* Return the string of non-alnum characters that may occur 5011 as a valid symbol component, in the standard assembler symbol 5012 syntax. */ 5013 5014 static const char * 5015 standard_symbol_characters () 5016 { 5017 return "_$."; 5018 } 5019 5020 5021 /* Return the string of non-alnum characters that may occur 5022 as a valid symbol name component in an HP object file. 5023 5024 Note that, since HP's compiler generates object code straight from 5025 C++ source, without going through an assembler, its mangled 5026 identifiers can use all sorts of characters that no assembler would 5027 tolerate, so the alphabet this function creates is a little odd. 5028 Here are some sample mangled identifiers offered by HP: 5029 5030 typeid*__XT24AddressIndExpClassMember_ 5031 [Vftptr]key:__dt__32OrdinaryCompareIndExpClassMemberFv 5032 __ct__Q2_9Elf64_Dyn18{unnamed.union.#1}Fv 5033 5034 This still seems really weird to me, since nowhere else in this 5035 file is there anything to recognize curly brackets, parens, etc. 5036 I've talked with Srikanth <srikanth@cup.hp.com>, and he assures me 5037 this is right, but I still strongly suspect that there's a 5038 misunderstanding here. 5039 5040 If we decide it's better for c++filt to use HP's assembler syntax 5041 to scrape identifiers out of its input, here's the definition of 5042 the symbol name syntax from the HP assembler manual: 5043 5044 Symbols are composed of uppercase and lowercase letters, decimal 5045 digits, dollar symbol, period (.), ampersand (&), pound sign(#) and 5046 underscore (_). A symbol can begin with a letter, digit underscore or 5047 dollar sign. If a symbol begins with a digit, it must contain a 5048 non-digit character. 5049 5050 So have fun. */ 5051 static const char * 5052 hp_symbol_characters () 5053 { 5054 return "_$.<>#,*&[]:(){}"; 5055 } 5056 5057 5058 /* Return the string of non-alnum characters that may occur 5059 as a valid symbol component in the GNU C++ V3 ABI mangling 5060 scheme. */ 5061 5062 static const char * 5063 gnu_v3_symbol_characters () 5064 { 5065 return "_$."; 5066 } 5067 5068 5069 extern int main PARAMS ((int, char **)); 5070 5071 int 5072 main (argc, argv) 5073 int argc; 5074 char **argv; 5075 { 5076 char *result; 5077 int c; 5078 const char *valid_symbols; 5079 enum demangling_styles style = auto_demangling; 5080 5081 program_name = argv[0]; 5082 5083 strip_underscore = prepends_underscore; 5084 5085 while ((c = getopt_long (argc, argv, "_ns:", long_options, (int *) 0)) != EOF) 5086 { 5087 switch (c) 5088 { 5089 case '?': 5090 usage (stderr, 1); 5091 break; 5092 case 'h': 5093 usage (stdout, 0); 5094 case 'n': 5095 strip_underscore = 0; 5096 break; 5097 case 'v': 5098 printf ("GNU %s (C++ demangler), version %s\n", program_name, program_version); 5099 return (0); 5100 case '_': 5101 strip_underscore = 1; 5102 break; 5103 case 's': 5104 { 5105 style = cplus_demangle_name_to_style (optarg); 5106 if (style == unknown_demangling) 5107 { 5108 fprintf (stderr, "%s: unknown demangling style `%s'\n", 5109 program_name, optarg); 5110 return (1); 5111 } 5112 else 5113 cplus_demangle_set_style (style); 5114 } 5115 break; 5116 } 5117 } 5118 5119 if (optind < argc) 5120 { 5121 for ( ; optind < argc; optind++) 5122 { 5123 demangle_it (argv[optind]); 5124 } 5125 } 5126 else 5127 { 5128 switch (current_demangling_style) 5129 { 5130 case gnu_demangling: 5131 case lucid_demangling: 5132 case arm_demangling: 5133 case java_demangling: 5134 case edg_demangling: 5135 case gnat_demangling: 5136 case auto_demangling: 5137 valid_symbols = standard_symbol_characters (); 5138 break; 5139 case hp_demangling: 5140 valid_symbols = hp_symbol_characters (); 5141 break; 5142 case gnu_v3_demangling: 5143 valid_symbols = gnu_v3_symbol_characters (); 5144 break; 5145 default: 5146 /* Folks should explicitly indicate the appropriate alphabet for 5147 each demangling. Providing a default would allow the 5148 question to go unconsidered. */ 5149 abort (); 5150 } 5151 5152 for (;;) 5153 { 5154 int i = 0; 5155 c = getchar (); 5156 /* Try to read a label. */ 5157 while (c != EOF && (ISALNUM (c) || strchr (valid_symbols, c))) 5158 { 5159 if (i >= MBUF_SIZE-1) 5160 break; 5161 mbuffer[i++] = c; 5162 c = getchar (); 5163 } 5164 if (i > 0) 5165 { 5166 int skip_first = 0; 5167 5168 if (mbuffer[0] == '.' || mbuffer[0] == '$') 5169 ++skip_first; 5170 if (strip_underscore && mbuffer[skip_first] == '_') 5171 ++skip_first; 5172 5173 if (skip_first > i) 5174 skip_first = i; 5175 5176 mbuffer[i] = 0; 5177 flags |= (int) style; 5178 result = cplus_demangle (mbuffer + skip_first, flags); 5179 if (result) 5180 { 5181 if (mbuffer[0] == '.') 5182 putc ('.', stdout); 5183 fputs (result, stdout); 5184 free (result); 5185 } 5186 else 5187 fputs (mbuffer, stdout); 5188 5189 fflush (stdout); 5190 } 5191 if (c == EOF) 5192 break; 5193 putchar (c); 5194 fflush (stdout); 5195 } 5196 } 5197 5198 return (0); 5199 } 5200 5201 static void 5202 fatal (str) 5203 const char *str; 5204 { 5205 fprintf (stderr, "%s: %s\n", program_name, str); 5206 exit (1); 5207 } 5208 5209 PTR 5210 xmalloc (size) 5211 size_t size; 5212 { 5213 register PTR value = (PTR) malloc (size); 5214 if (value == 0) 5215 fatal ("virtual memory exhausted"); 5216 return value; 5217 } 5218 5219 PTR 5220 xrealloc (ptr, size) 5221 PTR ptr; 5222 size_t size; 5223 { 5224 register PTR value = (PTR) realloc (ptr, size); 5225 if (value == 0) 5226 fatal ("virtual memory exhausted"); 5227 return value; 5228 } 5229 #endif /* main */ -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.