X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Flanguage.c;h=eb203dc587ce4260d9fccb02345e31f8d99926ec;hb=5f9a71c3d74f62fb4e6a3fe0007044f429638a60;hp=ebdcefe5628581eb23a68ff8b734d3babda5aa43;hpb=72ec28b8afa357cdde70c612b4e0e9f37a34f8e4;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/language.c b/gdb/language.c index ebdcefe562..eb203dc587 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1,5 +1,8 @@ /* Multiple source language support for GDB. - Copyright 1991, 1992, 2000 Free Software Foundation, Inc. + + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, + 2001, 2002, 2003 Free Software Foundation, Inc. + Contributed by the Department of Computer Science at the State University of New York at Buffalo. @@ -36,55 +39,48 @@ #include "gdbtypes.h" #include "value.h" #include "gdbcmd.h" -#include "frame.h" #include "expression.h" #include "language.h" #include "target.h" #include "parser-defs.h" +#include "jv-lang.h" +#include "demangle.h" -extern void _initialize_language PARAMS ((void)); +extern void _initialize_language (void); -static void -show_language_command PARAMS ((char *, int)); +static void show_language_command (char *, int); -static void -set_language_command PARAMS ((char *, int)); +static void set_language_command (char *, int); -static void -show_type_command PARAMS ((char *, int)); +static void show_type_command (char *, int); -static void -set_type_command PARAMS ((char *, int)); +static void set_type_command (char *, int); -static void -show_range_command PARAMS ((char *, int)); +static void show_range_command (char *, int); -static void -set_range_command PARAMS ((char *, int)); +static void set_range_command (char *, int); -static void -set_range_str PARAMS ((void)); +static void show_case_command (char *, int); -static void -set_type_str PARAMS ((void)); +static void set_case_command (char *, int); -static void -set_lang_str PARAMS ((void)); +static void set_case_str (void); -static void -unk_lang_error PARAMS ((char *)); +static void set_range_str (void); -static int -unk_lang_parser PARAMS ((void)); +static void set_type_str (void); -static void -show_check PARAMS ((char *, int)); +static void set_lang_str (void); -static void -set_check PARAMS ((char *, int)); +static void unk_lang_error (char *); -static void -set_type_range PARAMS ((void)); +static int unk_lang_parser (void); + +static void show_check (char *, int); + +static void set_check (char *, int); + +static void set_type_range_case (void); static void unk_lang_emit_char (int c, struct ui_file *stream, int quoter); @@ -94,8 +90,7 @@ static void unk_lang_printstr (struct ui_file * stream, char *string, unsigned int length, int width, int force_ellipses); -static struct type * - unk_lang_create_fundamental_type PARAMS ((struct objfile *, int)); +static struct type *unk_lang_create_fundamental_type (struct objfile *, int); static void unk_lang_print_type (struct type *, char *, struct ui_file *, int, int); @@ -104,11 +99,12 @@ static int unk_lang_val_print (struct type *, char *, int, CORE_ADDR, struct ui_file *, int, int, int, enum val_prettyprint); -static int unk_lang_value_print (value_ptr, struct ui_file *, int, enum val_prettyprint); +static int unk_lang_value_print (struct value *, struct ui_file *, int, enum val_prettyprint); + +static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc); /* Forward declaration */ extern const struct language_defn unknown_language_defn; -extern char *warning_pre_print; /* The current (default at startup) state of type and range checking. (If the modes are set to "auto", though, these are changed based @@ -119,6 +115,8 @@ enum range_mode range_mode = range_mode_auto; enum range_check range_check = range_check_off; enum type_mode type_mode = type_mode_auto; enum type_check type_check = type_check_off; +enum case_mode case_mode = case_mode_auto; +enum case_sensitivity case_sensitivity = case_sensitive_on; /* The current language and language_mode (see language.h) */ @@ -146,6 +144,7 @@ static unsigned languages_allocsize; static char *language; static char *type; static char *range; +static char *case_sensitive; /* Warning issued when current_language and the language of the current frame do not match. */ @@ -159,9 +158,7 @@ char lang_frame_mismatch_warn[] = /* Show command. Display a warning if the language set does not match the frame. */ static void -show_language_command (ignore, from_tty) - char *ignore; - int from_tty; +show_language_command (char *ignore, int from_tty) { enum language flang; /* The language of the current frame */ @@ -174,9 +171,7 @@ show_language_command (ignore, from_tty) /* Set command. Change the current working language. */ static void -set_language_command (ignore, from_tty) - char *ignore; - int from_tty; +set_language_command (char *ignore, int from_tty) { int i; enum language flang; @@ -229,7 +224,7 @@ set_language_command (ignore, from_tty) /* Enter manual mode. Set the specified language. */ language_mode = language_mode_manual; current_language = languages[i]; - set_type_range (); + set_type_range_case (); set_lang_str (); expected_language = current_language; return; @@ -240,7 +235,7 @@ set_language_command (ignore, from_tty) /* Reset the language (esp. the global string "language") to the correct values. */ err_lang = savestring (language, strlen (language)); - make_cleanup (free, err_lang); /* Free it after error */ + make_cleanup (xfree, err_lang); /* Free it after error */ set_language (current_language->la_language); error ("Unknown language `%s'.", err_lang); } @@ -248,9 +243,7 @@ set_language_command (ignore, from_tty) /* Show command. Display a warning if the type setting does not match the current language. */ static void -show_type_command (ignore, from_tty) - char *ignore; - int from_tty; +show_type_command (char *ignore, int from_tty) { if (type_check != current_language->la_type_check) printf_unfiltered ( @@ -259,9 +252,7 @@ show_type_command (ignore, from_tty) /* Set command. Change the setting for type checking. */ static void -set_type_command (ignore, from_tty) - char *ignore; - int from_tty; +set_type_command (char *ignore, int from_tty) { if (STREQ (type, "on")) { @@ -281,9 +272,9 @@ set_type_command (ignore, from_tty) else if (STREQ (type, "auto")) { type_mode = type_mode_auto; - set_type_range (); + set_type_range_case (); /* Avoid hitting the set_type_str call below. We - did it in set_type_range. */ + did it in set_type_range_case. */ return; } else @@ -297,9 +288,7 @@ set_type_command (ignore, from_tty) /* Show command. Display a warning if the range setting does not match the current language. */ static void -show_range_command (ignore, from_tty) - char *ignore; - int from_tty; +show_range_command (char *ignore, int from_tty) { if (range_check != current_language->la_range_check) @@ -309,9 +298,7 @@ show_range_command (ignore, from_tty) /* Set command. Change the setting for range checking. */ static void -set_range_command (ignore, from_tty) - char *ignore; - int from_tty; +set_range_command (char *ignore, int from_tty) { if (STREQ (range, "on")) { @@ -331,9 +318,9 @@ set_range_command (ignore, from_tty) else if (STREQ (range, "auto")) { range_mode = range_mode_auto; - set_type_range (); + set_type_range_case (); /* Avoid hitting the set_range_str call below. We - did it in set_type_range. */ + did it in set_type_range_case. */ return; } else @@ -344,12 +331,52 @@ set_range_command (ignore, from_tty) show_range_command ((char *) 0, from_tty); } -/* Set the status of range and type checking based on +/* Show command. Display a warning if the case sensitivity setting does + not match the current language. */ +static void +show_case_command (char *ignore, int from_tty) +{ + if (case_sensitivity != current_language->la_case_sensitivity) + printf_unfiltered( +"Warning: the current case sensitivity setting does not match the language.\n"); +} + +/* Set command. Change the setting for case sensitivity. */ +static void +set_case_command (char *ignore, int from_tty) +{ + if (STREQ (case_sensitive, "on")) + { + case_sensitivity = case_sensitive_on; + case_mode = case_mode_manual; + } + else if (STREQ (case_sensitive, "off")) + { + case_sensitivity = case_sensitive_off; + case_mode = case_mode_manual; + } + else if (STREQ (case_sensitive, "auto")) + { + case_mode = case_mode_auto; + set_type_range_case (); + /* Avoid hitting the set_case_str call below. We + did it in set_type_range_case. */ + return; + } + else + { + warning ("Unrecognized case-sensitive setting: \"%s\"", case_sensitive); + } + set_case_str(); + show_case_command ((char *) NULL, from_tty); +} + +/* Set the status of range and type checking and case sensitivity based on the current modes and the current language. If SHOW is non-zero, then print out the current language, type and range checking status. */ static void -set_type_range () +set_type_range_case (void) { if (range_mode == range_mode_auto) @@ -358,15 +385,18 @@ set_type_range () if (type_mode == type_mode_auto) type_check = current_language->la_type_check; + if (case_mode == case_mode_auto) + case_sensitivity = current_language->la_case_sensitivity; + set_type_str (); set_range_str (); + set_case_str (); } /* Set current language to (enum language) LANG. Returns previous language. */ enum language -set_language (lang) - enum language lang; +set_language (enum language lang) { int i; enum language prev_language; @@ -378,7 +408,7 @@ set_language (lang) if (languages[i]->la_language == lang) { current_language = languages[i]; - set_type_range (); + set_type_range_case (); set_lang_str (); break; } @@ -390,11 +420,12 @@ set_language (lang) /* This page contains functions that update the global vars language, type and range. */ static void -set_lang_str () +set_lang_str (void) { char *prefix = ""; - free (language); + if (language) + xfree (language); if (language_mode == language_mode_auto) prefix = "auto; currently "; @@ -402,11 +433,12 @@ set_lang_str () } static void -set_type_str () +set_type_str (void) { char *tmp = NULL, *prefix = ""; - free (type); + if (type) + xfree (type); if (type_mode == type_mode_auto) prefix = "auto; currently "; @@ -429,7 +461,7 @@ set_type_str () } static void -set_range_str () +set_range_str (void) { char *tmp, *pref = ""; @@ -451,17 +483,40 @@ set_range_str () error ("Unrecognized range check setting."); } - free (range); + if (range) + xfree (range); range = concat (pref, tmp, NULL); } +static void +set_case_str (void) +{ + char *tmp = NULL, *prefix = ""; + + if (case_mode==case_mode_auto) + prefix = "auto; currently "; + + switch (case_sensitivity) + { + case case_sensitive_on: + tmp = "on"; + break; + case case_sensitive_off: + tmp = "off"; + break; + default: + error ("Unrecognized case-sensitive setting."); + } + + xfree (case_sensitive); + case_sensitive = concat (prefix, tmp, NULL); +} /* Print out the current language settings: language, range and type checking. If QUIETLY, print only what has changed. */ void -language_info (quietly) - int quietly; +language_info (int quietly) { if (quietly && expected_language == current_language) return; @@ -476,6 +531,8 @@ language_info (quietly) show_type_command ((char *) 0, 1); printf_unfiltered ("Range checking: %s\n", range); show_range_command ((char *) 0, 1); + printf_unfiltered ("Case sensitivity: %s\n", case_sensitive); + show_case_command ((char *) 0, 1); } } @@ -484,8 +541,7 @@ language_info (quietly) #if 0 /* Currently unused */ struct type * -binop_result_type (v1, v2) - value_ptr v1, v2; +binop_result_type (struct value *v1, struct value *v2) { int size, uns; struct type *t1 = check_typedef (VALUE_TYPE (v1)); @@ -498,6 +554,7 @@ binop_result_type (v1, v2) { case language_c: case language_cplus: + case language_objc: if (TYPE_CODE (t1) == TYPE_CODE_FLT) return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ? VALUE_TYPE (v2) : VALUE_TYPE (v1); @@ -516,10 +573,8 @@ binop_result_type (v1, v2) not needed. */ return l1 > l2 ? VALUE_TYPE (v1) : VALUE_TYPE (v2); break; - case language_chill: - error ("Missing Chill support in function binop_result_check."); /*FIXME */ } - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); return (struct type *) 0; /* For lint */ } @@ -532,8 +587,7 @@ binop_result_type (v1, v2) /* Returns the appropriate printf format for hexadecimal numbers. */ char * -local_hex_format_custom (pre) - char *pre; +local_hex_format_custom (char *pre) { static char form[50]; @@ -545,56 +599,12 @@ local_hex_format_custom (pre) return form; } -/* Converts a number to hexadecimal (without leading "0x") and stores it in a - static string. Returns a pointer to this string. */ - -char * -longest_raw_hex_string (num) - LONGEST num; -{ - static char res_longest_raw_hex_string[50]; - long long ll = num; /* MERGEBUG ?? see below */ - res_longest_raw_hex_string[0] = 0; - /* MERGEBUG ?? As a quick fix I am replacing this with sprintf - strcat_address_numeric (num, 0, res_longest_raw_hex_string, 50); - */ - - sprintf (res_longest_raw_hex_string, "%llx", ll); - return res_longest_raw_hex_string; -} - -/* Converts a number to hexadecimal and stores it in a static +/* Converts a LONGEST to custom hexadecimal and stores it in a static string. Returns a pointer to this string. */ char * -local_hex_string (num) - unsigned long num; +local_hex_string (LONGEST num) { - static char res[50]; - - sprintf (res, local_hex_format (), num); - return res; -} - -/* Converts a LONGEST number to hexadecimal and stores it in a static - string. Returns a pointer to this string. */ -char * -longest_local_hex_string (num) - LONGEST num; -{ - return longest_local_hex_string_custom (num, "l"); -} - -/* Converts a number to custom hexadecimal and stores it in a static - string. Returns a pointer to this string. */ -char * -local_hex_string_custom (num, pre) - unsigned long num; - char *pre; -{ - static char res[50]; - - sprintf (res, local_hex_format_custom (pre), num); - return res; + return local_hex_string_custom (num, "l"); } /* Converts a LONGEST number to custom hexadecimal and stores it in a static @@ -602,14 +612,11 @@ local_hex_string_custom (num, pre) should end with "l", e.g. "08l" as with calls to local_hex_string_custom */ char * -longest_local_hex_string_custom (num, width) - LONGEST num; - char *width; +local_hex_string_custom (LONGEST num, char *width) { #define RESULT_BUF_LEN 50 static char res2[RESULT_BUF_LEN]; char format[RESULT_BUF_LEN]; -#if !defined (PRINTF_HAS_LONG_LONG) int field_width; int num_len; int num_pad_chars; @@ -617,41 +624,11 @@ longest_local_hex_string_custom (num, width) int pad_on_left; char *parse_ptr; char temp_nbr_buf[RESULT_BUF_LEN]; -#endif - -#ifndef CC_HAS_LONG_LONG - /* If there is no long long, then LONGEST should be just long and we - can use local_hex_string_custom - */ - return local_hex_string_custom ((unsigned long) num, width); -#endif -#if defined (PRINTF_HAS_LONG_LONG) - /* Just use printf. */ - strcpy (format, local_hex_format_prefix ()); /* 0x */ - strcat (format, "%"); - strcat (format, width); /* e.g. "08l" */ - strcat (format, "l"); /* need "ll" for long long */ - strcat (format, local_hex_format_specifier ()); /* "x" */ - strcat (format, local_hex_format_suffix ()); /* "" */ - sprintf (res2, format, num); - return res2; -#else /* !defined (PRINTF_HAS_LONG_LONG) */ - /* Use strcat_address_numeric to print the number into a string, then + /* Use phex_nz to print the number into a string, then build the result string from local_hex_format_prefix, padding and the hex representation as indicated by "width". */ - - temp_nbr_buf[0] = 0; - /* With use_local == 0, we don't get the leading "0x" prefix. */ - /* MERGEBUG ?? As a quick fix I am replacing this call to - strcat_address_numeric with sprintf - strcat_address_numeric(num, 0, temp_nbr_buf, RESULT_BUF_LEN); - */ - - { - long long ll = num; - sprintf (temp_nbr_buf, "%llx", ll); - } + strcpy (temp_nbr_buf, phex_nz (num, sizeof (num))); /* parse width */ parse_ptr = width; pad_on_left = 1; @@ -672,8 +649,9 @@ longest_local_hex_string_custom (num, width) num_pad_chars = field_width - strlen (temp_nbr_buf); /* possibly negative */ if (strlen (local_hex_format_prefix ()) + num_len + num_pad_chars - < RESULT_BUF_LEN) /* paranoia */ - internal_error ("longest_local_hex_string_custom: insufficient space to store result"); + >= RESULT_BUF_LEN) /* paranoia */ + internal_error (__FILE__, __LINE__, + "local_hex_string_custom: insufficient space to store result"); strcpy (res2, local_hex_format_prefix ()); if (pad_on_left) @@ -694,15 +672,13 @@ longest_local_hex_string_custom (num, width) } } return res2; -#endif -} /* longest_local_hex_string_custom */ +} /* local_hex_string_custom */ /* Returns the appropriate printf format for octal numbers. */ char * -local_octal_format_custom (pre) - char *pre; +local_octal_format_custom (char *pre) { static char form[50]; @@ -716,8 +692,7 @@ local_octal_format_custom (pre) /* Returns the appropriate printf format for decimal numbers. */ char * -local_decimal_format_custom (pre) - char *pre; +local_decimal_format_custom (char *pre) { static char form[50]; @@ -748,8 +723,7 @@ local_decimal_format_custom (pre) both Modula-2 and for C. In the C case, TYPE_CODE_CHAR will never occur, and thus will never cause the failure of the test. */ int -simple_type (type) - struct type *type; +simple_type (struct type *type) { CHECK_TYPEDEF (type); switch (TYPE_CODE (type)) @@ -772,8 +746,7 @@ simple_type (type) properties of "greater than", "less than", etc, or for which the operations "increment" or "decrement" make sense. */ int -ordered_type (type) - struct type *type; +ordered_type (struct type *type) { CHECK_TYPEDEF (type); switch (TYPE_CODE (type)) @@ -792,8 +765,7 @@ ordered_type (type) /* Returns non-zero if the two types are the same */ int -same_type (arg1, arg2) - struct type *arg1, *arg2; +same_type (struct type *arg1, struct type *arg2) { CHECK_TYPEDEF (type); if (structured_type (arg1) ? !structured_type (arg2) : structured_type (arg2)) @@ -811,20 +783,19 @@ same_type (arg1, arg2) /* Returns non-zero if the type is integral */ int -integral_type (type) - struct type *type; +integral_type (struct type *type) { CHECK_TYPEDEF (type); switch (current_language->la_language) { case language_c: case language_cplus: + case language_objc: return (TYPE_CODE (type) != TYPE_CODE_INT) && (TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1; case language_m2: + case language_pascal: return TYPE_CODE (type) != TYPE_CODE_INT ? 0 : 1; - case language_chill: - error ("Missing Chill support in function integral_type."); /*FIXME */ default: error ("Language not supported."); } @@ -832,8 +803,7 @@ integral_type (type) /* Returns non-zero if the value is numeric */ int -numeric_type (type) - struct type *type; +numeric_type (struct type *type) { CHECK_TYPEDEF (type); switch (TYPE_CODE (type)) @@ -849,18 +819,18 @@ numeric_type (type) /* Returns non-zero if the value is a character type */ int -character_type (type) - struct type *type; +character_type (struct type *type) { CHECK_TYPEDEF (type); switch (current_language->la_language) { - case language_chill: case language_m2: + case language_pascal: return TYPE_CODE (type) != TYPE_CODE_CHAR ? 0 : 1; case language_c: case language_cplus: + case language_objc: return (TYPE_CODE (type) == TYPE_CODE_INT) && TYPE_LENGTH (type) == sizeof (char) ? 1 : 0; @@ -871,18 +841,18 @@ character_type (type) /* Returns non-zero if the value is a string type */ int -string_type (type) - struct type *type; +string_type (struct type *type) { CHECK_TYPEDEF (type); switch (current_language->la_language) { - case language_chill: case language_m2: + case language_pascal: return TYPE_CODE (type) != TYPE_CODE_STRING ? 0 : 1; case language_c: case language_cplus: + case language_objc: /* C does not have distinct string type. */ return (0); default: @@ -892,8 +862,7 @@ string_type (type) /* Returns non-zero if the value is a boolean type */ int -boolean_type (type) - struct type *type; +boolean_type (struct type *type) { CHECK_TYPEDEF (type); if (TYPE_CODE (type) == TYPE_CODE_BOOL) @@ -902,8 +871,10 @@ boolean_type (type) { case language_c: case language_cplus: - /* Might be more cleanly handled by having a TYPE_CODE_INT_NOT_BOOL - for CHILL and such languages, or a TYPE_CODE_INT_OR_BOOL for C. */ + case language_objc: + /* Might be more cleanly handled by having a + TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such + languages, or a TYPE_CODE_INT_OR_BOOL for C. */ if (TYPE_CODE (type) == TYPE_CODE_INT) return 1; default: @@ -914,8 +885,7 @@ boolean_type (type) /* Returns non-zero if the value is a floating-point type */ int -float_type (type) - struct type *type; +float_type (struct type *type) { CHECK_TYPEDEF (type); return TYPE_CODE (type) == TYPE_CODE_FLT; @@ -923,8 +893,7 @@ float_type (type) /* Returns non-zero if the value is a pointer type */ int -pointer_type (type) - struct type *type; +pointer_type (struct type *type) { return TYPE_CODE (type) == TYPE_CODE_PTR || TYPE_CODE (type) == TYPE_CODE_REF; @@ -932,23 +901,26 @@ pointer_type (type) /* Returns non-zero if the value is a structured type */ int -structured_type (type) - struct type *type; +structured_type (struct type *type) { CHECK_TYPEDEF (type); switch (current_language->la_language) { case language_c: case language_cplus: + case language_objc: return (TYPE_CODE (type) == TYPE_CODE_STRUCT) || (TYPE_CODE (type) == TYPE_CODE_UNION) || (TYPE_CODE (type) == TYPE_CODE_ARRAY); + case language_pascal: + return (TYPE_CODE(type) == TYPE_CODE_STRUCT) || + (TYPE_CODE(type) == TYPE_CODE_UNION) || + (TYPE_CODE(type) == TYPE_CODE_SET) || + (TYPE_CODE(type) == TYPE_CODE_ARRAY); case language_m2: return (TYPE_CODE (type) == TYPE_CODE_STRUCT) || (TYPE_CODE (type) == TYPE_CODE_SET) || (TYPE_CODE (type) == TYPE_CODE_ARRAY); - case language_chill: - error ("Missing Chill support in function structured_type."); /*FIXME */ default: return (0); } @@ -956,16 +928,14 @@ structured_type (type) #endif struct type * -lang_bool_type () +lang_bool_type (void) { struct symbol *sym; struct type *type; switch (current_language->la_language) { - case language_chill: - return builtin_type_chill_bool; case language_fortran: - sym = lookup_symbol ("logical", NULL, VAR_NAMESPACE, NULL, NULL); + sym = lookup_symbol ("logical", NULL, VAR_DOMAIN, NULL, NULL); if (sym) { type = SYMBOL_TYPE (sym); @@ -974,7 +944,11 @@ lang_bool_type () } return builtin_type_f_logical_s2; case language_cplus: - sym = lookup_symbol ("bool", NULL, VAR_NAMESPACE, NULL, NULL); + case language_pascal: + if (current_language->la_language==language_cplus) + {sym = lookup_symbol ("bool", NULL, VAR_DOMAIN, NULL, NULL);} + else + {sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL);} if (sym) { type = SYMBOL_TYPE (sym); @@ -982,6 +956,15 @@ lang_bool_type () return type; } return builtin_type_bool; + case language_java: + sym = lookup_symbol ("boolean", NULL, VAR_DOMAIN, NULL, NULL); + if (sym) + { + type = SYMBOL_TYPE (sym); + if (type && TYPE_CODE (type) == TYPE_CODE_BOOL) + return type; + } + return java_boolean_type; default: return builtin_type_int; } @@ -992,8 +975,7 @@ lang_bool_type () /* Returns non-zero if the value VAL represents a true value. */ int -value_true (val) - value_ptr val; +value_true (struct value *val) { /* It is possible that we should have some sort of error if a non-boolean value is used in this context. Possibly dependent on some kind of @@ -1010,9 +992,7 @@ value_true (val) #if 0 /* Currently unused */ void -binop_type_check (arg1, arg2, op) - value_ptr arg1, arg2; - int op; +binop_type_check (struct value *arg1, struct value *arg2, int op) { struct type *t1, *t2; @@ -1143,6 +1123,7 @@ binop_type_check (arg1, arg2, op) #ifdef _LANG_c case language_c: case language_cplus: + case language_objc: switch (op) { case BINOP_DIV: @@ -1168,9 +1149,19 @@ binop_type_check (arg1, arg2, op) } #endif -#ifdef _LANG_chill - case language_chill: - error ("Missing Chill support in function binop_type_check."); /*FIXME */ +#ifdef _LANG_pascal + case language_pascal: + switch(op) + { + case BINOP_DIV: + if (!float_type(t1) && !float_type(t2)) + type_op_error ("Arguments to %s must be floating point numbers.",op); + break; + case BINOP_INTDIV: + if (!integral_type(t1) || !integral_type(t2)) + type_op_error ("Arguments to %s must be of integral type.",op); + break; + } #endif } @@ -1189,10 +1180,7 @@ binop_type_check (arg1, arg2, op) this is an error and error () is called. Otherwise, it is a warning and printf() is called. */ void -op_error (fmt, op, fatal) - char *fmt; - enum exp_opcode op; - int fatal; +op_error (char *fmt, enum exp_opcode op, int fatal) { if (fatal) error (fmt, op_string (op)); @@ -1202,47 +1190,63 @@ op_error (fmt, op, fatal) } } -/* These are called when a language fails a type- or range-check. - The first argument should be a printf()-style format string, and - the rest of the arguments should be its arguments. If - [type|range]_check is [type|range]_check_on, then return_to_top_level() - is called in the style of error (). Otherwise, the message is prefixed - by the value of warning_pre_print and we do not return to the top level. */ +/* These are called when a language fails a type- or range-check. The + first argument should be a printf()-style format string, and the + rest of the arguments should be its arguments. If + [type|range]_check is [type|range]_check_on, an error is printed; + if [type|range]_check_warn, a warning; otherwise just the + message. */ void -type_error (char *string,...) +type_error (const char *string,...) { va_list args; va_start (args, string); - if (type_check == type_check_warn) - fprintf_filtered (gdb_stderr, warning_pre_print); - else - error_begin (); - - vfprintf_filtered (gdb_stderr, string, args); - fprintf_filtered (gdb_stderr, "\n"); + switch (type_check) + { + case type_check_warn: + vwarning (string, args); + break; + case type_check_on: + verror (string, args); + break; + case type_check_off: + /* FIXME: cagney/2002-01-30: Should this function print anything + when type error is off? */ + vfprintf_filtered (gdb_stderr, string, args); + fprintf_filtered (gdb_stderr, "\n"); + break; + default: + internal_error (__FILE__, __LINE__, "bad switch"); + } va_end (args); - if (type_check == type_check_on) - return_to_top_level (RETURN_ERROR); } void -range_error (char *string,...) +range_error (const char *string,...) { va_list args; va_start (args, string); - if (range_check == range_check_warn) - fprintf_filtered (gdb_stderr, warning_pre_print); - else - error_begin (); - - vfprintf_filtered (gdb_stderr, string, args); - fprintf_filtered (gdb_stderr, "\n"); + switch (range_check) + { + case range_check_warn: + vwarning (string, args); + break; + case range_check_on: + verror (string, args); + break; + case range_check_off: + /* FIXME: cagney/2002-01-30: Should this function print anything + when range error is off? */ + vfprintf_filtered (gdb_stderr, string, args); + fprintf_filtered (gdb_stderr, "\n"); + break; + default: + internal_error (__FILE__, __LINE__, "bad switch"); + } va_end (args); - if (range_check == range_check_on) - return_to_top_level (RETURN_ERROR); } @@ -1251,8 +1255,7 @@ range_error (char *string,...) /* Return the language enum for a given language string. */ enum language -language_enum (str) - char *str; +language_enum (char *str) { int i; @@ -1266,8 +1269,7 @@ language_enum (str) /* Return the language struct for a given language enum. */ const struct language_defn * -language_def (lang) - enum language lang; +language_def (enum language lang) { int i; @@ -1283,8 +1285,7 @@ language_def (lang) /* Return the language as a string */ char * -language_str (lang) - enum language lang; +language_str (enum language lang) { int i; @@ -1299,9 +1300,7 @@ language_str (lang) } static void -set_check (ignore, from_tty) - char *ignore; - int from_tty; +set_check (char *ignore, int from_tty) { printf_unfiltered ( "\"set check\" must be followed by the name of a check subcommand.\n"); @@ -1309,9 +1308,7 @@ set_check (ignore, from_tty) } static void -show_check (ignore, from_tty) - char *ignore; - int from_tty; +show_check (char *ignore, int from_tty) { cmd_show_list (showchecklist, from_tty, ""); } @@ -1319,14 +1316,13 @@ show_check (ignore, from_tty) /* Add a language to the set of known languages. */ void -add_language (lang) - const struct language_defn *lang; +add_language (const struct language_defn *lang) { if (lang->la_magic != LANG_MAGIC) { fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n", lang->la_name); - abort (); + internal_error (__FILE__, __LINE__, "failed internal consistency check"); } if (!languages) @@ -1344,95 +1340,118 @@ add_language (lang) languages[languages_size++] = lang; } +/* Iterate through all registered languages looking for and calling + any non-NULL struct language_defn.skip_trampoline() functions. + Return the result from the first that returns non-zero, or 0 if all + `fail'. */ +CORE_ADDR +skip_language_trampoline (CORE_ADDR pc) +{ + int i; + + for (i = 0; i < languages_size; i++) + { + if (languages[i]->skip_trampoline) + { + CORE_ADDR real_pc = (languages[i]->skip_trampoline) (pc); + if (real_pc) + return real_pc; + } + } + + return 0; +} + +/* Return demangled language symbol, or NULL. + FIXME: Options are only useful for certain languages and ignored + by others, so it would be better to remove them here and have a + more flexible demangler for the languages that need it. + FIXME: Sometimes the demangler is invoked when we don't know the + language, so we can't use this everywhere. */ +char * +language_demangle (const struct language_defn *current_language, + const char *mangled, int options) +{ + if (current_language != NULL && current_language->la_demangle) + return current_language->la_demangle (mangled, options); + return NULL; +} + + /* Define the language that is no language. */ static int -unk_lang_parser () +unk_lang_parser (void) { return 1; } static void -unk_lang_error (msg) - char *msg; +unk_lang_error (char *msg) { error ("Attempted to parse an expression with unknown language"); } static void -unk_lang_emit_char (c, stream, quoter) - register int c; - struct ui_file *stream; - int quoter; +unk_lang_emit_char (register int c, struct ui_file *stream, int quoter) { error ("internal error - unimplemented function unk_lang_emit_char called."); } static void -unk_lang_printchar (c, stream) - register int c; - struct ui_file *stream; +unk_lang_printchar (register int c, struct ui_file *stream) { error ("internal error - unimplemented function unk_lang_printchar called."); } static void -unk_lang_printstr (stream, string, length, width, force_ellipses) - struct ui_file *stream; - char *string; - unsigned int length; - int width; - int force_ellipses; +unk_lang_printstr (struct ui_file *stream, char *string, unsigned int length, + int width, int force_ellipses) { error ("internal error - unimplemented function unk_lang_printstr called."); } static struct type * -unk_lang_create_fundamental_type (objfile, typeid) - struct objfile *objfile; - int typeid; +unk_lang_create_fundamental_type (struct objfile *objfile, int typeid) { error ("internal error - unimplemented function unk_lang_create_fundamental_type called."); } static void -unk_lang_print_type (type, varstring, stream, show, level) - struct type *type; - char *varstring; - struct ui_file *stream; - int show; - int level; +unk_lang_print_type (struct type *type, char *varstring, struct ui_file *stream, + int show, int level) { error ("internal error - unimplemented function unk_lang_print_type called."); } static int -unk_lang_val_print (type, valaddr, embedded_offset, address, stream, format, deref_ref, - recurse, pretty) - struct type *type; - char *valaddr; - int embedded_offset; - CORE_ADDR address; - struct ui_file *stream; - int format; - int deref_ref; - int recurse; - enum val_prettyprint pretty; +unk_lang_val_print (struct type *type, char *valaddr, int embedded_offset, + CORE_ADDR address, struct ui_file *stream, int format, + int deref_ref, int recurse, enum val_prettyprint pretty) { error ("internal error - unimplemented function unk_lang_val_print called."); } static int -unk_lang_value_print (val, stream, format, pretty) - value_ptr val; - struct ui_file *stream; - int format; - enum val_prettyprint pretty; +unk_lang_value_print (struct value *val, struct ui_file *stream, int format, + enum val_prettyprint pretty) { error ("internal error - unimplemented function unk_lang_value_print called."); } -static struct type **CONST_PTR (unknown_builtin_types[]) = +static CORE_ADDR unk_lang_trampoline (CORE_ADDR pc) +{ + return 0; +} + +/* Unknown languages just use the cplus demangler. */ +static char *unk_lang_demangle (const char *mangled, int options) +{ + return cplus_demangle (mangled, options); +} + + +static struct type **const (unknown_builtin_types[]) = { 0 }; @@ -1448,6 +1467,7 @@ const struct language_defn unknown_language_defn = &unknown_builtin_types[0], range_check_off, type_check_off, + case_sensitive_on, unk_lang_parser, unk_lang_error, evaluate_subexp_standard, @@ -1458,6 +1478,10 @@ const struct language_defn unknown_language_defn = unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ + unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1477,6 +1501,7 @@ const struct language_defn auto_language_defn = &unknown_builtin_types[0], range_check_off, type_check_off, + case_sensitive_on, unk_lang_parser, unk_lang_error, evaluate_subexp_standard, @@ -1487,6 +1512,10 @@ const struct language_defn auto_language_defn = unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ + unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1505,6 +1534,7 @@ const struct language_defn local_language_defn = &unknown_builtin_types[0], range_check_off, type_check_off, + case_sensitive_on, unk_lang_parser, unk_lang_error, evaluate_subexp_standard, @@ -1515,6 +1545,10 @@ const struct language_defn local_language_defn = unk_lang_print_type, /* Print a type using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ + unk_lang_trampoline, /* Language specific skip_trampoline */ + value_of_this, /* value_of_this */ + basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ + unk_lang_demangle, /* Language specific symbol demangler */ {"", "", "", ""}, /* Binary format info */ {"0%lo", "0", "o", ""}, /* Octal format info */ {"%ld", "", "d", ""}, /* Decimal format info */ @@ -1529,7 +1563,7 @@ const struct language_defn local_language_defn = /* Initialize the language routines */ void -_initialize_language () +_initialize_language (void) { struct cmd_list_element *set, *show; @@ -1540,17 +1574,17 @@ _initialize_language () "Set the current source language.", &setlist); show = add_show_from_set (set, &showlist); - set->function.cfunc = set_language_command; - show->function.cfunc = show_language_command; + set_cmd_cfunc (set, set_language_command); + set_cmd_cfunc (show, show_language_command); add_prefix_cmd ("check", no_class, set_check, - "Set the status of the type/range checker", + "Set the status of the type/range checker.", &setchecklist, "set check ", 0, &setlist); add_alias_cmd ("c", "check", no_class, 1, &setlist); add_alias_cmd ("ch", "check", no_class, 1, &setlist); add_prefix_cmd ("check", no_class, show_check, - "Show the status of the type/range checker", + "Show the status of the type/range checker.", &showchecklist, "show check ", 0, &showlist); add_alias_cmd ("c", "check", no_class, 1, &showlist); add_alias_cmd ("ch", "check", no_class, 1, &showlist); @@ -1560,27 +1594,35 @@ _initialize_language () "Set type checking. (on/warn/off/auto)", &setchecklist); show = add_show_from_set (set, &showchecklist); - set->function.cfunc = set_type_command; - show->function.cfunc = show_type_command; + set_cmd_cfunc (set, set_type_command); + set_cmd_cfunc (show, show_type_command); set = add_set_cmd ("range", class_support, var_string_noescape, (char *) &range, "Set range checking. (on/warn/off/auto)", &setchecklist); show = add_show_from_set (set, &showchecklist); - set->function.cfunc = set_range_command; - show->function.cfunc = show_range_command; + set_cmd_cfunc (set, set_range_command); + set_cmd_cfunc (show, show_range_command); + + set = add_set_cmd ("case-sensitive", class_support, var_string_noescape, + (char *) &case_sensitive, + "Set case sensitivity in name search. (on/off/auto)\n\ +For Fortran the default is off; for other languages the default is on.", + &setlist); + show = add_show_from_set (set, &showlist); + set_cmd_cfunc (set, set_case_command); + set_cmd_cfunc (show, show_case_command); add_language (&unknown_language_defn); add_language (&local_language_defn); add_language (&auto_language_defn); language = savestring ("auto", strlen ("auto")); - set_language_command (language, 0); - type = savestring ("auto", strlen ("auto")); - set_type_command (NULL, 0); - range = savestring ("auto", strlen ("auto")); - set_range_command (NULL, 0); + case_sensitive = savestring ("auto",strlen ("auto")); + + /* Have the above take effect */ + set_language (language_auto); }