comparison libiberty/cplus-dem.c @ 63:b7f97abdc517 gcc-4.6-20100522

update gcc from gcc-4.5.0 to gcc-4.6
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Mon, 24 May 2010 12:47:05 +0900
parents 77e2b8dfacca
children f6334be47118
comparison
equal deleted inserted replaced
56:3c8a44c06a95 63:b7f97abdc517
59 #include <demangle.h> 59 #include <demangle.h>
60 #undef CURRENT_DEMANGLING_STYLE 60 #undef CURRENT_DEMANGLING_STYLE
61 #define CURRENT_DEMANGLING_STYLE work->options 61 #define CURRENT_DEMANGLING_STYLE work->options
62 62
63 #include "libiberty.h" 63 #include "libiberty.h"
64
65 static char *ada_demangle (const char *, int);
66 64
67 #define min(X,Y) (((X) < (Y)) ? (X) : (Y)) 65 #define min(X,Y) (((X) < (Y)) ? (X) : (Y))
68 66
69 /* A value at least one greater than the maximum number of characters 67 /* A value at least one greater than the maximum number of characters
70 that will be output when using the `%d' format with `printf'. */ 68 that will be output when using the `%d' format with `printf'. */
476 demangle_arm_hp_template (struct work_stuff *, const char **, int, string *); 474 demangle_arm_hp_template (struct work_stuff *, const char **, int, string *);
477 475
478 static void 476 static void
479 recursively_demangle (struct work_stuff *, const char **, string *, int); 477 recursively_demangle (struct work_stuff *, const char **, string *, int);
480 478
481 static void grow_vect (char **, size_t *, size_t, int);
482
483 /* Translate count to integer, consuming tokens in the process. 479 /* Translate count to integer, consuming tokens in the process.
484 Conversion terminates on the first non-digit character. 480 Conversion terminates on the first non-digit character.
485 481
486 Trying to consume something that isn't a count results in no 482 Trying to consume something that isn't a count results in no
487 consumption of input and a return of -1. 483 consumption of input and a return of -1.
870 if (ret) 866 if (ret)
871 return ret; 867 return ret;
872 } 868 }
873 869
874 if (GNAT_DEMANGLING) 870 if (GNAT_DEMANGLING)
875 return ada_demangle(mangled,options); 871 return ada_demangle (mangled, options);
876 872
877 ret = internal_cplus_demangle (work, mangled); 873 ret = internal_cplus_demangle (work, mangled);
878 squangle_mop_up (work); 874 squangle_mop_up (work);
879 return (ret); 875 return (ret);
880 } 876 }
881 877
882 878 /* Demangle ada names. The encoding is documented in gcc/ada/exp_dbug.ads. */
883 /* Assuming *OLD_VECT points to an array of *SIZE objects of size 879
884 ELEMENT_SIZE, grow it to contain at least MIN_SIZE objects, 880 char *
885 updating *OLD_VECT and *SIZE as necessary. */
886
887 static void
888 grow_vect (char **old_vect, size_t *size, size_t min_size, int element_size)
889 {
890 if (*size < min_size)
891 {
892 *size *= 2;
893 if (*size < min_size)
894 *size = min_size;
895 *old_vect = XRESIZEVAR (char, *old_vect, *size * element_size);
896 }
897 }
898
899 /* Demangle ada names:
900 1. Discard final __{DIGIT}+ or ${DIGIT}+
901 2. Convert other instances of embedded "__" to `.'.
902 3. Discard leading _ada_.
903 4. Remove everything after first ___ if it is followed by 'X'.
904 5. Put symbols that should be suppressed in <...> brackets.
905 The resulting string is valid until the next call of ada_demangle. */
906
907 static char *
908 ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) 881 ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED)
909 { 882 {
910 int i, j;
911 int len0; 883 int len0;
912 const char* p; 884 const char* p;
913 char *demangled = NULL; 885 char *d;
914 int changed; 886 char *demangled;
915 size_t demangled_size = 0;
916 887
917 changed = 0; 888 /* Discard leading _ada_, which is used for library level subprograms. */
918
919 if (strncmp (mangled, "_ada_", 5) == 0) 889 if (strncmp (mangled, "_ada_", 5) == 0)
920 { 890 mangled += 5;
921 mangled += 5; 891
922 changed = 1; 892 /* All ada unit names are lower-case. */
923 } 893 if (!ISLOWER (mangled[0]))
894 goto unknown;
895
896 /* Most of the demangling will trivially remove chars. Operator names
897 may add one char but because they are always preceeded by '__' which is
898 replaced by '.', they eventually never expand the size. '___elabs' and
899 '___elabb' add only 2 chars, but they occur only once. */
900 len0 = strlen (mangled) + 2 + 1;
901 demangled = XNEWVEC (char, len0);
924 902
925 if (mangled[0] == '_' || mangled[0] == '<') 903 d = demangled;
926 goto Suppress; 904 p = mangled;
927 905 while (1)
928 p = strstr (mangled, "___"); 906 {
929 if (p == NULL) 907 /* Convert name, which is always lower-case. */
930 len0 = strlen (mangled); 908 if (ISLOWER (*p))
931 else 909 {
932 { 910 do
933 if (p[3] == 'X') 911 *d++ = *p++;
934 { 912 while (ISLOWER(*p) || ISDIGIT (*p)
935 len0 = p - mangled; 913 || (p[0] == '_' && (ISLOWER (p[1]) || ISDIGIT (p[1]))));
936 changed = 1; 914 }
937 } 915 else if (p[0] == 'O')
916 {
917 static const char * const operators[][2] =
918 {{"Oabs", "abs"}, {"Oand", "and"}, {"Omod", "mod"},
919 {"Onot", "not"}, {"Oor", "or"}, {"Orem", "rem"},
920 {"Oxor", "xor"}, {"Oeq", "="}, {"One", "/="},
921 {"Olt", "<"}, {"Ole", "<="}, {"Ogt", ">"},
922 {"Oge", ">="}, {"Oadd", "+"}, {"Osubtract", "-"},
923 {"Oconcat", "&"}, {"Omultiply", "*"}, {"Odivide", "/"},
924 {"Oexpon", "**"}, {NULL, NULL}};
925 int k;
926
927 for (k = 0; operators[k][0]; k++)
928 {
929 int l = strlen (operators[k][0]);
930 if (!strncmp (p, operators[k][0], l))
931 {
932 p += l;
933 l = strlen (operators[k][1]);
934 *d++ = '"';
935 memcpy (d, operators[k][1], l);
936 d += l;
937 *d++ = '"';
938 break;
939 }
940 }
941 /* Operator not found. */
942 if (!operators[k][0])
943 goto unknown;
944 }
938 else 945 else
939 goto Suppress; 946 {
940 } 947 /* Not a GNAT encoding. */
941 948 goto unknown;
942 /* Make demangled big enough for possible expansion by operator name. */ 949 }
943 grow_vect (&demangled, 950
944 &demangled_size, 2 * len0 + 1, 951 if (p[0] == '_')
945 sizeof (char)); 952 {
946 953 /* Separator. */
947 if (ISDIGIT ((unsigned char) mangled[len0 - 1])) { 954 if (p[1] == '_')
948 for (i = len0 - 2; i >= 0 && ISDIGIT ((unsigned char) mangled[i]); i -= 1) 955 {
949 ; 956 /* Standard separator. Handled first. */
950 if (i > 1 && mangled[i] == '_' && mangled[i - 1] == '_') 957 p += 2;
951 { 958 if (ISDIGIT (*p))
952 len0 = i - 1; 959 {
953 changed = 1; 960 /* Overloading. */
954 } 961 do
955 else if (mangled[i] == '$') 962 p++;
956 { 963 while (ISDIGIT (*p) || (p[0] == '_' && ISDIGIT (p[1])));
957 len0 = i; 964 }
958 changed = 1; 965 else if (*p == '_' && !strcmp (p + 1, "elabb"))
959 } 966 {
960 } 967 memcpy (d, "'Elab_Body", 10);
961 968 d += 10;
962 for (i = 0, j = 0; i < len0 && ! ISALPHA ((unsigned char)mangled[i]); 969 break;
963 i += 1, j += 1) 970 }
964 demangled[j] = mangled[i]; 971 else if (*p == '_' && !strcmp (p + 1, "elabs"))
965 972 {
966 while (i < len0) 973 memcpy (d, "'Elab_Spec", 10);
967 { 974 d += 10;
968 if (i < len0 - 2 && mangled[i] == '_' && mangled[i + 1] == '_') 975 break;
969 { 976 }
970 demangled[j] = '.'; 977 else
971 changed = 1; 978 {
972 i += 2; j += 1; 979 *d++ = '.';
973 } 980 continue;
981 }
982 }
983 else if (p[1] == 'B' || p[1] == 'E')
984 {
985 /* Entry Body or barrier Evaluation. */
986 p += 2;
987 while (ISDIGIT (*p))
988 p++;
989 if (p[0] == 's' && p[1] == 0)
990 break;
991 else
992 goto unknown;
993 }
994 else
995 goto unknown;
996 }
997
998 if (p[0] == 'T' && p[1] == 'K')
999 {
1000 if (p[2] == 'B' && p[3] == 0)
1001 {
1002 /* Subprogram for task body. */
1003 break;
1004 }
1005 else if (p[2] == '_' && p[3] == '_')
1006 {
1007 /* Inner declarations in a task. */
1008 p += 4;
1009 *d++ = '.';
1010 continue;
1011 }
1012 else
1013 goto unknown;
1014 }
1015 if ((p[0] == 'P' || p[0] == 'N') && p[1] == 0)
1016 {
1017 /* Protected type subprogram. */
1018 break;
1019 }
1020 if (p[0] == 'E' && p[1] == 0)
1021 {
1022 /* Exception name. */
1023 goto unknown;
1024 }
1025 if (*p == 'N' || *p == 'S')
1026 {
1027 /* Enumerated type name table. */
1028 goto unknown;
1029 }
1030 if (p[0] == 'X')
1031 {
1032 /* Body nested. */
1033 if (p[1] == 'n' || p[1] == 'b')
1034 p += 2;
1035 else if (p[1] == 0)
1036 p++;
1037 }
1038 if (p[0] == '.' && ISDIGIT (p[1]))
1039 {
1040 /* Nested subprogram. */
1041 p += 2;
1042 while (ISDIGIT (*p))
1043 p++;
1044 }
1045 if (*p == 0)
1046 {
1047 /* End of mangled name. */
1048 break;
1049 }
974 else 1050 else
975 { 1051 goto unknown;
976 demangled[j] = mangled[i]; 1052 }
977 i += 1; j += 1; 1053 *d = 0;
978 } 1054 return demangled;
979 } 1055
980 demangled[j] = '\000'; 1056 unknown:
981 1057 len0 = strlen (mangled);
982 for (i = 0; demangled[i] != '\0'; i += 1) 1058 demangled = XNEWVEC (char, len0 + 3);
983 if (ISUPPER ((unsigned char)demangled[i]) || demangled[i] == ' ')
984 goto Suppress;
985
986 if (! changed)
987 {
988 free (demangled);
989 return NULL;
990 }
991 else
992 return demangled;
993
994 Suppress:
995 grow_vect (&demangled,
996 &demangled_size, strlen (mangled) + 3,
997 sizeof (char));
998 1059
999 if (mangled[0] == '<') 1060 if (mangled[0] == '<')
1000 strcpy (demangled, mangled); 1061 strcpy (demangled, mangled);
1001 else 1062 else
1002 sprintf (demangled, "<%s>", mangled); 1063 sprintf (demangled, "<%s>", mangled);