1117415Skan/* Mainly the interface between cpplib and the C front ends. 290075Sobrien Copyright (C) 1987, 1988, 1989, 1992, 1994, 1995, 1996, 1997 3169699Skan 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 4169699Skan Free Software Foundation, Inc. 518334Speter 690075SobrienThis file is part of GCC. 718334Speter 890075SobrienGCC is free software; you can redistribute it and/or modify it under 990075Sobrienthe terms of the GNU General Public License as published by the Free 1090075SobrienSoftware Foundation; either version 2, or (at your option) any later 1190075Sobrienversion. 1218334Speter 1390075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1490075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1590075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1690075Sobrienfor more details. 1718334Speter 1818334SpeterYou should have received a copy of the GNU General Public License 1990075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 20169699SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 21169699Skan02110-1301, USA. */ 2218334Speter 2350397Sobrien#include "config.h" 2450397Sobrien#include "system.h" 25132727Skan#include "coretypes.h" 26132727Skan#include "tm.h" 2718334Speter 28117415Skan#include "real.h" 2918334Speter#include "rtl.h" 3018334Speter#include "tree.h" 3118334Speter#include "input.h" 3250397Sobrien#include "output.h" 3318334Speter#include "c-tree.h" 34117415Skan#include "c-common.h" 3518334Speter#include "flags.h" 3690075Sobrien#include "timevar.h" 3790075Sobrien#include "cpplib.h" 3818334Speter#include "c-pragma.h" 3950397Sobrien#include "toplev.h" 4052284Sobrien#include "intl.h" 4190075Sobrien#include "tm_p.h" 4290075Sobrien#include "splay-tree.h" 4390075Sobrien#include "debug.h" 4418334Speter 4590075Sobrien/* We may keep statistics about how long which files took to compile. */ 4690075Sobrienstatic int header_time, body_time; 4790075Sobrienstatic splay_tree file_info_tree; 4890075Sobrien 4990075Sobrienint pending_lang_change; /* If we need to switch languages - C++ only */ 5090075Sobrienint c_header_level; /* depth in C headers - C++ only */ 5118334Speter 52169699Skan/* If we need to translate characters received. This is tri-state: 53169699Skan 0 means use only the untranslated string; 1 means use only 54169699Skan the translated string; -1 means chain the translated string 55169699Skan to the untranslated one. */ 56169699Skanint c_lex_string_translate = 1; 57169699Skan 58169699Skan/* True if strings should be passed to the caller of c_lex completely 59169699Skan unmolested (no concatenation, no translation). */ 60169699Skanbool c_lex_return_raw_strings = false; 61169699Skan 62132727Skanstatic tree interpret_integer (const cpp_token *, unsigned int); 63132727Skanstatic tree interpret_float (const cpp_token *, unsigned int); 64169699Skanstatic enum integer_type_kind narrowest_unsigned_type 65169699Skan (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int); 66169699Skanstatic enum integer_type_kind narrowest_signed_type 67169699Skan (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, unsigned int); 68132727Skanstatic enum cpp_ttype lex_string (const cpp_token *, tree *, bool); 69132727Skanstatic tree lex_charconst (const cpp_token *); 70132727Skanstatic void update_header_times (const char *); 71132727Skanstatic int dump_one_header (splay_tree_node, void *); 72132727Skanstatic void cb_line_change (cpp_reader *, const cpp_token *, int); 73132727Skanstatic void cb_ident (cpp_reader *, unsigned int, const cpp_string *); 74132727Skanstatic void cb_def_pragma (cpp_reader *, unsigned int); 75132727Skanstatic void cb_define (cpp_reader *, unsigned int, cpp_hashnode *); 76132727Skanstatic void cb_undef (cpp_reader *, unsigned int, cpp_hashnode *); 7718334Speter 78132727Skanvoid 79132727Skaninit_c_lex (void) 8018334Speter{ 8190075Sobrien struct cpp_callbacks *cb; 8290075Sobrien struct c_fileinfo *toplevel; 8318334Speter 84169699Skan /* The get_fileinfo data structure must be initialized before 85169699Skan cpp_read_main_file is called. */ 8690075Sobrien toplevel = get_fileinfo ("<top level>"); 8790075Sobrien if (flag_detailed_statistics) 8850397Sobrien { 8990075Sobrien header_time = 0; 9090075Sobrien body_time = get_run_time (); 9190075Sobrien toplevel->time = body_time; 9250397Sobrien } 9318334Speter 9490075Sobrien cb = cpp_get_callbacks (parse_in); 9518334Speter 9690075Sobrien cb->line_change = cb_line_change; 9790075Sobrien cb->ident = cb_ident; 9890075Sobrien cb->def_pragma = cb_def_pragma; 99132727Skan cb->valid_pch = c_common_valid_pch; 100132727Skan cb->read_pch = c_common_read_pch; 10118334Speter 10290075Sobrien /* Set the debug callbacks if we can use them. */ 10390075Sobrien if (debug_info_level == DINFO_LEVEL_VERBOSE 104169699Skan && (write_symbols == DWARF2_DEBUG 105169699Skan || write_symbols == VMS_AND_DWARF2_DEBUG)) 10618334Speter { 10790075Sobrien cb->define = cb_define; 10890075Sobrien cb->undef = cb_undef; 10918334Speter } 11018334Speter} 11118334Speter 11290075Sobrienstruct c_fileinfo * 113132727Skanget_fileinfo (const char *name) 11418334Speter{ 11590075Sobrien splay_tree_node n; 11690075Sobrien struct c_fileinfo *fi; 11718334Speter 118169699Skan if (!file_info_tree) 119169699Skan file_info_tree = splay_tree_new ((splay_tree_compare_fn) strcmp, 120169699Skan 0, 121169699Skan (splay_tree_delete_value_fn) free); 122169699Skan 12390075Sobrien n = splay_tree_lookup (file_info_tree, (splay_tree_key) name); 12490075Sobrien if (n) 12590075Sobrien return (struct c_fileinfo *) n->value; 12690075Sobrien 127169699Skan fi = XNEW (struct c_fileinfo); 12890075Sobrien fi->time = 0; 12990075Sobrien fi->interface_only = 0; 13090075Sobrien fi->interface_unknown = 1; 13190075Sobrien splay_tree_insert (file_info_tree, (splay_tree_key) name, 13290075Sobrien (splay_tree_value) fi); 13390075Sobrien return fi; 13418334Speter} 13590075Sobrien 13690075Sobrienstatic void 137132727Skanupdate_header_times (const char *name) 13850397Sobrien{ 13990075Sobrien /* Changing files again. This means currently collected time 14090075Sobrien is charged against header time, and body time starts back at 0. */ 14190075Sobrien if (flag_detailed_statistics) 14250397Sobrien { 14390075Sobrien int this_time = get_run_time (); 14490075Sobrien struct c_fileinfo *file = get_fileinfo (name); 14590075Sobrien header_time += this_time - body_time; 14690075Sobrien file->time += this_time - body_time; 14790075Sobrien body_time = this_time; 14850397Sobrien } 14950397Sobrien} 15050397Sobrien 15118334Speterstatic int 152169699Skandump_one_header (splay_tree_node n, void * ARG_UNUSED (dummy)) 15318334Speter{ 15490075Sobrien print_time ((const char *) n->key, 15590075Sobrien ((struct c_fileinfo *) n->value)->time); 15690075Sobrien return 0; 15718334Speter} 15818334Speter 15918334Spetervoid 160132727Skandump_time_statistics (void) 16118334Speter{ 16290075Sobrien struct c_fileinfo *file = get_fileinfo (input_filename); 16390075Sobrien int this_time = get_run_time (); 16490075Sobrien file->time += this_time - body_time; 16518334Speter 16690075Sobrien fprintf (stderr, "\n******\n"); 16790075Sobrien print_time ("header files (total)", header_time); 16890075Sobrien print_time ("main file (total)", this_time - body_time); 16990075Sobrien fprintf (stderr, "ratio = %g : 1\n", 170169699Skan (double) header_time / (double) (this_time - body_time)); 17190075Sobrien fprintf (stderr, "\n******\n"); 17218334Speter 17390075Sobrien splay_tree_foreach (file_info_tree, dump_one_header, 0); 17418334Speter} 17518334Speter 17690075Sobrienstatic void 177169699Skancb_ident (cpp_reader * ARG_UNUSED (pfile), 178169699Skan unsigned int ARG_UNUSED (line), 179169699Skan const cpp_string * ARG_UNUSED (str)) 18050397Sobrien{ 18190075Sobrien#ifdef ASM_OUTPUT_IDENT 182169699Skan if (!flag_no_ident) 18350397Sobrien { 18490075Sobrien /* Convert escapes in the string. */ 185132727Skan cpp_string cstr = { 0, 0 }; 186132727Skan if (cpp_interpret_string (pfile, str, 1, &cstr, false)) 187132727Skan { 188132727Skan ASM_OUTPUT_IDENT (asm_out_file, (const char *) cstr.text); 189169699Skan free ((void *) cstr.text); 190132727Skan } 19150397Sobrien } 19290075Sobrien#endif 19350397Sobrien} 19450397Sobrien 19590075Sobrien/* Called at the start of every non-empty line. TOKEN is the first 19690075Sobrien lexed token on the line. Used for diagnostic line numbers. */ 19790075Sobrienstatic void 198169699Skancb_line_change (cpp_reader * ARG_UNUSED (pfile), const cpp_token *token, 199132727Skan int parsing_args) 20018334Speter{ 201169699Skan if (token->type != CPP_EOF && !parsing_args) 202169699Skan#ifdef USE_MAPPED_LOCATION 203169699Skan input_location = token->src_loc; 204169699Skan#else 205169699Skan { 206169699Skan source_location loc = token->src_loc; 207169699Skan const struct line_map *map = linemap_lookup (&line_table, loc); 208169699Skan input_line = SOURCE_LINE (map, loc); 209169699Skan } 210169699Skan#endif 21118334Speter} 21252284Sobrien 213132727Skanvoid 214132727Skanfe_file_change (const struct line_map *new_map) 21552284Sobrien{ 216132727Skan if (new_map == NULL) 217169699Skan return; 21852284Sobrien 21990075Sobrien if (new_map->reason == LC_ENTER) 22018334Speter { 22190075Sobrien /* Don't stack the main buffer on the input stack; 22290075Sobrien we already did in compile_file. */ 223169699Skan if (!MAIN_FILE_P (new_map)) 22418334Speter { 225169699Skan#ifdef USE_MAPPED_LOCATION 226169699Skan int included_at = LAST_SOURCE_LINE_LOCATION (new_map - 1); 22796263Sobrien 228169699Skan input_location = included_at; 229169699Skan push_srcloc (new_map->start_location); 230169699Skan#else 231169699Skan int included_at = LAST_SOURCE_LINE (new_map - 1); 232169699Skan 233132727Skan input_line = included_at; 23490075Sobrien push_srcloc (new_map->to_file, 1); 235169699Skan#endif 23696263Sobrien (*debug_hooks->start_source_file) (included_at, new_map->to_file); 23790075Sobrien#ifndef NO_IMPLICIT_EXTERN_C 23890075Sobrien if (c_header_level) 23990075Sobrien ++c_header_level; 24090075Sobrien else if (new_map->sysp == 2) 24118334Speter { 24290075Sobrien c_header_level = 1; 24390075Sobrien ++pending_lang_change; 24418334Speter } 24590075Sobrien#endif 24618334Speter } 24790075Sobrien } 24890075Sobrien else if (new_map->reason == LC_LEAVE) 24990075Sobrien { 25090075Sobrien#ifndef NO_IMPLICIT_EXTERN_C 25190075Sobrien if (c_header_level && --c_header_level == 0) 25218334Speter { 25390075Sobrien if (new_map->sysp == 2) 254169699Skan warning (0, "badly nested C headers from preprocessor"); 25590075Sobrien --pending_lang_change; 25618334Speter } 25790075Sobrien#endif 25890075Sobrien pop_srcloc (); 259132727Skan 260132727Skan (*debug_hooks->end_source_file) (new_map->to_line); 26190075Sobrien } 26218334Speter 26390075Sobrien update_header_times (new_map->to_file); 264122191Skan in_system_header = new_map->sysp != 0; 265169699Skan#ifdef USE_MAPPED_LOCATION 266169699Skan input_location = new_map->start_location; 267169699Skan#else 26890075Sobrien input_filename = new_map->to_file; 269132727Skan input_line = new_map->to_line; 270169699Skan#endif 27190075Sobrien} 27218334Speter 27390075Sobrienstatic void 274169699Skancb_def_pragma (cpp_reader *pfile, source_location loc) 27590075Sobrien{ 27690075Sobrien /* Issue a warning message if we have been asked to do so. Ignore 27790075Sobrien unknown pragmas in system headers unless an explicit 27890075Sobrien -Wunknown-pragmas has been given. */ 27990075Sobrien if (warn_unknown_pragmas > in_system_header) 28090075Sobrien { 281102791Skan const unsigned char *space, *name; 28290075Sobrien const cpp_token *s; 283169699Skan#ifndef USE_MAPPED_LOCATION 284169699Skan location_t fe_loc; 285169699Skan const struct line_map *map = linemap_lookup (&line_table, loc); 286169699Skan fe_loc.file = map->to_file; 287169699Skan fe_loc.line = SOURCE_LINE (map, loc); 288169699Skan#else 289169699Skan location_t fe_loc = loc; 290169699Skan#endif 29118334Speter 292102791Skan space = name = (const unsigned char *) ""; 29390075Sobrien s = cpp_get_token (pfile); 294102791Skan if (s->type != CPP_EOF) 295102791Skan { 296102791Skan space = cpp_token_as_text (pfile, s); 297102791Skan s = cpp_get_token (pfile); 298102791Skan if (s->type == CPP_NAME) 299102791Skan name = cpp_token_as_text (pfile, s); 300102791Skan } 30118334Speter 302169699Skan warning (OPT_Wunknown_pragmas, "%Hignoring #pragma %s %s", 303169699Skan &fe_loc, space, name); 30418334Speter } 30590075Sobrien} 30618334Speter 30790075Sobrien/* #define callback for DWARF and DWARF2 debug info. */ 30890075Sobrienstatic void 309169699Skancb_define (cpp_reader *pfile, source_location loc, cpp_hashnode *node) 31090075Sobrien{ 311169699Skan const struct line_map *map = linemap_lookup (&line_table, loc); 312169699Skan (*debug_hooks->define) (SOURCE_LINE (map, loc), 31390075Sobrien (const char *) cpp_macro_definition (pfile, node)); 31490075Sobrien} 31518334Speter 31690075Sobrien/* #undef callback for DWARF and DWARF2 debug info. */ 31790075Sobrienstatic void 318169699Skancb_undef (cpp_reader * ARG_UNUSED (pfile), source_location loc, 319132727Skan cpp_hashnode *node) 32090075Sobrien{ 321169699Skan const struct line_map *map = linemap_lookup (&line_table, loc); 322169699Skan (*debug_hooks->undef) (SOURCE_LINE (map, loc), 32390075Sobrien (const char *) NODE_NAME (node)); 32490075Sobrien} 32518334Speter 326169699Skan/* Read a token and return its type. Fill *VALUE with its value, if 327169699Skan applicable. Fill *CPP_FLAGS with the token's flags, if it is 328169699Skan non-NULL. */ 32918334Speter 330169699Skanenum cpp_ttype 331169699Skanc_lex_with_flags (tree *value, location_t *loc, unsigned char *cpp_flags) 332132727Skan{ 333169699Skan static bool no_more_pch; 334132727Skan const cpp_token *tok; 335169699Skan enum cpp_ttype type; 336169699Skan unsigned char add_flags = 0; 337132727Skan 338169699Skan timevar_push (TV_CPP); 339132727Skan retry: 340169699Skan tok = cpp_get_token (parse_in); 341169699Skan type = tok->type; 342132727Skan 343132727Skan retry_after_at: 344169699Skan#ifdef USE_MAPPED_LOCATION 345169699Skan *loc = tok->src_loc; 346169699Skan#else 347169699Skan *loc = input_location; 348169699Skan#endif 349169699Skan switch (type) 35018334Speter { 351169699Skan case CPP_PADDING: 352169699Skan goto retry; 353169699Skan 35490075Sobrien case CPP_NAME: 35590075Sobrien *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node)); 35690075Sobrien break; 35718334Speter 35890075Sobrien case CPP_NUMBER: 359117415Skan { 360117415Skan unsigned int flags = cpp_classify_number (parse_in, tok); 361117415Skan 362117415Skan switch (flags & CPP_N_CATEGORY) 363117415Skan { 364117415Skan case CPP_N_INVALID: 365117415Skan /* cpplib has issued an error. */ 366117415Skan *value = error_mark_node; 367169699Skan errorcount++; 368117415Skan break; 369117415Skan 370117415Skan case CPP_N_INTEGER: 371169699Skan /* C++ uses '0' to mark virtual functions as pure. 372169699Skan Set PURE_ZERO to pass this information to the C++ parser. */ 373169699Skan if (tok->val.str.len == 1 && *tok->val.str.text == '0') 374169699Skan add_flags = PURE_ZERO; 375117415Skan *value = interpret_integer (tok, flags); 376117415Skan break; 377117415Skan 378117415Skan case CPP_N_FLOATING: 379117415Skan *value = interpret_float (tok, flags); 380117415Skan break; 381117415Skan 382117415Skan default: 383169699Skan gcc_unreachable (); 384117415Skan } 385117415Skan } 38690075Sobrien break; 38718334Speter 388132727Skan case CPP_ATSIGN: 389132727Skan /* An @ may give the next token special significance in Objective-C. */ 390132727Skan if (c_dialect_objc ()) 391132727Skan { 392169699Skan location_t atloc = input_location; 393169699Skan 394169699Skan retry_at: 395169699Skan tok = cpp_get_token (parse_in); 396169699Skan type = tok->type; 397169699Skan switch (type) 398132727Skan { 399169699Skan case CPP_PADDING: 400169699Skan goto retry_at; 401169699Skan 402169699Skan case CPP_STRING: 403169699Skan case CPP_WSTRING: 404169699Skan type = lex_string (tok, value, true); 405169699Skan break; 406169699Skan 407132727Skan case CPP_NAME: 408169699Skan *value = HT_IDENT_TO_GCC_IDENT (HT_NODE (tok->val.node)); 409169699Skan if (objc_is_reserved_word (*value)) 410132727Skan { 411169699Skan type = CPP_AT_NAME; 412169699Skan break; 413132727Skan } 414169699Skan /* FALLTHROUGH */ 415132727Skan 416169699Skan default: 417169699Skan /* ... or not. */ 418169699Skan error ("%Hstray %<@%> in program", &atloc); 419169699Skan goto retry_after_at; 420132727Skan } 421169699Skan break; 422132727Skan } 423132727Skan 424169699Skan /* FALLTHROUGH */ 425169699Skan case CPP_HASH: 426169699Skan case CPP_PASTE: 427169699Skan { 428169699Skan unsigned char name[4]; 429132727Skan 430169699Skan *cpp_spell_token (parse_in, tok, name, true) = 0; 431169699Skan 432169699Skan error ("stray %qs in program", name); 433169699Skan } 434169699Skan 435169699Skan goto retry; 436169699Skan 437132727Skan case CPP_OTHER: 438132727Skan { 439132727Skan cppchar_t c = tok->val.str.text[0]; 440132727Skan 441132727Skan if (c == '"' || c == '\'') 442132727Skan error ("missing terminating %c character", (int) c); 443132727Skan else if (ISGRAPH (c)) 444169699Skan error ("stray %qc in program", (int) c); 445132727Skan else 446169699Skan error ("stray %<\\%o%> in program", (int) c); 447132727Skan } 448132727Skan goto retry; 449132727Skan 45090075Sobrien case CPP_CHAR: 45190075Sobrien case CPP_WCHAR: 45290075Sobrien *value = lex_charconst (tok); 45390075Sobrien break; 45418334Speter 45590075Sobrien case CPP_STRING: 45690075Sobrien case CPP_WSTRING: 457169699Skan if (!c_lex_return_raw_strings) 458169699Skan { 459169699Skan type = lex_string (tok, value, false); 460169699Skan break; 461169699Skan } 462169699Skan *value = build_string (tok->val.str.len, (char *) tok->val.str.text); 46390075Sobrien break; 464169699Skan 465169699Skan case CPP_PRAGMA: 466169699Skan *value = build_int_cst (NULL, tok->val.pragma); 467169699Skan break; 46818334Speter 46990075Sobrien /* These tokens should not be visible outside cpplib. */ 47090075Sobrien case CPP_HEADER_NAME: 47190075Sobrien case CPP_COMMENT: 47290075Sobrien case CPP_MACRO_ARG: 473169699Skan gcc_unreachable (); 47418334Speter 475132727Skan default: 476132727Skan *value = NULL_TREE; 477132727Skan break; 47890075Sobrien } 47918334Speter 480169699Skan if (cpp_flags) 481169699Skan *cpp_flags = tok->flags | add_flags; 482169699Skan 483169699Skan if (!no_more_pch) 484132727Skan { 485132727Skan no_more_pch = true; 486132727Skan c_common_no_more_pch (); 487132727Skan } 488132727Skan 489169699Skan timevar_pop (TV_CPP); 49018334Speter 491169699Skan return type; 492132727Skan} 493132727Skan 494117415Skan/* Returns the narrowest C-visible unsigned type, starting with the 495169699Skan minimum specified by FLAGS, that can fit HIGH:LOW, or itk_none if 496117415Skan there isn't one. */ 497169699Skan 498117415Skanstatic enum integer_type_kind 499169699Skannarrowest_unsigned_type (unsigned HOST_WIDE_INT low, 500169699Skan unsigned HOST_WIDE_INT high, 501169699Skan unsigned int flags) 50290075Sobrien{ 503117415Skan enum integer_type_kind itk; 50418334Speter 505117415Skan if ((flags & CPP_N_WIDTH) == CPP_N_SMALL) 506117415Skan itk = itk_unsigned_int; 507117415Skan else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM) 508117415Skan itk = itk_unsigned_long; 509117415Skan else 510117415Skan itk = itk_unsigned_long_long; 51118334Speter 512117415Skan for (; itk < itk_none; itk += 2 /* skip unsigned types */) 513169699Skan { 514169699Skan tree upper = TYPE_MAX_VALUE (integer_types[itk]); 51518334Speter 516169699Skan if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high 517169699Skan || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high 518169699Skan && TREE_INT_CST_LOW (upper) >= low)) 519169699Skan return itk; 520169699Skan } 521169699Skan 522117415Skan return itk_none; 523117415Skan} 52418334Speter 525117415Skan/* Ditto, but narrowest signed type. */ 526117415Skanstatic enum integer_type_kind 527169699Skannarrowest_signed_type (unsigned HOST_WIDE_INT low, 528169699Skan unsigned HOST_WIDE_INT high, unsigned int flags) 529117415Skan{ 530117415Skan enum integer_type_kind itk; 53118334Speter 532117415Skan if ((flags & CPP_N_WIDTH) == CPP_N_SMALL) 533117415Skan itk = itk_int; 534117415Skan else if ((flags & CPP_N_WIDTH) == CPP_N_MEDIUM) 535117415Skan itk = itk_long; 536117415Skan else 537117415Skan itk = itk_long_long; 53818334Speter 53918334Speter 540117415Skan for (; itk < itk_none; itk += 2 /* skip signed types */) 541169699Skan { 542169699Skan tree upper = TYPE_MAX_VALUE (integer_types[itk]); 54390075Sobrien 544169699Skan if ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) > high 545169699Skan || ((unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (upper) == high 546169699Skan && TREE_INT_CST_LOW (upper) >= low)) 547169699Skan return itk; 548169699Skan } 549169699Skan 550117415Skan return itk_none; 551117415Skan} 55290075Sobrien 553117415Skan/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */ 554117415Skanstatic tree 555132727Skaninterpret_integer (const cpp_token *token, unsigned int flags) 556117415Skan{ 557117415Skan tree value, type; 558117415Skan enum integer_type_kind itk; 559117415Skan cpp_num integer; 560117415Skan cpp_options *options = cpp_get_options (parse_in); 56118334Speter 562117415Skan integer = cpp_interpret_integer (parse_in, token, flags); 563117415Skan integer = cpp_num_sign_extend (integer, options->precision); 56418334Speter 565117415Skan /* The type of a constant with a U suffix is straightforward. */ 566117415Skan if (flags & CPP_N_UNSIGNED) 567169699Skan itk = narrowest_unsigned_type (integer.low, integer.high, flags); 568117415Skan else 56990075Sobrien { 570117415Skan /* The type of a potentially-signed integer constant varies 571117415Skan depending on the base it's in, the standard in use, and the 572117415Skan length suffixes. */ 573169699Skan enum integer_type_kind itk_u 574169699Skan = narrowest_unsigned_type (integer.low, integer.high, flags); 575169699Skan enum integer_type_kind itk_s 576169699Skan = narrowest_signed_type (integer.low, integer.high, flags); 57718334Speter 578117415Skan /* In both C89 and C99, octal and hex constants may be signed or 579117415Skan unsigned, whichever fits tighter. We do not warn about this 580117415Skan choice differing from the traditional choice, as the constant 581117415Skan is probably a bit pattern and either way will work. */ 582117415Skan if ((flags & CPP_N_RADIX) != CPP_N_DECIMAL) 583117415Skan itk = MIN (itk_u, itk_s); 584117415Skan else 58590075Sobrien { 586117415Skan /* In C99, decimal constants are always signed. 587117415Skan In C89, decimal constants that don't fit in long have 588117415Skan undefined behavior; we try to make them unsigned long. 589117415Skan In GCC's extended C89, that last is true of decimal 590117415Skan constants that don't fit in long long, too. */ 59118334Speter 592117415Skan itk = itk_s; 593117415Skan if (itk_s > itk_u && itk_s > itk_long) 59490075Sobrien { 595117415Skan if (!flag_isoc99) 59690075Sobrien { 597117415Skan if (itk_u < itk_unsigned_long) 598117415Skan itk_u = itk_unsigned_long; 599117415Skan itk = itk_u; 600169699Skan warning (0, "this decimal constant is unsigned only in ISO C90"); 60190075Sobrien } 602169699Skan else 603169699Skan warning (OPT_Wtraditional, 604169699Skan "this decimal constant would be unsigned in ISO C90"); 60590075Sobrien } 60690075Sobrien } 607117415Skan } 60818334Speter 609117415Skan if (itk == itk_none) 610117415Skan /* cpplib has already issued a warning for overflow. */ 611117415Skan type = ((flags & CPP_N_UNSIGNED) 612117415Skan ? widest_unsigned_literal_type_node 613117415Skan : widest_integer_literal_type_node); 614117415Skan else 615117415Skan type = integer_types[itk]; 61618334Speter 617117415Skan if (itk > itk_unsigned_long 618117415Skan && (flags & CPP_N_WIDTH) != CPP_N_LARGE 619169699Skan && !in_system_header && !flag_isoc99) 620169699Skan pedwarn ("integer constant is too large for %qs type", 621117415Skan (flags & CPP_N_UNSIGNED) ? "unsigned long" : "long"); 62252284Sobrien 623169699Skan value = build_int_cst_wide (type, integer.low, integer.high); 62418334Speter 625117415Skan /* Convert imaginary to a complex type. */ 626117415Skan if (flags & CPP_N_IMAGINARY) 627169699Skan value = build_complex (NULL_TREE, build_int_cst (type, 0), value); 62818334Speter 629117415Skan return value; 630117415Skan} 63118334Speter 632117415Skan/* Interpret TOKEN, a floating point number with FLAGS as classified 633117415Skan by cpplib. */ 634117415Skanstatic tree 635132727Skaninterpret_float (const cpp_token *token, unsigned int flags) 636117415Skan{ 637117415Skan tree type; 638117415Skan tree value; 639117415Skan REAL_VALUE_TYPE real; 640117415Skan char *copy; 641117415Skan size_t copylen; 64218334Speter 643250566Spfg /* Default (no suffix) is double. */ 644250566Spfg if (flags & CPP_N_DEFAULT) 645250566Spfg { 646250566Spfg flags ^= CPP_N_DEFAULT; 647250566Spfg flags |= CPP_N_MEDIUM; 648250566Spfg } 649250566Spfg 650169699Skan /* Decode type based on width and properties. */ 651169699Skan if (flags & CPP_N_DFLOAT) 652169699Skan if ((flags & CPP_N_WIDTH) == CPP_N_LARGE) 653169699Skan type = dfloat128_type_node; 654169699Skan else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL) 655169699Skan type = dfloat32_type_node; 656169699Skan else 657169699Skan type = dfloat64_type_node; 658169699Skan else 659169699Skan if ((flags & CPP_N_WIDTH) == CPP_N_LARGE) 660117415Skan type = long_double_type_node; 661169699Skan else if ((flags & CPP_N_WIDTH) == CPP_N_SMALL 662169699Skan || flag_single_precision_constant) 663117415Skan type = float_type_node; 664169699Skan else 665117415Skan type = double_type_node; 66618334Speter 667117415Skan /* Copy the constant to a nul-terminated buffer. If the constant 668117415Skan has any suffixes, cut them off; REAL_VALUE_ATOF/ REAL_VALUE_HTOF 669117415Skan can't handle them. */ 670117415Skan copylen = token->val.str.len; 671169699Skan if (flags & CPP_N_DFLOAT) 672169699Skan copylen -= 2; 673169699Skan else 674169699Skan { 675169699Skan if ((flags & CPP_N_WIDTH) != CPP_N_MEDIUM) 676169699Skan /* Must be an F or L suffix. */ 677169699Skan copylen--; 678169699Skan if (flags & CPP_N_IMAGINARY) 679169699Skan /* I or J suffix. */ 680169699Skan copylen--; 681169699Skan } 68218334Speter 683169699Skan copy = (char *) alloca (copylen + 1); 684117415Skan memcpy (copy, token->val.str.text, copylen); 685117415Skan copy[copylen] = '\0'; 68652284Sobrien 687169699Skan real_from_string3 (&real, copy, TYPE_MODE (type)); 68852284Sobrien 689169699Skan /* Both C and C++ require a diagnostic for a floating constant 690169699Skan outside the range of representable values of its type. Since we 691169699Skan have __builtin_inf* to produce an infinity, it might now be 692169699Skan appropriate for this to be a mandatory pedwarn rather than 693169699Skan conditioned on -pedantic. */ 694117415Skan if (REAL_VALUE_ISINF (real) && pedantic) 695169699Skan pedwarn ("floating constant exceeds range of %qT", type); 69652284Sobrien 697117415Skan /* Create a node with determined type and value. */ 698117415Skan value = build_real (type, real); 699117415Skan if (flags & CPP_N_IMAGINARY) 700117415Skan value = build_complex (NULL_TREE, convert (type, integer_zero_node), value); 70118334Speter 70290075Sobrien return value; 70390075Sobrien} 70418334Speter 705132727Skan/* Convert a series of STRING and/or WSTRING tokens into a tree, 706132727Skan performing string constant concatenation. TOK is the first of 707132727Skan these. VALP is the location to write the string into. OBJC_STRING 708132727Skan indicates whether an '@' token preceded the incoming token. 709132727Skan Returns the CPP token type of the result (CPP_STRING, CPP_WSTRING, 710132727Skan or CPP_OBJC_STRING). 711132727Skan 712132727Skan This is unfortunately more work than it should be. If any of the 713132727Skan strings in the series has an L prefix, the result is a wide string 714132727Skan (6.4.5p4). Whether or not the result is a wide string affects the 715132727Skan meaning of octal and hexadecimal escapes (6.4.4.4p6,9). But escape 716132727Skan sequences do not continue across the boundary between two strings in 717132727Skan a series (6.4.5p7), so we must not lose the boundaries. Therefore 718132727Skan cpp_interpret_string takes a vector of cpp_string structures, which 719132727Skan we must arrange to provide. */ 720132727Skan 721132727Skanstatic enum cpp_ttype 722132727Skanlex_string (const cpp_token *tok, tree *valp, bool objc_string) 72390075Sobrien{ 72490075Sobrien tree value; 725132727Skan bool wide = false; 726169699Skan size_t concats = 0; 727132727Skan struct obstack str_ob; 728132727Skan cpp_string istr; 72952284Sobrien 730132727Skan /* Try to avoid the overhead of creating and destroying an obstack 731132727Skan for the common case of just one string. */ 732132727Skan cpp_string str = tok->val.str; 733132727Skan cpp_string *strs = &str; 73418334Speter 735132727Skan if (tok->type == CPP_WSTRING) 736132727Skan wide = true; 737132727Skan 738169699Skan retry: 739169699Skan tok = cpp_get_token (parse_in); 740169699Skan switch (tok->type) 74190075Sobrien { 742169699Skan case CPP_PADDING: 743169699Skan goto retry; 744169699Skan case CPP_ATSIGN: 745169699Skan if (c_dialect_objc ()) 746169699Skan { 747169699Skan objc_string = true; 748169699Skan goto retry; 749169699Skan } 750169699Skan /* FALLTHROUGH */ 75118334Speter 752169699Skan default: 753169699Skan break; 754169699Skan 755169699Skan case CPP_WSTRING: 756169699Skan wide = true; 757169699Skan /* FALLTHROUGH */ 758169699Skan 759169699Skan case CPP_STRING: 760169699Skan if (!concats) 76190075Sobrien { 762169699Skan gcc_obstack_init (&str_ob); 763169699Skan obstack_grow (&str_ob, &str, sizeof (cpp_string)); 76490075Sobrien } 765169699Skan 766169699Skan concats++; 767169699Skan obstack_grow (&str_ob, &tok->val.str, sizeof (cpp_string)); 768169699Skan goto retry; 76990075Sobrien } 77018334Speter 771132727Skan /* We have read one more token than we want. */ 772132727Skan _cpp_backup_tokens (parse_in, 1); 773169699Skan if (concats) 774169699Skan strs = XOBFINISH (&str_ob, cpp_string *); 77518334Speter 776169699Skan if (concats && !objc_string && !in_system_header) 777169699Skan warning (OPT_Wtraditional, 778169699Skan "traditional C rejects string constant concatenation"); 779132727Skan 780169699Skan if ((c_lex_string_translate 781169699Skan ? cpp_interpret_string : cpp_interpret_string_notranslate) 782169699Skan (parse_in, strs, concats + 1, &istr, wide)) 78390075Sobrien { 784169699Skan value = build_string (istr.len, (char *) istr.text); 785169699Skan free ((void *) istr.text); 786169699Skan 787169699Skan if (c_lex_string_translate == -1) 788169699Skan { 789169699Skan int xlated = cpp_interpret_string_notranslate (parse_in, strs, 790169699Skan concats + 1, 791169699Skan &istr, wide); 792169699Skan /* Assume that, if we managed to translate the string above, 793169699Skan then the untranslated parsing will always succeed. */ 794169699Skan gcc_assert (xlated); 795169699Skan 796169699Skan if (TREE_STRING_LENGTH (value) != (int) istr.len 797169699Skan || 0 != strncmp (TREE_STRING_POINTER (value), (char *) istr.text, 798169699Skan istr.len)) 799169699Skan { 800169699Skan /* Arrange for us to return the untranslated string in 801169699Skan *valp, but to set up the C type of the translated 802169699Skan one. */ 803169699Skan *valp = build_string (istr.len, (char *) istr.text); 804169699Skan valp = &TREE_CHAIN (*valp); 805169699Skan } 806169699Skan free ((void *) istr.text); 807169699Skan } 80818334Speter } 80990075Sobrien else 81090075Sobrien { 811132727Skan /* Callers cannot generally handle error_mark_node in this context, 812132727Skan so return the empty string instead. cpp_interpret_string has 813132727Skan issued an error. */ 814132727Skan if (wide) 815132727Skan value = build_string (TYPE_PRECISION (wchar_type_node) 816132727Skan / TYPE_PRECISION (char_type_node), 817132727Skan "\0\0\0"); /* widest supported wchar_t 818132727Skan is 32 bits */ 819132727Skan else 820132727Skan value = build_string (1, ""); 82190075Sobrien } 82218334Speter 823132727Skan TREE_TYPE (value) = wide ? wchar_array_type_node : char_array_type_node; 824132727Skan *valp = fix_string_type (value); 82518334Speter 826169699Skan if (concats) 827132727Skan obstack_free (&str_ob, 0); 828132727Skan 829132727Skan return objc_string ? CPP_OBJC_STRING : wide ? CPP_WSTRING : CPP_STRING; 83018334Speter} 83118334Speter 83290075Sobrien/* Converts a (possibly wide) character constant token into a tree. */ 83390075Sobrienstatic tree 834132727Skanlex_charconst (const cpp_token *token) 83518334Speter{ 836117415Skan cppchar_t result; 83796263Sobrien tree type, value; 83890075Sobrien unsigned int chars_seen; 839117415Skan int unsignedp; 84096263Sobrien 841117415Skan result = cpp_interpret_charconst (parse_in, token, 842132727Skan &chars_seen, &unsignedp); 84396263Sobrien 844117415Skan if (token->type == CPP_WCHAR) 845117415Skan type = wchar_type_node; 846117415Skan /* In C, a character constant has type 'int'. 847117415Skan In C++ 'char', but multi-char charconsts have type 'int'. */ 848132727Skan else if (!c_dialect_cxx () || chars_seen > 1) 849117415Skan type = integer_type_node; 850117415Skan else 851117415Skan type = char_type_node; 85296263Sobrien 853169699Skan /* Cast to cppchar_signed_t to get correct sign-extension of RESULT 854169699Skan before possibly widening to HOST_WIDE_INT for build_int_cst. */ 855169699Skan if (unsignedp || (cppchar_signed_t) result >= 0) 856169699Skan value = build_int_cst_wide (type, result, 0); 857169699Skan else 858169699Skan value = build_int_cst_wide (type, (cppchar_signed_t) result, -1); 859169699Skan 86090075Sobrien return value; 86118334Speter} 862