X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fada-lex.l;h=ce8de69f8e3fee17edc8b300ae912ea4336b5ae9;hb=edd079d9f6ca2f9ad21322b742269aec5de61190;hp=3c30043323c6f9afa1a891e97dd4c3dc63411294;hpb=0e9f083f4cb94a9dc861f38ba151aac06efce2b8;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ada-lex.l b/gdb/ada-lex.l index 3c30043323..ce8de69f8e 100644 --- a/gdb/ada-lex.l +++ b/gdb/ada-lex.l @@ -1,5 +1,5 @@ /* FLEX lexer for Ada expressions, for GDB. - Copyright (C) 1994-2013 Free Software Foundation, Inc. + Copyright (C) 1994-2017 Free Software Foundation, Inc. This file is part of GDB. @@ -41,6 +41,14 @@ POSEXP (e"+"?{NUM10}) %{ +#include "common/diagnostics.h" + +/* Some old versions of flex generate code that uses the "register" keyword, + which clang warns about. This was observed for example with flex 2.5.35, + as shipped with macOS 10.12. */ +DIAGNOSTIC_PUSH +DIAGNOSTIC_IGNORE_DEPRECATED_REGISTER + #define NUMERAL_WIDTH 256 #define LONGEST_SIGN ((ULONGEST) 1 << (sizeof(LONGEST) * HOST_CHAR_BIT - 1)) @@ -48,8 +56,9 @@ POSEXP (e"+"?{NUM10}) static char numbuf[NUMERAL_WIDTH]; static void canonicalizeNumeral (char *s1, const char *); static struct stoken processString (const char*, int); -static int processInt (const char *, const char *, const char *); -static int processReal (const char *); +static int processInt (struct parser_state *, const char *, const char *, + const char *); +static int processReal (struct parser_state *, const char *); static struct stoken processId (const char *, int); static int processAttribute (const char *); static int find_dot_all (const char *); @@ -89,40 +98,42 @@ static int find_dot_all (const char *); {NUM10}{POSEXP} { canonicalizeNumeral (numbuf, yytext); - return processInt (NULL, numbuf, strrchr(numbuf, 'e')+1); + return processInt (pstate, NULL, numbuf, + strrchr (numbuf, 'e') + 1); } {NUM10} { canonicalizeNumeral (numbuf, yytext); - return processInt (NULL, numbuf, NULL); + return processInt (pstate, NULL, numbuf, NULL); } {NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#"{POSEXP} { canonicalizeNumeral (numbuf, yytext); - return processInt (numbuf, + return processInt (pstate, numbuf, strchr (numbuf, '#') + 1, strrchr(numbuf, '#') + 1); } {NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#" { canonicalizeNumeral (numbuf, yytext); - return processInt (numbuf, strchr (numbuf, '#') + 1, NULL); + return processInt (pstate, numbuf, strchr (numbuf, '#') + 1, + NULL); } "0x"{HEXDIG}+ { canonicalizeNumeral (numbuf, yytext+2); - return processInt ("16#", numbuf, NULL); + return processInt (pstate, "16#", numbuf, NULL); } {NUM10}"."{NUM10}{EXP} { canonicalizeNumeral (numbuf, yytext); - return processReal (numbuf); + return processReal (pstate, numbuf); } {NUM10}"."{NUM10} { canonicalizeNumeral (numbuf, yytext); - return processReal (numbuf); + return processReal (pstate, numbuf); } {NUM10}"#"{NUM16}"."{NUM16}"#"{EXP} { @@ -134,14 +145,14 @@ static int find_dot_all (const char *); } "'"({GRAPHIC}|\")"'" { - yylval.typed_val.type = type_char (); + yylval.typed_val.type = type_char (pstate); yylval.typed_val.val = yytext[1]; return CHARLIT; } "'[\""{HEXDIG}{2}"\"]'" { int v; - yylval.typed_val.type = type_char (); + yylval.typed_val.type = type_char (pstate); sscanf (yytext+3, "%2x", &v); yylval.typed_val.val = v; return CHARLIT; @@ -202,7 +213,7 @@ false { return FALSEKEYWORD; } /* ATTRIBUTES */ -{TICK}[a-zA-Z][a-zA-Z]+ { return processAttribute (yytext+1); } +{TICK}[a-zA-Z][a-zA-Z]+ { BEGIN INITIAL; return processAttribute (yytext+1); } /* PUNCTUATION */ @@ -288,8 +299,6 @@ false { return FALSEKEYWORD; } %% #include -#include - /* Initialize the lexer for processing new expression. */ static void @@ -324,7 +333,8 @@ canonicalizeNumeral (char *s1, const char *s2) */ static int -processInt (const char *base0, const char *num0, const char *exp0) +processInt (struct parser_state *par_state, const char *base0, + const char *num0, const char *exp0) { ULONGEST result; long exp; @@ -360,11 +370,11 @@ processInt (const char *base0, const char *num0, const char *exp0) exp -= 1; } - if ((result >> (gdbarch_int_bit (parse_gdbarch)-1)) == 0) - yylval.typed_val.type = type_int (); - else if ((result >> (gdbarch_long_bit (parse_gdbarch)-1)) == 0) - yylval.typed_val.type = type_long (); - else if (((result >> (gdbarch_long_bit (parse_gdbarch)-1)) >> 1) == 0) + if ((result >> (gdbarch_int_bit (parse_gdbarch (par_state))-1)) == 0) + yylval.typed_val.type = type_int (par_state); + else if ((result >> (gdbarch_long_bit (parse_gdbarch (par_state))-1)) == 0) + yylval.typed_val.type = type_long (par_state); + else if (((result >> (gdbarch_long_bit (parse_gdbarch (par_state))-1)) >> 1) == 0) { /* We have a number representable as an unsigned integer quantity. For consistency with the C treatment, we will treat it as an @@ -374,7 +384,7 @@ processInt (const char *base0, const char *num0, const char *exp0) assignment does the trick (no, it doesn't; read the reference manual). */ yylval.typed_val.type - = builtin_type (parse_gdbarch)->builtin_unsigned_long; + = builtin_type (parse_gdbarch (par_state))->builtin_unsigned_long; if (result & LONGEST_SIGN) yylval.typed_val.val = (LONGEST) (result & ~LONGEST_SIGN) @@ -384,25 +394,21 @@ processInt (const char *base0, const char *num0, const char *exp0) return INT; } else - yylval.typed_val.type = type_long_long (); + yylval.typed_val.type = type_long_long (par_state); yylval.typed_val.val = (LONGEST) result; return INT; } static int -processReal (const char *num0) +processReal (struct parser_state *par_state, const char *num0) { - sscanf (num0, "%" DOUBLEST_SCAN_FORMAT, &yylval.typed_val_float.dval); - - yylval.typed_val_float.type = type_float (); - if (sizeof(DOUBLEST) >= gdbarch_double_bit (parse_gdbarch) - / TARGET_CHAR_BIT) - yylval.typed_val_float.type = type_double (); - if (sizeof(DOUBLEST) >= gdbarch_long_double_bit (parse_gdbarch) - / TARGET_CHAR_BIT) - yylval.typed_val_float.type = type_long_double (); + yylval.typed_val_float.type = type_long_double (par_state); + bool parsed = parse_float (num0, strlen (num0), + yylval.typed_val_float.type, + yylval.typed_val_float.val); + gdb_assert (parsed); return FLOAT; } @@ -426,7 +432,7 @@ processReal (const char *num0) static struct stoken processId (const char *name0, int len) { - char *name = obstack_alloc (&temp_parse_space, len + 11); + char *name = (char *) obstack_alloc (&temp_parse_space, len + 11); int i0, i; struct stoken result; @@ -497,7 +503,7 @@ processString (const char *text, int len) const char *lim = text + len; struct stoken result; - q = obstack_alloc (&temp_parse_space, len); + q = (char *) obstack_alloc (&temp_parse_space, len); result.ptr = q; p = text; while (p < lim) @@ -537,19 +543,20 @@ static int find_dot_all (const char *str) { int i; - for (i = 0; str[i] != '\000'; i += 1) - { - if (str[i] == '.') - { - int i0 = i; - do - i += 1; - while (isspace (str[i])); - if (strncmp (str+i, "all", 3) == 0 - && ! isalnum (str[i+3]) && str[i+3] != '_') - return i0; - } - } + + for (i = 0; str[i] != '\000'; i++) + if (str[i] == '.') + { + int i0 = i; + + do + i += 1; + while (isspace (str[i])); + + if (strncasecmp (str + i, "all", 3) == 0 + && !isalnum (str[i + 3]) && str[i + 3] != '_') + return i0; + } return -1; } @@ -645,3 +652,5 @@ dummy_function ada_flex_use[] = { (dummy_function) yyunput }; + +DIAGNOSTIC_POP