c-common.c (161660) | c-common.c (169699) |
---|---|
1/* Subroutines shared by all languages that are variants of C. 2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, | 1/* Subroutines shared by all languages that are variants of C. 2 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, |
3 2001, 2002, 2003, 2004 Free Software Foundation, Inc. | 3 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. |
4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to the Free | 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 2, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING. If not, write to the Free |
19Software Foundation, 59 Temple Place - Suite 330, Boston, MA 2002111-1307, USA. */ | 19Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 2002110-1301, USA. */ |
21 22#include "config.h" 23#include "system.h" 24#include "coretypes.h" 25#include "tm.h" 26#include "intl.h" 27#include "tree.h" 28#include "flags.h" --- 8 unchanged lines hidden (view full) --- 37#include "tm_p.h" 38#include "obstack.h" 39#include "cpplib.h" 40#include "target.h" 41#include "langhooks.h" 42#include "tree-inline.h" 43#include "c-tree.h" 44#include "toplev.h" | 21 22#include "config.h" 23#include "system.h" 24#include "coretypes.h" 25#include "tm.h" 26#include "intl.h" 27#include "tree.h" 28#include "flags.h" --- 8 unchanged lines hidden (view full) --- 37#include "tm_p.h" 38#include "obstack.h" 39#include "cpplib.h" 40#include "target.h" 41#include "langhooks.h" 42#include "tree-inline.h" 43#include "c-tree.h" 44#include "toplev.h" |
45#include "tree-iterator.h" 46#include "hashtab.h" 47#include "tree-mudflap.h" 48#include "opts.h" 49#include "real.h" 50#include "cgraph.h" |
|
45 46cpp_reader *parse_in; /* Declared in c-pragma.h. */ 47 48/* We let tm.h override the types used here, to handle trivial differences 49 such as the choice of unsigned int or long unsigned int for size_t. 50 When machines start needing nontrivial differences in the size type, 51 it would be best to do something here to figure out automatically 52 from other information what type to use. */ 53 54#ifndef SIZE_TYPE 55#define SIZE_TYPE "long unsigned int" 56#endif 57 | 51 52cpp_reader *parse_in; /* Declared in c-pragma.h. */ 53 54/* We let tm.h override the types used here, to handle trivial differences 55 such as the choice of unsigned int or long unsigned int for size_t. 56 When machines start needing nontrivial differences in the size type, 57 it would be best to do something here to figure out automatically 58 from other information what type to use. */ 59 60#ifndef SIZE_TYPE 61#define SIZE_TYPE "long unsigned int" 62#endif 63 |
64#ifndef PID_TYPE 65#define PID_TYPE "int" 66#endif 67 |
|
58#ifndef WCHAR_TYPE 59#define WCHAR_TYPE "int" 60#endif 61 62/* WCHAR_TYPE gets overridden by -fshort-wchar. */ 63#define MODIFIED_WCHAR_TYPE \ 64 (flag_short_wchar ? "short unsigned int" : WCHAR_TYPE) 65 --- 50 unchanged lines hidden (view full) --- 116 tree double_type_node; 117 tree long_double_type_node; 118 119 tree complex_integer_type_node; 120 tree complex_float_type_node; 121 tree complex_double_type_node; 122 tree complex_long_double_type_node; 123 | 68#ifndef WCHAR_TYPE 69#define WCHAR_TYPE "int" 70#endif 71 72/* WCHAR_TYPE gets overridden by -fshort-wchar. */ 73#define MODIFIED_WCHAR_TYPE \ 74 (flag_short_wchar ? "short unsigned int" : WCHAR_TYPE) 75 --- 50 unchanged lines hidden (view full) --- 126 tree double_type_node; 127 tree long_double_type_node; 128 129 tree complex_integer_type_node; 130 tree complex_float_type_node; 131 tree complex_double_type_node; 132 tree complex_long_double_type_node; 133 |
134 tree dfloat32_type_node; 135 tree dfloat64_type_node; 136 tree_dfloat128_type_node; 137 |
|
124 tree intQI_type_node; 125 tree intHI_type_node; 126 tree intSI_type_node; 127 tree intDI_type_node; 128 tree intTI_type_node; 129 130 tree unsigned_intQI_type_node; 131 tree unsigned_intHI_type_node; --- 45 unchanged lines hidden (view full) --- 177 178 Stack of nested function name VAR_DECLs. 179 180 tree saved_function_name_decls; 181 182*/ 183 184tree c_global_trees[CTI_MAX]; | 138 tree intQI_type_node; 139 tree intHI_type_node; 140 tree intSI_type_node; 141 tree intDI_type_node; 142 tree intTI_type_node; 143 144 tree unsigned_intQI_type_node; 145 tree unsigned_intHI_type_node; --- 45 unchanged lines hidden (view full) --- 191 192 Stack of nested function name VAR_DECLs. 193 194 tree saved_function_name_decls; 195 196*/ 197 198tree c_global_trees[CTI_MAX]; |
185 186/* TRUE if a code represents a statement. The front end init 187 langhook should take care of initialization of this array. */ 188 189bool statement_code_p[MAX_TREE_CODES]; | |
190 191/* Switches common to the C front ends. */ 192 193/* Nonzero if prepreprocessing only. */ 194 195int flag_preprocess_only; 196 197/* Nonzero means don't output line number information. */ --- 8 unchanged lines hidden (view full) --- 206/* Nonzero means dump macros in some fashion. */ 207 208char flag_dump_macros; 209 210/* Nonzero means pass #include lines through to the output. */ 211 212char flag_dump_includes; 213 | 199 200/* Switches common to the C front ends. */ 201 202/* Nonzero if prepreprocessing only. */ 203 204int flag_preprocess_only; 205 206/* Nonzero means don't output line number information. */ --- 8 unchanged lines hidden (view full) --- 215/* Nonzero means dump macros in some fashion. */ 216 217char flag_dump_macros; 218 219/* Nonzero means pass #include lines through to the output. */ 220 221char flag_dump_includes; 222 |
223/* Nonzero means process PCH files while preprocessing. */ 224 225bool flag_pch_preprocess; 226 |
|
214/* The file name to which we should write a precompiled header, or 215 NULL if no header will be written in this compile. */ 216 217const char *pch_file; 218 219/* Nonzero if an ISO standard was selected. It rejects macros in the 220 user's namespace. */ 221int flag_iso; --- 21 unchanged lines hidden (view full) --- 243 244/* Nonzero means allow Microsoft extensions without warnings or errors. */ 245int flag_ms_extensions; 246 247/* Nonzero means don't recognize the keyword `asm'. */ 248 249int flag_no_asm; 250 | 227/* The file name to which we should write a precompiled header, or 228 NULL if no header will be written in this compile. */ 229 230const char *pch_file; 231 232/* Nonzero if an ISO standard was selected. It rejects macros in the 233 user's namespace. */ 234int flag_iso; --- 21 unchanged lines hidden (view full) --- 256 257/* Nonzero means allow Microsoft extensions without warnings or errors. */ 258int flag_ms_extensions; 259 260/* Nonzero means don't recognize the keyword `asm'. */ 261 262int flag_no_asm; 263 |
251/* Nonzero means give string constants the type `const char *', as mandated 252 by the standard. */ 253 254int flag_const_strings; 255 | |
256/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ 257 258int flag_signed_bitfields = 1; | 264/* Nonzero means to treat bitfields as signed unless they say `unsigned'. */ 265 266int flag_signed_bitfields = 1; |
259int explicit_flag_signed_bitfields; | |
260 | 267 |
261/* Nonzero means warn about pointer casts that can drop a type qualifier 262 from the pointer target type. */ 263 264int warn_cast_qual; 265 266/* Warn about functions which might be candidates for format attributes. */ 267 268int warn_missing_format_attribute; 269 270/* Nonzero means warn about sizeof(function) or addition/subtraction 271 of function pointers. */ 272 273int warn_pointer_arith; 274 275/* Nonzero means do not warn that K&R style main() is not a function prototype. */ 276 277int flag_bsd_no_warn_kr_main; 278 279/* Nonzero means warn for any global function def 280 without separate previous prototype decl. */ 281 282int warn_missing_prototypes; 283 284/* Warn if adding () is suggested. */ 285 286int warn_parentheses; 287 288/* Warn if initializer is not completely bracketed. */ 289 290int warn_missing_braces; 291 292/* Warn about comparison of signed and unsigned values. 293 If -1, neither -Wsign-compare nor -Wno-sign-compare has been specified 294 (in which case -Wextra gets to decide). */ 295 296int warn_sign_compare = -1; 297 298/* Nonzero means warn about usage of long long when `-pedantic'. */ 299 300int warn_long_long = 1; 301 302/* Nonzero means warn about deprecated conversion from string constant to 303 `char *'. */ 304 305int warn_write_strings; 306 307/* Nonzero means warn about multiple (redundant) decls for the same single 308 variable or function. */ 309 310int warn_redundant_decls; 311 312/* Warn about testing equality of floating point numbers. */ 313 314int warn_float_equal; 315 316/* Warn about a subscript that has type char. */ 317 318int warn_char_subscripts; 319 320/* Warn if a type conversion is done that might have confusing results. */ 321 322int warn_conversion; 323 | |
324/* Warn about #pragma directives that are not recognized. */ 325 326int warn_unknown_pragmas; /* Tri state variable. */ 327 328/* Warn about format/argument anomalies in calls to formatted I/O functions 329 (*printf, *scanf, strftime, strfmon, etc.). */ 330 331int warn_format; 332 | 268/* Warn about #pragma directives that are not recognized. */ 269 270int warn_unknown_pragmas; /* Tri state variable. */ 271 272/* Warn about format/argument anomalies in calls to formatted I/O functions 273 (*printf, *scanf, strftime, strfmon, etc.). */ 274 275int warn_format; 276 |
333/* Warn about Y2K problems with strftime formats. */ | 277/* Warn about using __null (as NULL in C++) as sentinel. For code compiled 278 with GCC this doesn't matter as __null is guaranteed to have the right 279 size. */ |
334 | 280 |
335int warn_format_y2k; | 281int warn_strict_null_sentinel; |
336 | 282 |
337/* Warn about excess arguments to formats. */ 338 339int warn_format_extra_args; 340 341/* Warn about zero-length formats. */ 342 343int warn_format_zero_length; 344 345/* Warn about non-literal format arguments. */ 346 347int warn_format_nonliteral; 348 349/* Warn about possible security problems with calls to format functions. */ 350 351int warn_format_security; 352 | |
353/* Zero means that faster, ...NonNil variants of objc_msgSend... 354 calls will be used in ObjC; passing nil receivers to such calls 355 will most likely result in crashes. */ 356int flag_nil_receivers = 1; 357 | 283/* Zero means that faster, ...NonNil variants of objc_msgSend... 284 calls will be used in ObjC; passing nil receivers to such calls 285 will most likely result in crashes. */ 286int flag_nil_receivers = 1; 287 |
358/* Nonzero means that we will allow new ObjC exception syntax (@throw, 359 @try, etc.) in source code. */ 360int flag_objc_exceptions = 0; 361 | |
362/* Nonzero means that code generation will be altered to support 363 "zero-link" execution. This currently affects ObjC only, but may 364 affect other languages in the future. */ 365int flag_zero_link = 0; 366 367/* Nonzero means emit an '__OBJC, __image_info' for the current translation 368 unit. It will inform the ObjC runtime that class definition(s) herein 369 contained are to replace one(s) previously loaded. */ 370int flag_replace_objc_classes = 0; | 288/* Nonzero means that code generation will be altered to support 289 "zero-link" execution. This currently affects ObjC only, but may 290 affect other languages in the future. */ 291int flag_zero_link = 0; 292 293/* Nonzero means emit an '__OBJC, __image_info' for the current translation 294 unit. It will inform the ObjC runtime that class definition(s) herein 295 contained are to replace one(s) previously loaded. */ 296int flag_replace_objc_classes = 0; |
371 | 297 |
372/* C/ObjC language option variables. */ 373 374 | 298/* C/ObjC language option variables. */ 299 300 |
375/* Nonzero means message about use of implicit function declarations; 376 1 means warning; 2 means error. */ 377 378int mesg_implicit_function_declaration = -1; 379 | |
380/* Nonzero means allow type mismatches in conditional expressions; 381 just make their values `void'. */ 382 383int flag_cond_mismatch; 384 385/* Nonzero means enable C89 Amendment 1 features. */ 386 387int flag_isoc94; 388 389/* Nonzero means use the ISO C99 dialect of C. */ 390 391int flag_isoc99; 392 | 301/* Nonzero means allow type mismatches in conditional expressions; 302 just make their values `void'. */ 303 304int flag_cond_mismatch; 305 306/* Nonzero means enable C89 Amendment 1 features. */ 307 308int flag_isoc94; 309 310/* Nonzero means use the ISO C99 dialect of C. */ 311 312int flag_isoc99; 313 |
393/* Nonzero means allow the BSD kernel printf enhancements. */ 394 395int flag_bsd_format; 396 | |
397/* Nonzero means that we have builtin functions, and main is an int. */ 398 399int flag_hosted = 1; 400 | 314/* Nonzero means that we have builtin functions, and main is an int. */ 315 316int flag_hosted = 1; 317 |
401/* Nonzero means warn when casting a function call to a type that does 402 not match the return type (e.g. (float)sqrt() or (anything*)malloc() 403 when there is no previous declaration of sqrt or malloc. */ 404 405int warn_bad_function_cast; 406 407/* Warn about traditional constructs whose meanings changed in ANSI C. */ 408 409int warn_traditional; 410 411/* Nonzero means warn for a declaration found after a statement. */ 412 413int warn_declaration_after_statement; 414 415/* Nonzero means warn for non-prototype function decls 416 or non-prototyped defs without previous prototype. */ 417 418int warn_strict_prototypes; 419 420/* Nonzero means warn for any global function def 421 without separate previous decl. */ 422 423int warn_missing_declarations; 424 425/* Nonzero means warn about declarations of objects not at 426 file-scope level and about *all* declarations of functions (whether 427 or static) not at file-scope level. Note that we exclude 428 implicit function declarations. To get warnings about those, use 429 -Wimplicit. */ 430 431int warn_nested_externs; 432 | |
433/* Warn if main is suspicious. */ 434 435int warn_main; 436 | 318/* Warn if main is suspicious. */ 319 320int warn_main; 321 |
437/* Nonzero means warn about possible violations of sequence point rules. */ | |
438 | 322 |
439int warn_sequence_point; 440 441/* Nonzero means warn about uninitialized variable when it is initialized with itself. 442 For example: int i = i;, GCC will not warn about this when warn_init_self is nonzero. */ 443 444int warn_init_self; 445 446/* Nonzero means to warn about compile-time division by zero. */ 447int warn_div_by_zero = 1; 448 449/* Nonzero means warn about use of implicit int. */ 450 451int warn_implicit_int; 452 453/* Warn about NULL being passed to argument slots marked as requiring 454 non-NULL. */ 455 456int warn_nonnull; 457 458/* Warn about old-style parameter declaration. */ 459 460int warn_old_style_definition; 461 462 | |
463/* ObjC language option variables. */ 464 465 466/* Open and close the file for outputting class declarations, if 467 requested (ObjC). */ 468 469int flag_gen_declaration; 470 | 323/* ObjC language option variables. */ 324 325 326/* Open and close the file for outputting class declarations, if 327 requested (ObjC). */ 328 329int flag_gen_declaration; 330 |
471/* Generate code for GNU or NeXT runtime environment. */ 472 473#ifdef NEXT_OBJC_RUNTIME 474int flag_next_runtime = 1; 475#else 476int flag_next_runtime = 0; 477#endif 478 | |
479/* Tells the compiler that this is a special run. Do not perform any 480 compiling, instead we are to test some platform dependent features 481 and output a C header file with appropriate definitions. */ 482 483int print_struct_values; 484 | 331/* Tells the compiler that this is a special run. Do not perform any 332 compiling, instead we are to test some platform dependent features 333 and output a C header file with appropriate definitions. */ 334 335int print_struct_values; 336 |
485/* ???. Undocumented. */ | 337/* Tells the compiler what is the constant string class for Objc. */ |
486 487const char *constant_string_class_name; 488 | 338 339const char *constant_string_class_name; 340 |
489/* Warn if multiple methods are seen for the same selector, but with 490 different argument types. Performs the check on the whole selector 491 table at the end of compilation. */ | |
492 | 341 |
493int warn_selector; 494 495/* Warn if a @selector() is found, and no method with that selector 496 has been previously declared. The check is done on each 497 @selector() as soon as it is found - so it warns about forward 498 declarations. */ 499 500int warn_undeclared_selector; 501 502/* Warn if methods required by a protocol are not implemented in the 503 class adopting it. When turned off, methods inherited to that 504 class are also considered implemented. */ 505 506int warn_protocol = 1; 507 508 | |
509/* C++ language option variables. */ 510 511 512/* Nonzero means don't recognize any extension keywords. */ 513 514int flag_no_gnu_keywords; 515 516/* Nonzero means do emit exported implementations of functions even if --- 69 unchanged lines hidden (view full) --- 586/* 0 means we want the preprocessor to not emit line directives for 587 the current working directory. 1 means we want it to do it. -1 588 means we should decide depending on whether debugging information 589 is being emitted or not. */ 590 591int flag_working_directory = -1; 592 593/* Nonzero to use __cxa_atexit, rather than atexit, to register | 342/* C++ language option variables. */ 343 344 345/* Nonzero means don't recognize any extension keywords. */ 346 347int flag_no_gnu_keywords; 348 349/* Nonzero means do emit exported implementations of functions even if --- 69 unchanged lines hidden (view full) --- 419/* 0 means we want the preprocessor to not emit line directives for 420 the current working directory. 1 means we want it to do it. -1 421 means we should decide depending on whether debugging information 422 is being emitted or not. */ 423 424int flag_working_directory = -1; 425 426/* Nonzero to use __cxa_atexit, rather than atexit, to register |
594 destructors for local statics and global objects. */ | 427 destructors for local statics and global objects. '2' means it has been 428 set nonzero as a default, not by a command-line flag. */ |
595 596int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT; 597 | 429 430int flag_use_cxa_atexit = DEFAULT_USE_CXA_ATEXIT; 431 |
432/* Nonzero to use __cxa_get_exception_ptr in C++ exception-handling 433 code. '2' means it has not been set explicitly on the command line. */ 434 435int flag_use_cxa_get_exception_ptr = 2; 436 |
|
598/* Nonzero means make the default pedwarns warnings instead of errors. 599 The value of this flag is ignored if -pedantic is specified. */ 600 601int flag_permissive; 602 603/* Nonzero means to implement standard semantics for exception 604 specifications, calling unexpected if an exception is thrown that 605 doesn't match the specification. Zero means to treat them as 606 assertions and optimize accordingly, but not check them. */ 607 608int flag_enforce_eh_specs = 1; 609 | 437/* Nonzero means make the default pedwarns warnings instead of errors. 438 The value of this flag is ignored if -pedantic is specified. */ 439 440int flag_permissive; 441 442/* Nonzero means to implement standard semantics for exception 443 specifications, calling unexpected if an exception is thrown that 444 doesn't match the specification. Zero means to treat them as 445 assertions and optimize accordingly, but not check them. */ 446 447int flag_enforce_eh_specs = 1; 448 |
610/* Nonzero means warn about things that will change when compiling 611 with an ABI-compliant compiler. */ | 449/* Nonzero means to generate thread-safe code for initializing local 450 statics. */ |
612 | 451 |
613int warn_abi = 0; | 452int flag_threadsafe_statics = 1; |
614 | 453 |
615/* Nonzero means warn about invalid uses of offsetof. */ 616 617int warn_invalid_offsetof = 1; 618 | |
619/* Nonzero means warn about implicit declarations. */ 620 621int warn_implicit = 1; 622 | 454/* Nonzero means warn about implicit declarations. */ 455 456int warn_implicit = 1; 457 |
623/* Nonzero means warn when all ctors or dtors are private, and the class 624 has no friends. */ 625 626int warn_ctor_dtor_privacy = 0; 627 628/* Nonzero means warn in function declared in derived class has the 629 same name as a virtual in the base class, but fails to match the 630 type signature of any virtual function in the base class. */ 631 632int warn_overloaded_virtual; 633 634/* Nonzero means warn when declaring a class that has a non virtual 635 destructor, when it really ought to have a virtual one. */ 636 637int warn_nonvdtor; 638 639/* Nonzero means warn when the compiler will reorder code. */ 640 641int warn_reorder; 642 643/* Nonzero means warn when synthesis behavior differs from Cfront's. */ 644 645int warn_synth; 646 647/* Nonzero means warn when we convert a pointer to member function 648 into a pointer to (void or function). */ 649 650int warn_pmf2ptr = 1; 651 652/* Nonzero means warn about violation of some Effective C++ style rules. */ 653 654int warn_ecpp; 655 656/* Nonzero means warn where overload resolution chooses a promotion from 657 unsigned to signed over a conversion to an unsigned of the same size. */ 658 659int warn_sign_promo; 660 661/* Nonzero means warn when an old-style cast is used. */ 662 663int warn_old_style_cast; 664 665/* Nonzero means warn when non-templatized friend functions are 666 declared within a template */ 667 668int warn_nontemplate_friend = 1; 669 670/* Nonzero means complain about deprecated features. */ 671 672int warn_deprecated = 1; 673 | |
674/* Maximum template instantiation depth. This limit is rather 675 arbitrary, but it exists to limit the time it takes to notice 676 infinite template instantiations. */ 677 678int max_tinst_depth = 500; 679 680 681 682/* The elements of `ridpointers' are identifier nodes for the reserved 683 type names and storage classes. It is indexed by a RID_... value. */ 684tree *ridpointers; 685 686tree (*make_fname_decl) (tree, int); 687 | 458/* Maximum template instantiation depth. This limit is rather 459 arbitrary, but it exists to limit the time it takes to notice 460 infinite template instantiations. */ 461 462int max_tinst_depth = 500; 463 464 465 466/* The elements of `ridpointers' are identifier nodes for the reserved 467 type names and storage classes. It is indexed by a RID_... value. */ 468tree *ridpointers; 469 470tree (*make_fname_decl) (tree, int); 471 |
688/* If non-NULL, the address of a language-specific function that takes 689 any action required right before expand_function_end is called. */ 690void (*lang_expand_function_end) (void); 691 | |
692/* Nonzero means the expression being parsed will never be evaluated. 693 This is a count, since unevaluated expressions can nest. */ 694int skip_evaluation; 695 696/* Information about how a function name is generated. */ 697struct fname_var_t 698{ 699 tree *const decl; /* pointer to the VAR_DECL. */ --- 10 unchanged lines hidden (view full) --- 710 /* GCC __FUNCTION__ compliant. */ 711 {&function_name_decl_node, RID_FUNCTION_NAME, 0}, 712 /* GCC __PRETTY_FUNCTION__ compliant. */ 713 {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1}, 714 {NULL, 0, 0}, 715}; 716 717static int constant_fits_type_p (tree, tree); | 472/* Nonzero means the expression being parsed will never be evaluated. 473 This is a count, since unevaluated expressions can nest. */ 474int skip_evaluation; 475 476/* Information about how a function name is generated. */ 477struct fname_var_t 478{ 479 tree *const decl; /* pointer to the VAR_DECL. */ --- 10 unchanged lines hidden (view full) --- 490 /* GCC __FUNCTION__ compliant. */ 491 {&function_name_decl_node, RID_FUNCTION_NAME, 0}, 492 /* GCC __PRETTY_FUNCTION__ compliant. */ 493 {&pretty_function_name_decl_node, RID_PRETTY_FUNCTION_NAME, 1}, 494 {NULL, 0, 0}, 495}; 496 497static int constant_fits_type_p (tree, tree); |
498static tree check_case_value (tree); 499static bool check_case_bounds (tree, tree, tree *, tree *); |
|
718 | 500 |
719/* Keep a stack of if statements. We record the number of compound 720 statements seen up to the if keyword, as well as the line number 721 and file of the if. If a potentially ambiguous else is seen, that 722 fact is recorded; the warning is issued when we can be sure that 723 the enclosing if statement does not have an else branch. */ 724typedef struct 725{ 726 int compstmt_count; 727 location_t locus; 728 int needs_warning; 729 tree if_stmt; 730} if_elt; 731 732static if_elt *if_stack; 733 734/* Amount of space in the if statement stack. */ 735static int if_stack_space = 0; 736 737/* Stack pointer. */ 738static int if_stack_pointer = 0; 739 | |
740static tree handle_packed_attribute (tree *, tree, tree, int, bool *); 741static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *); 742static tree handle_common_attribute (tree *, tree, tree, int, bool *); 743static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); 744static tree handle_noinline_attribute (tree *, tree, tree, int, bool *); 745static tree handle_always_inline_attribute (tree *, tree, tree, int, 746 bool *); | 501static tree handle_packed_attribute (tree *, tree, tree, int, bool *); 502static tree handle_nocommon_attribute (tree *, tree, tree, int, bool *); 503static tree handle_common_attribute (tree *, tree, tree, int, bool *); 504static tree handle_noreturn_attribute (tree *, tree, tree, int, bool *); 505static tree handle_noinline_attribute (tree *, tree, tree, int, bool *); 506static tree handle_always_inline_attribute (tree *, tree, tree, int, 507 bool *); |
508static tree handle_gnu_inline_attribute (tree *, tree, tree, int, 509 bool *); 510static tree handle_flatten_attribute (tree *, tree, tree, int, bool *); |
|
747static tree handle_used_attribute (tree *, tree, tree, int, bool *); 748static tree handle_unused_attribute (tree *, tree, tree, int, bool *); | 511static tree handle_used_attribute (tree *, tree, tree, int, bool *); 512static tree handle_unused_attribute (tree *, tree, tree, int, bool *); |
513static tree handle_externally_visible_attribute (tree *, tree, tree, int, 514 bool *); |
|
749static tree handle_const_attribute (tree *, tree, tree, int, bool *); 750static tree handle_transparent_union_attribute (tree *, tree, tree, 751 int, bool *); 752static tree handle_constructor_attribute (tree *, tree, tree, int, bool *); 753static tree handle_destructor_attribute (tree *, tree, tree, int, bool *); 754static tree handle_mode_attribute (tree *, tree, tree, int, bool *); 755static tree handle_section_attribute (tree *, tree, tree, int, bool *); 756static tree handle_aligned_attribute (tree *, tree, tree, int, bool *); 757static tree handle_weak_attribute (tree *, tree, tree, int, bool *) ; 758static tree handle_alias_attribute (tree *, tree, tree, int, bool *); | 515static tree handle_const_attribute (tree *, tree, tree, int, bool *); 516static tree handle_transparent_union_attribute (tree *, tree, tree, 517 int, bool *); 518static tree handle_constructor_attribute (tree *, tree, tree, int, bool *); 519static tree handle_destructor_attribute (tree *, tree, tree, int, bool *); 520static tree handle_mode_attribute (tree *, tree, tree, int, bool *); 521static tree handle_section_attribute (tree *, tree, tree, int, bool *); 522static tree handle_aligned_attribute (tree *, tree, tree, int, bool *); 523static tree handle_weak_attribute (tree *, tree, tree, int, bool *) ; 524static tree handle_alias_attribute (tree *, tree, tree, int, bool *); |
525static tree handle_weakref_attribute (tree *, tree, tree, int, bool *) ; |
|
759static tree handle_visibility_attribute (tree *, tree, tree, int, 760 bool *); 761static tree handle_tls_model_attribute (tree *, tree, tree, int, 762 bool *); 763static tree handle_no_instrument_function_attribute (tree *, tree, 764 tree, int, bool *); 765static tree handle_malloc_attribute (tree *, tree, tree, int, bool *); | 526static tree handle_visibility_attribute (tree *, tree, tree, int, 527 bool *); 528static tree handle_tls_model_attribute (tree *, tree, tree, int, 529 bool *); 530static tree handle_no_instrument_function_attribute (tree *, tree, 531 tree, int, bool *); 532static tree handle_malloc_attribute (tree *, tree, tree, int, bool *); |
533static tree handle_returns_twice_attribute (tree *, tree, tree, int, bool *); |
|
766static tree handle_no_limit_stack_attribute (tree *, tree, tree, int, 767 bool *); 768static tree handle_pure_attribute (tree *, tree, tree, int, bool *); | 534static tree handle_no_limit_stack_attribute (tree *, tree, tree, int, 535 bool *); 536static tree handle_pure_attribute (tree *, tree, tree, int, bool *); |
537static tree handle_novops_attribute (tree *, tree, tree, int, bool *); |
|
769static tree handle_deprecated_attribute (tree *, tree, tree, int, 770 bool *); 771static tree handle_vector_size_attribute (tree *, tree, tree, int, 772 bool *); 773static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *); 774static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *); 775static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *); 776static tree handle_warn_unused_result_attribute (tree *, tree, tree, int, 777 bool *); | 538static tree handle_deprecated_attribute (tree *, tree, tree, int, 539 bool *); 540static tree handle_vector_size_attribute (tree *, tree, tree, int, 541 bool *); 542static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *); 543static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *); 544static tree handle_cleanup_attribute (tree *, tree, tree, int, bool *); 545static tree handle_warn_unused_result_attribute (tree *, tree, tree, int, 546 bool *); |
547static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *); |
|
778 779static void check_function_nonnull (tree, tree); 780static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); 781static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT); 782static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *); 783static int resort_field_decl_cmp (const void *, const void *); 784 785/* Table of machine-independent attributes common to all C-like languages. */ --- 14 unchanged lines hidden (view full) --- 800 { "noreturn", 0, 0, true, false, false, 801 handle_noreturn_attribute }, 802 { "volatile", 0, 0, true, false, false, 803 handle_noreturn_attribute }, 804 { "noinline", 0, 0, true, false, false, 805 handle_noinline_attribute }, 806 { "always_inline", 0, 0, true, false, false, 807 handle_always_inline_attribute }, | 548 549static void check_function_nonnull (tree, tree); 550static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT); 551static bool nonnull_check_p (tree, unsigned HOST_WIDE_INT); 552static bool get_nonnull_operand (tree, unsigned HOST_WIDE_INT *); 553static int resort_field_decl_cmp (const void *, const void *); 554 555/* Table of machine-independent attributes common to all C-like languages. */ --- 14 unchanged lines hidden (view full) --- 570 { "noreturn", 0, 0, true, false, false, 571 handle_noreturn_attribute }, 572 { "volatile", 0, 0, true, false, false, 573 handle_noreturn_attribute }, 574 { "noinline", 0, 0, true, false, false, 575 handle_noinline_attribute }, 576 { "always_inline", 0, 0, true, false, false, 577 handle_always_inline_attribute }, |
578 { "gnu_inline", 0, 0, true, false, false, 579 handle_gnu_inline_attribute }, 580 { "flatten", 0, 0, true, false, false, 581 handle_flatten_attribute }, |
|
808 { "used", 0, 0, true, false, false, 809 handle_used_attribute }, 810 { "unused", 0, 0, false, false, false, 811 handle_unused_attribute }, | 582 { "used", 0, 0, true, false, false, 583 handle_used_attribute }, 584 { "unused", 0, 0, false, false, false, 585 handle_unused_attribute }, |
586 { "externally_visible", 0, 0, true, false, false, 587 handle_externally_visible_attribute }, |
|
812 /* The same comments as for noreturn attributes apply to const ones. */ 813 { "const", 0, 0, true, false, false, 814 handle_const_attribute }, 815 { "transparent_union", 0, 0, false, false, false, 816 handle_transparent_union_attribute }, 817 { "constructor", 0, 0, true, false, false, 818 handle_constructor_attribute }, 819 { "destructor", 0, 0, true, false, false, 820 handle_destructor_attribute }, 821 { "mode", 1, 1, false, true, false, 822 handle_mode_attribute }, 823 { "section", 1, 1, true, false, false, 824 handle_section_attribute }, 825 { "aligned", 0, 1, false, false, false, 826 handle_aligned_attribute }, 827 { "weak", 0, 0, true, false, false, 828 handle_weak_attribute }, 829 { "alias", 1, 1, true, false, false, 830 handle_alias_attribute }, | 588 /* The same comments as for noreturn attributes apply to const ones. */ 589 { "const", 0, 0, true, false, false, 590 handle_const_attribute }, 591 { "transparent_union", 0, 0, false, false, false, 592 handle_transparent_union_attribute }, 593 { "constructor", 0, 0, true, false, false, 594 handle_constructor_attribute }, 595 { "destructor", 0, 0, true, false, false, 596 handle_destructor_attribute }, 597 { "mode", 1, 1, false, true, false, 598 handle_mode_attribute }, 599 { "section", 1, 1, true, false, false, 600 handle_section_attribute }, 601 { "aligned", 0, 1, false, false, false, 602 handle_aligned_attribute }, 603 { "weak", 0, 0, true, false, false, 604 handle_weak_attribute }, 605 { "alias", 1, 1, true, false, false, 606 handle_alias_attribute }, |
607 { "weakref", 0, 1, true, false, false, 608 handle_weakref_attribute }, |
|
831 { "no_instrument_function", 0, 0, true, false, false, 832 handle_no_instrument_function_attribute }, 833 { "malloc", 0, 0, true, false, false, 834 handle_malloc_attribute }, | 609 { "no_instrument_function", 0, 0, true, false, false, 610 handle_no_instrument_function_attribute }, 611 { "malloc", 0, 0, true, false, false, 612 handle_malloc_attribute }, |
613 { "returns_twice", 0, 0, true, false, false, 614 handle_returns_twice_attribute }, |
|
835 { "no_stack_limit", 0, 0, true, false, false, 836 handle_no_limit_stack_attribute }, 837 { "pure", 0, 0, true, false, false, 838 handle_pure_attribute }, | 615 { "no_stack_limit", 0, 0, true, false, false, 616 handle_no_limit_stack_attribute }, 617 { "pure", 0, 0, true, false, false, 618 handle_pure_attribute }, |
619 /* For internal use (marking of builtins) only. The name contains space 620 to prevent its usage in source code. */ 621 { "no vops", 0, 0, true, false, false, 622 handle_novops_attribute }, |
|
839 { "deprecated", 0, 0, false, false, false, 840 handle_deprecated_attribute }, 841 { "vector_size", 1, 1, false, true, false, 842 handle_vector_size_attribute }, | 623 { "deprecated", 0, 0, false, false, false, 624 handle_deprecated_attribute }, 625 { "vector_size", 1, 1, false, true, false, 626 handle_vector_size_attribute }, |
843 { "visibility", 1, 1, true, false, false, | 627 { "visibility", 1, 1, false, false, false, |
844 handle_visibility_attribute }, 845 { "tls_model", 1, 1, true, false, false, 846 handle_tls_model_attribute }, 847 { "nonnull", 0, -1, false, true, true, 848 handle_nonnull_attribute }, 849 { "nothrow", 0, 0, true, false, false, 850 handle_nothrow_attribute }, 851 { "may_alias", 0, 0, false, true, false, NULL }, 852 { "cleanup", 1, 1, true, false, false, 853 handle_cleanup_attribute }, 854 { "warn_unused_result", 0, 0, false, true, true, 855 handle_warn_unused_result_attribute }, | 628 handle_visibility_attribute }, 629 { "tls_model", 1, 1, true, false, false, 630 handle_tls_model_attribute }, 631 { "nonnull", 0, -1, false, true, true, 632 handle_nonnull_attribute }, 633 { "nothrow", 0, 0, true, false, false, 634 handle_nothrow_attribute }, 635 { "may_alias", 0, 0, false, true, false, NULL }, 636 { "cleanup", 1, 1, true, false, false, 637 handle_cleanup_attribute }, 638 { "warn_unused_result", 0, 0, false, true, true, 639 handle_warn_unused_result_attribute }, |
640 { "sentinel", 0, 1, false, true, true, 641 handle_sentinel_attribute }, |
|
856 { NULL, 0, 0, false, false, false, NULL } 857}; 858 859/* Give the specifications for the format attributes, used by C and all 860 descendants. */ 861 862const struct attribute_spec c_common_format_attribute_table[] = 863{ 864 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ 865 { "format", 3, 3, false, true, true, 866 handle_format_attribute }, 867 { "format_arg", 1, 1, false, true, true, 868 handle_format_arg_attribute }, 869 { NULL, 0, 0, false, false, false, NULL } 870}; 871 | 642 { NULL, 0, 0, false, false, false, NULL } 643}; 644 645/* Give the specifications for the format attributes, used by C and all 646 descendants. */ 647 648const struct attribute_spec c_common_format_attribute_table[] = 649{ 650 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ 651 { "format", 3, 3, false, true, true, 652 handle_format_attribute }, 653 { "format_arg", 1, 1, false, true, true, 654 handle_format_arg_attribute }, 655 { NULL, 0, 0, false, false, false, NULL } 656}; 657 |
872/* Record the start of an if-then, and record the start of it 873 for ambiguous else detection. 874 875 COND is the condition for the if-then statement. 876 877 IF_STMT is the statement node that has already been created for 878 this if-then statement. It is created before parsing the 879 condition to keep line number information accurate. */ 880 881void 882c_expand_start_cond (tree cond, int compstmt_count, tree if_stmt) 883{ 884 /* Make sure there is enough space on the stack. */ 885 if (if_stack_space == 0) 886 { 887 if_stack_space = 10; 888 if_stack = xmalloc (10 * sizeof (if_elt)); 889 } 890 else if (if_stack_space == if_stack_pointer) 891 { 892 if_stack_space += 10; 893 if_stack = xrealloc (if_stack, if_stack_space * sizeof (if_elt)); 894 } 895 896 IF_COND (if_stmt) = cond; 897 add_stmt (if_stmt); 898 899 /* Record this if statement. */ 900 if_stack[if_stack_pointer].compstmt_count = compstmt_count; 901 if_stack[if_stack_pointer].locus = input_location; 902 if_stack[if_stack_pointer].needs_warning = 0; 903 if_stack[if_stack_pointer].if_stmt = if_stmt; 904 if_stack_pointer++; 905} 906 907/* Called after the then-clause for an if-statement is processed. */ 908 909void 910c_finish_then (void) 911{ 912 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt; 913 RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt)); 914} 915 916/* Record the end of an if-then. Optionally warn if a nested 917 if statement had an ambiguous else clause. */ 918 919void 920c_expand_end_cond (void) 921{ 922 if_stack_pointer--; 923 if (if_stack[if_stack_pointer].needs_warning) 924 warning ("%Hsuggest explicit braces to avoid ambiguous `else'", 925 &if_stack[if_stack_pointer].locus); 926 last_expr_type = NULL_TREE; 927} 928 929/* Called between the then-clause and the else-clause 930 of an if-then-else. */ 931 932void 933c_expand_start_else (void) 934{ 935 /* An ambiguous else warning must be generated for the enclosing if 936 statement, unless we see an else branch for that one, too. */ 937 if (warn_parentheses 938 && if_stack_pointer > 1 939 && (if_stack[if_stack_pointer - 1].compstmt_count 940 == if_stack[if_stack_pointer - 2].compstmt_count)) 941 if_stack[if_stack_pointer - 2].needs_warning = 1; 942 943 /* Even if a nested if statement had an else branch, it can't be 944 ambiguous if this one also has an else. So don't warn in that 945 case. Also don't warn for any if statements nested in this else. */ 946 if_stack[if_stack_pointer - 1].needs_warning = 0; 947 if_stack[if_stack_pointer - 1].compstmt_count--; 948} 949 950/* Called after the else-clause for an if-statement is processed. */ 951 952void 953c_finish_else (void) 954{ 955 tree if_stmt = if_stack[if_stack_pointer - 1].if_stmt; 956 RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt)); 957} 958 959/* Begin an if-statement. Returns a newly created IF_STMT if 960 appropriate. 961 962 Unlike the C++ front-end, we do not call add_stmt here; it is 963 probably safe to do so, but I am not very familiar with this 964 code so I am being extra careful not to change its behavior 965 beyond what is strictly necessary for correctness. */ 966 967tree 968c_begin_if_stmt (void) 969{ 970 tree r; 971 r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE); 972 return r; 973} 974 975/* Begin a while statement. Returns a newly created WHILE_STMT if 976 appropriate. 977 978 Unlike the C++ front-end, we do not call add_stmt here; it is 979 probably safe to do so, but I am not very familiar with this 980 code so I am being extra careful not to change its behavior 981 beyond what is strictly necessary for correctness. */ 982 983tree 984c_begin_while_stmt (void) 985{ 986 tree r; 987 r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE); 988 return r; 989} 990 991void 992c_finish_while_stmt_cond (tree cond, tree while_stmt) 993{ 994 WHILE_COND (while_stmt) = cond; 995} 996 | |
997/* Push current bindings for the function name VAR_DECLS. */ 998 999void 1000start_fname_decls (void) 1001{ 1002 unsigned ix; 1003 tree saved = NULL_TREE; 1004 1005 for (ix = 0; fname_vars[ix].decl; ix++) 1006 { 1007 tree decl = *fname_vars[ix].decl; 1008 1009 if (decl) 1010 { | 658/* Push current bindings for the function name VAR_DECLS. */ 659 660void 661start_fname_decls (void) 662{ 663 unsigned ix; 664 tree saved = NULL_TREE; 665 666 for (ix = 0; fname_vars[ix].decl; ix++) 667 { 668 tree decl = *fname_vars[ix].decl; 669 670 if (decl) 671 { |
1011 saved = tree_cons (decl, build_int_2 (ix, 0), saved); | 672 saved = tree_cons (decl, build_int_cst (NULL_TREE, ix), saved); |
1012 *fname_vars[ix].decl = NULL_TREE; 1013 } 1014 } 1015 if (saved || saved_function_name_decls) 1016 /* Normally they'll have been NULL, so only push if we've got a 1017 stack, or they are non-NULL. */ 1018 saved_function_name_decls = tree_cons (saved, NULL_TREE, 1019 saved_function_name_decls); 1020} 1021 | 673 *fname_vars[ix].decl = NULL_TREE; 674 } 675 } 676 if (saved || saved_function_name_decls) 677 /* Normally they'll have been NULL, so only push if we've got a 678 stack, or they are non-NULL. */ 679 saved_function_name_decls = tree_cons (saved, NULL_TREE, 680 saved_function_name_decls); 681} 682 |
1022/* Finish up the current bindings, adding them into the 1023 current function's statement tree. This is done by wrapping the 1024 function's body in a COMPOUND_STMT containing these decls too. This 1025 must be done _before_ finish_stmt_tree is called. If there is no 1026 current function, we must be at file scope and no statements are 1027 involved. Pop the previous bindings. */ | 683/* Finish up the current bindings, adding them into the current function's 684 statement tree. This must be done _before_ finish_stmt_tree is called. 685 If there is no current function, we must be at file scope and no statements 686 are involved. Pop the previous bindings. */ |
1028 1029void 1030finish_fname_decls (void) 1031{ 1032 unsigned ix; | 687 688void 689finish_fname_decls (void) 690{ 691 unsigned ix; |
1033 tree body = NULL_TREE; | 692 tree stmts = NULL_TREE; |
1034 tree stack = saved_function_name_decls; 1035 1036 for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack)) | 693 tree stack = saved_function_name_decls; 694 695 for (; stack && TREE_VALUE (stack); stack = TREE_CHAIN (stack)) |
1037 body = chainon (TREE_VALUE (stack), body); | 696 append_to_statement_list (TREE_VALUE (stack), &stmts); |
1038 | 697 |
1039 if (body) | 698 if (stmts) |
1040 { | 699 { |
1041 /* They were called into existence, so add to statement tree. Add 1042 the DECL_STMTs inside the outermost scope. */ 1043 tree *p = &DECL_SAVED_TREE (current_function_decl); 1044 /* Skip the dummy EXPR_STMT and any EH_SPEC_BLOCK. */ 1045 while (TREE_CODE (*p) != COMPOUND_STMT) 1046 { 1047 if (TREE_CODE (*p) == EXPR_STMT) 1048 p = &TREE_CHAIN (*p); 1049 else 1050 p = &TREE_OPERAND(*p, 0); 1051 } | 700 tree *bodyp = &DECL_SAVED_TREE (current_function_decl); |
1052 | 701 |
1053 p = &COMPOUND_BODY (*p); 1054 if (TREE_CODE (*p) == SCOPE_STMT) 1055 p = &TREE_CHAIN (*p); | 702 if (TREE_CODE (*bodyp) == BIND_EXPR) 703 bodyp = &BIND_EXPR_BODY (*bodyp); |
1056 | 704 |
1057 body = chainon (body, *p); 1058 *p = body; | 705 append_to_statement_list_force (*bodyp, &stmts); 706 *bodyp = stmts; |
1059 } 1060 1061 for (ix = 0; fname_vars[ix].decl; ix++) 1062 *fname_vars[ix].decl = NULL_TREE; 1063 1064 if (stack) 1065 { 1066 /* We had saved values, restore them. */ --- 7 unchanged lines hidden (view full) --- 1074 *fname_vars[ix].decl = decl; 1075 } 1076 stack = TREE_CHAIN (stack); 1077 } 1078 saved_function_name_decls = stack; 1079} 1080 1081/* Return the text name of the current function, suitably prettified | 707 } 708 709 for (ix = 0; fname_vars[ix].decl; ix++) 710 *fname_vars[ix].decl = NULL_TREE; 711 712 if (stack) 713 { 714 /* We had saved values, restore them. */ --- 7 unchanged lines hidden (view full) --- 722 *fname_vars[ix].decl = decl; 723 } 724 stack = TREE_CHAIN (stack); 725 } 726 saved_function_name_decls = stack; 727} 728 729/* Return the text name of the current function, suitably prettified |
1082 by PRETTY_P. */ | 730 by PRETTY_P. Return string must be freed by caller. */ |
1083 1084const char * 1085fname_as_string (int pretty_p) 1086{ 1087 const char *name = "top level"; | 731 732const char * 733fname_as_string (int pretty_p) 734{ 735 const char *name = "top level"; |
736 char *namep; |
|
1088 int vrb = 2; 1089 | 737 int vrb = 2; 738 |
1090 if (! pretty_p) | 739 if (!pretty_p) |
1091 { 1092 name = ""; 1093 vrb = 0; 1094 } 1095 1096 if (current_function_decl) | 740 { 741 name = ""; 742 vrb = 0; 743 } 744 745 if (current_function_decl) |
1097 name = (*lang_hooks.decl_printable_name) (current_function_decl, vrb); | 746 name = lang_hooks.decl_printable_name (current_function_decl, vrb); |
1098 | 747 |
1099 return name; | 748 if (c_lex_string_translate) 749 { 750 int len = strlen (name) + 3; /* Two for '"'s. One for NULL. */ 751 cpp_string cstr = { 0, 0 }, strname; 752 753 namep = XNEWVEC (char, len); 754 snprintf (namep, len, "\"%s\"", name); 755 strname.text = (unsigned char *) namep; 756 strname.len = len - 1; 757 758 if (cpp_interpret_string (parse_in, &strname, 1, &cstr, false)) 759 { 760 XDELETEVEC (namep); 761 return (char *) cstr.text; 762 } 763 } 764 else 765 namep = xstrdup (name); 766 767 return namep; |
1100} 1101 | 768} 769 |
770/* Expand DECL if it declares an entity not handled by the 771 common code. */ 772 773int 774c_expand_decl (tree decl) 775{ 776 if (TREE_CODE (decl) == VAR_DECL && !TREE_STATIC (decl)) 777 { 778 /* Let the back-end know about this variable. */ 779 if (!anon_aggr_type_p (TREE_TYPE (decl))) 780 emit_local_var (decl); 781 else 782 expand_anon_union_decl (decl, NULL_TREE, 783 DECL_ANON_UNION_ELEMS (decl)); 784 } 785 else 786 return 0; 787 788 return 1; 789} 790 791 |
|
1102/* Return the VAR_DECL for a const char array naming the current 1103 function. If the VAR_DECL has not yet been created, create it 1104 now. RID indicates how it should be formatted and IDENTIFIER_NODE 1105 ID is its name (unfortunately C and C++ hold the RID values of 1106 keywords in different places, so we can't derive RID from ID in 1107 this language independent code. */ 1108 1109tree --- 4 unchanged lines hidden (view full) --- 1114 1115 for (ix = 0; fname_vars[ix].decl; ix++) 1116 if (fname_vars[ix].rid == rid) 1117 break; 1118 1119 decl = *fname_vars[ix].decl; 1120 if (!decl) 1121 { | 792/* Return the VAR_DECL for a const char array naming the current 793 function. If the VAR_DECL has not yet been created, create it 794 now. RID indicates how it should be formatted and IDENTIFIER_NODE 795 ID is its name (unfortunately C and C++ hold the RID values of 796 keywords in different places, so we can't derive RID from ID in 797 this language independent code. */ 798 799tree --- 4 unchanged lines hidden (view full) --- 804 805 for (ix = 0; fname_vars[ix].decl; ix++) 806 if (fname_vars[ix].rid == rid) 807 break; 808 809 decl = *fname_vars[ix].decl; 810 if (!decl) 811 { |
1122 tree saved_last_tree = last_tree; | |
1123 /* If a tree is built here, it would normally have the lineno of 1124 the current statement. Later this tree will be moved to the 1125 beginning of the function and this line number will be wrong. 1126 To avoid this problem set the lineno to 0 here; that prevents 1127 it from appearing in the RTL. */ | 812 /* If a tree is built here, it would normally have the lineno of 813 the current statement. Later this tree will be moved to the 814 beginning of the function and this line number will be wrong. 815 To avoid this problem set the lineno to 0 here; that prevents 816 it from appearing in the RTL. */ |
1128 int saved_lineno = input_line; | 817 tree stmts; 818 location_t saved_location = input_location; 819#ifdef USE_MAPPED_LOCATION 820 input_location = UNKNOWN_LOCATION; 821#else |
1129 input_line = 0; | 822 input_line = 0; |
823#endif |
|
1130 | 824 |
825 stmts = push_stmt_list (); |
|
1131 decl = (*make_fname_decl) (id, fname_vars[ix].pretty); | 826 decl = (*make_fname_decl) (id, fname_vars[ix].pretty); |
1132 if (last_tree != saved_last_tree) 1133 { 1134 /* We created some statement tree for the decl. This belongs 1135 at the start of the function, so remove it now and reinsert 1136 it after the function is complete. */ 1137 tree stmts = TREE_CHAIN (saved_last_tree); 1138 1139 TREE_CHAIN (saved_last_tree) = NULL_TREE; 1140 last_tree = saved_last_tree; 1141 saved_function_name_decls = tree_cons (decl, stmts, 1142 saved_function_name_decls); 1143 } | 827 stmts = pop_stmt_list (stmts); 828 if (!IS_EMPTY_STMT (stmts)) 829 saved_function_name_decls 830 = tree_cons (decl, stmts, saved_function_name_decls); |
1144 *fname_vars[ix].decl = decl; | 831 *fname_vars[ix].decl = decl; |
1145 input_line = saved_lineno; | 832 input_location = saved_location; |
1146 } 1147 if (!ix && !current_function_decl) | 833 } 834 if (!ix && !current_function_decl) |
1148 pedwarn ("'%D' is not defined outside of function scope", decl); | 835 pedwarn ("%qD is not defined outside of function scope", decl); |
1149 1150 return decl; 1151} 1152 1153/* Given a STRING_CST, give it a suitable array-of-chars data type. */ 1154 1155tree 1156fix_string_type (tree value) 1157{ 1158 const int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT; 1159 const int wide_flag = TREE_TYPE (value) == wchar_array_type_node; | 836 837 return decl; 838} 839 840/* Given a STRING_CST, give it a suitable array-of-chars data type. */ 841 842tree 843fix_string_type (tree value) 844{ 845 const int wchar_bytes = TYPE_PRECISION (wchar_type_node) / BITS_PER_UNIT; 846 const int wide_flag = TREE_TYPE (value) == wchar_array_type_node; |
1160 const int nchars_max = flag_isoc99 ? 4095 : 509; | |
1161 int length = TREE_STRING_LENGTH (value); 1162 int nchars; | 847 int length = TREE_STRING_LENGTH (value); 848 int nchars; |
849 tree e_type, i_type, a_type; |
|
1163 1164 /* Compute the number of elements, for the array type. */ 1165 nchars = wide_flag ? length / wchar_bytes : length; 1166 | 850 851 /* Compute the number of elements, for the array type. */ 852 nchars = wide_flag ? length / wchar_bytes : length; 853 |
1167 if (pedantic && nchars - 1 > nchars_max && !c_dialect_cxx ()) 1168 pedwarn ("string length `%d' is greater than the length `%d' ISO C%d compilers are required to support", 1169 nchars - 1, nchars_max, flag_isoc99 ? 99 : 89); 1170 1171 /* Create the array type for the string constant. 1172 -Wwrite-strings says make the string constant an array of const char 1173 so that copying it to a non-const pointer will get a warning. 1174 For C++, this is the standard behavior. */ 1175 if (flag_const_strings && ! flag_writable_strings) | 854 /* C89 2.2.4.1, C99 5.2.4.1 (Translation limits). The analogous 855 limit in C++98 Annex B is very large (65536) and is not normative, 856 so we do not diagnose it (warn_overlength_strings is forced off 857 in c_common_post_options). */ 858 if (warn_overlength_strings) |
1176 { | 859 { |
1177 tree elements 1178 = build_type_variant (wide_flag ? wchar_type_node : char_type_node, 1179 1, 0); 1180 TREE_TYPE (value) 1181 = build_array_type (elements, 1182 build_index_type (build_int_2 (nchars - 1, 0))); | 860 const int nchars_max = flag_isoc99 ? 4095 : 509; 861 const int relevant_std = flag_isoc99 ? 99 : 90; 862 if (nchars - 1 > nchars_max) 863 /* Translators: The %d after 'ISO C' will be 90 or 99. Do not 864 separate the %d from the 'C'. 'ISO' should not be 865 translated, but it may be moved after 'C%d' in languages 866 where modifiers follow nouns. */ 867 pedwarn ("string length %qd is greater than the length %qd " 868 "ISO C%d compilers are required to support", 869 nchars - 1, nchars_max, relevant_std); |
1183 } | 870 } |
1184 else 1185 TREE_TYPE (value) 1186 = build_array_type (wide_flag ? wchar_type_node : char_type_node, 1187 build_index_type (build_int_2 (nchars - 1, 0))); | |
1188 | 871 |
872 /* Create the array type for the string constant. The ISO C++ 873 standard says that a string literal has type `const char[N]' or 874 `const wchar_t[N]'. We use the same logic when invoked as a C 875 front-end with -Wwrite-strings. 876 ??? We should change the type of an expression depending on the 877 state of a warning flag. We should just be warning -- see how 878 this is handled in the C++ front-end for the deprecated implicit 879 conversion from string literals to `char*' or `wchar_t*'. 880 881 The C++ front end relies on TYPE_MAIN_VARIANT of a cv-qualified 882 array type being the unqualified version of that type. 883 Therefore, if we are constructing an array of const char, we must 884 construct the matching unqualified array type first. The C front 885 end does not require this, but it does no harm, so we do it 886 unconditionally. */ 887 e_type = wide_flag ? wchar_type_node : char_type_node; 888 i_type = build_index_type (build_int_cst (NULL_TREE, nchars - 1)); 889 a_type = build_array_type (e_type, i_type); 890 if (c_dialect_cxx() || warn_write_strings) 891 a_type = c_build_qualified_type (a_type, TYPE_QUAL_CONST); 892 893 TREE_TYPE (value) = a_type; |
|
1189 TREE_CONSTANT (value) = 1; | 894 TREE_CONSTANT (value) = 1; |
1190 TREE_READONLY (value) = ! flag_writable_strings; | 895 TREE_INVARIANT (value) = 1; 896 TREE_READONLY (value) = 1; |
1191 TREE_STATIC (value) = 1; 1192 return value; 1193} 1194 1195/* Print a warning if a constant expression had overflow in folding. 1196 Invoke this function on every expression that the language 1197 requires to be a constant expression. 1198 Note the ANSI C standard says it is erroneous for a 1199 constant expression to overflow. */ 1200 1201void 1202constant_expression_warning (tree value) 1203{ 1204 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST 1205 || TREE_CODE (value) == VECTOR_CST 1206 || TREE_CODE (value) == COMPLEX_CST) | 897 TREE_STATIC (value) = 1; 898 return value; 899} 900 901/* Print a warning if a constant expression had overflow in folding. 902 Invoke this function on every expression that the language 903 requires to be a constant expression. 904 Note the ANSI C standard says it is erroneous for a 905 constant expression to overflow. */ 906 907void 908constant_expression_warning (tree value) 909{ 910 if ((TREE_CODE (value) == INTEGER_CST || TREE_CODE (value) == REAL_CST 911 || TREE_CODE (value) == VECTOR_CST 912 || TREE_CODE (value) == COMPLEX_CST) |
1207 && TREE_CONSTANT_OVERFLOW (value) && pedantic) | 913 && TREE_CONSTANT_OVERFLOW (value) 914 && warn_overflow 915 && pedantic) |
1208 pedwarn ("overflow in constant expression"); 1209} 1210 1211/* Print a warning if an expression had overflow in folding. 1212 Invoke this function on every expression that 1213 (1) appears in the source code, and 1214 (2) might be a constant expression that overflowed, and 1215 (3) is not already checked by convert_and_check; --- 4 unchanged lines hidden (view full) --- 1220{ 1221 if ((TREE_CODE (value) == INTEGER_CST 1222 || (TREE_CODE (value) == COMPLEX_CST 1223 && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST)) 1224 && TREE_OVERFLOW (value)) 1225 { 1226 TREE_OVERFLOW (value) = 0; 1227 if (skip_evaluation == 0) | 916 pedwarn ("overflow in constant expression"); 917} 918 919/* Print a warning if an expression had overflow in folding. 920 Invoke this function on every expression that 921 (1) appears in the source code, and 922 (2) might be a constant expression that overflowed, and 923 (3) is not already checked by convert_and_check; --- 4 unchanged lines hidden (view full) --- 928{ 929 if ((TREE_CODE (value) == INTEGER_CST 930 || (TREE_CODE (value) == COMPLEX_CST 931 && TREE_CODE (TREE_REALPART (value)) == INTEGER_CST)) 932 && TREE_OVERFLOW (value)) 933 { 934 TREE_OVERFLOW (value) = 0; 935 if (skip_evaluation == 0) |
1228 warning ("integer overflow in expression"); | 936 warning (OPT_Woverflow, "integer overflow in expression"); |
1229 } 1230 else if ((TREE_CODE (value) == REAL_CST 1231 || (TREE_CODE (value) == COMPLEX_CST 1232 && TREE_CODE (TREE_REALPART (value)) == REAL_CST)) 1233 && TREE_OVERFLOW (value)) 1234 { 1235 TREE_OVERFLOW (value) = 0; 1236 if (skip_evaluation == 0) | 937 } 938 else if ((TREE_CODE (value) == REAL_CST 939 || (TREE_CODE (value) == COMPLEX_CST 940 && TREE_CODE (TREE_REALPART (value)) == REAL_CST)) 941 && TREE_OVERFLOW (value)) 942 { 943 TREE_OVERFLOW (value) = 0; 944 if (skip_evaluation == 0) |
1237 warning ("floating point overflow in expression"); | 945 warning (OPT_Woverflow, "floating point overflow in expression"); |
1238 } 1239 else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value)) 1240 { 1241 TREE_OVERFLOW (value) = 0; 1242 if (skip_evaluation == 0) | 946 } 947 else if (TREE_CODE (value) == VECTOR_CST && TREE_OVERFLOW (value)) 948 { 949 TREE_OVERFLOW (value) = 0; 950 if (skip_evaluation == 0) |
1243 warning ("vector overflow in expression"); | 951 warning (OPT_Woverflow, "vector overflow in expression"); |
1244 } 1245} 1246 1247/* Print a warning if a large constant is truncated to unsigned, 1248 or if -Wconversion is used and a constant < 0 is converted to unsigned. 1249 Invoke this function on every expression that might be implicitly 1250 converted to an unsigned type. */ 1251 | 952 } 953} 954 955/* Print a warning if a large constant is truncated to unsigned, 956 or if -Wconversion is used and a constant < 0 is converted to unsigned. 957 Invoke this function on every expression that might be implicitly 958 converted to an unsigned type. */ 959 |
1252void | 960static void |
1253unsigned_conversion_warning (tree result, tree operand) 1254{ 1255 tree type = TREE_TYPE (result); 1256 1257 if (TREE_CODE (operand) == INTEGER_CST 1258 && TREE_CODE (type) == INTEGER_TYPE | 961unsigned_conversion_warning (tree result, tree operand) 962{ 963 tree type = TREE_TYPE (result); 964 965 if (TREE_CODE (operand) == INTEGER_CST 966 && TREE_CODE (type) == INTEGER_TYPE |
1259 && TREE_UNSIGNED (type) | 967 && TYPE_UNSIGNED (type) |
1260 && skip_evaluation == 0 1261 && !int_fits_type_p (operand, type)) 1262 { 1263 if (!int_fits_type_p (operand, c_common_signed_type (type))) 1264 /* This detects cases like converting -129 or 256 to unsigned char. */ | 968 && skip_evaluation == 0 969 && !int_fits_type_p (operand, type)) 970 { 971 if (!int_fits_type_p (operand, c_common_signed_type (type))) 972 /* This detects cases like converting -129 or 256 to unsigned char. */ |
1265 warning ("large integer implicitly truncated to unsigned type"); 1266 else if (warn_conversion) 1267 warning ("negative integer implicitly converted to unsigned type"); | 973 warning (OPT_Woverflow, 974 "large integer implicitly truncated to unsigned type"); 975 else 976 warning (OPT_Wconversion, 977 "negative integer implicitly converted to unsigned type"); |
1268 } 1269} 1270 | 978 } 979} 980 |
981/* Print a warning about casts that might indicate violation 982 of strict aliasing rules if -Wstrict-aliasing is used and 983 strict aliasing mode is in effect. OTYPE is the original 984 TREE_TYPE of EXPR, and TYPE the type we're casting to. */ 985 986void 987strict_aliasing_warning (tree otype, tree type, tree expr) 988{ 989 if (flag_strict_aliasing && warn_strict_aliasing 990 && POINTER_TYPE_P (type) && POINTER_TYPE_P (otype) 991 && TREE_CODE (expr) == ADDR_EXPR 992 && (DECL_P (TREE_OPERAND (expr, 0)) 993 || handled_component_p (TREE_OPERAND (expr, 0))) 994 && !VOID_TYPE_P (TREE_TYPE (type))) 995 { 996 /* Casting the address of an object to non void pointer. Warn 997 if the cast breaks type based aliasing. */ 998 if (!COMPLETE_TYPE_P (TREE_TYPE (type))) 999 warning (OPT_Wstrict_aliasing, "type-punning to incomplete type " 1000 "might break strict-aliasing rules"); 1001 else 1002 { 1003 HOST_WIDE_INT set1 = get_alias_set (TREE_TYPE (TREE_OPERAND (expr, 0))); 1004 HOST_WIDE_INT set2 = get_alias_set (TREE_TYPE (type)); 1005 1006 if (!alias_sets_conflict_p (set1, set2)) 1007 warning (OPT_Wstrict_aliasing, "dereferencing type-punned " 1008 "pointer will break strict-aliasing rules"); 1009 else if (warn_strict_aliasing > 1 1010 && !alias_sets_might_conflict_p (set1, set2)) 1011 warning (OPT_Wstrict_aliasing, "dereferencing type-punned " 1012 "pointer might break strict-aliasing rules"); 1013 } 1014 } 1015} 1016 1017 1018/* Print a warning about if (); or if () .. else; constructs 1019 via the special empty statement node that we create. INNER_THEN 1020 and INNER_ELSE are the statement lists of the if and the else 1021 block. */ 1022 1023void 1024empty_body_warning (tree inner_then, tree inner_else) 1025{ 1026 if (extra_warnings) 1027 { 1028 if (TREE_CODE (inner_then) == STATEMENT_LIST 1029 && STATEMENT_LIST_TAIL (inner_then)) 1030 inner_then = STATEMENT_LIST_TAIL (inner_then)->stmt; 1031 1032 if (inner_else && TREE_CODE (inner_else) == STATEMENT_LIST 1033 && STATEMENT_LIST_TAIL (inner_else)) 1034 inner_else = STATEMENT_LIST_TAIL (inner_else)->stmt; 1035 1036 if (IS_EMPTY_STMT (inner_then) && !inner_else) 1037 warning (OPT_Wextra, "%Hempty body in an if-statement", 1038 EXPR_LOCUS (inner_then)); 1039 1040 if (inner_else && IS_EMPTY_STMT (inner_else)) 1041 warning (OPT_Wextra, "%Hempty body in an else-statement", 1042 EXPR_LOCUS (inner_else)); 1043 } 1044} 1045 1046 |
|
1271/* Nonzero if constant C has a value that is permissible 1272 for type TYPE (an INTEGER_TYPE). */ 1273 1274static int 1275constant_fits_type_p (tree c, tree type) 1276{ 1277 if (TREE_CODE (c) == INTEGER_CST) 1278 return int_fits_type_p (c, type); --- 4 unchanged lines hidden (view full) --- 1283 1284/* Nonzero if vector types T1 and T2 can be converted to each other 1285 without an explicit cast. */ 1286int 1287vector_types_convertible_p (tree t1, tree t2) 1288{ 1289 return targetm.vector_opaque_p (t1) 1290 || targetm.vector_opaque_p (t2) | 1047/* Nonzero if constant C has a value that is permissible 1048 for type TYPE (an INTEGER_TYPE). */ 1049 1050static int 1051constant_fits_type_p (tree c, tree type) 1052{ 1053 if (TREE_CODE (c) == INTEGER_CST) 1054 return int_fits_type_p (c, type); --- 4 unchanged lines hidden (view full) --- 1059 1060/* Nonzero if vector types T1 and T2 can be converted to each other 1061 without an explicit cast. */ 1062int 1063vector_types_convertible_p (tree t1, tree t2) 1064{ 1065 return targetm.vector_opaque_p (t1) 1066 || targetm.vector_opaque_p (t2) |
1291 || (tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)) | 1067 || (tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)) 1068 && (TREE_CODE (TREE_TYPE (t1)) != REAL_TYPE || 1069 TYPE_PRECISION (t1) == TYPE_PRECISION (t2)) |
1292 && INTEGRAL_TYPE_P (TREE_TYPE (t1)) 1293 == INTEGRAL_TYPE_P (TREE_TYPE (t2))); 1294} 1295 1296/* Convert EXPR to TYPE, warning about conversion problems with constants. 1297 Invoke this function on every expression that is converted implicitly, 1298 i.e. because of language rules and not because of an explicit cast. */ 1299 --- 4 unchanged lines hidden (view full) --- 1304 if (TREE_CODE (t) == INTEGER_CST) 1305 { 1306 if (TREE_OVERFLOW (t)) 1307 { 1308 TREE_OVERFLOW (t) = 0; 1309 1310 /* Do not diagnose overflow in a constant expression merely 1311 because a conversion overflowed. */ | 1070 && INTEGRAL_TYPE_P (TREE_TYPE (t1)) 1071 == INTEGRAL_TYPE_P (TREE_TYPE (t2))); 1072} 1073 1074/* Convert EXPR to TYPE, warning about conversion problems with constants. 1075 Invoke this function on every expression that is converted implicitly, 1076 i.e. because of language rules and not because of an explicit cast. */ 1077 --- 4 unchanged lines hidden (view full) --- 1082 if (TREE_CODE (t) == INTEGER_CST) 1083 { 1084 if (TREE_OVERFLOW (t)) 1085 { 1086 TREE_OVERFLOW (t) = 0; 1087 1088 /* Do not diagnose overflow in a constant expression merely 1089 because a conversion overflowed. */ |
1312 TREE_CONSTANT_OVERFLOW (t) = TREE_CONSTANT_OVERFLOW (expr); | 1090 TREE_CONSTANT_OVERFLOW (t) = CONSTANT_CLASS_P (expr) 1091 && TREE_CONSTANT_OVERFLOW (expr); |
1313 1314 /* No warning for converting 0x80000000 to int. */ | 1092 1093 /* No warning for converting 0x80000000 to int. */ |
1315 if (!(TREE_UNSIGNED (type) < TREE_UNSIGNED (TREE_TYPE (expr)) | 1094 if (!(TYPE_UNSIGNED (type) < TYPE_UNSIGNED (TREE_TYPE (expr)) |
1316 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE 1317 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr)))) 1318 /* If EXPR fits in the unsigned version of TYPE, 1319 don't warn unless pedantic. */ 1320 if ((pedantic | 1095 && TREE_CODE (TREE_TYPE (expr)) == INTEGER_TYPE 1096 && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (expr)))) 1097 /* If EXPR fits in the unsigned version of TYPE, 1098 don't warn unless pedantic. */ 1099 if ((pedantic |
1321 || TREE_UNSIGNED (type) 1322 || ! constant_fits_type_p (expr, 1323 c_common_unsigned_type (type))) 1324 && skip_evaluation == 0) 1325 warning ("overflow in implicit constant conversion"); | 1100 || TYPE_UNSIGNED (type) 1101 || !constant_fits_type_p (expr, 1102 c_common_unsigned_type (type))) 1103 && skip_evaluation == 0) 1104 warning (OPT_Woverflow, 1105 "overflow in implicit constant conversion"); |
1326 } 1327 else 1328 unsigned_conversion_warning (t, expr); 1329 } 1330 return t; 1331} 1332 1333/* A node in a list that describes references to variables (EXPR), which are --- 29 unchanged lines hidden (view full) --- 1363 1364static void add_tlist (struct tlist **, struct tlist *, tree, int); 1365static void merge_tlist (struct tlist **, struct tlist *, int); 1366static void verify_tree (tree, struct tlist **, struct tlist **, tree); 1367static int warning_candidate_p (tree); 1368static void warn_for_collisions (struct tlist *); 1369static void warn_for_collisions_1 (tree, tree, struct tlist *, int); 1370static struct tlist *new_tlist (struct tlist *, tree, tree); | 1106 } 1107 else 1108 unsigned_conversion_warning (t, expr); 1109 } 1110 return t; 1111} 1112 1113/* A node in a list that describes references to variables (EXPR), which are --- 29 unchanged lines hidden (view full) --- 1143 1144static void add_tlist (struct tlist **, struct tlist *, tree, int); 1145static void merge_tlist (struct tlist **, struct tlist *, int); 1146static void verify_tree (tree, struct tlist **, struct tlist **, tree); 1147static int warning_candidate_p (tree); 1148static void warn_for_collisions (struct tlist *); 1149static void warn_for_collisions_1 (tree, tree, struct tlist *, int); 1150static struct tlist *new_tlist (struct tlist *, tree, tree); |
1371static void verify_sequence_points (tree); | |
1372 1373/* Create a new struct tlist and fill in its fields. */ 1374static struct tlist * 1375new_tlist (struct tlist *next, tree t, tree writer) 1376{ 1377 struct tlist *l; | 1151 1152/* Create a new struct tlist and fill in its fields. */ 1153static struct tlist * 1154new_tlist (struct tlist *next, tree t, tree writer) 1155{ 1156 struct tlist *l; |
1378 l = obstack_alloc (&tlist_obstack, sizeof *l); | 1157 l = XOBNEW (&tlist_obstack, struct tlist); |
1379 l->next = next; 1380 l->expr = t; 1381 l->writer = writer; 1382 return l; 1383} 1384 1385/* Add duplicates of the nodes found in ADD to the list *TO. If EXCLUDE_WRITER 1386 is nonnull, we ignore any node we find which has a writer equal to it. */ 1387 1388static void 1389add_tlist (struct tlist **to, struct tlist *add, tree exclude_writer, int copy) 1390{ 1391 while (add) 1392 { 1393 struct tlist *next = add->next; | 1158 l->next = next; 1159 l->expr = t; 1160 l->writer = writer; 1161 return l; 1162} 1163 1164/* Add duplicates of the nodes found in ADD to the list *TO. If EXCLUDE_WRITER 1165 is nonnull, we ignore any node we find which has a writer equal to it. */ 1166 1167static void 1168add_tlist (struct tlist **to, struct tlist *add, tree exclude_writer, int copy) 1169{ 1170 while (add) 1171 { 1172 struct tlist *next = add->next; |
1394 if (! copy) | 1173 if (!copy) |
1395 add->next = *to; | 1174 add->next = *to; |
1396 if (! exclude_writer || add->writer != exclude_writer) | 1175 if (!exclude_writer || add->writer != exclude_writer) |
1397 *to = copy ? new_tlist (*to, add->expr, add->writer) : add; 1398 add = next; 1399 } 1400} 1401 1402/* Merge the nodes of ADD into TO. This merging process is done so that for 1403 each variable that already exists in TO, no new node is added; however if 1404 there is a write access recorded in ADD, and an occurrence on TO is only --- 13 unchanged lines hidden (view full) --- 1418 int found = 0; 1419 struct tlist *tmp2; 1420 struct tlist *next = add->next; 1421 1422 for (tmp2 = *to; tmp2; tmp2 = tmp2->next) 1423 if (tmp2->expr == add->expr) 1424 { 1425 found = 1; | 1176 *to = copy ? new_tlist (*to, add->expr, add->writer) : add; 1177 add = next; 1178 } 1179} 1180 1181/* Merge the nodes of ADD into TO. This merging process is done so that for 1182 each variable that already exists in TO, no new node is added; however if 1183 there is a write access recorded in ADD, and an occurrence on TO is only --- 13 unchanged lines hidden (view full) --- 1197 int found = 0; 1198 struct tlist *tmp2; 1199 struct tlist *next = add->next; 1200 1201 for (tmp2 = *to; tmp2; tmp2 = tmp2->next) 1202 if (tmp2->expr == add->expr) 1203 { 1204 found = 1; |
1426 if (! tmp2->writer) | 1205 if (!tmp2->writer) |
1427 tmp2->writer = add->writer; 1428 } | 1206 tmp2->writer = add->writer; 1207 } |
1429 if (! found) | 1208 if (!found) |
1430 { 1431 *end = copy ? add : new_tlist (NULL, add->expr, add->writer); 1432 end = &(*end)->next; 1433 *end = 0; 1434 } 1435 add = next; 1436 } 1437} --- 12 unchanged lines hidden (view full) --- 1450 for (tmp = warned_ids; tmp; tmp = tmp->next) 1451 if (tmp->expr == written) 1452 return; 1453 1454 while (list) 1455 { 1456 if (list->expr == written 1457 && list->writer != writer | 1209 { 1210 *end = copy ? add : new_tlist (NULL, add->expr, add->writer); 1211 end = &(*end)->next; 1212 *end = 0; 1213 } 1214 add = next; 1215 } 1216} --- 12 unchanged lines hidden (view full) --- 1229 for (tmp = warned_ids; tmp; tmp = tmp->next) 1230 if (tmp->expr == written) 1231 return; 1232 1233 while (list) 1234 { 1235 if (list->expr == written 1236 && list->writer != writer |
1458 && (! only_writes || list->writer)) | 1237 && (!only_writes || list->writer) 1238 && DECL_NAME (list->expr)) |
1459 { 1460 warned_ids = new_tlist (warned_ids, written, NULL_TREE); | 1239 { 1240 warned_ids = new_tlist (warned_ids, written, NULL_TREE); |
1461 warning ("operation on `%s' may be undefined", 1462 IDENTIFIER_POINTER (DECL_NAME (list->expr))); | 1241 warning (0, "operation on %qE may be undefined", list->expr); |
1463 } 1464 list = list->next; 1465 } 1466} 1467 1468/* Given a list LIST of references to variables, find whether any of these 1469 can cause conflicts due to missing sequence points. */ 1470 --- 43 unchanged lines hidden (view full) --- 1514 way, so that no more than one access to B is recorded. */ 1515 1516static void 1517verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp, 1518 tree writer) 1519{ 1520 struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3; 1521 enum tree_code code; | 1242 } 1243 list = list->next; 1244 } 1245} 1246 1247/* Given a list LIST of references to variables, find whether any of these 1248 can cause conflicts due to missing sequence points. */ 1249 --- 43 unchanged lines hidden (view full) --- 1293 way, so that no more than one access to B is recorded. */ 1294 1295static void 1296verify_tree (tree x, struct tlist **pbefore_sp, struct tlist **pno_sp, 1297 tree writer) 1298{ 1299 struct tlist *tmp_before, *tmp_nosp, *tmp_list2, *tmp_list3; 1300 enum tree_code code; |
1522 char class; | 1301 enum tree_code_class cl; |
1523 1524 /* X may be NULL if it is the operand of an empty statement expression 1525 ({ }). */ 1526 if (x == NULL) 1527 return; 1528 1529 restart: 1530 code = TREE_CODE (x); | 1302 1303 /* X may be NULL if it is the operand of an empty statement expression 1304 ({ }). */ 1305 if (x == NULL) 1306 return; 1307 1308 restart: 1309 code = TREE_CODE (x); |
1531 class = TREE_CODE_CLASS (code); | 1310 cl = TREE_CODE_CLASS (code); |
1532 1533 if (warning_candidate_p (x)) 1534 { 1535 *pno_sp = new_tlist (*pno_sp, x, writer); 1536 return; 1537 } 1538 1539 switch (code) --- 98 unchanged lines hidden (view full) --- 1638 1639 case SAVE_EXPR: 1640 { 1641 struct tlist_cache *t; 1642 for (t = save_expr_cache; t; t = t->next) 1643 if (t->expr == x) 1644 break; 1645 | 1311 1312 if (warning_candidate_p (x)) 1313 { 1314 *pno_sp = new_tlist (*pno_sp, x, writer); 1315 return; 1316 } 1317 1318 switch (code) --- 98 unchanged lines hidden (view full) --- 1417 1418 case SAVE_EXPR: 1419 { 1420 struct tlist_cache *t; 1421 for (t = save_expr_cache; t; t = t->next) 1422 if (t->expr == x) 1423 break; 1424 |
1646 if (! t) | 1425 if (!t) |
1647 { | 1426 { |
1648 t = obstack_alloc (&tlist_obstack, sizeof *t); | 1427 t = XOBNEW (&tlist_obstack, struct tlist_cache); |
1649 t->next = save_expr_cache; 1650 t->expr = x; 1651 save_expr_cache = t; 1652 1653 tmp_before = tmp_nosp = 0; 1654 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE); 1655 warn_for_collisions (tmp_nosp); 1656 --- 6 unchanged lines hidden (view full) --- 1663 } 1664 t->cache_before_sp = tmp_before; 1665 t->cache_after_sp = tmp_list3; 1666 } 1667 merge_tlist (pbefore_sp, t->cache_before_sp, 1); 1668 add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1); 1669 return; 1670 } | 1428 t->next = save_expr_cache; 1429 t->expr = x; 1430 save_expr_cache = t; 1431 1432 tmp_before = tmp_nosp = 0; 1433 verify_tree (TREE_OPERAND (x, 0), &tmp_before, &tmp_nosp, NULL_TREE); 1434 warn_for_collisions (tmp_nosp); 1435 --- 6 unchanged lines hidden (view full) --- 1442 } 1443 t->cache_before_sp = tmp_before; 1444 t->cache_after_sp = tmp_list3; 1445 } 1446 merge_tlist (pbefore_sp, t->cache_before_sp, 1); 1447 add_tlist (pno_sp, t->cache_after_sp, NULL_TREE, 1); 1448 return; 1449 } |
1450 |
|
1671 default: | 1451 default: |
1672 break; | 1452 /* For other expressions, simply recurse on their operands. 1453 Manual tail recursion for unary expressions. 1454 Other non-expressions need not be processed. */ 1455 if (cl == tcc_unary) 1456 { 1457 x = TREE_OPERAND (x, 0); 1458 writer = 0; 1459 goto restart; 1460 } 1461 else if (IS_EXPR_CODE_CLASS (cl)) 1462 { 1463 int lp; 1464 int max = TREE_CODE_LENGTH (TREE_CODE (x)); 1465 for (lp = 0; lp < max; lp++) 1466 { 1467 tmp_before = tmp_nosp = 0; 1468 verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, 0); 1469 merge_tlist (&tmp_nosp, tmp_before, 0); 1470 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0); 1471 } 1472 } 1473 return; |
1673 } | 1474 } |
1674 1675 if (class == '1') 1676 { 1677 if (first_rtl_op (code) == 0) 1678 return; 1679 x = TREE_OPERAND (x, 0); 1680 writer = 0; 1681 goto restart; 1682 } 1683 1684 switch (class) 1685 { 1686 case 'r': 1687 case '<': 1688 case '2': 1689 case 'b': 1690 case 'e': 1691 case 's': 1692 case 'x': 1693 { 1694 int lp; 1695 int max = first_rtl_op (TREE_CODE (x)); 1696 for (lp = 0; lp < max; lp++) 1697 { 1698 tmp_before = tmp_nosp = 0; 1699 verify_tree (TREE_OPERAND (x, lp), &tmp_before, &tmp_nosp, NULL_TREE); 1700 merge_tlist (&tmp_nosp, tmp_before, 0); 1701 add_tlist (pno_sp, tmp_nosp, NULL_TREE, 0); 1702 } 1703 break; 1704 } 1705 } | |
1706} 1707 1708/* Try to warn for undefined behavior in EXPR due to missing sequence 1709 points. */ 1710 | 1475} 1476 1477/* Try to warn for undefined behavior in EXPR due to missing sequence 1478 points. */ 1479 |
1711static void | 1480void |
1712verify_sequence_points (tree expr) 1713{ 1714 struct tlist *before_sp = 0, *after_sp = 0; 1715 1716 warned_ids = 0; 1717 save_expr_cache = 0; 1718 if (tlist_firstobj == 0) 1719 { 1720 gcc_obstack_init (&tlist_obstack); | 1481verify_sequence_points (tree expr) 1482{ 1483 struct tlist *before_sp = 0, *after_sp = 0; 1484 1485 warned_ids = 0; 1486 save_expr_cache = 0; 1487 if (tlist_firstobj == 0) 1488 { 1489 gcc_obstack_init (&tlist_obstack); |
1721 tlist_firstobj = obstack_alloc (&tlist_obstack, 0); | 1490 tlist_firstobj = (char *) obstack_alloc (&tlist_obstack, 0); |
1722 } 1723 1724 verify_tree (expr, &before_sp, &after_sp, 0); 1725 warn_for_collisions (after_sp); 1726 obstack_free (&tlist_obstack, tlist_firstobj); 1727} | 1491 } 1492 1493 verify_tree (expr, &before_sp, &after_sp, 0); 1494 warn_for_collisions (after_sp); 1495 obstack_free (&tlist_obstack, tlist_firstobj); 1496} |
1728 1729tree 1730c_expand_expr_stmt (tree expr) 1731{ 1732 /* Do default conversion if safe and possibly important, 1733 in case within ({...}). */ 1734 if ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE 1735 && (flag_isoc99 || lvalue_p (expr))) 1736 || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE) 1737 expr = default_conversion (expr); 1738 1739 if (warn_sequence_point) 1740 verify_sequence_points (expr); 1741 1742 if (TREE_TYPE (expr) != error_mark_node 1743 && !COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (expr)) 1744 && TREE_CODE (TREE_TYPE (expr)) != ARRAY_TYPE) 1745 error ("expression statement has incomplete type"); 1746 1747 last_expr_type = TREE_TYPE (expr); 1748 return add_stmt (build_stmt (EXPR_STMT, expr)); 1749} | |
1750 1751/* Validate the expression after `case' and apply default promotions. */ 1752 | 1497 1498/* Validate the expression after `case' and apply default promotions. */ 1499 |
1753tree | 1500static tree |
1754check_case_value (tree value) 1755{ 1756 if (value == NULL_TREE) 1757 return value; 1758 | 1501check_case_value (tree value) 1502{ 1503 if (value == NULL_TREE) 1504 return value; 1505 |
1759 /* Strip NON_LVALUE_EXPRs since we aren't using as an lvalue. */ | 1506 /* ??? Can we ever get nops here for a valid case value? We 1507 shouldn't for C. */ |
1760 STRIP_TYPE_NOPS (value); 1761 /* In C++, the following is allowed: 1762 1763 const int i = 3; 1764 switch (...) { case i: ... } 1765 1766 So, we try to reduce the VALUE to a constant that way. */ 1767 if (c_dialect_cxx ()) 1768 { 1769 value = decl_constant_value (value); 1770 STRIP_TYPE_NOPS (value); 1771 value = fold (value); 1772 } 1773 | 1508 STRIP_TYPE_NOPS (value); 1509 /* In C++, the following is allowed: 1510 1511 const int i = 3; 1512 switch (...) { case i: ... } 1513 1514 So, we try to reduce the VALUE to a constant that way. */ 1515 if (c_dialect_cxx ()) 1516 { 1517 value = decl_constant_value (value); 1518 STRIP_TYPE_NOPS (value); 1519 value = fold (value); 1520 } 1521 |
1774 if (TREE_CODE (value) != INTEGER_CST 1775 && value != error_mark_node) | 1522 if (TREE_CODE (value) == INTEGER_CST) 1523 /* Promote char or short to int. */ 1524 value = perform_integral_promotions (value); 1525 else if (value != error_mark_node) |
1776 { 1777 error ("case label does not reduce to an integer constant"); 1778 value = error_mark_node; 1779 } | 1526 { 1527 error ("case label does not reduce to an integer constant"); 1528 value = error_mark_node; 1529 } |
1780 else 1781 /* Promote char or short to int. */ 1782 value = default_conversion (value); | |
1783 1784 constant_expression_warning (value); 1785 1786 return value; 1787} 1788 | 1530 1531 constant_expression_warning (value); 1532 1533 return value; 1534} 1535 |
1536/* See if the case values LOW and HIGH are in the range of the original 1537 type (i.e. before the default conversion to int) of the switch testing 1538 expression. 1539 TYPE is the promoted type of the testing expression, and ORIG_TYPE is 1540 the type before promoting it. CASE_LOW_P is a pointer to the lower 1541 bound of the case label, and CASE_HIGH_P is the upper bound or NULL 1542 if the case is not a case range. 1543 The caller has to make sure that we are not called with NULL for 1544 CASE_LOW_P (i.e. the default case). 1545 Returns true if the case label is in range of ORIG_TYPE (saturated or 1546 untouched) or false if the label is out of range. */ 1547 1548static bool 1549check_case_bounds (tree type, tree orig_type, 1550 tree *case_low_p, tree *case_high_p) 1551{ 1552 tree min_value, max_value; 1553 tree case_low = *case_low_p; 1554 tree case_high = case_high_p ? *case_high_p : case_low; 1555 1556 /* If there was a problem with the original type, do nothing. */ 1557 if (orig_type == error_mark_node) 1558 return true; 1559 1560 min_value = TYPE_MIN_VALUE (orig_type); 1561 max_value = TYPE_MAX_VALUE (orig_type); 1562 1563 /* Case label is less than minimum for type. */ 1564 if (tree_int_cst_compare (case_low, min_value) < 0 1565 && tree_int_cst_compare (case_high, min_value) < 0) 1566 { 1567 warning (0, "case label value is less than minimum value for type"); 1568 return false; 1569 } 1570 1571 /* Case value is greater than maximum for type. */ 1572 if (tree_int_cst_compare (case_low, max_value) > 0 1573 && tree_int_cst_compare (case_high, max_value) > 0) 1574 { 1575 warning (0, "case label value exceeds maximum value for type"); 1576 return false; 1577 } 1578 1579 /* Saturate lower case label value to minimum. */ 1580 if (tree_int_cst_compare (case_high, min_value) >= 0 1581 && tree_int_cst_compare (case_low, min_value) < 0) 1582 { 1583 warning (0, "lower value in case label range" 1584 " less than minimum value for type"); 1585 case_low = min_value; 1586 } 1587 1588 /* Saturate upper case label value to maximum. */ 1589 if (tree_int_cst_compare (case_low, max_value) <= 0 1590 && tree_int_cst_compare (case_high, max_value) > 0) 1591 { 1592 warning (0, "upper value in case label range" 1593 " exceeds maximum value for type"); 1594 case_high = max_value; 1595 } 1596 1597 if (*case_low_p != case_low) 1598 *case_low_p = convert (type, case_low); 1599 if (case_high_p && *case_high_p != case_high) 1600 *case_high_p = convert (type, case_high); 1601 1602 return true; 1603} 1604 |
|
1789/* Return an integer type with BITS bits of precision, 1790 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */ 1791 1792tree 1793c_common_type_for_size (unsigned int bits, int unsignedp) 1794{ 1795 if (bits == TYPE_PRECISION (integer_type_node)) 1796 return unsignedp ? unsigned_type_node : integer_type_node; --- 55 unchanged lines hidden (view full) --- 1852 if (mode == TYPE_MODE (long_integer_type_node)) 1853 return unsignedp ? long_unsigned_type_node : long_integer_type_node; 1854 1855 if (mode == TYPE_MODE (long_long_integer_type_node)) 1856 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node; 1857 1858 if (mode == TYPE_MODE (widest_integer_literal_type_node)) 1859 return unsignedp ? widest_unsigned_literal_type_node | 1605/* Return an integer type with BITS bits of precision, 1606 that is unsigned if UNSIGNEDP is nonzero, otherwise signed. */ 1607 1608tree 1609c_common_type_for_size (unsigned int bits, int unsignedp) 1610{ 1611 if (bits == TYPE_PRECISION (integer_type_node)) 1612 return unsignedp ? unsigned_type_node : integer_type_node; --- 55 unchanged lines hidden (view full) --- 1668 if (mode == TYPE_MODE (long_integer_type_node)) 1669 return unsignedp ? long_unsigned_type_node : long_integer_type_node; 1670 1671 if (mode == TYPE_MODE (long_long_integer_type_node)) 1672 return unsignedp ? long_long_unsigned_type_node : long_long_integer_type_node; 1673 1674 if (mode == TYPE_MODE (widest_integer_literal_type_node)) 1675 return unsignedp ? widest_unsigned_literal_type_node |
1860 : widest_integer_literal_type_node; | 1676 : widest_integer_literal_type_node; |
1861 1862 if (mode == QImode) 1863 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; 1864 1865 if (mode == HImode) 1866 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; 1867 1868 if (mode == SImode) --- 13 unchanged lines hidden (view full) --- 1882 if (mode == TYPE_MODE (double_type_node)) 1883 return double_type_node; 1884 1885 if (mode == TYPE_MODE (long_double_type_node)) 1886 return long_double_type_node; 1887 1888 if (mode == TYPE_MODE (void_type_node)) 1889 return void_type_node; | 1677 1678 if (mode == QImode) 1679 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; 1680 1681 if (mode == HImode) 1682 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; 1683 1684 if (mode == SImode) --- 13 unchanged lines hidden (view full) --- 1698 if (mode == TYPE_MODE (double_type_node)) 1699 return double_type_node; 1700 1701 if (mode == TYPE_MODE (long_double_type_node)) 1702 return long_double_type_node; 1703 1704 if (mode == TYPE_MODE (void_type_node)) 1705 return void_type_node; |
1890 | 1706 |
1891 if (mode == TYPE_MODE (build_pointer_type (char_type_node))) | 1707 if (mode == TYPE_MODE (build_pointer_type (char_type_node))) |
1892 return unsignedp ? make_unsigned_type (mode) : make_signed_type (mode); | 1708 return (unsignedp 1709 ? make_unsigned_type (GET_MODE_PRECISION (mode)) 1710 : make_signed_type (GET_MODE_PRECISION (mode))); |
1893 1894 if (mode == TYPE_MODE (build_pointer_type (integer_type_node))) | 1711 1712 if (mode == TYPE_MODE (build_pointer_type (integer_type_node))) |
1895 return unsignedp ? make_unsigned_type (mode) : make_signed_type (mode); | 1713 return (unsignedp 1714 ? make_unsigned_type (GET_MODE_PRECISION (mode)) 1715 : make_signed_type (GET_MODE_PRECISION (mode))); |
1896 | 1716 |
1897 switch (mode) | 1717 if (COMPLEX_MODE_P (mode)) |
1898 { | 1718 { |
1899 case V16QImode: 1900 return unsignedp ? unsigned_V16QI_type_node : V16QI_type_node; 1901 case V8HImode: 1902 return unsignedp ? unsigned_V8HI_type_node : V8HI_type_node; 1903 case V4SImode: 1904 return unsignedp ? unsigned_V4SI_type_node : V4SI_type_node; 1905 case V2DImode: 1906 return unsignedp ? unsigned_V2DI_type_node : V2DI_type_node; 1907 case V2SImode: 1908 return unsignedp ? unsigned_V2SI_type_node : V2SI_type_node; 1909 case V2HImode: 1910 return unsignedp ? unsigned_V2HI_type_node : V2HI_type_node; 1911 case V4HImode: 1912 return unsignedp ? unsigned_V4HI_type_node : V4HI_type_node; 1913 case V8QImode: 1914 return unsignedp ? unsigned_V8QI_type_node : V8QI_type_node; 1915 case V1DImode: 1916 return unsignedp ? unsigned_V1DI_type_node : V1DI_type_node; 1917 case V16SFmode: 1918 return V16SF_type_node; 1919 case V4SFmode: 1920 return V4SF_type_node; 1921 case V2SFmode: 1922 return V2SF_type_node; 1923 case V2DFmode: 1924 return V2DF_type_node; 1925 case V4DFmode: 1926 return V4DF_type_node; 1927 default: 1928 break; | 1719 enum machine_mode inner_mode; 1720 tree inner_type; 1721 1722 if (mode == TYPE_MODE (complex_float_type_node)) 1723 return complex_float_type_node; 1724 if (mode == TYPE_MODE (complex_double_type_node)) 1725 return complex_double_type_node; 1726 if (mode == TYPE_MODE (complex_long_double_type_node)) 1727 return complex_long_double_type_node; 1728 1729 if (mode == TYPE_MODE (complex_integer_type_node) && !unsignedp) 1730 return complex_integer_type_node; 1731 1732 inner_mode = GET_MODE_INNER (mode); 1733 inner_type = c_common_type_for_mode (inner_mode, unsignedp); 1734 if (inner_type != NULL_TREE) 1735 return build_complex_type (inner_type); |
1929 } | 1736 } |
1737 else if (VECTOR_MODE_P (mode)) 1738 { 1739 enum machine_mode inner_mode = GET_MODE_INNER (mode); 1740 tree inner_type = c_common_type_for_mode (inner_mode, unsignedp); 1741 if (inner_type != NULL_TREE) 1742 return build_vector_type_for_mode (inner_type, mode); 1743 } |
|
1930 | 1744 |
1745 if (mode == TYPE_MODE (dfloat32_type_node)) 1746 return dfloat32_type_node; 1747 if (mode == TYPE_MODE (dfloat64_type_node)) 1748 return dfloat64_type_node; 1749 if (mode == TYPE_MODE (dfloat128_type_node)) 1750 return dfloat128_type_node; 1751 |
|
1931 for (t = registered_builtin_types; t; t = TREE_CHAIN (t)) 1932 if (TYPE_MODE (TREE_VALUE (t)) == mode) 1933 return TREE_VALUE (t); 1934 1935 return 0; 1936} 1937 1938/* Return an unsigned type the same as TYPE in other respects. */ --- 64 unchanged lines hidden (view full) --- 2003} 2004 2005/* Return a type the same as TYPE except unsigned or 2006 signed according to UNSIGNEDP. */ 2007 2008tree 2009c_common_signed_or_unsigned_type (int unsignedp, tree type) 2010{ | 1752 for (t = registered_builtin_types; t; t = TREE_CHAIN (t)) 1753 if (TYPE_MODE (TREE_VALUE (t)) == mode) 1754 return TREE_VALUE (t); 1755 1756 return 0; 1757} 1758 1759/* Return an unsigned type the same as TYPE in other respects. */ --- 64 unchanged lines hidden (view full) --- 1824} 1825 1826/* Return a type the same as TYPE except unsigned or 1827 signed according to UNSIGNEDP. */ 1828 1829tree 1830c_common_signed_or_unsigned_type (int unsignedp, tree type) 1831{ |
2011 if (! INTEGRAL_TYPE_P (type) 2012 || TREE_UNSIGNED (type) == unsignedp) | 1832 if (!INTEGRAL_TYPE_P (type) 1833 || TYPE_UNSIGNED (type) == unsignedp) |
2013 return type; 2014 | 1834 return type; 1835 |
2015 /* Must check the mode of the types, not the precision. Enumeral types 2016 in C++ have precision set to match their range, but may use a wider 2017 mode to match an ABI. If we change modes, we may wind up with bad 2018 conversions. */ | 1836 /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not 1837 the precision; they have precision set to match their range, but 1838 may use a wider mode to match an ABI. If we change modes, we may 1839 wind up with bad conversions. For INTEGER_TYPEs in C, must check 1840 the precision as well, so as to yield correct results for 1841 bit-field types. C++ does not have these separate bit-field 1842 types, and producing a signed or unsigned variant of an 1843 ENUMERAL_TYPE may cause other problems as well. */ |
2019 | 1844 |
2020 if (TYPE_MODE (type) == TYPE_MODE (signed_char_type_node)) | 1845#define TYPE_OK(node) \ 1846 (TYPE_MODE (type) == TYPE_MODE (node) \ 1847 && (c_dialect_cxx () || TYPE_PRECISION (type) == TYPE_PRECISION (node))) 1848 if (TYPE_OK (signed_char_type_node)) |
2021 return unsignedp ? unsigned_char_type_node : signed_char_type_node; | 1849 return unsignedp ? unsigned_char_type_node : signed_char_type_node; |
2022 if (TYPE_MODE (type) == TYPE_MODE (integer_type_node)) | 1850 if (TYPE_OK (integer_type_node)) |
2023 return unsignedp ? unsigned_type_node : integer_type_node; | 1851 return unsignedp ? unsigned_type_node : integer_type_node; |
2024 if (TYPE_MODE (type) == TYPE_MODE (short_integer_type_node)) | 1852 if (TYPE_OK (short_integer_type_node)) |
2025 return unsignedp ? short_unsigned_type_node : short_integer_type_node; | 1853 return unsignedp ? short_unsigned_type_node : short_integer_type_node; |
2026 if (TYPE_MODE (type) == TYPE_MODE (long_integer_type_node)) | 1854 if (TYPE_OK (long_integer_type_node)) |
2027 return unsignedp ? long_unsigned_type_node : long_integer_type_node; | 1855 return unsignedp ? long_unsigned_type_node : long_integer_type_node; |
2028 if (TYPE_MODE (type) == TYPE_MODE (long_long_integer_type_node)) | 1856 if (TYPE_OK (long_long_integer_type_node)) |
2029 return (unsignedp ? long_long_unsigned_type_node 2030 : long_long_integer_type_node); | 1857 return (unsignedp ? long_long_unsigned_type_node 1858 : long_long_integer_type_node); |
2031 if (TYPE_MODE (type) == TYPE_MODE (widest_integer_literal_type_node)) | 1859 if (TYPE_OK (widest_integer_literal_type_node)) |
2032 return (unsignedp ? widest_unsigned_literal_type_node 2033 : widest_integer_literal_type_node); 2034 2035#if HOST_BITS_PER_WIDE_INT >= 64 | 1860 return (unsignedp ? widest_unsigned_literal_type_node 1861 : widest_integer_literal_type_node); 1862 1863#if HOST_BITS_PER_WIDE_INT >= 64 |
2036 if (TYPE_MODE (type) == TYPE_MODE (intTI_type_node)) | 1864 if (TYPE_OK (intTI_type_node)) |
2037 return unsignedp ? unsigned_intTI_type_node : intTI_type_node; 2038#endif | 1865 return unsignedp ? unsigned_intTI_type_node : intTI_type_node; 1866#endif |
2039 if (TYPE_MODE (type) == TYPE_MODE (intDI_type_node)) | 1867 if (TYPE_OK (intDI_type_node)) |
2040 return unsignedp ? unsigned_intDI_type_node : intDI_type_node; | 1868 return unsignedp ? unsigned_intDI_type_node : intDI_type_node; |
2041 if (TYPE_MODE (type) == TYPE_MODE (intSI_type_node)) | 1869 if (TYPE_OK (intSI_type_node)) |
2042 return unsignedp ? unsigned_intSI_type_node : intSI_type_node; | 1870 return unsignedp ? unsigned_intSI_type_node : intSI_type_node; |
2043 if (TYPE_MODE (type) == TYPE_MODE (intHI_type_node)) | 1871 if (TYPE_OK (intHI_type_node)) |
2044 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; | 1872 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; |
2045 if (TYPE_MODE (type) == TYPE_MODE (intQI_type_node)) | 1873 if (TYPE_OK (intQI_type_node)) |
2046 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; | 1874 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; |
1875#undef TYPE_OK |
|
2047 | 1876 |
2048 return type; | 1877 if (c_dialect_cxx ()) 1878 return type; 1879 else 1880 return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp); |
2049} 2050 | 1881} 1882 |
1883/* Build a bit-field integer type for the given WIDTH and UNSIGNEDP. */ 1884 1885tree 1886c_build_bitfield_integer_type (unsigned HOST_WIDE_INT width, int unsignedp) 1887{ 1888 /* Extended integer types of the same width as a standard type have 1889 lesser rank, so those of the same width as int promote to int or 1890 unsigned int and are valid for printf formats expecting int or 1891 unsigned int. To avoid such special cases, avoid creating 1892 extended integer types for bit-fields if a standard integer type 1893 is available. */ 1894 if (width == TYPE_PRECISION (integer_type_node)) 1895 return unsignedp ? unsigned_type_node : integer_type_node; 1896 if (width == TYPE_PRECISION (signed_char_type_node)) 1897 return unsignedp ? unsigned_char_type_node : signed_char_type_node; 1898 if (width == TYPE_PRECISION (short_integer_type_node)) 1899 return unsignedp ? short_unsigned_type_node : short_integer_type_node; 1900 if (width == TYPE_PRECISION (long_integer_type_node)) 1901 return unsignedp ? long_unsigned_type_node : long_integer_type_node; 1902 if (width == TYPE_PRECISION (long_long_integer_type_node)) 1903 return (unsignedp ? long_long_unsigned_type_node 1904 : long_long_integer_type_node); 1905 return build_nonstandard_integer_type (width, unsignedp); 1906} 1907 |
|
2051/* The C version of the register_builtin_type langhook. */ 2052 2053void 2054c_register_builtin_type (tree type, const char* name) 2055{ 2056 tree decl; 2057 2058 decl = build_decl (TYPE_DECL, get_identifier (name), type); --- 15 unchanged lines hidden (view full) --- 2074 int log; 2075 2076 /* If the value is negative, compute its negative minus 1. The latter 2077 adjustment is because the absolute value of the largest negative value 2078 is one larger than the largest positive value. This is equivalent to 2079 a bit-wise negation, so use that operation instead. */ 2080 2081 if (tree_int_cst_sgn (value) < 0) | 1908/* The C version of the register_builtin_type langhook. */ 1909 1910void 1911c_register_builtin_type (tree type, const char* name) 1912{ 1913 tree decl; 1914 1915 decl = build_decl (TYPE_DECL, get_identifier (name), type); --- 15 unchanged lines hidden (view full) --- 1931 int log; 1932 1933 /* If the value is negative, compute its negative minus 1. The latter 1934 adjustment is because the absolute value of the largest negative value 1935 is one larger than the largest positive value. This is equivalent to 1936 a bit-wise negation, so use that operation instead. */ 1937 1938 if (tree_int_cst_sgn (value) < 0) |
2082 value = fold (build1 (BIT_NOT_EXPR, TREE_TYPE (value), value)); | 1939 value = fold_build1 (BIT_NOT_EXPR, TREE_TYPE (value), value); |
2083 2084 /* Return the number of bits needed, taking into account the fact 2085 that we need one more bit for a signed than unsigned type. */ 2086 2087 if (integer_zerop (value)) 2088 log = 0; 2089 else 2090 log = tree_floor_log2 (value); 2091 | 1940 1941 /* Return the number of bits needed, taking into account the fact 1942 that we need one more bit for a signed than unsigned type. */ 1943 1944 if (integer_zerop (value)) 1945 log = 0; 1946 else 1947 log = tree_floor_log2 (value); 1948 |
2092 return log + 1 + ! unsignedp; | 1949 return log + 1 + !unsignedp; |
2093} 2094 2095/* Print an error message for invalid operands to arith operation | 1950} 1951 1952/* Print an error message for invalid operands to arith operation |
2096 CODE. NOP_EXPR is used as a special case (see 2097 c_common_truthvalue_conversion). */ | 1953 CODE. */ |
2098 2099void 2100binary_op_error (enum tree_code code) 2101{ 2102 const char *opname; 2103 2104 switch (code) 2105 { | 1954 1955void 1956binary_op_error (enum tree_code code) 1957{ 1958 const char *opname; 1959 1960 switch (code) 1961 { |
2106 case NOP_EXPR: 2107 error ("invalid truth-value expression"); 2108 return; 2109 | |
2110 case PLUS_EXPR: 2111 opname = "+"; break; 2112 case MINUS_EXPR: 2113 opname = "-"; break; 2114 case MULT_EXPR: 2115 opname = "*"; break; 2116 case MAX_EXPR: 2117 opname = "max"; break; --- 26 unchanged lines hidden (view full) --- 2144 case BIT_IOR_EXPR: 2145 opname = "|"; break; 2146 case TRUTH_ANDIF_EXPR: 2147 opname = "&&"; break; 2148 case TRUTH_ORIF_EXPR: 2149 opname = "||"; break; 2150 case BIT_XOR_EXPR: 2151 opname = "^"; break; | 1962 case PLUS_EXPR: 1963 opname = "+"; break; 1964 case MINUS_EXPR: 1965 opname = "-"; break; 1966 case MULT_EXPR: 1967 opname = "*"; break; 1968 case MAX_EXPR: 1969 opname = "max"; break; --- 26 unchanged lines hidden (view full) --- 1996 case BIT_IOR_EXPR: 1997 opname = "|"; break; 1998 case TRUTH_ANDIF_EXPR: 1999 opname = "&&"; break; 2000 case TRUTH_ORIF_EXPR: 2001 opname = "||"; break; 2002 case BIT_XOR_EXPR: 2003 opname = "^"; break; |
2152 case LROTATE_EXPR: 2153 case RROTATE_EXPR: 2154 opname = "rotate"; break; | |
2155 default: | 2004 default: |
2156 opname = "unknown"; break; | 2005 gcc_unreachable (); |
2157 } 2158 error ("invalid operands to binary %s", opname); 2159} 2160 2161/* Subroutine of build_binary_op, used for comparison operations. 2162 See if the operands have both been converted from subword integer types 2163 and, if so, perhaps change them both back to their original type. 2164 This function is also responsible for converting the two operands --- 24 unchanged lines hidden (view full) --- 2189 2190 primop0 = get_narrower (op0, &unsignedp0); 2191 primop1 = get_narrower (op1, &unsignedp1); 2192 2193 /* Handle the case that OP0 does not *contain* a conversion 2194 but it *requires* conversion to FINAL_TYPE. */ 2195 2196 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr) | 2006 } 2007 error ("invalid operands to binary %s", opname); 2008} 2009 2010/* Subroutine of build_binary_op, used for comparison operations. 2011 See if the operands have both been converted from subword integer types 2012 and, if so, perhaps change them both back to their original type. 2013 This function is also responsible for converting the two operands --- 24 unchanged lines hidden (view full) --- 2038 2039 primop0 = get_narrower (op0, &unsignedp0); 2040 primop1 = get_narrower (op1, &unsignedp1); 2041 2042 /* Handle the case that OP0 does not *contain* a conversion 2043 but it *requires* conversion to FINAL_TYPE. */ 2044 2045 if (op0 == primop0 && TREE_TYPE (op0) != *restype_ptr) |
2197 unsignedp0 = TREE_UNSIGNED (TREE_TYPE (op0)); | 2046 unsignedp0 = TYPE_UNSIGNED (TREE_TYPE (op0)); |
2198 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr) | 2047 if (op1 == primop1 && TREE_TYPE (op1) != *restype_ptr) |
2199 unsignedp1 = TREE_UNSIGNED (TREE_TYPE (op1)); | 2048 unsignedp1 = TYPE_UNSIGNED (TREE_TYPE (op1)); |
2200 2201 /* If one of the operands must be floated, we cannot optimize. */ 2202 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE; 2203 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE; 2204 2205 /* If first arg is constant, swap the args (changing operation 2206 so value is preserved), for canonicalization. Don't do this if 2207 the second arg is 0. */ 2208 2209 if (TREE_CONSTANT (primop0) | 2049 2050 /* If one of the operands must be floated, we cannot optimize. */ 2051 real1 = TREE_CODE (TREE_TYPE (primop0)) == REAL_TYPE; 2052 real2 = TREE_CODE (TREE_TYPE (primop1)) == REAL_TYPE; 2053 2054 /* If first arg is constant, swap the args (changing operation 2055 so value is preserved), for canonicalization. Don't do this if 2056 the second arg is 0. */ 2057 2058 if (TREE_CONSTANT (primop0) |
2210 && ! integer_zerop (primop1) && ! real_zerop (primop1)) | 2059 && !integer_zerop (primop1) && !real_zerop (primop1)) |
2211 { 2212 tree tem = primop0; 2213 int temi = unsignedp0; 2214 primop0 = primop1; 2215 primop1 = tem; 2216 tem = op0; 2217 op0 = op1; 2218 op1 = tem; --- 44 unchanged lines hidden (view full) --- 2263 2264 if (!real1 && !real2 2265 && TREE_CODE (primop1) == INTEGER_CST 2266 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)) 2267 { 2268 int min_gt, max_gt, min_lt, max_lt; 2269 tree maxval, minval; 2270 /* 1 if comparison is nominally unsigned. */ | 2060 { 2061 tree tem = primop0; 2062 int temi = unsignedp0; 2063 primop0 = primop1; 2064 primop1 = tem; 2065 tem = op0; 2066 op0 = op1; 2067 op1 = tem; --- 44 unchanged lines hidden (view full) --- 2112 2113 if (!real1 && !real2 2114 && TREE_CODE (primop1) == INTEGER_CST 2115 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr)) 2116 { 2117 int min_gt, max_gt, min_lt, max_lt; 2118 tree maxval, minval; 2119 /* 1 if comparison is nominally unsigned. */ |
2271 int unsignedp = TREE_UNSIGNED (*restype_ptr); | 2120 int unsignedp = TYPE_UNSIGNED (*restype_ptr); |
2272 tree val; 2273 2274 type = c_common_signed_or_unsigned_type (unsignedp0, 2275 TREE_TYPE (primop0)); 2276 | 2121 tree val; 2122 2123 type = c_common_signed_or_unsigned_type (unsignedp0, 2124 TREE_TYPE (primop0)); 2125 |
2277 /* In C, if TYPE is an enumeration, then we need to get its 2278 min/max values from it's underlying integral type, not the 2279 enumerated type itself. In C++, TYPE_MAX_VALUE and 2280 TYPE_MIN_VALUE have already been set correctly on the 2281 enumeration type. */ 2282 if (!c_dialect_cxx() && TREE_CODE (type) == ENUMERAL_TYPE) 2283 type = c_common_type_for_size (TYPE_PRECISION (type), unsignedp0); 2284 | |
2285 maxval = TYPE_MAX_VALUE (type); 2286 minval = TYPE_MIN_VALUE (type); 2287 2288 if (unsignedp && !unsignedp0) 2289 *restype_ptr = c_common_signed_type (*restype_ptr); 2290 2291 if (TREE_TYPE (primop1) != *restype_ptr) | 2126 maxval = TYPE_MAX_VALUE (type); 2127 minval = TYPE_MIN_VALUE (type); 2128 2129 if (unsignedp && !unsignedp0) 2130 *restype_ptr = c_common_signed_type (*restype_ptr); 2131 2132 if (TREE_TYPE (primop1) != *restype_ptr) |
2292 primop1 = convert (*restype_ptr, primop1); | 2133 { 2134 /* Convert primop1 to target type, but do not introduce 2135 additional overflow. We know primop1 is an int_cst. */ 2136 tree tmp = build_int_cst_wide (*restype_ptr, 2137 TREE_INT_CST_LOW (primop1), 2138 TREE_INT_CST_HIGH (primop1)); 2139 2140 primop1 = force_fit_type (tmp, 0, TREE_OVERFLOW (primop1), 2141 TREE_CONSTANT_OVERFLOW (primop1)); 2142 } |
2293 if (type != *restype_ptr) 2294 { 2295 minval = convert (*restype_ptr, minval); 2296 maxval = convert (*restype_ptr, maxval); 2297 } 2298 2299 if (unsignedp && unsignedp0) 2300 { --- 83 unchanged lines hidden (view full) --- 2384 break; 2385 } 2386 type = c_common_unsigned_type (type); 2387 } 2388 2389 if (TREE_CODE (primop0) != INTEGER_CST) 2390 { 2391 if (val == truthvalue_false_node) | 2143 if (type != *restype_ptr) 2144 { 2145 minval = convert (*restype_ptr, minval); 2146 maxval = convert (*restype_ptr, maxval); 2147 } 2148 2149 if (unsignedp && unsignedp0) 2150 { --- 83 unchanged lines hidden (view full) --- 2234 break; 2235 } 2236 type = c_common_unsigned_type (type); 2237 } 2238 2239 if (TREE_CODE (primop0) != INTEGER_CST) 2240 { 2241 if (val == truthvalue_false_node) |
2392 warning ("comparison is always false due to limited range of data type"); | 2242 warning (0, "comparison is always false due to limited range of data type"); |
2393 if (val == truthvalue_true_node) | 2243 if (val == truthvalue_true_node) |
2394 warning ("comparison is always true due to limited range of data type"); | 2244 warning (0, "comparison is always true due to limited range of data type"); |
2395 } 2396 2397 if (val != 0) 2398 { 2399 /* Don't forget to evaluate PRIMOP0 if it has side effects. */ 2400 if (TREE_SIDE_EFFECTS (primop0)) | 2245 } 2246 2247 if (val != 0) 2248 { 2249 /* Don't forget to evaluate PRIMOP0 if it has side effects. */ 2250 if (TREE_SIDE_EFFECTS (primop0)) |
2401 return build (COMPOUND_EXPR, TREE_TYPE (val), primop0, val); | 2251 return build2 (COMPOUND_EXPR, TREE_TYPE (val), primop0, val); |
2402 return val; 2403 } 2404 2405 /* Value is not predetermined, but do the comparison 2406 in the type of the operand that is not constant. 2407 TYPE is already properly set. */ 2408 } | 2252 return val; 2253 } 2254 2255 /* Value is not predetermined, but do the comparison 2256 in the type of the operand that is not constant. 2257 TYPE is already properly set. */ 2258 } |
2259 2260 /* If either arg is decimal float and the other is float, find the 2261 proper common type to use for comparison. */ |
|
2409 else if (real1 && real2 | 2262 else if (real1 && real2 |
2263 && (DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop0))) 2264 || DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (primop1))))) 2265 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1)); 2266 2267 else if (real1 && real2 |
|
2410 && (TYPE_PRECISION (TREE_TYPE (primop0)) 2411 == TYPE_PRECISION (TREE_TYPE (primop1)))) 2412 type = TREE_TYPE (primop0); 2413 2414 /* If args' natural types are both narrower than nominal type 2415 and both extend in the same manner, compare them 2416 in the type of the wider arg. 2417 Otherwise must actually extend both to the nominal 2418 common type lest different ways of extending 2419 alter the result. 2420 (eg, (short)-1 == (unsigned short)-1 should be 0.) */ 2421 2422 else if (unsignedp0 == unsignedp1 && real1 == real2 2423 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr) 2424 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr)) 2425 { 2426 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1)); 2427 type = c_common_signed_or_unsigned_type (unsignedp0 | 2268 && (TYPE_PRECISION (TREE_TYPE (primop0)) 2269 == TYPE_PRECISION (TREE_TYPE (primop1)))) 2270 type = TREE_TYPE (primop0); 2271 2272 /* If args' natural types are both narrower than nominal type 2273 and both extend in the same manner, compare them 2274 in the type of the wider arg. 2275 Otherwise must actually extend both to the nominal 2276 common type lest different ways of extending 2277 alter the result. 2278 (eg, (short)-1 == (unsigned short)-1 should be 0.) */ 2279 2280 else if (unsignedp0 == unsignedp1 && real1 == real2 2281 && TYPE_PRECISION (TREE_TYPE (primop0)) < TYPE_PRECISION (*restype_ptr) 2282 && TYPE_PRECISION (TREE_TYPE (primop1)) < TYPE_PRECISION (*restype_ptr)) 2283 { 2284 type = common_type (TREE_TYPE (primop0), TREE_TYPE (primop1)); 2285 type = c_common_signed_or_unsigned_type (unsignedp0 |
2428 || TREE_UNSIGNED (*restype_ptr), | 2286 || TYPE_UNSIGNED (*restype_ptr), |
2429 type); 2430 /* Make sure shorter operand is extended the right way 2431 to match the longer operand. */ 2432 primop0 2433 = convert (c_common_signed_or_unsigned_type (unsignedp0, 2434 TREE_TYPE (primop0)), 2435 primop0); 2436 primop1 --- 5 unchanged lines hidden (view full) --- 2442 { 2443 /* Here we must do the comparison on the nominal type 2444 using the args exactly as we received them. */ 2445 type = *restype_ptr; 2446 primop0 = op0; 2447 primop1 = op1; 2448 2449 if (!real1 && !real2 && integer_zerop (primop1) | 2287 type); 2288 /* Make sure shorter operand is extended the right way 2289 to match the longer operand. */ 2290 primop0 2291 = convert (c_common_signed_or_unsigned_type (unsignedp0, 2292 TREE_TYPE (primop0)), 2293 primop0); 2294 primop1 --- 5 unchanged lines hidden (view full) --- 2300 { 2301 /* Here we must do the comparison on the nominal type 2302 using the args exactly as we received them. */ 2303 type = *restype_ptr; 2304 primop0 = op0; 2305 primop1 = op1; 2306 2307 if (!real1 && !real2 && integer_zerop (primop1) |
2450 && TREE_UNSIGNED (*restype_ptr)) | 2308 && TYPE_UNSIGNED (*restype_ptr)) |
2451 { 2452 tree value = 0; 2453 switch (code) 2454 { 2455 case GE_EXPR: 2456 /* All unsigned values are >= 0, so we warn if extra warnings 2457 are requested. However, if OP0 is a constant that is 2458 >= 0, the signedness of the comparison isn't an issue, 2459 so suppress the warning. */ 2460 if (extra_warnings && !in_system_header | 2309 { 2310 tree value = 0; 2311 switch (code) 2312 { 2313 case GE_EXPR: 2314 /* All unsigned values are >= 0, so we warn if extra warnings 2315 are requested. However, if OP0 is a constant that is 2316 >= 0, the signedness of the comparison isn't an issue, 2317 so suppress the warning. */ 2318 if (extra_warnings && !in_system_header |
2461 && ! (TREE_CODE (primop0) == INTEGER_CST 2462 && ! TREE_OVERFLOW (convert (c_common_signed_type (type), 2463 primop0)))) 2464 warning ("comparison of unsigned expression >= 0 is always true"); | 2319 && !(TREE_CODE (primop0) == INTEGER_CST 2320 && !TREE_OVERFLOW (convert (c_common_signed_type (type), 2321 primop0)))) 2322 warning (0, "comparison of unsigned expression >= 0 is always true"); |
2465 value = truthvalue_true_node; 2466 break; 2467 2468 case LT_EXPR: 2469 if (extra_warnings && !in_system_header | 2323 value = truthvalue_true_node; 2324 break; 2325 2326 case LT_EXPR: 2327 if (extra_warnings && !in_system_header |
2470 && ! (TREE_CODE (primop0) == INTEGER_CST 2471 && ! TREE_OVERFLOW (convert (c_common_signed_type (type), 2472 primop0)))) 2473 warning ("comparison of unsigned expression < 0 is always false"); | 2328 && !(TREE_CODE (primop0) == INTEGER_CST 2329 && !TREE_OVERFLOW (convert (c_common_signed_type (type), 2330 primop0)))) 2331 warning (0, "comparison of unsigned expression < 0 is always false"); |
2474 value = truthvalue_false_node; 2475 break; 2476 2477 default: 2478 break; 2479 } 2480 2481 if (value != 0) 2482 { 2483 /* Don't forget to evaluate PRIMOP0 if it has side effects. */ 2484 if (TREE_SIDE_EFFECTS (primop0)) | 2332 value = truthvalue_false_node; 2333 break; 2334 2335 default: 2336 break; 2337 } 2338 2339 if (value != 0) 2340 { 2341 /* Don't forget to evaluate PRIMOP0 if it has side effects. */ 2342 if (TREE_SIDE_EFFECTS (primop0)) |
2485 return build (COMPOUND_EXPR, TREE_TYPE (value), 2486 primop0, value); | 2343 return build2 (COMPOUND_EXPR, TREE_TYPE (value), 2344 primop0, value); |
2487 return value; 2488 } 2489 } 2490 } 2491 2492 *op0_ptr = convert (type, primop0); 2493 *op1_ptr = convert (type, primop1); 2494 2495 *restype_ptr = truthvalue_type_node; 2496 2497 return 0; 2498} 2499 2500/* Return a tree for the sum or difference (RESULTCODE says which) 2501 of pointer PTROP and integer INTOP. */ 2502 2503tree 2504pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) 2505{ | 2345 return value; 2346 } 2347 } 2348 } 2349 2350 *op0_ptr = convert (type, primop0); 2351 *op1_ptr = convert (type, primop1); 2352 2353 *restype_ptr = truthvalue_type_node; 2354 2355 return 0; 2356} 2357 2358/* Return a tree for the sum or difference (RESULTCODE says which) 2359 of pointer PTROP and integer INTOP. */ 2360 2361tree 2362pointer_int_sum (enum tree_code resultcode, tree ptrop, tree intop) 2363{ |
2506 tree size_exp; | 2364 tree size_exp, ret; |
2507 | 2365 |
2508 tree result; 2509 tree folded; 2510 | |
2511 /* The result is a pointer of the same type that is being added. */ 2512 2513 tree result_type = TREE_TYPE (ptrop); 2514 2515 if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) 2516 { 2517 if (pedantic || warn_pointer_arith) | 2366 /* The result is a pointer of the same type that is being added. */ 2367 2368 tree result_type = TREE_TYPE (ptrop); 2369 2370 if (TREE_CODE (TREE_TYPE (result_type)) == VOID_TYPE) 2371 { 2372 if (pedantic || warn_pointer_arith) |
2518 pedwarn ("pointer of type `void *' used in arithmetic"); | 2373 pedwarn ("pointer of type %<void *%> used in arithmetic"); |
2519 size_exp = integer_one_node; 2520 } 2521 else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE) 2522 { 2523 if (pedantic || warn_pointer_arith) 2524 pedwarn ("pointer to a function used in arithmetic"); 2525 size_exp = integer_one_node; 2526 } 2527 else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE) 2528 { 2529 if (pedantic || warn_pointer_arith) 2530 pedwarn ("pointer to member function used in arithmetic"); 2531 size_exp = integer_one_node; 2532 } 2533 else 2534 size_exp = size_in_bytes (TREE_TYPE (result_type)); 2535 | 2374 size_exp = integer_one_node; 2375 } 2376 else if (TREE_CODE (TREE_TYPE (result_type)) == FUNCTION_TYPE) 2377 { 2378 if (pedantic || warn_pointer_arith) 2379 pedwarn ("pointer to a function used in arithmetic"); 2380 size_exp = integer_one_node; 2381 } 2382 else if (TREE_CODE (TREE_TYPE (result_type)) == METHOD_TYPE) 2383 { 2384 if (pedantic || warn_pointer_arith) 2385 pedwarn ("pointer to member function used in arithmetic"); 2386 size_exp = integer_one_node; 2387 } 2388 else 2389 size_exp = size_in_bytes (TREE_TYPE (result_type)); 2390 |
2391 /* We are manipulating pointer values, so we don't need to warn 2392 about relying on undefined signed overflow. We disable the 2393 warning here because we use integer types so fold won't know that 2394 they are really pointers. */ 2395 fold_defer_overflow_warnings (); 2396 |
|
2536 /* If what we are about to multiply by the size of the elements 2537 contains a constant term, apply distributive law 2538 and multiply that constant term separately. 2539 This helps produce common subexpressions. */ 2540 2541 if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR) | 2397 /* If what we are about to multiply by the size of the elements 2398 contains a constant term, apply distributive law 2399 and multiply that constant term separately. 2400 This helps produce common subexpressions. */ 2401 2402 if ((TREE_CODE (intop) == PLUS_EXPR || TREE_CODE (intop) == MINUS_EXPR) |
2542 && ! TREE_CONSTANT (intop) | 2403 && !TREE_CONSTANT (intop) |
2543 && TREE_CONSTANT (TREE_OPERAND (intop, 1)) 2544 && TREE_CONSTANT (size_exp) 2545 /* If the constant comes from pointer subtraction, 2546 skip this optimization--it would cause an error. */ 2547 && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE 2548 /* If the constant is unsigned, and smaller than the pointer size, 2549 then we must skip this optimization. This is because it could cause 2550 an overflow error if the constant is negative but INTOP is not. */ | 2404 && TREE_CONSTANT (TREE_OPERAND (intop, 1)) 2405 && TREE_CONSTANT (size_exp) 2406 /* If the constant comes from pointer subtraction, 2407 skip this optimization--it would cause an error. */ 2408 && TREE_CODE (TREE_TYPE (TREE_OPERAND (intop, 0))) == INTEGER_TYPE 2409 /* If the constant is unsigned, and smaller than the pointer size, 2410 then we must skip this optimization. This is because it could cause 2411 an overflow error if the constant is negative but INTOP is not. */ |
2551 && (! TREE_UNSIGNED (TREE_TYPE (intop)) | 2412 && (!TYPE_UNSIGNED (TREE_TYPE (intop)) |
2552 || (TYPE_PRECISION (TREE_TYPE (intop)) 2553 == TYPE_PRECISION (TREE_TYPE (ptrop))))) 2554 { 2555 enum tree_code subcode = resultcode; 2556 tree int_type = TREE_TYPE (intop); 2557 if (TREE_CODE (intop) == MINUS_EXPR) 2558 subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR); 2559 /* Convert both subexpression types to the type of intop, 2560 because weird cases involving pointer arithmetic 2561 can result in a sum or difference with different type args. */ 2562 ptrop = build_binary_op (subcode, ptrop, 2563 convert (int_type, TREE_OPERAND (intop, 1)), 1); 2564 intop = convert (int_type, TREE_OPERAND (intop, 0)); 2565 } 2566 2567 /* Convert the integer argument to a type the same size as sizetype 2568 so the multiply won't overflow spuriously. */ 2569 2570 if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype) | 2413 || (TYPE_PRECISION (TREE_TYPE (intop)) 2414 == TYPE_PRECISION (TREE_TYPE (ptrop))))) 2415 { 2416 enum tree_code subcode = resultcode; 2417 tree int_type = TREE_TYPE (intop); 2418 if (TREE_CODE (intop) == MINUS_EXPR) 2419 subcode = (subcode == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR); 2420 /* Convert both subexpression types to the type of intop, 2421 because weird cases involving pointer arithmetic 2422 can result in a sum or difference with different type args. */ 2423 ptrop = build_binary_op (subcode, ptrop, 2424 convert (int_type, TREE_OPERAND (intop, 1)), 1); 2425 intop = convert (int_type, TREE_OPERAND (intop, 0)); 2426 } 2427 2428 /* Convert the integer argument to a type the same size as sizetype 2429 so the multiply won't overflow spuriously. */ 2430 2431 if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype) |
2571 || TREE_UNSIGNED (TREE_TYPE (intop)) != TREE_UNSIGNED (sizetype)) | 2432 || TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype)) |
2572 intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype), | 2433 intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype), |
2573 TREE_UNSIGNED (sizetype)), intop); | 2434 TYPE_UNSIGNED (sizetype)), intop); |
2574 2575 /* Replace the integer argument with a suitable product by the object size. 2576 Do this multiplication as signed, then convert to the appropriate 2577 pointer type (actually unsigned integral). */ 2578 2579 intop = convert (result_type, 2580 build_binary_op (MULT_EXPR, intop, 2581 convert (TREE_TYPE (intop), size_exp), 1)); 2582 2583 /* Create the sum or difference. */ | 2435 2436 /* Replace the integer argument with a suitable product by the object size. 2437 Do this multiplication as signed, then convert to the appropriate 2438 pointer type (actually unsigned integral). */ 2439 2440 intop = convert (result_type, 2441 build_binary_op (MULT_EXPR, intop, 2442 convert (TREE_TYPE (intop), size_exp), 1)); 2443 2444 /* Create the sum or difference. */ |
2445 ret = fold_build2 (resultcode, result_type, ptrop, intop); |
|
2584 | 2446 |
2585 result = build (resultcode, result_type, ptrop, intop); | 2447 fold_undefer_and_ignore_overflow_warnings (); |
2586 | 2448 |
2587 folded = fold (result); 2588 if (folded == result) 2589 TREE_CONSTANT (folded) = TREE_CONSTANT (ptrop) & TREE_CONSTANT (intop); 2590 return folded; | 2449 return ret; |
2591} 2592 2593/* Prepare expr to be an argument of a TRUTH_NOT_EXPR, | 2450} 2451 2452/* Prepare expr to be an argument of a TRUTH_NOT_EXPR, |
2594 or validate its data type for an `if' or `while' statement or ?..: exp. | 2453 or for an `if' or `while' statement or ?..: exp. It should already 2454 have been validated to be of suitable type; otherwise, a bad 2455 diagnostic may result. |
2595 2596 This preparation consists of taking the ordinary 2597 representation of an expression expr and producing a valid tree 2598 boolean expression describing whether expr is nonzero. We could 2599 simply always do build_binary_op (NE_EXPR, expr, truthvalue_false_node, 1), 2600 but we optimize comparisons, &&, ||, and !. 2601 2602 The resulting type should always be `truthvalue_type_node'. */ 2603 2604tree 2605c_common_truthvalue_conversion (tree expr) 2606{ | 2456 2457 This preparation consists of taking the ordinary 2458 representation of an expression expr and producing a valid tree 2459 boolean expression describing whether expr is nonzero. We could 2460 simply always do build_binary_op (NE_EXPR, expr, truthvalue_false_node, 1), 2461 but we optimize comparisons, &&, ||, and !. 2462 2463 The resulting type should always be `truthvalue_type_node'. */ 2464 2465tree 2466c_common_truthvalue_conversion (tree expr) 2467{ |
2607 if (TREE_CODE (expr) == ERROR_MARK) 2608 return expr; 2609 2610 if (TREE_CODE (expr) == FUNCTION_DECL) 2611 expr = build_unary_op (ADDR_EXPR, expr, 0); 2612 2613#if 0 /* This appears to be wrong for C++. */ 2614 /* These really should return error_mark_node after 2.4 is stable. 2615 But not all callers handle ERROR_MARK properly. */ 2616 switch (TREE_CODE (TREE_TYPE (expr))) 2617 { 2618 case RECORD_TYPE: 2619 error ("struct type value used where scalar is required"); 2620 return truthvalue_false_node; 2621 2622 case UNION_TYPE: 2623 error ("union type value used where scalar is required"); 2624 return truthvalue_false_node; 2625 2626 case ARRAY_TYPE: 2627 error ("array type value used where scalar is required"); 2628 return truthvalue_false_node; 2629 2630 default: 2631 break; 2632 } 2633#endif /* 0 */ 2634 | |
2635 switch (TREE_CODE (expr)) 2636 { | 2468 switch (TREE_CODE (expr)) 2469 { |
2637 case EQ_EXPR: 2638 case NE_EXPR: case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR: | 2470 case EQ_EXPR: case NE_EXPR: case UNEQ_EXPR: case LTGT_EXPR: 2471 case LE_EXPR: case GE_EXPR: case LT_EXPR: case GT_EXPR: 2472 case UNLE_EXPR: case UNGE_EXPR: case UNLT_EXPR: case UNGT_EXPR: 2473 case ORDERED_EXPR: case UNORDERED_EXPR: 2474 if (TREE_TYPE (expr) == truthvalue_type_node) 2475 return expr; 2476 return build2 (TREE_CODE (expr), truthvalue_type_node, 2477 TREE_OPERAND (expr, 0), TREE_OPERAND (expr, 1)); 2478 |
2639 case TRUTH_ANDIF_EXPR: 2640 case TRUTH_ORIF_EXPR: 2641 case TRUTH_AND_EXPR: 2642 case TRUTH_OR_EXPR: 2643 case TRUTH_XOR_EXPR: | 2479 case TRUTH_ANDIF_EXPR: 2480 case TRUTH_ORIF_EXPR: 2481 case TRUTH_AND_EXPR: 2482 case TRUTH_OR_EXPR: 2483 case TRUTH_XOR_EXPR: |
2484 if (TREE_TYPE (expr) == truthvalue_type_node) 2485 return expr; 2486 return build2 (TREE_CODE (expr), truthvalue_type_node, 2487 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)), 2488 c_common_truthvalue_conversion (TREE_OPERAND (expr, 1))); 2489 |
|
2644 case TRUTH_NOT_EXPR: | 2490 case TRUTH_NOT_EXPR: |
2645 TREE_TYPE (expr) = truthvalue_type_node; 2646 return expr; | 2491 if (TREE_TYPE (expr) == truthvalue_type_node) 2492 return expr; 2493 return build1 (TREE_CODE (expr), truthvalue_type_node, 2494 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0))); |
2647 2648 case ERROR_MARK: 2649 return expr; 2650 2651 case INTEGER_CST: | 2495 2496 case ERROR_MARK: 2497 return expr; 2498 2499 case INTEGER_CST: |
2652 return integer_zerop (expr) ? truthvalue_false_node : truthvalue_true_node; | 2500 /* Avoid integer_zerop to ignore TREE_CONSTANT_OVERFLOW. */ 2501 return (TREE_INT_CST_LOW (expr) != 0 || TREE_INT_CST_HIGH (expr) != 0) 2502 ? truthvalue_true_node 2503 : truthvalue_false_node; |
2653 2654 case REAL_CST: | 2504 2505 case REAL_CST: |
2655 return real_zerop (expr) ? truthvalue_false_node : truthvalue_true_node; | 2506 return real_compare (NE_EXPR, &TREE_REAL_CST (expr), &dconst0) 2507 ? truthvalue_true_node 2508 : truthvalue_false_node; |
2656 | 2509 |
2510 case FUNCTION_DECL: 2511 expr = build_unary_op (ADDR_EXPR, expr, 0); 2512 /* Fall through. */ 2513 |
|
2657 case ADDR_EXPR: 2658 { | 2514 case ADDR_EXPR: 2515 { |
2659 if (TREE_CODE (TREE_OPERAND (expr, 0)) == FUNCTION_DECL 2660 && ! DECL_WEAK (TREE_OPERAND (expr, 0))) | 2516 tree inner = TREE_OPERAND (expr, 0); 2517 if (DECL_P (inner) 2518 && (TREE_CODE (inner) == PARM_DECL 2519 || TREE_CODE (inner) == LABEL_DECL 2520 || !DECL_WEAK (inner))) |
2661 { | 2521 { |
2662 /* Common Ada/Pascal programmer's mistake. We always warn | 2522 /* Common Ada/Pascal programmer's mistake. We always warn |
2663 about this since it is so bad. */ | 2523 about this since it is so bad. */ |
2664 warning ("the address of `%D', will always evaluate as `true'", 2665 TREE_OPERAND (expr, 0)); | 2524 warning (OPT_Waddress, 2525 "the address of %qD will always evaluate as %<true%>", 2526 inner); |
2666 return truthvalue_true_node; 2667 } 2668 2669 /* If we are taking the address of an external decl, it might be 2670 zero if it is weak, so we cannot optimize. */ | 2527 return truthvalue_true_node; 2528 } 2529 2530 /* If we are taking the address of an external decl, it might be 2531 zero if it is weak, so we cannot optimize. */ |
2671 if (DECL_P (TREE_OPERAND (expr, 0)) 2672 && DECL_EXTERNAL (TREE_OPERAND (expr, 0))) | 2532 if (DECL_P (inner) 2533 && DECL_EXTERNAL (inner)) |
2673 break; 2674 | 2534 break; 2535 |
2675 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 0))) 2676 return build (COMPOUND_EXPR, truthvalue_type_node, 2677 TREE_OPERAND (expr, 0), truthvalue_true_node); | 2536 if (TREE_SIDE_EFFECTS (inner)) 2537 return build2 (COMPOUND_EXPR, truthvalue_type_node, 2538 inner, truthvalue_true_node); |
2678 else 2679 return truthvalue_true_node; 2680 } 2681 2682 case COMPLEX_EXPR: 2683 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)) 2684 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), 2685 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)), --- 6 unchanged lines hidden (view full) --- 2692 /* These don't change whether an object is nonzero or zero. */ 2693 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2694 2695 case LROTATE_EXPR: 2696 case RROTATE_EXPR: 2697 /* These don't change whether an object is zero or nonzero, but 2698 we can't ignore them if their second arg has side-effects. */ 2699 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))) | 2539 else 2540 return truthvalue_true_node; 2541 } 2542 2543 case COMPLEX_EXPR: 2544 return build_binary_op ((TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1)) 2545 ? TRUTH_OR_EXPR : TRUTH_ORIF_EXPR), 2546 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)), --- 6 unchanged lines hidden (view full) --- 2553 /* These don't change whether an object is nonzero or zero. */ 2554 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2555 2556 case LROTATE_EXPR: 2557 case RROTATE_EXPR: 2558 /* These don't change whether an object is zero or nonzero, but 2559 we can't ignore them if their second arg has side-effects. */ 2560 if (TREE_SIDE_EFFECTS (TREE_OPERAND (expr, 1))) |
2700 return build (COMPOUND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 1), 2701 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0))); | 2561 return build2 (COMPOUND_EXPR, truthvalue_type_node, 2562 TREE_OPERAND (expr, 1), 2563 c_common_truthvalue_conversion (TREE_OPERAND (expr, 0))); |
2702 else 2703 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2704 2705 case COND_EXPR: 2706 /* Distribute the conversion into the arms of a COND_EXPR. */ | 2564 else 2565 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2566 2567 case COND_EXPR: 2568 /* Distribute the conversion into the arms of a COND_EXPR. */ |
2707 return fold (build (COND_EXPR, truthvalue_type_node, TREE_OPERAND (expr, 0), | 2569 return fold_build3 (COND_EXPR, truthvalue_type_node, 2570 TREE_OPERAND (expr, 0), |
2708 c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)), | 2571 c_common_truthvalue_conversion (TREE_OPERAND (expr, 1)), |
2709 c_common_truthvalue_conversion (TREE_OPERAND (expr, 2)))); | 2572 c_common_truthvalue_conversion (TREE_OPERAND (expr, 2))); |
2710 2711 case CONVERT_EXPR: | 2573 2574 case CONVERT_EXPR: |
2575 case NOP_EXPR: |
|
2712 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, 2713 since that affects how `default_conversion' will behave. */ 2714 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE 2715 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE) 2716 break; | 2576 /* Don't cancel the effect of a CONVERT_EXPR from a REFERENCE_TYPE, 2577 since that affects how `default_conversion' will behave. */ 2578 if (TREE_CODE (TREE_TYPE (expr)) == REFERENCE_TYPE 2579 || TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == REFERENCE_TYPE) 2580 break; |
2717 /* Fall through.... */ 2718 case NOP_EXPR: | |
2719 /* If this is widening the argument, we can ignore it. */ 2720 if (TYPE_PRECISION (TREE_TYPE (expr)) 2721 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0)))) 2722 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2723 break; 2724 | 2581 /* If this is widening the argument, we can ignore it. */ 2582 if (TYPE_PRECISION (TREE_TYPE (expr)) 2583 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (expr, 0)))) 2584 return c_common_truthvalue_conversion (TREE_OPERAND (expr, 0)); 2585 break; 2586 |
2725 case MINUS_EXPR: 2726 /* Perhaps reduce (x - y) != 0 to (x != y). The expressions 2727 aren't guaranteed to the be same for modes that can represent 2728 infinity, since if x and y are both +infinity, or both 2729 -infinity, then x - y is not a number. 2730 2731 Note that this transformation is safe when x or y is NaN. 2732 (x - y) is then NaN, and both (x - y) != 0 and x != y will 2733 be false. */ 2734 if (HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (TREE_OPERAND (expr, 0))))) 2735 break; 2736 /* Fall through.... */ 2737 case BIT_XOR_EXPR: 2738 /* This and MINUS_EXPR can be changed into a comparison of the 2739 two objects. */ 2740 if (TREE_TYPE (TREE_OPERAND (expr, 0)) 2741 == TREE_TYPE (TREE_OPERAND (expr, 1))) 2742 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0), 2743 TREE_OPERAND (expr, 1), 1); 2744 return build_binary_op (NE_EXPR, TREE_OPERAND (expr, 0), 2745 fold (build1 (NOP_EXPR, 2746 TREE_TYPE (TREE_OPERAND (expr, 0)), 2747 TREE_OPERAND (expr, 1))), 1); 2748 2749 case BIT_AND_EXPR: 2750 if (integer_onep (TREE_OPERAND (expr, 1)) 2751 && TREE_TYPE (expr) != truthvalue_type_node) 2752 /* Using convert here would cause infinite recursion. */ 2753 return build1 (NOP_EXPR, truthvalue_type_node, expr); 2754 break; 2755 | |
2756 case MODIFY_EXPR: | 2587 case MODIFY_EXPR: |
2757 if (warn_parentheses && C_EXP_ORIGINAL_CODE (expr) == MODIFY_EXPR) 2758 warning ("suggest parentheses around assignment used as truth value"); | 2588 if (!TREE_NO_WARNING (expr)) 2589 warning (OPT_Wparentheses, 2590 "suggest parentheses around assignment used as truth value"); |
2759 break; 2760 2761 default: 2762 break; 2763 } 2764 2765 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE) 2766 { --- 4 unchanged lines hidden (view full) --- 2771 c_common_truthvalue_conversion (build_unary_op (REALPART_EXPR, t, 0)), 2772 c_common_truthvalue_conversion (build_unary_op (IMAGPART_EXPR, t, 0)), 2773 0)); 2774 } 2775 2776 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1); 2777} 2778 | 2591 break; 2592 2593 default: 2594 break; 2595 } 2596 2597 if (TREE_CODE (TREE_TYPE (expr)) == COMPLEX_TYPE) 2598 { --- 4 unchanged lines hidden (view full) --- 2603 c_common_truthvalue_conversion (build_unary_op (REALPART_EXPR, t, 0)), 2604 c_common_truthvalue_conversion (build_unary_op (IMAGPART_EXPR, t, 0)), 2605 0)); 2606 } 2607 2608 return build_binary_op (NE_EXPR, expr, integer_zero_node, 1); 2609} 2610 |
2779static tree builtin_function_2 (const char *, const char *, tree, tree, 2780 int, enum built_in_class, int, int, 2781 tree); | 2611static void def_builtin_1 (enum built_in_function fncode, 2612 const char *name, 2613 enum built_in_class fnclass, 2614 tree fntype, tree libtype, 2615 bool both_p, bool fallback_p, bool nonansi_p, 2616 tree fnattrs, bool implicit_p); |
2782 2783/* Make a variant type in the proper way for C/C++, propagating qualifiers 2784 down to the element type of an array. */ 2785 2786tree 2787c_build_qualified_type (tree type, int type_quals) 2788{ 2789 if (type == error_mark_node) 2790 return type; | 2617 2618/* Make a variant type in the proper way for C/C++, propagating qualifiers 2619 down to the element type of an array. */ 2620 2621tree 2622c_build_qualified_type (tree type, int type_quals) 2623{ 2624 if (type == error_mark_node) 2625 return type; |
2791 | 2626 |
2792 if (TREE_CODE (type) == ARRAY_TYPE) | 2627 if (TREE_CODE (type) == ARRAY_TYPE) |
2793 return build_array_type (c_build_qualified_type (TREE_TYPE (type), 2794 type_quals), 2795 TYPE_DOMAIN (type)); | 2628 { 2629 tree t; 2630 tree element_type = c_build_qualified_type (TREE_TYPE (type), 2631 type_quals); |
2796 | 2632 |
2633 /* See if we already have an identically qualified type. */ 2634 for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t)) 2635 { 2636 if (TYPE_QUALS (strip_array_types (t)) == type_quals 2637 && TYPE_NAME (t) == TYPE_NAME (type) 2638 && TYPE_CONTEXT (t) == TYPE_CONTEXT (type) 2639 && attribute_list_equal (TYPE_ATTRIBUTES (t), 2640 TYPE_ATTRIBUTES (type))) 2641 break; 2642 } 2643 if (!t) 2644 { 2645 t = build_variant_type_copy (type); 2646 TREE_TYPE (t) = element_type; 2647 } 2648 return t; 2649 } 2650 |
|
2797 /* A restrict-qualified pointer type must be a pointer to object or 2798 incomplete type. Note that the use of POINTER_TYPE_P also allows 2799 REFERENCE_TYPEs, which is appropriate for C++. */ 2800 if ((type_quals & TYPE_QUAL_RESTRICT) 2801 && (!POINTER_TYPE_P (type) 2802 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))) 2803 { | 2651 /* A restrict-qualified pointer type must be a pointer to object or 2652 incomplete type. Note that the use of POINTER_TYPE_P also allows 2653 REFERENCE_TYPEs, which is appropriate for C++. */ 2654 if ((type_quals & TYPE_QUAL_RESTRICT) 2655 && (!POINTER_TYPE_P (type) 2656 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type)))) 2657 { |
2804 error ("invalid use of `restrict'"); | 2658 error ("invalid use of %<restrict%>"); |
2805 type_quals &= ~TYPE_QUAL_RESTRICT; 2806 } 2807 2808 return build_qualified_type (type, type_quals); 2809} 2810 2811/* Apply the TYPE_QUALS to the new DECL. */ 2812 2813void 2814c_apply_type_quals_to_decl (int type_quals, tree decl) 2815{ 2816 tree type = TREE_TYPE (decl); | 2659 type_quals &= ~TYPE_QUAL_RESTRICT; 2660 } 2661 2662 return build_qualified_type (type, type_quals); 2663} 2664 2665/* Apply the TYPE_QUALS to the new DECL. */ 2666 2667void 2668c_apply_type_quals_to_decl (int type_quals, tree decl) 2669{ 2670 tree type = TREE_TYPE (decl); |
2817 | 2671 |
2818 if (type == error_mark_node) 2819 return; 2820 2821 if (((type_quals & TYPE_QUAL_CONST) 2822 || (type && TREE_CODE (type) == REFERENCE_TYPE)) 2823 /* An object declared 'const' is only readonly after it is 2824 initialized. We don't have any way of expressing this currently, 2825 so we need to be conservative and unset TREE_READONLY for types --- 10 unchanged lines hidden (view full) --- 2836 { 2837 while (type && TREE_CODE (type) == ARRAY_TYPE) 2838 /* Allow 'restrict' on arrays of pointers. 2839 FIXME currently we just ignore it. */ 2840 type = TREE_TYPE (type); 2841 if (!type 2842 || !POINTER_TYPE_P (type) 2843 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))) | 2672 if (type == error_mark_node) 2673 return; 2674 2675 if (((type_quals & TYPE_QUAL_CONST) 2676 || (type && TREE_CODE (type) == REFERENCE_TYPE)) 2677 /* An object declared 'const' is only readonly after it is 2678 initialized. We don't have any way of expressing this currently, 2679 so we need to be conservative and unset TREE_READONLY for types --- 10 unchanged lines hidden (view full) --- 2690 { 2691 while (type && TREE_CODE (type) == ARRAY_TYPE) 2692 /* Allow 'restrict' on arrays of pointers. 2693 FIXME currently we just ignore it. */ 2694 type = TREE_TYPE (type); 2695 if (!type 2696 || !POINTER_TYPE_P (type) 2697 || !C_TYPE_OBJECT_OR_INCOMPLETE_P (TREE_TYPE (type))) |
2844 error ("invalid use of `restrict'"); | 2698 error ("invalid use of %<restrict%>"); |
2845 else if (flag_strict_aliasing && type == TREE_TYPE (decl)) 2846 /* Indicate we need to make a unique alias set for this pointer. 2847 We can't do it here because it might be pointing to an 2848 incomplete type. */ 2849 DECL_POINTER_ALIAS_SET (decl) = -2; 2850 } 2851} 2852 | 2699 else if (flag_strict_aliasing && type == TREE_TYPE (decl)) 2700 /* Indicate we need to make a unique alias set for this pointer. 2701 We can't do it here because it might be pointing to an 2702 incomplete type. */ 2703 DECL_POINTER_ALIAS_SET (decl) = -2; 2704 } 2705} 2706 |
2707/* Hash function for the problem of multiple type definitions in 2708 different files. This must hash all types that will compare 2709 equal via comptypes to the same value. In practice it hashes 2710 on some of the simple stuff and leaves the details to comptypes. */ 2711 2712static hashval_t 2713c_type_hash (const void *p) 2714{ 2715 int i = 0; 2716 int shift, size; 2717 tree t = (tree) p; 2718 tree t2; 2719 switch (TREE_CODE (t)) 2720 { 2721 /* For pointers, hash on pointee type plus some swizzling. */ 2722 case POINTER_TYPE: 2723 return c_type_hash (TREE_TYPE (t)) ^ 0x3003003; 2724 /* Hash on number of elements and total size. */ 2725 case ENUMERAL_TYPE: 2726 shift = 3; 2727 t2 = TYPE_VALUES (t); 2728 break; 2729 case RECORD_TYPE: 2730 shift = 0; 2731 t2 = TYPE_FIELDS (t); 2732 break; 2733 case QUAL_UNION_TYPE: 2734 shift = 1; 2735 t2 = TYPE_FIELDS (t); 2736 break; 2737 case UNION_TYPE: 2738 shift = 2; 2739 t2 = TYPE_FIELDS (t); 2740 break; 2741 default: 2742 gcc_unreachable (); 2743 } 2744 for (; t2; t2 = TREE_CHAIN (t2)) 2745 i++; 2746 size = TREE_INT_CST_LOW (TYPE_SIZE (t)); 2747 return ((size << 24) | (i << shift)); 2748} 2749 2750static GTY((param_is (union tree_node))) htab_t type_hash_table; 2751 |
|
2853/* Return the typed-based alias set for T, which may be an expression 2854 or a type. Return -1 if we don't do anything special. */ 2855 2856HOST_WIDE_INT 2857c_common_get_alias_set (tree t) 2858{ 2859 tree u; | 2752/* Return the typed-based alias set for T, which may be an expression 2753 or a type. Return -1 if we don't do anything special. */ 2754 2755HOST_WIDE_INT 2756c_common_get_alias_set (tree t) 2757{ 2758 tree u; |
2759 PTR *slot; |
|
2860 2861 /* Permit type-punning when accessing a union, provided the access 2862 is directly through the union. For example, this code does not 2863 permit taking the address of a union member and then storing 2864 through it. Even the type-punning allowed here is a GCC 2865 extension, albeit a common and useful one; the C standard says 2866 that such accesses have implementation-defined behavior. */ 2867 for (u = t; 2868 TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF; 2869 u = TREE_OPERAND (u, 0)) 2870 if (TREE_CODE (u) == COMPONENT_REF 2871 && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE) 2872 return 0; 2873 2874 /* That's all the expressions we handle specially. */ | 2760 2761 /* Permit type-punning when accessing a union, provided the access 2762 is directly through the union. For example, this code does not 2763 permit taking the address of a union member and then storing 2764 through it. Even the type-punning allowed here is a GCC 2765 extension, albeit a common and useful one; the C standard says 2766 that such accesses have implementation-defined behavior. */ 2767 for (u = t; 2768 TREE_CODE (u) == COMPONENT_REF || TREE_CODE (u) == ARRAY_REF; 2769 u = TREE_OPERAND (u, 0)) 2770 if (TREE_CODE (u) == COMPONENT_REF 2771 && TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE) 2772 return 0; 2773 2774 /* That's all the expressions we handle specially. */ |
2875 if (! TYPE_P (t)) | 2775 if (!TYPE_P (t)) |
2876 return -1; 2877 2878 /* The C standard guarantees that any object may be accessed via an 2879 lvalue that has character type. */ 2880 if (t == char_type_node 2881 || t == signed_char_type_node 2882 || t == unsigned_char_type_node) 2883 return 0; 2884 2885 /* If it has the may_alias attribute, it can alias anything. */ 2886 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t))) 2887 return 0; 2888 2889 /* The C standard specifically allows aliasing between signed and 2890 unsigned variants of the same type. We treat the signed 2891 variant as canonical. */ | 2776 return -1; 2777 2778 /* The C standard guarantees that any object may be accessed via an 2779 lvalue that has character type. */ 2780 if (t == char_type_node 2781 || t == signed_char_type_node 2782 || t == unsigned_char_type_node) 2783 return 0; 2784 2785 /* If it has the may_alias attribute, it can alias anything. */ 2786 if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (t))) 2787 return 0; 2788 2789 /* The C standard specifically allows aliasing between signed and 2790 unsigned variants of the same type. We treat the signed 2791 variant as canonical. */ |
2892 if (TREE_CODE (t) == INTEGER_TYPE && TREE_UNSIGNED (t)) | 2792 if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t)) |
2893 { 2894 tree t1 = c_common_signed_type (t); 2895 2896 /* t1 == t can happen for boolean nodes which are always unsigned. */ 2897 if (t1 != t) 2898 return get_alias_set (t1); 2899 } 2900 else if (POINTER_TYPE_P (t)) --- 7 unchanged lines hidden (view full) --- 2908 2909 Technically, this approach is actually more conservative that 2910 it needs to be. In particular, `const int *' and `int *' 2911 should be in different alias sets, according to the C and C++ 2912 standard, since their types are not the same, and so, 2913 technically, an `int **' and `const int **' cannot point at 2914 the same thing. 2915 | 2793 { 2794 tree t1 = c_common_signed_type (t); 2795 2796 /* t1 == t can happen for boolean nodes which are always unsigned. */ 2797 if (t1 != t) 2798 return get_alias_set (t1); 2799 } 2800 else if (POINTER_TYPE_P (t)) --- 7 unchanged lines hidden (view full) --- 2808 2809 Technically, this approach is actually more conservative that 2810 it needs to be. In particular, `const int *' and `int *' 2811 should be in different alias sets, according to the C and C++ 2812 standard, since their types are not the same, and so, 2813 technically, an `int **' and `const int **' cannot point at 2814 the same thing. 2815 |
2916 But, the standard is wrong. In particular, this code is | 2816 But, the standard is wrong. In particular, this code is |
2917 legal C++: 2918 | 2817 legal C++: 2818 |
2919 int *ip; 2920 int **ipp = &ip; 2921 const int* const* cipp = &ipp; | 2819 int *ip; 2820 int **ipp = &ip; 2821 const int* const* cipp = ipp; |
2922 | 2822 |
2923 And, it doesn't make sense for that to be legal unless you | 2823 And, it doesn't make sense for that to be legal unless you |
2924 can dereference IPP and CIPP. So, we ignore cv-qualifiers on 2925 the pointed-to types. This issue has been reported to the 2926 C++ committee. */ 2927 t1 = build_type_no_quals (t); 2928 if (t1 != t) 2929 return get_alias_set (t1); 2930 } 2931 | 2824 can dereference IPP and CIPP. So, we ignore cv-qualifiers on 2825 the pointed-to types. This issue has been reported to the 2826 C++ committee. */ 2827 t1 = build_type_no_quals (t); 2828 if (t1 != t) 2829 return get_alias_set (t1); 2830 } 2831 |
2832 /* Handle the case of multiple type nodes referring to "the same" type, 2833 which occurs with IMA. These share an alias set. FIXME: Currently only 2834 C90 is handled. (In C99 type compatibility is not transitive, which 2835 complicates things mightily. The alias set splay trees can theoretically 2836 represent this, but insertion is tricky when you consider all the 2837 different orders things might arrive in.) */ 2838 2839 if (c_language != clk_c || flag_isoc99) 2840 return -1; 2841 2842 /* Save time if there's only one input file. */ 2843 if (num_in_fnames == 1) 2844 return -1; 2845 2846 /* Pointers need special handling if they point to any type that 2847 needs special handling (below). */ 2848 if (TREE_CODE (t) == POINTER_TYPE) 2849 { 2850 tree t2; 2851 /* Find bottom type under any nested POINTERs. */ 2852 for (t2 = TREE_TYPE (t); 2853 TREE_CODE (t2) == POINTER_TYPE; 2854 t2 = TREE_TYPE (t2)) 2855 ; 2856 if (TREE_CODE (t2) != RECORD_TYPE 2857 && TREE_CODE (t2) != ENUMERAL_TYPE 2858 && TREE_CODE (t2) != QUAL_UNION_TYPE 2859 && TREE_CODE (t2) != UNION_TYPE) |
|
2932 return -1; | 2860 return -1; |
2861 if (TYPE_SIZE (t2) == 0) 2862 return -1; 2863 } 2864 /* These are the only cases that need special handling. */ 2865 if (TREE_CODE (t) != RECORD_TYPE 2866 && TREE_CODE (t) != ENUMERAL_TYPE 2867 && TREE_CODE (t) != QUAL_UNION_TYPE 2868 && TREE_CODE (t) != UNION_TYPE 2869 && TREE_CODE (t) != POINTER_TYPE) 2870 return -1; 2871 /* Undefined? */ 2872 if (TYPE_SIZE (t) == 0) 2873 return -1; 2874 2875 /* Look up t in hash table. Only one of the compatible types within each 2876 alias set is recorded in the table. */ 2877 if (!type_hash_table) 2878 type_hash_table = htab_create_ggc (1021, c_type_hash, 2879 (htab_eq) lang_hooks.types_compatible_p, 2880 NULL); 2881 slot = htab_find_slot (type_hash_table, t, INSERT); 2882 if (*slot != NULL) 2883 { 2884 TYPE_ALIAS_SET (t) = TYPE_ALIAS_SET ((tree)*slot); 2885 return TYPE_ALIAS_SET ((tree)*slot); 2886 } 2887 else 2888 /* Our caller will assign and record (in t) a new alias set; all we need 2889 to do is remember t in the hash table. */ 2890 *slot = t; 2891 2892 return -1; |
|
2933} 2934 2935/* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where the 2936 second parameter indicates which OPERATOR is being applied. The COMPLAIN 2937 flag controls whether we should diagnose possibly ill-formed 2938 constructs or not. */ | 2893} 2894 2895/* Compute the value of 'sizeof (TYPE)' or '__alignof__ (TYPE)', where the 2896 second parameter indicates which OPERATOR is being applied. The COMPLAIN 2897 flag controls whether we should diagnose possibly ill-formed 2898 constructs or not. */ |
2899 |
|
2939tree | 2900tree |
2940c_sizeof_or_alignof_type (tree type, enum tree_code op, int complain) | 2901c_sizeof_or_alignof_type (tree type, bool is_sizeof, int complain) |
2941{ 2942 const char *op_name; 2943 tree value = NULL; 2944 enum tree_code type_code = TREE_CODE (type); 2945 | 2902{ 2903 const char *op_name; 2904 tree value = NULL; 2905 enum tree_code type_code = TREE_CODE (type); 2906 |
2946 my_friendly_assert (op == SIZEOF_EXPR || op == ALIGNOF_EXPR, 20020720); 2947 op_name = op == SIZEOF_EXPR ? "sizeof" : "__alignof__"; | 2907 op_name = is_sizeof ? "sizeof" : "__alignof__"; |
2948 2949 if (type_code == FUNCTION_TYPE) 2950 { | 2908 2909 if (type_code == FUNCTION_TYPE) 2910 { |
2951 if (op == SIZEOF_EXPR) | 2911 if (is_sizeof) |
2952 { 2953 if (complain && (pedantic || warn_pointer_arith)) | 2912 { 2913 if (complain && (pedantic || warn_pointer_arith)) |
2954 pedwarn ("invalid application of `sizeof' to a function type"); | 2914 pedwarn ("invalid application of %<sizeof%> to a function type"); |
2955 value = size_one_node; 2956 } 2957 else 2958 value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT); 2959 } 2960 else if (type_code == VOID_TYPE || type_code == ERROR_MARK) 2961 { 2962 if (type_code == VOID_TYPE 2963 && complain && (pedantic || warn_pointer_arith)) | 2915 value = size_one_node; 2916 } 2917 else 2918 value = size_int (FUNCTION_BOUNDARY / BITS_PER_UNIT); 2919 } 2920 else if (type_code == VOID_TYPE || type_code == ERROR_MARK) 2921 { 2922 if (type_code == VOID_TYPE 2923 && complain && (pedantic || warn_pointer_arith)) |
2964 pedwarn ("invalid application of `%s' to a void type", op_name); | 2924 pedwarn ("invalid application of %qs to a void type", op_name); |
2965 value = size_one_node; 2966 } 2967 else if (!COMPLETE_TYPE_P (type)) 2968 { 2969 if (complain) | 2925 value = size_one_node; 2926 } 2927 else if (!COMPLETE_TYPE_P (type)) 2928 { 2929 if (complain) |
2970 error ("invalid application of `%s' to incomplete type `%T' ", | 2930 error ("invalid application of %qs to incomplete type %qT ", |
2971 op_name, type); 2972 value = size_zero_node; 2973 } 2974 else 2975 { | 2931 op_name, type); 2932 value = size_zero_node; 2933 } 2934 else 2935 { |
2976 if (op == SIZEOF_EXPR) | 2936 if (is_sizeof) |
2977 /* Convert in case a char is more than one unit. */ 2978 value = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type), 2979 size_int (TYPE_PRECISION (char_type_node) 2980 / BITS_PER_UNIT)); 2981 else | 2937 /* Convert in case a char is more than one unit. */ 2938 value = size_binop (CEIL_DIV_EXPR, TYPE_SIZE_UNIT (type), 2939 size_int (TYPE_PRECISION (char_type_node) 2940 / BITS_PER_UNIT)); 2941 else |
2982 value = size_int (TYPE_ALIGN (type) / BITS_PER_UNIT); | 2942 value = size_int (TYPE_ALIGN_UNIT (type)); |
2983 } 2984 2985 /* VALUE will have an integer type with TYPE_IS_SIZETYPE set. 2986 TYPE_IS_SIZETYPE means that certain things (like overflow) will 2987 never happen. However, this node should really have type 2988 `size_t', which is just a typedef for an ordinary integer type. */ | 2943 } 2944 2945 /* VALUE will have an integer type with TYPE_IS_SIZETYPE set. 2946 TYPE_IS_SIZETYPE means that certain things (like overflow) will 2947 never happen. However, this node should really have type 2948 `size_t', which is just a typedef for an ordinary integer type. */ |
2989 value = fold (build1 (NOP_EXPR, size_type_node, value)); 2990 my_friendly_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value)), 20001021); | 2949 value = fold_convert (size_type_node, value); 2950 gcc_assert (!TYPE_IS_SIZETYPE (TREE_TYPE (value))); |
2991 2992 return value; 2993} 2994 2995/* Implement the __alignof keyword: Return the minimum required 2996 alignment of EXPR, measured in bytes. For VAR_DECL's and 2997 FIELD_DECL's return DECL_ALIGN (which can be set from an 2998 "aligned" __attribute__ specification). */ 2999 3000tree 3001c_alignof_expr (tree expr) 3002{ 3003 tree t; 3004 3005 if (TREE_CODE (expr) == VAR_DECL) | 2951 2952 return value; 2953} 2954 2955/* Implement the __alignof keyword: Return the minimum required 2956 alignment of EXPR, measured in bytes. For VAR_DECL's and 2957 FIELD_DECL's return DECL_ALIGN (which can be set from an 2958 "aligned" __attribute__ specification). */ 2959 2960tree 2961c_alignof_expr (tree expr) 2962{ 2963 tree t; 2964 2965 if (TREE_CODE (expr) == VAR_DECL) |
3006 t = size_int (DECL_ALIGN (expr) / BITS_PER_UNIT); | 2966 t = size_int (DECL_ALIGN_UNIT (expr)); |
3007 3008 else if (TREE_CODE (expr) == COMPONENT_REF 3009 && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1))) 3010 { | 2967 2968 else if (TREE_CODE (expr) == COMPONENT_REF 2969 && DECL_C_BIT_FIELD (TREE_OPERAND (expr, 1))) 2970 { |
3011 error ("`__alignof' applied to a bit-field"); | 2971 error ("%<__alignof%> applied to a bit-field"); |
3012 t = size_one_node; 3013 } 3014 else if (TREE_CODE (expr) == COMPONENT_REF 3015 && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL) | 2972 t = size_one_node; 2973 } 2974 else if (TREE_CODE (expr) == COMPONENT_REF 2975 && TREE_CODE (TREE_OPERAND (expr, 1)) == FIELD_DECL) |
3016 t = size_int (DECL_ALIGN (TREE_OPERAND (expr, 1)) / BITS_PER_UNIT); | 2976 t = size_int (DECL_ALIGN_UNIT (TREE_OPERAND (expr, 1))); |
3017 3018 else if (TREE_CODE (expr) == INDIRECT_REF) 3019 { 3020 tree t = TREE_OPERAND (expr, 0); 3021 tree best = t; 3022 int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); 3023 | 2977 2978 else if (TREE_CODE (expr) == INDIRECT_REF) 2979 { 2980 tree t = TREE_OPERAND (expr, 0); 2981 tree best = t; 2982 int bestalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); 2983 |
3024 while (TREE_CODE (t) == NOP_EXPR | 2984 while ((TREE_CODE (t) == NOP_EXPR || TREE_CODE (t) == CONVERT_EXPR) |
3025 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) 3026 { 3027 int thisalign; 3028 3029 t = TREE_OPERAND (t, 0); 3030 thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); 3031 if (thisalign > bestalign) 3032 best = t, bestalign = thisalign; 3033 } 3034 return c_alignof (TREE_TYPE (TREE_TYPE (best))); 3035 } 3036 else 3037 return c_alignof (TREE_TYPE (expr)); 3038 | 2985 && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == POINTER_TYPE) 2986 { 2987 int thisalign; 2988 2989 t = TREE_OPERAND (t, 0); 2990 thisalign = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (t))); 2991 if (thisalign > bestalign) 2992 best = t, bestalign = thisalign; 2993 } 2994 return c_alignof (TREE_TYPE (TREE_TYPE (best))); 2995 } 2996 else 2997 return c_alignof (TREE_TYPE (expr)); 2998 |
3039 return fold (build1 (NOP_EXPR, size_type_node, t)); | 2999 return fold_convert (size_type_node, t); |
3040} 3041 3042/* Handle C and C++ default attributes. */ 3043 3044enum built_in_attribute 3045{ 3046#define DEF_ATTR_NULL_TREE(ENUM) ENUM, 3047#define DEF_ATTR_INT(ENUM, VALUE) ENUM, --- 6 unchanged lines hidden (view full) --- 3054#undef DEF_ATTR_TREE_LIST 3055 ATTR_LAST 3056}; 3057 3058static GTY(()) tree built_in_attributes[(int) ATTR_LAST]; 3059 3060static void c_init_attributes (void); 3061 | 3000} 3001 3002/* Handle C and C++ default attributes. */ 3003 3004enum built_in_attribute 3005{ 3006#define DEF_ATTR_NULL_TREE(ENUM) ENUM, 3007#define DEF_ATTR_INT(ENUM, VALUE) ENUM, --- 6 unchanged lines hidden (view full) --- 3014#undef DEF_ATTR_TREE_LIST 3015 ATTR_LAST 3016}; 3017 3018static GTY(()) tree built_in_attributes[(int) ATTR_LAST]; 3019 3020static void c_init_attributes (void); 3021 |
3062/* Build tree nodes and builtin functions common to both C and C++ language 3063 frontends. */ 3064 3065void 3066c_common_nodes_and_builtins (void) | 3022enum c_builtin_type |
3067{ | 3023{ |
3068 enum builtin_type 3069 { | |
3070#define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, 3071#define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, 3072#define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, 3073#define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, 3074#define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 3075#define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, | 3024#define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME, 3025#define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME, 3026#define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME, 3027#define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME, 3028#define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, 3029#define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, |
3030#define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME, 3031#define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) NAME, 3032#define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) NAME, |
|
3076#define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, 3077#define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, 3078#define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, 3079#define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, | 3033#define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME, 3034#define DEF_FUNCTION_TYPE_VAR_1(NAME, RETURN, ARG1) NAME, 3035#define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME, 3036#define DEF_FUNCTION_TYPE_VAR_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME, |
3037#define DEF_FUNCTION_TYPE_VAR_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME, 3038#define DEF_FUNCTION_TYPE_VAR_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG6) \ 3039 NAME, |
|
3080#define DEF_POINTER_TYPE(NAME, TYPE) NAME, 3081#include "builtin-types.def" 3082#undef DEF_PRIMITIVE_TYPE 3083#undef DEF_FUNCTION_TYPE_0 3084#undef DEF_FUNCTION_TYPE_1 3085#undef DEF_FUNCTION_TYPE_2 3086#undef DEF_FUNCTION_TYPE_3 3087#undef DEF_FUNCTION_TYPE_4 | 3040#define DEF_POINTER_TYPE(NAME, TYPE) NAME, 3041#include "builtin-types.def" 3042#undef DEF_PRIMITIVE_TYPE 3043#undef DEF_FUNCTION_TYPE_0 3044#undef DEF_FUNCTION_TYPE_1 3045#undef DEF_FUNCTION_TYPE_2 3046#undef DEF_FUNCTION_TYPE_3 3047#undef DEF_FUNCTION_TYPE_4 |
3048#undef DEF_FUNCTION_TYPE_5 3049#undef DEF_FUNCTION_TYPE_6 3050#undef DEF_FUNCTION_TYPE_7 |
|
3088#undef DEF_FUNCTION_TYPE_VAR_0 3089#undef DEF_FUNCTION_TYPE_VAR_1 3090#undef DEF_FUNCTION_TYPE_VAR_2 3091#undef DEF_FUNCTION_TYPE_VAR_3 | 3051#undef DEF_FUNCTION_TYPE_VAR_0 3052#undef DEF_FUNCTION_TYPE_VAR_1 3053#undef DEF_FUNCTION_TYPE_VAR_2 3054#undef DEF_FUNCTION_TYPE_VAR_3 |
3055#undef DEF_FUNCTION_TYPE_VAR_4 3056#undef DEF_FUNCTION_TYPE_VAR_5 |
|
3092#undef DEF_POINTER_TYPE | 3057#undef DEF_POINTER_TYPE |
3093 BT_LAST 3094 }; | 3058 BT_LAST 3059}; |
3095 | 3060 |
3096 typedef enum builtin_type builtin_type; | 3061typedef enum c_builtin_type builtin_type; |
3097 | 3062 |
3098 tree builtin_types[(int) BT_LAST]; | 3063/* A temporary array for c_common_nodes_and_builtins. Used in 3064 communication with def_fn_type. */ 3065static tree builtin_types[(int) BT_LAST + 1]; 3066 3067/* A helper function for c_common_nodes_and_builtins. Build function type 3068 for DEF with return type RET and N arguments. If VAR is true, then the 3069 function should be variadic after those N arguments. 3070 3071 Takes special care not to ICE if any of the types involved are 3072 error_mark_node, which indicates that said type is not in fact available 3073 (see builtin_type_for_size). In which case the function type as a whole 3074 should be error_mark_node. */ 3075 3076static void 3077def_fn_type (builtin_type def, builtin_type ret, bool var, int n, ...) 3078{ 3079 tree args = NULL, t; 3080 va_list list; 3081 int i; 3082 3083 va_start (list, n); 3084 for (i = 0; i < n; ++i) 3085 { 3086 builtin_type a = va_arg (list, builtin_type); 3087 t = builtin_types[a]; 3088 if (t == error_mark_node) 3089 goto egress; 3090 args = tree_cons (NULL_TREE, t, args); 3091 } 3092 va_end (list); 3093 3094 args = nreverse (args); 3095 if (!var) 3096 args = chainon (args, void_list_node); 3097 3098 t = builtin_types[ret]; 3099 if (t == error_mark_node) 3100 goto egress; 3101 t = build_function_type (t, args); 3102 3103 egress: 3104 builtin_types[def] = t; 3105} 3106 3107/* Build tree nodes and builtin functions common to both C and C++ language 3108 frontends. */ 3109 3110void 3111c_common_nodes_and_builtins (void) 3112{ |
3099 int wchar_type_size; 3100 tree array_domain_type; 3101 tree va_list_ref_type_node; 3102 tree va_list_arg_type_node; 3103 3104 /* Define `int' and `char' first so that dbx will output them first. */ 3105 record_builtin_type (RID_INT, NULL, integer_type_node); 3106 record_builtin_type (RID_CHAR, "char", char_type_node); --- 24 unchanged lines hidden (view full) --- 3131 short_unsigned_type_node); 3132 3133 /* Define both `signed char' and `unsigned char'. */ 3134 record_builtin_type (RID_MAX, "signed char", signed_char_type_node); 3135 record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node); 3136 3137 /* These are types that c_common_type_for_size and 3138 c_common_type_for_mode use. */ | 3113 int wchar_type_size; 3114 tree array_domain_type; 3115 tree va_list_ref_type_node; 3116 tree va_list_arg_type_node; 3117 3118 /* Define `int' and `char' first so that dbx will output them first. */ 3119 record_builtin_type (RID_INT, NULL, integer_type_node); 3120 record_builtin_type (RID_CHAR, "char", char_type_node); --- 24 unchanged lines hidden (view full) --- 3145 short_unsigned_type_node); 3146 3147 /* Define both `signed char' and `unsigned char'. */ 3148 record_builtin_type (RID_MAX, "signed char", signed_char_type_node); 3149 record_builtin_type (RID_MAX, "unsigned char", unsigned_char_type_node); 3150 3151 /* These are types that c_common_type_for_size and 3152 c_common_type_for_mode use. */ |
3139 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3140 intQI_type_node)); 3141 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3142 intHI_type_node)); 3143 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3144 intSI_type_node)); 3145 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3146 intDI_type_node)); | 3153 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3154 intQI_type_node)); 3155 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3156 intHI_type_node)); 3157 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3158 intSI_type_node)); 3159 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3160 intDI_type_node)); |
3147#if HOST_BITS_PER_WIDE_INT >= 64 | 3161#if HOST_BITS_PER_WIDE_INT >= 64 |
3148 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3149 get_identifier ("__int128_t"), 3150 intTI_type_node)); | 3162 if (targetm.scalar_mode_supported_p (TImode)) 3163 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, 3164 get_identifier ("__int128_t"), 3165 intTI_type_node)); |
3151#endif | 3166#endif |
3152 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3153 unsigned_intQI_type_node)); 3154 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3155 unsigned_intHI_type_node)); 3156 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3157 unsigned_intSI_type_node)); 3158 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3159 unsigned_intDI_type_node)); | 3167 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3168 unsigned_intQI_type_node)); 3169 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3170 unsigned_intHI_type_node)); 3171 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3172 unsigned_intSI_type_node)); 3173 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3174 unsigned_intDI_type_node)); |
3160#if HOST_BITS_PER_WIDE_INT >= 64 | 3175#if HOST_BITS_PER_WIDE_INT >= 64 |
3161 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3162 get_identifier ("__uint128_t"), 3163 unsigned_intTI_type_node)); | 3176 if (targetm.scalar_mode_supported_p (TImode)) 3177 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, 3178 get_identifier ("__uint128_t"), 3179 unsigned_intTI_type_node)); |
3164#endif 3165 3166 /* Create the widest literal types. */ 3167 widest_integer_literal_type_node 3168 = make_signed_type (HOST_BITS_PER_WIDE_INT * 2); | 3180#endif 3181 3182 /* Create the widest literal types. */ 3183 widest_integer_literal_type_node 3184 = make_signed_type (HOST_BITS_PER_WIDE_INT * 2); |
3169 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3170 widest_integer_literal_type_node)); | 3185 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3186 widest_integer_literal_type_node)); |
3171 3172 widest_unsigned_literal_type_node 3173 = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2); | 3187 3188 widest_unsigned_literal_type_node 3189 = make_unsigned_type (HOST_BITS_PER_WIDE_INT * 2); |
3174 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, NULL_TREE, 3175 widest_unsigned_literal_type_node)); | 3190 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, NULL_TREE, 3191 widest_unsigned_literal_type_node)); |
3176 3177 /* `unsigned long' is the standard type for sizeof. 3178 Note that stddef.h uses `unsigned long', 3179 and this must agree, even if long and int are the same size. */ 3180 size_type_node = 3181 TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE))); 3182 signed_size_type_node = c_common_signed_type (size_type_node); 3183 set_sizetype (size_type_node); 3184 | 3192 3193 /* `unsigned long' is the standard type for sizeof. 3194 Note that stddef.h uses `unsigned long', 3195 and this must agree, even if long and int are the same size. */ 3196 size_type_node = 3197 TREE_TYPE (identifier_global_value (get_identifier (SIZE_TYPE))); 3198 signed_size_type_node = c_common_signed_type (size_type_node); 3199 set_sizetype (size_type_node); 3200 |
3201 pid_type_node = 3202 TREE_TYPE (identifier_global_value (get_identifier (PID_TYPE))); 3203 |
|
3185 build_common_tree_nodes_2 (flag_short_double); 3186 3187 record_builtin_type (RID_FLOAT, NULL, float_type_node); 3188 record_builtin_type (RID_DOUBLE, NULL, double_type_node); 3189 record_builtin_type (RID_MAX, "long double", long_double_type_node); 3190 | 3204 build_common_tree_nodes_2 (flag_short_double); 3205 3206 record_builtin_type (RID_FLOAT, NULL, float_type_node); 3207 record_builtin_type (RID_DOUBLE, NULL, double_type_node); 3208 record_builtin_type (RID_MAX, "long double", long_double_type_node); 3209 |
3191 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3192 get_identifier ("complex int"), 3193 complex_integer_type_node)); 3194 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3195 get_identifier ("complex float"), 3196 complex_float_type_node)); 3197 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3198 get_identifier ("complex double"), 3199 complex_double_type_node)); 3200 (*lang_hooks.decls.pushdecl) 3201 (build_decl (TYPE_DECL, get_identifier ("complex long double"), 3202 complex_long_double_type_node)); 3203 3204 /* Types which are common to the fortran compiler and libf2c. When 3205 changing these, you also need to be concerned with f/com.h. */ 3206 3207 if (TYPE_PRECISION (float_type_node) 3208 == TYPE_PRECISION (long_integer_type_node)) | 3210 /* Only supported decimal floating point extension if the target 3211 actually supports underlying modes. */ 3212 if (targetm.scalar_mode_supported_p (SDmode) 3213 && targetm.scalar_mode_supported_p (DDmode) 3214 && targetm.scalar_mode_supported_p (TDmode)) |
3209 { | 3215 { |
3210 g77_integer_type_node = long_integer_type_node; 3211 g77_uinteger_type_node = long_unsigned_type_node; | 3216 record_builtin_type (RID_DFLOAT32, NULL, dfloat32_type_node); 3217 record_builtin_type (RID_DFLOAT64, NULL, dfloat64_type_node); 3218 record_builtin_type (RID_DFLOAT128, NULL, dfloat128_type_node); |
3212 } | 3219 } |
3213 else if (TYPE_PRECISION (float_type_node) 3214 == TYPE_PRECISION (integer_type_node)) 3215 { 3216 g77_integer_type_node = integer_type_node; 3217 g77_uinteger_type_node = unsigned_type_node; 3218 } 3219 else 3220 g77_integer_type_node = g77_uinteger_type_node = NULL_TREE; | |
3221 | 3220 |
3222 if (g77_integer_type_node != NULL_TREE) 3223 { 3224 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3225 get_identifier ("__g77_integer"), 3226 g77_integer_type_node)); 3227 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3228 get_identifier ("__g77_uinteger"), 3229 g77_uinteger_type_node)); 3230 } | 3221 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, 3222 get_identifier ("complex int"), 3223 complex_integer_type_node)); 3224 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, 3225 get_identifier ("complex float"), 3226 complex_float_type_node)); 3227 lang_hooks.decls.pushdecl (build_decl (TYPE_DECL, 3228 get_identifier ("complex double"), 3229 complex_double_type_node)); 3230 lang_hooks.decls.pushdecl 3231 (build_decl (TYPE_DECL, get_identifier ("complex long double"), 3232 complex_long_double_type_node)); |
3231 | 3233 |
3232 if (TYPE_PRECISION (float_type_node) * 2 3233 == TYPE_PRECISION (long_integer_type_node)) 3234 { 3235 g77_longint_type_node = long_integer_type_node; 3236 g77_ulongint_type_node = long_unsigned_type_node; 3237 } 3238 else if (TYPE_PRECISION (float_type_node) * 2 3239 == TYPE_PRECISION (long_long_integer_type_node)) 3240 { 3241 g77_longint_type_node = long_long_integer_type_node; 3242 g77_ulongint_type_node = long_long_unsigned_type_node; 3243 } 3244 else 3245 g77_longint_type_node = g77_ulongint_type_node = NULL_TREE; | 3234 if (c_dialect_cxx ()) 3235 /* For C++, make fileptr_type_node a distinct void * type until 3236 FILE type is defined. */ 3237 fileptr_type_node = build_variant_type_copy (ptr_type_node); |
3246 | 3238 |
3247 if (g77_longint_type_node != NULL_TREE) 3248 { 3249 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3250 get_identifier ("__g77_longint"), 3251 g77_longint_type_node)); 3252 (*lang_hooks.decls.pushdecl) (build_decl (TYPE_DECL, 3253 get_identifier ("__g77_ulongint"), 3254 g77_ulongint_type_node)); 3255 } 3256 | |
3257 record_builtin_type (RID_VOID, NULL, void_type_node); 3258 | 3239 record_builtin_type (RID_VOID, NULL, void_type_node); 3240 |
3259 void_zero_node = build_int_2 (0, 0); | 3241 /* This node must not be shared. */ 3242 void_zero_node = make_node (INTEGER_CST); |
3260 TREE_TYPE (void_zero_node) = void_type_node; 3261 3262 void_list_node = build_void_list_node (); 3263 3264 /* Make a type to be the domain of a few array types 3265 whose domains don't really matter. 3266 200 is small enough that it always fits in size_t 3267 and large enough that it can hold most function names for the --- 16 unchanged lines hidden (view full) --- 3284 (char_type_node, TYPE_QUAL_CONST)); 3285 3286 /* This is special for C++ so functions can be overloaded. */ 3287 wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE); 3288 wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node)); 3289 wchar_type_size = TYPE_PRECISION (wchar_type_node); 3290 if (c_dialect_cxx ()) 3291 { | 3243 TREE_TYPE (void_zero_node) = void_type_node; 3244 3245 void_list_node = build_void_list_node (); 3246 3247 /* Make a type to be the domain of a few array types 3248 whose domains don't really matter. 3249 200 is small enough that it always fits in size_t 3250 and large enough that it can hold most function names for the --- 16 unchanged lines hidden (view full) --- 3267 (char_type_node, TYPE_QUAL_CONST)); 3268 3269 /* This is special for C++ so functions can be overloaded. */ 3270 wchar_type_node = get_identifier (MODIFIED_WCHAR_TYPE); 3271 wchar_type_node = TREE_TYPE (identifier_global_value (wchar_type_node)); 3272 wchar_type_size = TYPE_PRECISION (wchar_type_node); 3273 if (c_dialect_cxx ()) 3274 { |
3292 if (TREE_UNSIGNED (wchar_type_node)) | 3275 if (TYPE_UNSIGNED (wchar_type_node)) |
3293 wchar_type_node = make_unsigned_type (wchar_type_size); 3294 else 3295 wchar_type_node = make_signed_type (wchar_type_size); 3296 record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node); 3297 } 3298 else 3299 { 3300 signed_wchar_type_node = c_common_signed_type (wchar_type_node); --- 12 unchanged lines hidden (view full) --- 3313 uintmax_type_node = 3314 TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE))); 3315 3316 default_function_type = build_function_type (integer_type_node, NULL_TREE); 3317 ptrdiff_type_node 3318 = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE))); 3319 unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node); 3320 | 3276 wchar_type_node = make_unsigned_type (wchar_type_size); 3277 else 3278 wchar_type_node = make_signed_type (wchar_type_size); 3279 record_builtin_type (RID_WCHAR, "wchar_t", wchar_type_node); 3280 } 3281 else 3282 { 3283 signed_wchar_type_node = c_common_signed_type (wchar_type_node); --- 12 unchanged lines hidden (view full) --- 3296 uintmax_type_node = 3297 TREE_TYPE (identifier_global_value (get_identifier (UINTMAX_TYPE))); 3298 3299 default_function_type = build_function_type (integer_type_node, NULL_TREE); 3300 ptrdiff_type_node 3301 = TREE_TYPE (identifier_global_value (get_identifier (PTRDIFF_TYPE))); 3302 unsigned_ptrdiff_type_node = c_common_unsigned_type (ptrdiff_type_node); 3303 |
3321 (*lang_hooks.decls.pushdecl) | 3304 lang_hooks.decls.pushdecl |
3322 (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"), 3323 va_list_type_node)); 3324 | 3305 (build_decl (TYPE_DECL, get_identifier ("__builtin_va_list"), 3306 va_list_type_node)); 3307 |
3325 (*lang_hooks.decls.pushdecl) 3326 (build_decl (TYPE_DECL, get_identifier ("__builtin_ptrdiff_t"), 3327 ptrdiff_type_node)); 3328 3329 (*lang_hooks.decls.pushdecl) 3330 (build_decl (TYPE_DECL, get_identifier ("__builtin_size_t"), 3331 sizetype)); 3332 | |
3333 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE) 3334 { 3335 va_list_arg_type_node = va_list_ref_type_node = 3336 build_pointer_type (TREE_TYPE (va_list_type_node)); 3337 } 3338 else 3339 { 3340 va_list_arg_type_node = va_list_type_node; 3341 va_list_ref_type_node = build_reference_type (va_list_type_node); 3342 } 3343 3344#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \ | 3308 if (TREE_CODE (va_list_type_node) == ARRAY_TYPE) 3309 { 3310 va_list_arg_type_node = va_list_ref_type_node = 3311 build_pointer_type (TREE_TYPE (va_list_type_node)); 3312 } 3313 else 3314 { 3315 va_list_arg_type_node = va_list_type_node; 3316 va_list_ref_type_node = build_reference_type (va_list_type_node); 3317 } 3318 3319#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \ |
3345 builtin_types[(int) ENUM] = VALUE; 3346#define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \ 3347 builtin_types[(int) ENUM] \ 3348 = build_function_type (builtin_types[(int) RETURN], \ 3349 void_list_node); 3350#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \ 3351 builtin_types[(int) ENUM] \ 3352 = build_function_type (builtin_types[(int) RETURN], \ 3353 tree_cons (NULL_TREE, \ 3354 builtin_types[(int) ARG1], \ 3355 void_list_node)); 3356#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \ 3357 builtin_types[(int) ENUM] \ 3358 = build_function_type \ 3359 (builtin_types[(int) RETURN], \ 3360 tree_cons (NULL_TREE, \ 3361 builtin_types[(int) ARG1], \ 3362 tree_cons (NULL_TREE, \ 3363 builtin_types[(int) ARG2], \ 3364 void_list_node))); 3365#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 3366 builtin_types[(int) ENUM] \ 3367 = build_function_type \ 3368 (builtin_types[(int) RETURN], \ 3369 tree_cons (NULL_TREE, \ 3370 builtin_types[(int) ARG1], \ 3371 tree_cons (NULL_TREE, \ 3372 builtin_types[(int) ARG2], \ 3373 tree_cons (NULL_TREE, \ 3374 builtin_types[(int) ARG3], \ 3375 void_list_node)))); 3376#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ 3377 builtin_types[(int) ENUM] \ 3378 = build_function_type \ 3379 (builtin_types[(int) RETURN], \ 3380 tree_cons (NULL_TREE, \ 3381 builtin_types[(int) ARG1], \ 3382 tree_cons (NULL_TREE, \ 3383 builtin_types[(int) ARG2], \ 3384 tree_cons \ 3385 (NULL_TREE, \ 3386 builtin_types[(int) ARG3], \ 3387 tree_cons (NULL_TREE, \ 3388 builtin_types[(int) ARG4], \ 3389 void_list_node))))); 3390#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ 3391 builtin_types[(int) ENUM] \ 3392 = build_function_type (builtin_types[(int) RETURN], NULL_TREE); 3393#define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ 3394 builtin_types[(int) ENUM] \ 3395 = build_function_type (builtin_types[(int) RETURN], \ 3396 tree_cons (NULL_TREE, \ 3397 builtin_types[(int) ARG1], \ 3398 NULL_TREE)); | 3320 builtin_types[ENUM] = VALUE; 3321#define DEF_FUNCTION_TYPE_0(ENUM, RETURN) \ 3322 def_fn_type (ENUM, RETURN, 0, 0); 3323#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1) \ 3324 def_fn_type (ENUM, RETURN, 0, 1, ARG1); 3325#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2) \ 3326 def_fn_type (ENUM, RETURN, 0, 2, ARG1, ARG2); 3327#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 3328 def_fn_type (ENUM, RETURN, 0, 3, ARG1, ARG2, ARG3); 3329#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ 3330 def_fn_type (ENUM, RETURN, 0, 4, ARG1, ARG2, ARG3, ARG4); 3331#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 3332 def_fn_type (ENUM, RETURN, 0, 5, ARG1, ARG2, ARG3, ARG4, ARG5); 3333#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 3334 ARG6) \ 3335 def_fn_type (ENUM, RETURN, 0, 6, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6); 3336#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \ 3337 ARG6, ARG7) \ 3338 def_fn_type (ENUM, RETURN, 0, 7, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7); 3339#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN) \ 3340 def_fn_type (ENUM, RETURN, 1, 0); 3341#define DEF_FUNCTION_TYPE_VAR_1(ENUM, RETURN, ARG1) \ 3342 def_fn_type (ENUM, RETURN, 1, 1, ARG1); 3343#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \ 3344 def_fn_type (ENUM, RETURN, 1, 2, ARG1, ARG2); 3345#define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 3346 def_fn_type (ENUM, RETURN, 1, 3, ARG1, ARG2, ARG3); 3347#define DEF_FUNCTION_TYPE_VAR_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4) \ 3348 def_fn_type (ENUM, RETURN, 1, 4, ARG1, ARG2, ARG3, ARG4); 3349#define DEF_FUNCTION_TYPE_VAR_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) \ 3350 def_fn_type (ENUM, RETURN, 1, 5, ARG1, ARG2, ARG3, ARG4, ARG5); 3351#define DEF_POINTER_TYPE(ENUM, TYPE) \ 3352 builtin_types[(int) ENUM] = build_pointer_type (builtin_types[(int) TYPE]); |
3399 | 3353 |
3400#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2) \ 3401 builtin_types[(int) ENUM] \ 3402 = build_function_type \ 3403 (builtin_types[(int) RETURN], \ 3404 tree_cons (NULL_TREE, \ 3405 builtin_types[(int) ARG1], \ 3406 tree_cons (NULL_TREE, \ 3407 builtin_types[(int) ARG2], \ 3408 NULL_TREE))); 3409 3410#define DEF_FUNCTION_TYPE_VAR_3(ENUM, RETURN, ARG1, ARG2, ARG3) \ 3411 builtin_types[(int) ENUM] \ 3412 = build_function_type \ 3413 (builtin_types[(int) RETURN], \ 3414 tree_cons (NULL_TREE, \ 3415 builtin_types[(int) ARG1], \ 3416 tree_cons (NULL_TREE, \ 3417 builtin_types[(int) ARG2], \ 3418 tree_cons (NULL_TREE, \ 3419 builtin_types[(int) ARG3], \ 3420 NULL_TREE)))); 3421 3422#define DEF_POINTER_TYPE(ENUM, TYPE) \ 3423 builtin_types[(int) ENUM] \ 3424 = build_pointer_type (builtin_types[(int) TYPE]); | |
3425#include "builtin-types.def" | 3354#include "builtin-types.def" |
3355 |
|
3426#undef DEF_PRIMITIVE_TYPE 3427#undef DEF_FUNCTION_TYPE_1 3428#undef DEF_FUNCTION_TYPE_2 3429#undef DEF_FUNCTION_TYPE_3 3430#undef DEF_FUNCTION_TYPE_4 | 3356#undef DEF_PRIMITIVE_TYPE 3357#undef DEF_FUNCTION_TYPE_1 3358#undef DEF_FUNCTION_TYPE_2 3359#undef DEF_FUNCTION_TYPE_3 3360#undef DEF_FUNCTION_TYPE_4 |
3361#undef DEF_FUNCTION_TYPE_5 3362#undef DEF_FUNCTION_TYPE_6 |
|
3431#undef DEF_FUNCTION_TYPE_VAR_0 3432#undef DEF_FUNCTION_TYPE_VAR_1 3433#undef DEF_FUNCTION_TYPE_VAR_2 3434#undef DEF_FUNCTION_TYPE_VAR_3 | 3363#undef DEF_FUNCTION_TYPE_VAR_0 3364#undef DEF_FUNCTION_TYPE_VAR_1 3365#undef DEF_FUNCTION_TYPE_VAR_2 3366#undef DEF_FUNCTION_TYPE_VAR_3 |
3367#undef DEF_FUNCTION_TYPE_VAR_4 3368#undef DEF_FUNCTION_TYPE_VAR_5 |
|
3435#undef DEF_POINTER_TYPE | 3369#undef DEF_POINTER_TYPE |
3370 builtin_types[(int) BT_LAST] = NULL_TREE; |
|
3436 3437 c_init_attributes (); 3438 | 3371 3372 c_init_attributes (); 3373 |
3439#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, \ 3440 BOTH_P, FALLBACK_P, NONANSI_P, ATTRS, IMPLICIT) \ 3441 if (NAME) \ 3442 { \ 3443 tree decl; \ 3444 \ 3445 if (strncmp (NAME, "__builtin_", strlen ("__builtin_")) != 0) \ 3446 abort (); \ 3447 \ 3448 if (!BOTH_P) \ 3449 decl = builtin_function (NAME, builtin_types[TYPE], ENUM, \ 3450 CLASS, \ 3451 (FALLBACK_P \ 3452 ? (NAME + strlen ("__builtin_")) \ 3453 : NULL), \ 3454 built_in_attributes[(int) ATTRS]); \ 3455 else \ 3456 decl = builtin_function_2 (NAME, \ 3457 NAME + strlen ("__builtin_"), \ 3458 builtin_types[TYPE], \ 3459 builtin_types[LIBTYPE], \ 3460 ENUM, \ 3461 CLASS, \ 3462 FALLBACK_P, \ 3463 NONANSI_P, \ 3464 built_in_attributes[(int) ATTRS]); \ 3465 \ 3466 built_in_decls[(int) ENUM] = decl; \ 3467 if (IMPLICIT) \ 3468 implicit_built_in_decls[(int) ENUM] = decl; \ 3469 } | 3374#define DEF_BUILTIN(ENUM, NAME, CLASS, TYPE, LIBTYPE, BOTH_P, FALLBACK_P, \ 3375 NONANSI_P, ATTRS, IMPLICIT, COND) \ 3376 if (NAME && COND) \ 3377 def_builtin_1 (ENUM, NAME, CLASS, \ 3378 builtin_types[(int) TYPE], \ 3379 builtin_types[(int) LIBTYPE], \ 3380 BOTH_P, FALLBACK_P, NONANSI_P, \ 3381 built_in_attributes[(int) ATTRS], IMPLICIT); |
3470#include "builtins.def" 3471#undef DEF_BUILTIN 3472 | 3382#include "builtins.def" 3383#undef DEF_BUILTIN 3384 |
3473 (*targetm.init_builtins) (); | 3385 build_common_builtin_nodes (); |
3474 | 3386 |
3387 targetm.init_builtins (); 3388 if (flag_mudflap) 3389 mudflap_init (); 3390 |
|
3475 main_identifier_node = get_identifier ("main"); | 3391 main_identifier_node = get_identifier ("main"); |
3392 3393 /* Create the built-in __null node. It is important that this is 3394 not shared. */ 3395 null_node = make_node (INTEGER_CST); 3396 TREE_TYPE (null_node) = c_common_type_for_size (POINTER_SIZE, 0); 3397 3398 /* Since builtin_types isn't gc'ed, don't export these nodes. */ 3399 memset (builtin_types, 0, sizeof (builtin_types)); |
|
3476} 3477 | 3400} 3401 |
3402/* Look up the function in built_in_decls that corresponds to DECL 3403 and set ASMSPEC as its user assembler name. DECL must be a 3404 function decl that declares a builtin. */ 3405 3406void 3407set_builtin_user_assembler_name (tree decl, const char *asmspec) 3408{ 3409 tree builtin; 3410 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL 3411 && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL 3412 && asmspec != 0); 3413 3414 builtin = built_in_decls [DECL_FUNCTION_CODE (decl)]; 3415 set_user_assembler_name (builtin, asmspec); 3416 if (DECL_FUNCTION_CODE (decl) == BUILT_IN_MEMCPY) 3417 init_block_move_fn (asmspec); 3418 else if (DECL_FUNCTION_CODE (decl) == BUILT_IN_MEMSET) 3419 init_block_clear_fn (asmspec); 3420} 3421 3422/* The number of named compound-literals generated thus far. */ 3423static GTY(()) int compound_literal_number; 3424 3425/* Set DECL_NAME for DECL, a VAR_DECL for a compound-literal. */ 3426 3427void 3428set_compound_literal_name (tree decl) 3429{ 3430 char *name; 3431 ASM_FORMAT_PRIVATE_NAME (name, "__compound_literal", 3432 compound_literal_number); 3433 compound_literal_number++; 3434 DECL_NAME (decl) = get_identifier (name); 3435} 3436 |
|
3478tree 3479build_va_arg (tree expr, tree type) 3480{ 3481 return build1 (VA_ARG_EXPR, type, expr); 3482} 3483 3484 3485/* Linked list of disabled built-in functions. */ --- 9 unchanged lines hidden (view full) --- 3495 3496/* Disable a built-in function specified by -fno-builtin-NAME. If NAME 3497 begins with "__builtin_", give an error. */ 3498 3499void 3500disable_builtin_function (const char *name) 3501{ 3502 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0) | 3437tree 3438build_va_arg (tree expr, tree type) 3439{ 3440 return build1 (VA_ARG_EXPR, type, expr); 3441} 3442 3443 3444/* Linked list of disabled built-in functions. */ --- 9 unchanged lines hidden (view full) --- 3454 3455/* Disable a built-in function specified by -fno-builtin-NAME. If NAME 3456 begins with "__builtin_", give an error. */ 3457 3458void 3459disable_builtin_function (const char *name) 3460{ 3461 if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0) |
3503 error ("cannot disable built-in function `%s'", name); | 3462 error ("cannot disable built-in function %qs", name); |
3504 else 3505 { | 3463 else 3464 { |
3506 disabled_builtin *new = xmalloc (sizeof (disabled_builtin)); 3507 new->name = name; 3508 new->next = disabled_builtins; 3509 disabled_builtins = new; | 3465 disabled_builtin *new_disabled_builtin = XNEW (disabled_builtin); 3466 new_disabled_builtin->name = name; 3467 new_disabled_builtin->next = disabled_builtins; 3468 disabled_builtins = new_disabled_builtin; |
3510 } 3511} 3512 3513 3514/* Return true if the built-in function NAME has been disabled, false 3515 otherwise. */ 3516 3517static bool --- 4 unchanged lines hidden (view full) --- 3522 { 3523 if (strcmp (name, p->name) == 0) 3524 return true; 3525 } 3526 return false; 3527} 3528 3529 | 3469 } 3470} 3471 3472 3473/* Return true if the built-in function NAME has been disabled, false 3474 otherwise. */ 3475 3476static bool --- 4 unchanged lines hidden (view full) --- 3481 { 3482 if (strcmp (name, p->name) == 0) 3483 return true; 3484 } 3485 return false; 3486} 3487 3488 |
3530/* Possibly define a builtin function with one or two names. BUILTIN_NAME 3531 is an __builtin_-prefixed name; NAME is the ordinary name; one or both 3532 of these may be NULL (though both being NULL is useless). 3533 BUILTIN_TYPE is the type of the __builtin_-prefixed function; 3534 TYPE is the type of the function with the ordinary name. These 3535 may differ if the ordinary name is declared with a looser type to avoid 3536 conflicts with headers. FUNCTION_CODE and CLASS are as for 3537 builtin_function. If LIBRARY_NAME_P is nonzero, NAME is passed as 3538 the LIBRARY_NAME parameter to builtin_function when declaring BUILTIN_NAME. 3539 If NONANSI_P is nonzero, the name NAME is treated as a non-ANSI name; 3540 ATTRS is the tree list representing the builtin's function attributes. 3541 Returns the declaration of BUILTIN_NAME, if any, otherwise 3542 the declaration of NAME. Does not declare NAME if flag_no_builtin, 3543 or if NONANSI_P and flag_no_nonansi_builtin. */ | 3489/* Worker for DEF_BUILTIN. 3490 Possibly define a builtin function with one or two names. 3491 Does not declare a non-__builtin_ function if flag_no_builtin, or if 3492 nonansi_p and flag_no_nonansi_builtin. */ |
3544 | 3493 |
3545static tree 3546builtin_function_2 (const char *builtin_name, const char *name, 3547 tree builtin_type, tree type, int function_code, 3548 enum built_in_class class, int library_name_p, 3549 int nonansi_p, tree attrs) | 3494static void 3495def_builtin_1 (enum built_in_function fncode, 3496 const char *name, 3497 enum built_in_class fnclass, 3498 tree fntype, tree libtype, 3499 bool both_p, bool fallback_p, bool nonansi_p, 3500 tree fnattrs, bool implicit_p) |
3550{ | 3501{ |
3551 tree bdecl = NULL_TREE; 3552 tree decl = NULL_TREE; | 3502 tree decl; 3503 const char *libname; |
3553 | 3504 |
3554 if (builtin_name != 0) 3555 bdecl = builtin_function (builtin_name, builtin_type, function_code, 3556 class, library_name_p ? name : NULL, attrs); | 3505 if (fntype == error_mark_node) 3506 return; |
3557 | 3507 |
3558 if (name != 0 && !flag_no_builtin && !builtin_function_disabled_p (name) | 3508 gcc_assert ((!both_p && !fallback_p) 3509 || !strncmp (name, "__builtin_", 3510 strlen ("__builtin_"))); 3511 3512 libname = name + strlen ("__builtin_"); 3513 decl = lang_hooks.builtin_function (name, fntype, fncode, fnclass, 3514 (fallback_p ? libname : NULL), 3515 fnattrs); 3516 if (both_p 3517 && !flag_no_builtin && !builtin_function_disabled_p (libname) |
3559 && !(nonansi_p && flag_no_nonansi_builtin)) | 3518 && !(nonansi_p && flag_no_nonansi_builtin)) |
3560 decl = builtin_function (name, type, function_code, class, NULL, attrs); | 3519 lang_hooks.builtin_function (libname, libtype, fncode, fnclass, 3520 NULL, fnattrs); |
3561 | 3521 |
3562 return (bdecl != 0 ? bdecl : decl); | 3522 built_in_decls[(int) fncode] = decl; 3523 if (implicit_p) 3524 implicit_built_in_decls[(int) fncode] = decl; |
3563} 3564 3565/* Nonzero if the type T promotes to int. This is (nearly) the 3566 integral promotions defined in ISO C99 6.3.1.1/2. */ 3567 3568bool 3569c_promoting_integer_type_p (tree t) 3570{ --- 27 unchanged lines hidden (view full) --- 3598int 3599self_promoting_args_p (tree parms) 3600{ 3601 tree t; 3602 for (t = parms; t; t = TREE_CHAIN (t)) 3603 { 3604 tree type = TREE_VALUE (t); 3605 | 3525} 3526 3527/* Nonzero if the type T promotes to int. This is (nearly) the 3528 integral promotions defined in ISO C99 6.3.1.1/2. */ 3529 3530bool 3531c_promoting_integer_type_p (tree t) 3532{ --- 27 unchanged lines hidden (view full) --- 3560int 3561self_promoting_args_p (tree parms) 3562{ 3563 tree t; 3564 for (t = parms; t; t = TREE_CHAIN (t)) 3565 { 3566 tree type = TREE_VALUE (t); 3567 |
3568 if (type == error_mark_node) 3569 continue; 3570 |
|
3606 if (TREE_CHAIN (t) == 0 && type != void_type_node) 3607 return 0; 3608 3609 if (type == 0) 3610 return 0; 3611 3612 if (TYPE_MAIN_VARIANT (type) == float_type_node) 3613 return 0; --- 20 unchanged lines hidden (view full) --- 3634tree 3635strip_pointer_operator (tree t) 3636{ 3637 while (POINTER_TYPE_P (t)) 3638 t = TREE_TYPE (t); 3639 return t; 3640} 3641 | 3571 if (TREE_CHAIN (t) == 0 && type != void_type_node) 3572 return 0; 3573 3574 if (type == 0) 3575 return 0; 3576 3577 if (TYPE_MAIN_VARIANT (type) == float_type_node) 3578 return 0; --- 20 unchanged lines hidden (view full) --- 3599tree 3600strip_pointer_operator (tree t) 3601{ 3602 while (POINTER_TYPE_P (t)) 3603 t = TREE_TYPE (t); 3604 return t; 3605} 3606 |
3642static tree expand_unordered_cmp (tree, tree, enum tree_code, enum tree_code); 3643 3644/* Expand a call to an unordered comparison function such as 3645 __builtin_isgreater(). FUNCTION is the function's declaration and 3646 PARAMS a list of the values passed. For __builtin_isunordered(), 3647 UNORDERED_CODE is UNORDERED_EXPR and ORDERED_CODE is NOP_EXPR. In 3648 other cases, UNORDERED_CODE and ORDERED_CODE are comparison codes 3649 that give the opposite of the desired result. UNORDERED_CODE is 3650 used for modes that can hold NaNs and ORDERED_CODE is used for the 3651 rest. */ 3652 3653static tree 3654expand_unordered_cmp (tree function, tree params, 3655 enum tree_code unordered_code, 3656 enum tree_code ordered_code) 3657{ 3658 tree arg0, arg1, type; 3659 enum tree_code code0, code1; 3660 3661 /* Check that we have exactly two arguments. */ 3662 if (params == 0 || TREE_CHAIN (params) == 0) 3663 { 3664 error ("too few arguments to function `%s'", 3665 IDENTIFIER_POINTER (DECL_NAME (function))); 3666 return error_mark_node; 3667 } 3668 else if (TREE_CHAIN (TREE_CHAIN (params)) != 0) 3669 { 3670 error ("too many arguments to function `%s'", 3671 IDENTIFIER_POINTER (DECL_NAME (function))); 3672 return error_mark_node; 3673 } 3674 3675 arg0 = TREE_VALUE (params); 3676 arg1 = TREE_VALUE (TREE_CHAIN (params)); 3677 3678 code0 = TREE_CODE (TREE_TYPE (arg0)); 3679 code1 = TREE_CODE (TREE_TYPE (arg1)); 3680 3681 /* Make sure that the arguments have a common type of REAL. */ 3682 type = 0; 3683 if ((code0 == INTEGER_TYPE || code0 == REAL_TYPE) 3684 && (code1 == INTEGER_TYPE || code1 == REAL_TYPE)) 3685 type = common_type (TREE_TYPE (arg0), TREE_TYPE (arg1)); 3686 3687 if (type == 0 || TREE_CODE (type) != REAL_TYPE) 3688 { 3689 error ("non-floating-point argument to function `%s'", 3690 IDENTIFIER_POINTER (DECL_NAME (function))); 3691 return error_mark_node; 3692 } 3693 3694 if (unordered_code == UNORDERED_EXPR) 3695 { 3696 if (MODE_HAS_NANS (TYPE_MODE (type))) 3697 return build_binary_op (unordered_code, 3698 convert (type, arg0), 3699 convert (type, arg1), 3700 0); 3701 else 3702 return integer_zero_node; 3703 } 3704 3705 return build_unary_op (TRUTH_NOT_EXPR, 3706 build_binary_op (MODE_HAS_NANS (TYPE_MODE (type)) 3707 ? unordered_code 3708 : ordered_code, 3709 convert (type, arg0), 3710 convert (type, arg1), 3711 0), 3712 0); 3713} 3714 3715 3716/* Recognize certain built-in functions so we can make tree-codes 3717 other than CALL_EXPR. We do this when it enables fold-const.c 3718 to do something useful. */ 3719/* ??? By rights this should go in builtins.c, but only C and C++ 3720 implement build_{binary,unary}_op. Not exactly sure what bits 3721 of functionality are actually needed from those functions, or 3722 where the similar functionality exists in the other front ends. */ 3723 3724tree 3725expand_tree_builtin (tree function, tree params, tree coerced_params) 3726{ 3727 if (DECL_BUILT_IN_CLASS (function) != BUILT_IN_NORMAL) 3728 return NULL_TREE; 3729 3730 switch (DECL_FUNCTION_CODE (function)) 3731 { 3732 case BUILT_IN_ABS: 3733 case BUILT_IN_LABS: 3734 case BUILT_IN_LLABS: 3735 case BUILT_IN_IMAXABS: 3736 case BUILT_IN_FABS: 3737 case BUILT_IN_FABSL: 3738 case BUILT_IN_FABSF: 3739 if (coerced_params == 0) 3740 return integer_zero_node; 3741 return build_unary_op (ABS_EXPR, TREE_VALUE (coerced_params), 0); 3742 3743 case BUILT_IN_CONJ: 3744 case BUILT_IN_CONJF: 3745 case BUILT_IN_CONJL: 3746 if (coerced_params == 0) 3747 return integer_zero_node; 3748 return build_unary_op (CONJ_EXPR, TREE_VALUE (coerced_params), 0); 3749 3750 case BUILT_IN_CREAL: 3751 case BUILT_IN_CREALF: 3752 case BUILT_IN_CREALL: 3753 if (coerced_params == 0) 3754 return integer_zero_node; 3755 return non_lvalue (build_unary_op (REALPART_EXPR, 3756 TREE_VALUE (coerced_params), 0)); 3757 3758 case BUILT_IN_CIMAG: 3759 case BUILT_IN_CIMAGF: 3760 case BUILT_IN_CIMAGL: 3761 if (coerced_params == 0) 3762 return integer_zero_node; 3763 return non_lvalue (build_unary_op (IMAGPART_EXPR, 3764 TREE_VALUE (coerced_params), 0)); 3765 3766 case BUILT_IN_ISGREATER: 3767 return expand_unordered_cmp (function, params, UNLE_EXPR, LE_EXPR); 3768 3769 case BUILT_IN_ISGREATEREQUAL: 3770 return expand_unordered_cmp (function, params, UNLT_EXPR, LT_EXPR); 3771 3772 case BUILT_IN_ISLESS: 3773 return expand_unordered_cmp (function, params, UNGE_EXPR, GE_EXPR); 3774 3775 case BUILT_IN_ISLESSEQUAL: 3776 return expand_unordered_cmp (function, params, UNGT_EXPR, GT_EXPR); 3777 3778 case BUILT_IN_ISLESSGREATER: 3779 return expand_unordered_cmp (function, params, UNEQ_EXPR, EQ_EXPR); 3780 3781 case BUILT_IN_ISUNORDERED: 3782 return expand_unordered_cmp (function, params, UNORDERED_EXPR, NOP_EXPR); 3783 3784 default: 3785 break; 3786 } 3787 3788 return NULL_TREE; 3789} 3790 3791/* Walk the statement tree, rooted at *tp. Apply FUNC to all the 3792 sub-trees of *TP in a pre-order traversal. FUNC is called with the 3793 DATA and the address of each sub-tree. If FUNC returns a non-NULL 3794 value, the traversal is aborted, and the value returned by FUNC is 3795 returned. If FUNC sets WALK_SUBTREES to zero, then the subtrees of 3796 the node being visited are not walked. 3797 3798 We don't need a without_duplicates variant of this one because the 3799 statement tree is a tree, not a graph. */ 3800 3801tree 3802walk_stmt_tree (tree *tp, walk_tree_fn func, void *data) 3803{ 3804 enum tree_code code; 3805 int walk_subtrees; 3806 tree result; 3807 int i, len; 3808 3809#define WALK_SUBTREE(NODE) \ 3810 do \ 3811 { \ 3812 result = walk_stmt_tree (&(NODE), func, data); \ 3813 if (result) \ 3814 return result; \ 3815 } \ 3816 while (0) 3817 3818 /* Skip empty subtrees. */ 3819 if (!*tp) 3820 return NULL_TREE; 3821 3822 /* Skip subtrees below non-statement nodes. */ 3823 if (!STATEMENT_CODE_P (TREE_CODE (*tp))) 3824 return NULL_TREE; 3825 3826 /* Call the function. */ 3827 walk_subtrees = 1; 3828 result = (*func) (tp, &walk_subtrees, data); 3829 3830 /* If we found something, return it. */ 3831 if (result) 3832 return result; 3833 3834 /* FUNC may have modified the tree, recheck that we're looking at a 3835 statement node. */ 3836 code = TREE_CODE (*tp); 3837 if (!STATEMENT_CODE_P (code)) 3838 return NULL_TREE; 3839 3840 /* Visit the subtrees unless FUNC decided that there was nothing 3841 interesting below this point in the tree. */ 3842 if (walk_subtrees) 3843 { 3844 /* Walk over all the sub-trees of this operand. Statement nodes 3845 never contain RTL, and we needn't worry about TARGET_EXPRs. */ 3846 len = TREE_CODE_LENGTH (code); 3847 3848 /* Go through the subtrees. We need to do this in forward order so 3849 that the scope of a FOR_EXPR is handled properly. */ 3850 for (i = 0; i < len; ++i) 3851 WALK_SUBTREE (TREE_OPERAND (*tp, i)); 3852 } 3853 3854 /* Finally visit the chain. This can be tail-recursion optimized if 3855 we write it this way. */ 3856 return walk_stmt_tree (&TREE_CHAIN (*tp), func, data); 3857 3858#undef WALK_SUBTREE 3859} 3860 | |
3861/* Used to compare case labels. K1 and K2 are actually tree nodes 3862 representing case labels, or NULL_TREE for a `default' label. 3863 Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after 3864 K2, and 0 if K1 and K2 are equal. */ 3865 3866int 3867case_compare (splay_tree_key k1, splay_tree_key k2) 3868{ --- 8 unchanged lines hidden (view full) --- 3877} 3878 3879/* Process a case label for the range LOW_VALUE ... HIGH_VALUE. If 3880 LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is 3881 actually a `default' label. If only HIGH_VALUE is NULL_TREE, then 3882 case label was declared using the usual C/C++ syntax, rather than 3883 the GNU case range extension. CASES is a tree containing all the 3884 case ranges processed so far; COND is the condition for the | 3607/* Used to compare case labels. K1 and K2 are actually tree nodes 3608 representing case labels, or NULL_TREE for a `default' label. 3609 Returns -1 if K1 is ordered before K2, -1 if K1 is ordered after 3610 K2, and 0 if K1 and K2 are equal. */ 3611 3612int 3613case_compare (splay_tree_key k1, splay_tree_key k2) 3614{ --- 8 unchanged lines hidden (view full) --- 3623} 3624 3625/* Process a case label for the range LOW_VALUE ... HIGH_VALUE. If 3626 LOW_VALUE and HIGH_VALUE are both NULL_TREE then this case label is 3627 actually a `default' label. If only HIGH_VALUE is NULL_TREE, then 3628 case label was declared using the usual C/C++ syntax, rather than 3629 the GNU case range extension. CASES is a tree containing all the 3630 case ranges processed so far; COND is the condition for the |
3885 switch-statement itself. Returns the CASE_LABEL created, or 3886 ERROR_MARK_NODE if no CASE_LABEL is created. */ | 3631 switch-statement itself. Returns the CASE_LABEL_EXPR created, or 3632 ERROR_MARK_NODE if no CASE_LABEL_EXPR is created. */ |
3887 3888tree | 3633 3634tree |
3889c_add_case_label (splay_tree cases, tree cond, tree low_value, 3890 tree high_value) | 3635c_add_case_label (splay_tree cases, tree cond, tree orig_type, 3636 tree low_value, tree high_value) |
3891{ 3892 tree type; 3893 tree label; 3894 tree case_label; 3895 splay_tree_node node; 3896 3897 /* Create the LABEL_DECL itself. */ | 3637{ 3638 tree type; 3639 tree label; 3640 tree case_label; 3641 splay_tree_node node; 3642 3643 /* Create the LABEL_DECL itself. */ |
3898 label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE); 3899 DECL_CONTEXT (label) = current_function_decl; | 3644 label = create_artificial_label (); |
3900 3901 /* If there was an error processing the switch condition, bail now 3902 before we get more confused. */ 3903 if (!cond || cond == error_mark_node) | 3645 3646 /* If there was an error processing the switch condition, bail now 3647 before we get more confused. */ 3648 if (!cond || cond == error_mark_node) |
3904 { 3905 /* Add a label anyhow so that the back-end doesn't think that 3906 the beginning of the switch is unreachable. */ 3907 if (!cases->root) 3908 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label)); 3909 return error_mark_node; 3910 } | 3649 goto error_out; |
3911 3912 if ((low_value && TREE_TYPE (low_value) 3913 && POINTER_TYPE_P (TREE_TYPE (low_value))) 3914 || (high_value && TREE_TYPE (high_value) 3915 && POINTER_TYPE_P (TREE_TYPE (high_value)))) | 3650 3651 if ((low_value && TREE_TYPE (low_value) 3652 && POINTER_TYPE_P (TREE_TYPE (low_value))) 3653 || (high_value && TREE_TYPE (high_value) 3654 && POINTER_TYPE_P (TREE_TYPE (high_value)))) |
3916 error ("pointers are not permitted as case values"); | 3655 { 3656 error ("pointers are not permitted as case values"); 3657 goto error_out; 3658 } |
3917 3918 /* Case ranges are a GNU extension. */ 3919 if (high_value && pedantic) 3920 pedwarn ("range expressions in switch statements are non-standard"); 3921 3922 type = TREE_TYPE (cond); 3923 if (low_value) 3924 { 3925 low_value = check_case_value (low_value); 3926 low_value = convert_and_check (type, low_value); | 3659 3660 /* Case ranges are a GNU extension. */ 3661 if (high_value && pedantic) 3662 pedwarn ("range expressions in switch statements are non-standard"); 3663 3664 type = TREE_TYPE (cond); 3665 if (low_value) 3666 { 3667 low_value = check_case_value (low_value); 3668 low_value = convert_and_check (type, low_value); |
3669 if (low_value == error_mark_node) 3670 goto error_out; |
|
3927 } 3928 if (high_value) 3929 { 3930 high_value = check_case_value (high_value); 3931 high_value = convert_and_check (type, high_value); | 3671 } 3672 if (high_value) 3673 { 3674 high_value = check_case_value (high_value); 3675 high_value = convert_and_check (type, high_value); |
3676 if (high_value == error_mark_node) 3677 goto error_out; |
|
3932 } 3933 | 3678 } 3679 |
3934 /* If an error has occurred, bail out now. */ 3935 if (low_value == error_mark_node || high_value == error_mark_node) | 3680 if (low_value && high_value) |
3936 { | 3681 { |
3937 if (!cases->root) 3938 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label)); 3939 return error_mark_node; | 3682 /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't 3683 really a case range, even though it was written that way. 3684 Remove the HIGH_VALUE to simplify later processing. */ 3685 if (tree_int_cst_equal (low_value, high_value)) 3686 high_value = NULL_TREE; 3687 else if (!tree_int_cst_lt (low_value, high_value)) 3688 warning (0, "empty range specified"); |
3940 } 3941 | 3689 } 3690 |
3942 /* If the LOW_VALUE and HIGH_VALUE are the same, then this isn't 3943 really a case range, even though it was written that way. Remove 3944 the HIGH_VALUE to simplify later processing. */ 3945 if (tree_int_cst_equal (low_value, high_value)) 3946 high_value = NULL_TREE; 3947 if (low_value && high_value 3948 && !tree_int_cst_lt (low_value, high_value)) 3949 warning ("empty range specified"); | 3691 /* See if the case is in range of the type of the original testing 3692 expression. If both low_value and high_value are out of range, 3693 don't insert the case label and return NULL_TREE. */ 3694 if (low_value 3695 && !check_case_bounds (type, orig_type, 3696 &low_value, high_value ? &high_value : NULL)) 3697 return NULL_TREE; |
3950 3951 /* Look up the LOW_VALUE in the table of case labels we already 3952 have. */ 3953 node = splay_tree_lookup (cases, (splay_tree_key) low_value); 3954 /* If there was not an exact match, check for overlapping ranges. 3955 There's no need to do this if there's no LOW_VALUE or HIGH_VALUE; 3956 that's a `default' label and the only overlap is an exact match. */ 3957 if (!node && (low_value || high_value)) --- 30 unchanged lines hidden (view full) --- 3988 && (tree_int_cst_compare ((tree) high_bound->key, 3989 high_value) 3990 <= 0)) 3991 node = high_bound; 3992 } 3993 /* If there was an overlap, issue an error. */ 3994 if (node) 3995 { | 3698 3699 /* Look up the LOW_VALUE in the table of case labels we already 3700 have. */ 3701 node = splay_tree_lookup (cases, (splay_tree_key) low_value); 3702 /* If there was not an exact match, check for overlapping ranges. 3703 There's no need to do this if there's no LOW_VALUE or HIGH_VALUE; 3704 that's a `default' label and the only overlap is an exact match. */ 3705 if (!node && (low_value || high_value)) --- 30 unchanged lines hidden (view full) --- 3736 && (tree_int_cst_compare ((tree) high_bound->key, 3737 high_value) 3738 <= 0)) 3739 node = high_bound; 3740 } 3741 /* If there was an overlap, issue an error. */ 3742 if (node) 3743 { |
3996 tree duplicate = CASE_LABEL_DECL ((tree) node->value); | 3744 tree duplicate = CASE_LABEL ((tree) node->value); |
3997 3998 if (high_value) 3999 { 4000 error ("duplicate (or overlapping) case value"); 4001 error ("%Jthis is the first entry overlapping that value", duplicate); 4002 } 4003 else if (low_value) 4004 { 4005 error ("duplicate case value") ; 4006 error ("%Jpreviously used here", duplicate); 4007 } 4008 else 4009 { 4010 error ("multiple default labels in one switch"); 4011 error ("%Jthis is the first default label", duplicate); 4012 } | 3745 3746 if (high_value) 3747 { 3748 error ("duplicate (or overlapping) case value"); 3749 error ("%Jthis is the first entry overlapping that value", duplicate); 3750 } 3751 else if (low_value) 3752 { 3753 error ("duplicate case value") ; 3754 error ("%Jpreviously used here", duplicate); 3755 } 3756 else 3757 { 3758 error ("multiple default labels in one switch"); 3759 error ("%Jthis is the first default label", duplicate); 3760 } |
4013 if (!cases->root) 4014 add_stmt (build_case_label (NULL_TREE, NULL_TREE, label)); | 3761 goto error_out; |
4015 } 4016 4017 /* Add a CASE_LABEL to the statement-tree. */ 4018 case_label = add_stmt (build_case_label (low_value, high_value, label)); 4019 /* Register this case label in the splay tree. */ 4020 splay_tree_insert (cases, 4021 (splay_tree_key) low_value, 4022 (splay_tree_value) case_label); 4023 4024 return case_label; | 3762 } 3763 3764 /* Add a CASE_LABEL to the statement-tree. */ 3765 case_label = add_stmt (build_case_label (low_value, high_value, label)); 3766 /* Register this case label in the splay tree. */ 3767 splay_tree_insert (cases, 3768 (splay_tree_key) low_value, 3769 (splay_tree_value) case_label); 3770 3771 return case_label; |
3772 3773 error_out: 3774 /* Add a label so that the back-end doesn't think that the beginning of 3775 the switch is unreachable. Note that we do not add a case label, as 3776 that just leads to duplicates and thence to failure later on. */ 3777 if (!cases->root) 3778 { 3779 tree t = create_artificial_label (); 3780 add_stmt (build_stmt (LABEL_EXPR, t)); 3781 } 3782 return error_mark_node; |
|
4025} 4026 | 3783} 3784 |
3785/* Subroutines of c_do_switch_warnings, called via splay_tree_foreach. 3786 Used to verify that case values match up with enumerator values. */ 3787 3788static void 3789match_case_to_enum_1 (tree key, tree type, tree label) 3790{ 3791 char buf[2 + 2*HOST_BITS_PER_WIDE_INT/4 + 1]; 3792 3793 /* ??? Not working too hard to print the double-word value. 3794 Should perhaps be done with %lwd in the diagnostic routines? */ 3795 if (TREE_INT_CST_HIGH (key) == 0) 3796 snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_UNSIGNED, 3797 TREE_INT_CST_LOW (key)); 3798 else if (!TYPE_UNSIGNED (type) 3799 && TREE_INT_CST_HIGH (key) == -1 3800 && TREE_INT_CST_LOW (key) != 0) 3801 snprintf (buf, sizeof (buf), "-" HOST_WIDE_INT_PRINT_UNSIGNED, 3802 -TREE_INT_CST_LOW (key)); 3803 else 3804 snprintf (buf, sizeof (buf), HOST_WIDE_INT_PRINT_DOUBLE_HEX, 3805 TREE_INT_CST_HIGH (key), TREE_INT_CST_LOW (key)); 3806 3807 if (TYPE_NAME (type) == 0) 3808 warning (0, "%Jcase value %qs not in enumerated type", 3809 CASE_LABEL (label), buf); 3810 else 3811 warning (0, "%Jcase value %qs not in enumerated type %qT", 3812 CASE_LABEL (label), buf, type); 3813} 3814 3815/* Subroutine of c_do_switch_warnings, called via splay_tree_foreach. 3816 Used to verify that case values match up with enumerator values. */ 3817 3818static int 3819match_case_to_enum (splay_tree_node node, void *data) 3820{ 3821 tree label = (tree) node->value; 3822 tree type = (tree) data; 3823 3824 /* Skip default case. */ 3825 if (!CASE_LOW (label)) 3826 return 0; 3827 3828 /* If CASE_LOW_SEEN is not set, that means CASE_LOW did not appear 3829 when we did our enum->case scan. Reset our scratch bit after. */ 3830 if (!CASE_LOW_SEEN (label)) 3831 match_case_to_enum_1 (CASE_LOW (label), type, label); 3832 else 3833 CASE_LOW_SEEN (label) = 0; 3834 3835 /* If CASE_HIGH is non-null, we have a range. If CASE_HIGH_SEEN is 3836 not set, that means that CASE_HIGH did not appear when we did our 3837 enum->case scan. Reset our scratch bit after. */ 3838 if (CASE_HIGH (label)) 3839 { 3840 if (!CASE_HIGH_SEEN (label)) 3841 match_case_to_enum_1 (CASE_HIGH (label), type, label); 3842 else 3843 CASE_HIGH_SEEN (label) = 0; 3844 } 3845 3846 return 0; 3847} 3848 3849/* Handle -Wswitch*. Called from the front end after parsing the 3850 switch construct. */ 3851/* ??? Should probably be somewhere generic, since other languages 3852 besides C and C++ would want this. At the moment, however, C/C++ 3853 are the only tree-ssa languages that support enumerations at all, 3854 so the point is moot. */ 3855 3856void 3857c_do_switch_warnings (splay_tree cases, location_t switch_location, 3858 tree type, tree cond) 3859{ 3860 splay_tree_node default_node; 3861 splay_tree_node node; 3862 tree chain; 3863 3864 if (!warn_switch && !warn_switch_enum && !warn_switch_default) 3865 return; 3866 3867 default_node = splay_tree_lookup (cases, (splay_tree_key) NULL); 3868 if (!default_node) 3869 warning (OPT_Wswitch_default, "%Hswitch missing default case", 3870 &switch_location); 3871 3872 /* From here on, we only care about about enumerated types. */ 3873 if (!type || TREE_CODE (type) != ENUMERAL_TYPE) 3874 return; 3875 3876 /* If the switch expression was an enumerated type, check that 3877 exactly all enumeration literals are covered by the cases. 3878 The check is made when -Wswitch was specified and there is no 3879 default case, or when -Wswitch-enum was specified. */ 3880 3881 if (!warn_switch_enum 3882 && !(warn_switch && !default_node)) 3883 return; 3884 3885 /* Clearing COND if it is not an integer constant simplifies 3886 the tests inside the loop below. */ 3887 if (TREE_CODE (cond) != INTEGER_CST) 3888 cond = NULL_TREE; 3889 3890 /* The time complexity here is O(N*lg(N)) worst case, but for the 3891 common case of monotonically increasing enumerators, it is 3892 O(N), since the nature of the splay tree will keep the next 3893 element adjacent to the root at all times. */ 3894 3895 for (chain = TYPE_VALUES (type); chain; chain = TREE_CHAIN (chain)) 3896 { 3897 tree value = TREE_VALUE (chain); 3898 node = splay_tree_lookup (cases, (splay_tree_key) value); 3899 if (node) 3900 { 3901 /* Mark the CASE_LOW part of the case entry as seen. */ 3902 tree label = (tree) node->value; 3903 CASE_LOW_SEEN (label) = 1; 3904 continue; 3905 } 3906 3907 /* Even though there wasn't an exact match, there might be a 3908 case range which includes the enumator's value. */ 3909 node = splay_tree_predecessor (cases, (splay_tree_key) value); 3910 if (node && CASE_HIGH ((tree) node->value)) 3911 { 3912 tree label = (tree) node->value; 3913 int cmp = tree_int_cst_compare (CASE_HIGH (label), value); 3914 if (cmp >= 0) 3915 { 3916 /* If we match the upper bound exactly, mark the CASE_HIGH 3917 part of the case entry as seen. */ 3918 if (cmp == 0) 3919 CASE_HIGH_SEEN (label) = 1; 3920 continue; 3921 } 3922 } 3923 3924 /* We've now determined that this enumerated literal isn't 3925 handled by the case labels of the switch statement. */ 3926 3927 /* If the switch expression is a constant, we only really care 3928 about whether that constant is handled by the switch. */ 3929 if (cond && tree_int_cst_compare (cond, value)) 3930 continue; 3931 3932 warning (0, "%Henumeration value %qE not handled in switch", 3933 &switch_location, TREE_PURPOSE (chain)); 3934 } 3935 3936 /* Warn if there are case expressions that don't correspond to 3937 enumerators. This can occur since C and C++ don't enforce 3938 type-checking of assignments to enumeration variables. 3939 3940 The time complexity here is now always O(N) worst case, since 3941 we should have marked both the lower bound and upper bound of 3942 every disjoint case label, with CASE_LOW_SEEN and CASE_HIGH_SEEN 3943 above. This scan also resets those fields. */ 3944 splay_tree_foreach (cases, match_case_to_enum, type); 3945} 3946 |
|
4027/* Finish an expression taking the address of LABEL (an 4028 IDENTIFIER_NODE). Returns an expression for the address. */ 4029 4030tree 4031finish_label_address_expr (tree label) 4032{ 4033 tree result; 4034 --- 5 unchanged lines hidden (view full) --- 4040 4041 label = lookup_label (label); 4042 if (label == NULL_TREE) 4043 result = null_pointer_node; 4044 else 4045 { 4046 TREE_USED (label) = 1; 4047 result = build1 (ADDR_EXPR, ptr_type_node, label); | 3947/* Finish an expression taking the address of LABEL (an 3948 IDENTIFIER_NODE). Returns an expression for the address. */ 3949 3950tree 3951finish_label_address_expr (tree label) 3952{ 3953 tree result; 3954 --- 5 unchanged lines hidden (view full) --- 3960 3961 label = lookup_label (label); 3962 if (label == NULL_TREE) 3963 result = null_pointer_node; 3964 else 3965 { 3966 TREE_USED (label) = 1; 3967 result = build1 (ADDR_EXPR, ptr_type_node, label); |
4048 TREE_CONSTANT (result) = 1; | |
4049 /* The current function in not necessarily uninlinable. 4050 Computed gotos are incompatible with inlining, but the value 4051 here could be used only in a diagnostic, for example. */ 4052 } 4053 4054 return result; 4055} 4056 4057/* Hook used by expand_expr to expand language-specific tree codes. */ | 3968 /* The current function in not necessarily uninlinable. 3969 Computed gotos are incompatible with inlining, but the value 3970 here could be used only in a diagnostic, for example. */ 3971 } 3972 3973 return result; 3974} 3975 3976/* Hook used by expand_expr to expand language-specific tree codes. */ |
3977/* The only things that should go here are bits needed to expand 3978 constant initializers. Everything else should be handled by the 3979 gimplification routines. */ |
|
4058 4059rtx | 3980 3981rtx |
4060c_expand_expr (tree exp, rtx target, enum machine_mode tmode, | 3982c_expand_expr (tree exp, rtx target, enum machine_mode tmode, |
4061 int modifier /* Actually enum_modifier. */, 4062 rtx *alt_rtl) 4063{ 4064 switch (TREE_CODE (exp)) 4065 { | 3983 int modifier /* Actually enum_modifier. */, 3984 rtx *alt_rtl) 3985{ 3986 switch (TREE_CODE (exp)) 3987 { |
4066 case STMT_EXPR: 4067 { 4068 tree rtl_expr; 4069 rtx result; 4070 bool preserve_result = false; 4071 4072 if (STMT_EXPR_WARN_UNUSED_RESULT (exp) && target == const0_rtx) 4073 { 4074 tree stmt = STMT_EXPR_STMT (exp); 4075 tree scope; 4076 4077 for (scope = COMPOUND_BODY (stmt); 4078 scope && TREE_CODE (scope) != SCOPE_STMT; 4079 scope = TREE_CHAIN (scope)); 4080 4081 if (scope && SCOPE_STMT_BLOCK (scope)) 4082 warning ("%Hignoring return value of `%D', " 4083 "declared with attribute warn_unused_result", 4084 &expr_wfl_stack->location, 4085 BLOCK_ABSTRACT_ORIGIN (SCOPE_STMT_BLOCK (scope))); 4086 else 4087 warning ("%Hignoring return value of function " 4088 "declared with attribute warn_unused_result", 4089 &expr_wfl_stack->location); 4090 } 4091 4092 /* Since expand_expr_stmt calls free_temp_slots after every 4093 expression statement, we must call push_temp_slots here. 4094 Otherwise, any temporaries in use now would be considered 4095 out-of-scope after the first EXPR_STMT from within the 4096 STMT_EXPR. */ 4097 push_temp_slots (); 4098 rtl_expr = expand_start_stmt_expr (!STMT_EXPR_NO_SCOPE (exp)); 4099 4100 /* If we want the result of this expression, find the last 4101 EXPR_STMT in the COMPOUND_STMT and mark it as addressable. */ 4102 if (target != const0_rtx 4103 && TREE_CODE (STMT_EXPR_STMT (exp)) == COMPOUND_STMT 4104 && TREE_CODE (COMPOUND_BODY (STMT_EXPR_STMT (exp))) == SCOPE_STMT) 4105 { 4106 tree expr = COMPOUND_BODY (STMT_EXPR_STMT (exp)); 4107 tree last = TREE_CHAIN (expr); 4108 4109 while (TREE_CHAIN (last)) 4110 { 4111 expr = last; 4112 last = TREE_CHAIN (last); 4113 } 4114 4115 if (TREE_CODE (last) == SCOPE_STMT 4116 && TREE_CODE (expr) == EXPR_STMT) 4117 { 4118 /* Otherwise, note that we want the value from the last 4119 expression. */ 4120 TREE_ADDRESSABLE (expr) = 1; 4121 preserve_result = true; 4122 } 4123 } 4124 4125 expand_stmt (STMT_EXPR_STMT (exp)); 4126 expand_end_stmt_expr (rtl_expr); 4127 4128 result = expand_expr_real (rtl_expr, target, tmode, modifier, alt_rtl); 4129 if (preserve_result && GET_CODE (result) == MEM) 4130 { 4131 if (GET_MODE (result) != BLKmode) 4132 result = copy_to_reg (result); 4133 else 4134 preserve_temp_slots (result); 4135 } 4136 4137 /* If the statment-expression does not have a scope, then the 4138 new temporaries we created within it must live beyond the 4139 statement-expression. */ 4140 if (STMT_EXPR_NO_SCOPE (exp)) 4141 preserve_temp_slots (NULL_RTX); 4142 4143 pop_temp_slots (); 4144 return result; 4145 } 4146 break; 4147 | |
4148 case COMPOUND_LITERAL_EXPR: 4149 { 4150 /* Initialize the anonymous variable declared in the compound 4151 literal, then return the variable. */ 4152 tree decl = COMPOUND_LITERAL_EXPR_DECL (exp); 4153 emit_local_var (decl); 4154 return expand_expr_real (decl, target, tmode, modifier, alt_rtl); 4155 } 4156 4157 default: | 3988 case COMPOUND_LITERAL_EXPR: 3989 { 3990 /* Initialize the anonymous variable declared in the compound 3991 literal, then return the variable. */ 3992 tree decl = COMPOUND_LITERAL_EXPR_DECL (exp); 3993 emit_local_var (decl); 3994 return expand_expr_real (decl, target, tmode, modifier, alt_rtl); 3995 } 3996 3997 default: |
4158 abort (); | 3998 gcc_unreachable (); |
4159 } | 3999 } |
4160 4161 abort (); 4162 return NULL; | |
4163} 4164 | 4000} 4001 |
4165/* Hook used by safe_from_p to handle language-specific tree codes. */ 4166 4167int 4168c_safe_from_p (rtx target, tree exp) 4169{ 4170 /* We can see statements here when processing the body of a 4171 statement-expression. For a declaration statement declaring a 4172 variable, look at the variable's initializer. */ 4173 if (TREE_CODE (exp) == DECL_STMT) 4174 { 4175 tree decl = DECL_STMT_DECL (exp); 4176 4177 if (TREE_CODE (decl) == VAR_DECL 4178 && DECL_INITIAL (decl) 4179 && !safe_from_p (target, DECL_INITIAL (decl), /*top_p=*/0)) 4180 return 0; 4181 } 4182 4183 /* For any statement, we must follow the statement-chain. */ 4184 if (STATEMENT_CODE_P (TREE_CODE (exp)) && TREE_CHAIN (exp)) 4185 return safe_from_p (target, TREE_CHAIN (exp), /*top_p=*/0); 4186 4187 /* Assume everything else is safe. */ 4188 return 1; 4189} 4190 4191/* Hook used by unsafe_for_reeval to handle language-specific tree codes. */ 4192 4193int 4194c_common_unsafe_for_reeval (tree exp) 4195{ 4196 /* Statement expressions may not be reevaluated, likewise compound 4197 literals. */ 4198 if (TREE_CODE (exp) == STMT_EXPR 4199 || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR) 4200 return 2; 4201 4202 /* Walk all other expressions. */ 4203 return -1; 4204} 4205 | |
4206/* Hook used by staticp to handle language-specific tree codes. */ 4207 | 4002/* Hook used by staticp to handle language-specific tree codes. */ 4003 |
4208int | 4004tree |
4209c_staticp (tree exp) 4210{ | 4005c_staticp (tree exp) 4006{ |
4211 if (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR 4212 && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp))) 4213 return 1; 4214 return 0; | 4007 return (TREE_CODE (exp) == COMPOUND_LITERAL_EXPR 4008 && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)) 4009 ? exp : NULL); |
4215} 4216 4217 4218/* Given a boolean expression ARG, return a tree representing an increment 4219 or decrement (as indicated by CODE) of ARG. The front end must check for 4220 invalid cases (e.g., decrement in C++). */ 4221tree 4222boolean_increment (enum tree_code code, tree arg) 4223{ 4224 tree val; 4225 tree true_res = boolean_true_node; 4226 4227 arg = stabilize_reference (arg); 4228 switch (code) 4229 { 4230 case PREINCREMENT_EXPR: | 4010} 4011 4012 4013/* Given a boolean expression ARG, return a tree representing an increment 4014 or decrement (as indicated by CODE) of ARG. The front end must check for 4015 invalid cases (e.g., decrement in C++). */ 4016tree 4017boolean_increment (enum tree_code code, tree arg) 4018{ 4019 tree val; 4020 tree true_res = boolean_true_node; 4021 4022 arg = stabilize_reference (arg); 4023 switch (code) 4024 { 4025 case PREINCREMENT_EXPR: |
4231 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res); | 4026 val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res); |
4232 break; 4233 case POSTINCREMENT_EXPR: | 4027 break; 4028 case POSTINCREMENT_EXPR: |
4234 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res); | 4029 val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, true_res); |
4235 arg = save_expr (arg); | 4030 arg = save_expr (arg); |
4236 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg); 4237 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val); | 4031 val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg); 4032 val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val); |
4238 break; 4239 case PREDECREMENT_EXPR: | 4033 break; 4034 case PREDECREMENT_EXPR: |
4240 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg)); | 4035 val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, 4036 invert_truthvalue (arg)); |
4241 break; 4242 case POSTDECREMENT_EXPR: | 4037 break; 4038 case POSTDECREMENT_EXPR: |
4243 val = build (MODIFY_EXPR, TREE_TYPE (arg), arg, invert_truthvalue (arg)); | 4039 val = build2 (MODIFY_EXPR, TREE_TYPE (arg), arg, 4040 invert_truthvalue (arg)); |
4244 arg = save_expr (arg); | 4041 arg = save_expr (arg); |
4245 val = build (COMPOUND_EXPR, TREE_TYPE (arg), val, arg); 4246 val = build (COMPOUND_EXPR, TREE_TYPE (arg), arg, val); | 4042 val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), val, arg); 4043 val = build2 (COMPOUND_EXPR, TREE_TYPE (arg), arg, val); |
4247 break; 4248 default: | 4044 break; 4045 default: |
4249 abort (); | 4046 gcc_unreachable (); |
4250 } 4251 TREE_SIDE_EFFECTS (val) = 1; 4252 return val; 4253} 4254 4255/* Built-in macros for stddef.h, that require macros defined in this 4256 file. */ 4257void 4258c_stddef_cpp_builtins(void) 4259{ 4260 builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0); 4261 builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0); 4262 builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0); 4263 builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0); | 4047 } 4048 TREE_SIDE_EFFECTS (val) = 1; 4049 return val; 4050} 4051 4052/* Built-in macros for stddef.h, that require macros defined in this 4053 file. */ 4054void 4055c_stddef_cpp_builtins(void) 4056{ 4057 builtin_define_with_value ("__SIZE_TYPE__", SIZE_TYPE, 0); 4058 builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0); 4059 builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0); 4060 builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0); |
4061 builtin_define_with_value ("__INTMAX_TYPE__", INTMAX_TYPE, 0); 4062 builtin_define_with_value ("__UINTMAX_TYPE__", UINTMAX_TYPE, 0); |
|
4264} 4265 4266static void 4267c_init_attributes (void) 4268{ 4269 /* Fill in the built_in_attributes array. */ | 4063} 4064 4065static void 4066c_init_attributes (void) 4067{ 4068 /* Fill in the built_in_attributes array. */ |
4270#define DEF_ATTR_NULL_TREE(ENUM) \ | 4069#define DEF_ATTR_NULL_TREE(ENUM) \ |
4271 built_in_attributes[(int) ENUM] = NULL_TREE; | 4070 built_in_attributes[(int) ENUM] = NULL_TREE; |
4272#define DEF_ATTR_INT(ENUM, VALUE) \ 4273 built_in_attributes[(int) ENUM] = build_int_2 (VALUE, VALUE < 0 ? -1 : 0); | 4071#define DEF_ATTR_INT(ENUM, VALUE) \ 4072 built_in_attributes[(int) ENUM] = build_int_cst (NULL_TREE, VALUE); |
4274#define DEF_ATTR_IDENT(ENUM, STRING) \ 4275 built_in_attributes[(int) ENUM] = get_identifier (STRING); 4276#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \ 4277 built_in_attributes[(int) ENUM] \ 4278 = tree_cons (built_in_attributes[(int) PURPOSE], \ 4279 built_in_attributes[(int) VALUE], \ 4280 built_in_attributes[(int) CHAIN]); 4281#include "builtin-attrs.def" --- 4 unchanged lines hidden (view full) --- 4286} 4287 4288/* Attribute handlers common to C front ends. */ 4289 4290/* Handle a "packed" attribute; arguments as in 4291 struct attribute_spec.handler. */ 4292 4293static tree | 4073#define DEF_ATTR_IDENT(ENUM, STRING) \ 4074 built_in_attributes[(int) ENUM] = get_identifier (STRING); 4075#define DEF_ATTR_TREE_LIST(ENUM, PURPOSE, VALUE, CHAIN) \ 4076 built_in_attributes[(int) ENUM] \ 4077 = tree_cons (built_in_attributes[(int) PURPOSE], \ 4078 built_in_attributes[(int) VALUE], \ 4079 built_in_attributes[(int) CHAIN]); 4080#include "builtin-attrs.def" --- 4 unchanged lines hidden (view full) --- 4085} 4086 4087/* Attribute handlers common to C front ends. */ 4088 4089/* Handle a "packed" attribute; arguments as in 4090 struct attribute_spec.handler. */ 4091 4092static tree |
4294handle_packed_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, | 4093handle_packed_attribute (tree *node, tree name, tree ARG_UNUSED (args), |
4295 int flags, bool *no_add_attrs) 4296{ 4297 if (TYPE_P (*node)) 4298 { 4299 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) | 4094 int flags, bool *no_add_attrs) 4095{ 4096 if (TYPE_P (*node)) 4097 { 4098 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) |
4300 *node = build_type_copy (*node); | 4099 *node = build_variant_type_copy (*node); |
4301 TYPE_PACKED (*node) = 1; | 4100 TYPE_PACKED (*node) = 1; |
4302 if (TYPE_MAIN_VARIANT (*node) == *node) 4303 { 4304 /* If it is the main variant, then pack the other variants 4305 too. This happens in, 4306 4307 struct Foo { 4308 struct Foo const *ptr; // creates a variant w/o packed flag 4309 } __ attribute__((packed)); // packs it now. 4310 */ 4311 tree probe; 4312 4313 for (probe = *node; probe; probe = TYPE_NEXT_VARIANT (probe)) 4314 TYPE_PACKED (probe) = 1; 4315 } 4316 | |
4317 } 4318 else if (TREE_CODE (*node) == FIELD_DECL) | 4101 } 4102 else if (TREE_CODE (*node) == FIELD_DECL) |
4319 DECL_PACKED (*node) = 1; | 4103 { 4104 if (TYPE_ALIGN (TREE_TYPE (*node)) <= BITS_PER_UNIT) 4105 warning (OPT_Wattributes, 4106 "%qE attribute ignored for field of type %qT", 4107 name, TREE_TYPE (*node)); 4108 else 4109 DECL_PACKED (*node) = 1; 4110 } |
4320 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is 4321 used for DECL_REGISTER. It wouldn't mean anything anyway. 4322 We can't set DECL_PACKED on the type of a TYPE_DECL, because 4323 that changes what the typedef is typing. */ 4324 else 4325 { | 4111 /* We can't set DECL_PACKED for a VAR_DECL, because the bit is 4112 used for DECL_REGISTER. It wouldn't mean anything anyway. 4113 We can't set DECL_PACKED on the type of a TYPE_DECL, because 4114 that changes what the typedef is typing. */ 4115 else 4116 { |
4326 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4117 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4327 *no_add_attrs = true; 4328 } 4329 4330 return NULL_TREE; 4331} 4332 4333/* Handle a "nocommon" attribute; arguments as in 4334 struct attribute_spec.handler. */ 4335 4336static tree 4337handle_nocommon_attribute (tree *node, tree name, | 4118 *no_add_attrs = true; 4119 } 4120 4121 return NULL_TREE; 4122} 4123 4124/* Handle a "nocommon" attribute; arguments as in 4125 struct attribute_spec.handler. */ 4126 4127static tree 4128handle_nocommon_attribute (tree *node, tree name, |
4338 tree args ATTRIBUTE_UNUSED, 4339 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4129 tree ARG_UNUSED (args), 4130 int ARG_UNUSED (flags), bool *no_add_attrs) |
4340{ 4341 if (TREE_CODE (*node) == VAR_DECL) 4342 DECL_COMMON (*node) = 0; 4343 else 4344 { | 4131{ 4132 if (TREE_CODE (*node) == VAR_DECL) 4133 DECL_COMMON (*node) = 0; 4134 else 4135 { |
4345 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4136 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4346 *no_add_attrs = true; 4347 } 4348 4349 return NULL_TREE; 4350} 4351 4352/* Handle a "common" attribute; arguments as in 4353 struct attribute_spec.handler. */ 4354 4355static tree | 4137 *no_add_attrs = true; 4138 } 4139 4140 return NULL_TREE; 4141} 4142 4143/* Handle a "common" attribute; arguments as in 4144 struct attribute_spec.handler. */ 4145 4146static tree |
4356handle_common_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 4357 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4147handle_common_attribute (tree *node, tree name, tree ARG_UNUSED (args), 4148 int ARG_UNUSED (flags), bool *no_add_attrs) |
4358{ 4359 if (TREE_CODE (*node) == VAR_DECL) 4360 DECL_COMMON (*node) = 1; 4361 else 4362 { | 4149{ 4150 if (TREE_CODE (*node) == VAR_DECL) 4151 DECL_COMMON (*node) = 1; 4152 else 4153 { |
4363 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4154 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4364 *no_add_attrs = true; 4365 } 4366 4367 return NULL_TREE; 4368} 4369 4370/* Handle a "noreturn" attribute; arguments as in 4371 struct attribute_spec.handler. */ 4372 4373static tree | 4155 *no_add_attrs = true; 4156 } 4157 4158 return NULL_TREE; 4159} 4160 4161/* Handle a "noreturn" attribute; arguments as in 4162 struct attribute_spec.handler. */ 4163 4164static tree |
4374handle_noreturn_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 4375 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4165handle_noreturn_attribute (tree *node, tree name, tree ARG_UNUSED (args), 4166 int ARG_UNUSED (flags), bool *no_add_attrs) |
4376{ 4377 tree type = TREE_TYPE (*node); 4378 4379 /* See FIXME comment in c_common_attribute_table. */ 4380 if (TREE_CODE (*node) == FUNCTION_DECL) 4381 TREE_THIS_VOLATILE (*node) = 1; 4382 else if (TREE_CODE (type) == POINTER_TYPE 4383 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) 4384 TREE_TYPE (*node) 4385 = build_pointer_type 4386 (build_type_variant (TREE_TYPE (type), | 4167{ 4168 tree type = TREE_TYPE (*node); 4169 4170 /* See FIXME comment in c_common_attribute_table. */ 4171 if (TREE_CODE (*node) == FUNCTION_DECL) 4172 TREE_THIS_VOLATILE (*node) = 1; 4173 else if (TREE_CODE (type) == POINTER_TYPE 4174 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) 4175 TREE_TYPE (*node) 4176 = build_pointer_type 4177 (build_type_variant (TREE_TYPE (type), |
4387 TREE_READONLY (TREE_TYPE (type)), 1)); | 4178 TYPE_READONLY (TREE_TYPE (type)), 1)); |
4388 else 4389 { | 4179 else 4180 { |
4390 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4181 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4391 *no_add_attrs = true; 4392 } 4393 4394 return NULL_TREE; 4395} 4396 4397/* Handle a "noinline" attribute; arguments as in 4398 struct attribute_spec.handler. */ 4399 4400static tree 4401handle_noinline_attribute (tree *node, tree name, | 4182 *no_add_attrs = true; 4183 } 4184 4185 return NULL_TREE; 4186} 4187 4188/* Handle a "noinline" attribute; arguments as in 4189 struct attribute_spec.handler. */ 4190 4191static tree 4192handle_noinline_attribute (tree *node, tree name, |
4402 tree args ATTRIBUTE_UNUSED, 4403 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4193 tree ARG_UNUSED (args), 4194 int ARG_UNUSED (flags), bool *no_add_attrs) |
4404{ 4405 if (TREE_CODE (*node) == FUNCTION_DECL) 4406 DECL_UNINLINABLE (*node) = 1; 4407 else 4408 { | 4195{ 4196 if (TREE_CODE (*node) == FUNCTION_DECL) 4197 DECL_UNINLINABLE (*node) = 1; 4198 else 4199 { |
4409 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4200 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4410 *no_add_attrs = true; 4411 } 4412 4413 return NULL_TREE; 4414} 4415 4416/* Handle a "always_inline" attribute; arguments as in 4417 struct attribute_spec.handler. */ 4418 4419static tree 4420handle_always_inline_attribute (tree *node, tree name, | 4201 *no_add_attrs = true; 4202 } 4203 4204 return NULL_TREE; 4205} 4206 4207/* Handle a "always_inline" attribute; arguments as in 4208 struct attribute_spec.handler. */ 4209 4210static tree 4211handle_always_inline_attribute (tree *node, tree name, |
4421 tree args ATTRIBUTE_UNUSED, 4422 int flags ATTRIBUTE_UNUSED, | 4212 tree ARG_UNUSED (args), 4213 int ARG_UNUSED (flags), |
4423 bool *no_add_attrs) 4424{ 4425 if (TREE_CODE (*node) == FUNCTION_DECL) 4426 { 4427 /* Do nothing else, just set the attribute. We'll get at 4428 it later with lookup_attribute. */ 4429 } 4430 else 4431 { | 4214 bool *no_add_attrs) 4215{ 4216 if (TREE_CODE (*node) == FUNCTION_DECL) 4217 { 4218 /* Do nothing else, just set the attribute. We'll get at 4219 it later with lookup_attribute. */ 4220 } 4221 else 4222 { |
4432 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4223 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4433 *no_add_attrs = true; 4434 } 4435 4436 return NULL_TREE; 4437} 4438 | 4224 *no_add_attrs = true; 4225 } 4226 4227 return NULL_TREE; 4228} 4229 |
4230/* Handle a "gnu_inline" attribute; arguments as in 4231 struct attribute_spec.handler. */ 4232 4233static tree 4234handle_gnu_inline_attribute (tree *node, tree name, 4235 tree ARG_UNUSED (args), 4236 int ARG_UNUSED (flags), 4237 bool *no_add_attrs) 4238{ 4239 if (TREE_CODE (*node) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (*node)) 4240 { 4241 /* Do nothing else, just set the attribute. We'll get at 4242 it later with lookup_attribute. */ 4243 } 4244 else 4245 { 4246 warning (OPT_Wattributes, "%qE attribute ignored", name); 4247 *no_add_attrs = true; 4248 } 4249 4250 return NULL_TREE; 4251} 4252 4253/* Handle a "flatten" attribute; arguments as in 4254 struct attribute_spec.handler. */ 4255 4256static tree 4257handle_flatten_attribute (tree *node, tree name, 4258 tree args ATTRIBUTE_UNUSED, 4259 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) 4260{ 4261 if (TREE_CODE (*node) == FUNCTION_DECL) 4262 /* Do nothing else, just set the attribute. We'll get at 4263 it later with lookup_attribute. */ 4264 ; 4265 else 4266 { 4267 warning (OPT_Wattributes, "%qE attribute ignored", name); 4268 *no_add_attrs = true; 4269 } 4270 4271 return NULL_TREE; 4272} 4273 4274 |
|
4439/* Handle a "used" attribute; arguments as in 4440 struct attribute_spec.handler. */ 4441 4442static tree | 4275/* Handle a "used" attribute; arguments as in 4276 struct attribute_spec.handler. */ 4277 4278static tree |
4443handle_used_attribute (tree *pnode, tree name, tree args ATTRIBUTE_UNUSED, 4444 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4279handle_used_attribute (tree *pnode, tree name, tree ARG_UNUSED (args), 4280 int ARG_UNUSED (flags), bool *no_add_attrs) |
4445{ 4446 tree node = *pnode; 4447 4448 if (TREE_CODE (node) == FUNCTION_DECL 4449 || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node))) 4450 { 4451 TREE_USED (node) = 1; | 4281{ 4282 tree node = *pnode; 4283 4284 if (TREE_CODE (node) == FUNCTION_DECL 4285 || (TREE_CODE (node) == VAR_DECL && TREE_STATIC (node))) 4286 { 4287 TREE_USED (node) = 1; |
4288 DECL_PRESERVE_P (node) = 1; |
|
4452 } 4453 else 4454 { | 4289 } 4290 else 4291 { |
4455 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4292 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4456 *no_add_attrs = true; 4457 } 4458 4459 return NULL_TREE; 4460} 4461 4462/* Handle a "unused" attribute; arguments as in 4463 struct attribute_spec.handler. */ 4464 4465static tree | 4293 *no_add_attrs = true; 4294 } 4295 4296 return NULL_TREE; 4297} 4298 4299/* Handle a "unused" attribute; arguments as in 4300 struct attribute_spec.handler. */ 4301 4302static tree |
4466handle_unused_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 4467 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4303handle_unused_attribute (tree *node, tree name, tree ARG_UNUSED (args), 4304 int flags, bool *no_add_attrs) |
4468{ 4469 if (DECL_P (*node)) 4470 { 4471 tree decl = *node; 4472 4473 if (TREE_CODE (decl) == PARM_DECL 4474 || TREE_CODE (decl) == VAR_DECL 4475 || TREE_CODE (decl) == FUNCTION_DECL 4476 || TREE_CODE (decl) == LABEL_DECL 4477 || TREE_CODE (decl) == TYPE_DECL) 4478 TREE_USED (decl) = 1; 4479 else 4480 { | 4305{ 4306 if (DECL_P (*node)) 4307 { 4308 tree decl = *node; 4309 4310 if (TREE_CODE (decl) == PARM_DECL 4311 || TREE_CODE (decl) == VAR_DECL 4312 || TREE_CODE (decl) == FUNCTION_DECL 4313 || TREE_CODE (decl) == LABEL_DECL 4314 || TREE_CODE (decl) == TYPE_DECL) 4315 TREE_USED (decl) = 1; 4316 else 4317 { |
4481 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4318 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4482 *no_add_attrs = true; 4483 } 4484 } 4485 else 4486 { 4487 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) | 4319 *no_add_attrs = true; 4320 } 4321 } 4322 else 4323 { 4324 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) |
4488 *node = build_type_copy (*node); | 4325 *node = build_variant_type_copy (*node); |
4489 TREE_USED (*node) = 1; 4490 } 4491 4492 return NULL_TREE; 4493} 4494 | 4326 TREE_USED (*node) = 1; 4327 } 4328 4329 return NULL_TREE; 4330} 4331 |
4332/* Handle a "externally_visible" attribute; arguments as in 4333 struct attribute_spec.handler. */ 4334 4335static tree 4336handle_externally_visible_attribute (tree *pnode, tree name, 4337 tree ARG_UNUSED (args), 4338 int ARG_UNUSED (flags), 4339 bool *no_add_attrs) 4340{ 4341 tree node = *pnode; 4342 4343 if (TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL) 4344 { 4345 if ((!TREE_STATIC (node) && TREE_CODE (node) != FUNCTION_DECL 4346 && !DECL_EXTERNAL (node)) || !TREE_PUBLIC (node)) 4347 { 4348 warning (OPT_Wattributes, 4349 "%qE attribute have effect only on public objects", name); 4350 *no_add_attrs = true; 4351 } 4352 } 4353 else 4354 { 4355 warning (OPT_Wattributes, "%qE attribute ignored", name); 4356 *no_add_attrs = true; 4357 } 4358 4359 return NULL_TREE; 4360} 4361 |
|
4495/* Handle a "const" attribute; arguments as in 4496 struct attribute_spec.handler. */ 4497 4498static tree | 4362/* Handle a "const" attribute; arguments as in 4363 struct attribute_spec.handler. */ 4364 4365static tree |
4499handle_const_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 4500 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4366handle_const_attribute (tree *node, tree name, tree ARG_UNUSED (args), 4367 int ARG_UNUSED (flags), bool *no_add_attrs) |
4501{ 4502 tree type = TREE_TYPE (*node); 4503 4504 /* See FIXME comment on noreturn in c_common_attribute_table. */ 4505 if (TREE_CODE (*node) == FUNCTION_DECL) 4506 TREE_READONLY (*node) = 1; 4507 else if (TREE_CODE (type) == POINTER_TYPE 4508 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) 4509 TREE_TYPE (*node) 4510 = build_pointer_type 4511 (build_type_variant (TREE_TYPE (type), 1, 4512 TREE_THIS_VOLATILE (TREE_TYPE (type)))); 4513 else 4514 { | 4368{ 4369 tree type = TREE_TYPE (*node); 4370 4371 /* See FIXME comment on noreturn in c_common_attribute_table. */ 4372 if (TREE_CODE (*node) == FUNCTION_DECL) 4373 TREE_READONLY (*node) = 1; 4374 else if (TREE_CODE (type) == POINTER_TYPE 4375 && TREE_CODE (TREE_TYPE (type)) == FUNCTION_TYPE) 4376 TREE_TYPE (*node) 4377 = build_pointer_type 4378 (build_type_variant (TREE_TYPE (type), 1, 4379 TREE_THIS_VOLATILE (TREE_TYPE (type)))); 4380 else 4381 { |
4515 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4382 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4516 *no_add_attrs = true; 4517 } 4518 4519 return NULL_TREE; 4520} 4521 4522/* Handle a "transparent_union" attribute; arguments as in 4523 struct attribute_spec.handler. */ 4524 4525static tree 4526handle_transparent_union_attribute (tree *node, tree name, | 4383 *no_add_attrs = true; 4384 } 4385 4386 return NULL_TREE; 4387} 4388 4389/* Handle a "transparent_union" attribute; arguments as in 4390 struct attribute_spec.handler. */ 4391 4392static tree 4393handle_transparent_union_attribute (tree *node, tree name, |
4527 tree args ATTRIBUTE_UNUSED, int flags, | 4394 tree ARG_UNUSED (args), int flags, |
4528 bool *no_add_attrs) 4529{ | 4395 bool *no_add_attrs) 4396{ |
4530 tree decl = NULL_TREE; 4531 tree *type = NULL; 4532 int is_type = 0; | 4397 tree type = NULL; |
4533 | 4398 |
4399 *no_add_attrs = true; 4400 |
|
4534 if (DECL_P (*node)) 4535 { | 4401 if (DECL_P (*node)) 4402 { |
4536 decl = *node; 4537 type = &TREE_TYPE (decl); 4538 is_type = TREE_CODE (*node) == TYPE_DECL; | 4403 if (TREE_CODE (*node) != TYPE_DECL) 4404 goto ignored; 4405 node = &TREE_TYPE (*node); 4406 type = *node; |
4539 } 4540 else if (TYPE_P (*node)) | 4407 } 4408 else if (TYPE_P (*node)) |
4541 type = node, is_type = 1; | 4409 type = *node; 4410 else 4411 goto ignored; |
4542 | 4412 |
4543 if (is_type 4544 && TREE_CODE (*type) == UNION_TYPE 4545 && (decl == 0 4546 || (TYPE_FIELDS (*type) != 0 4547 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type))))) | 4413 if (TREE_CODE (type) == UNION_TYPE) |
4548 { | 4414 { |
4415 /* When IN_PLACE is set, leave the check for FIELDS and MODE to 4416 the code in finish_struct. */ |
|
4549 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) | 4417 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) |
4550 *type = build_type_copy (*type); 4551 TYPE_TRANSPARENT_UNION (*type) = 1; | 4418 { 4419 if (TYPE_FIELDS (type) == NULL_TREE 4420 || TYPE_MODE (type) != DECL_MODE (TYPE_FIELDS (type))) 4421 goto ignored; 4422 4423 /* A type variant isn't good enough, since we don't a cast 4424 to such a type removed as a no-op. */ 4425 *node = type = build_duplicate_type (type); 4426 } 4427 4428 TYPE_TRANSPARENT_UNION (type) = 1; 4429 return NULL_TREE; |
4552 } | 4430 } |
4553 else if (decl != 0 && TREE_CODE (decl) == PARM_DECL 4554 && TREE_CODE (*type) == UNION_TYPE 4555 && TYPE_MODE (*type) == DECL_MODE (TYPE_FIELDS (*type))) 4556 DECL_TRANSPARENT_UNION (decl) = 1; 4557 else 4558 { 4559 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); 4560 *no_add_attrs = true; 4561 } | |
4562 | 4431 |
4432 ignored: 4433 warning (OPT_Wattributes, "%qE attribute ignored", name); |
|
4563 return NULL_TREE; 4564} 4565 4566/* Handle a "constructor" attribute; arguments as in 4567 struct attribute_spec.handler. */ 4568 4569static tree 4570handle_constructor_attribute (tree *node, tree name, | 4434 return NULL_TREE; 4435} 4436 4437/* Handle a "constructor" attribute; arguments as in 4438 struct attribute_spec.handler. */ 4439 4440static tree 4441handle_constructor_attribute (tree *node, tree name, |
4571 tree args ATTRIBUTE_UNUSED, 4572 int flags ATTRIBUTE_UNUSED, | 4442 tree ARG_UNUSED (args), 4443 int ARG_UNUSED (flags), |
4573 bool *no_add_attrs) 4574{ 4575 tree decl = *node; 4576 tree type = TREE_TYPE (decl); 4577 4578 if (TREE_CODE (decl) == FUNCTION_DECL 4579 && TREE_CODE (type) == FUNCTION_TYPE 4580 && decl_function_context (decl) == 0) 4581 { 4582 DECL_STATIC_CONSTRUCTOR (decl) = 1; 4583 TREE_USED (decl) = 1; 4584 } 4585 else 4586 { | 4444 bool *no_add_attrs) 4445{ 4446 tree decl = *node; 4447 tree type = TREE_TYPE (decl); 4448 4449 if (TREE_CODE (decl) == FUNCTION_DECL 4450 && TREE_CODE (type) == FUNCTION_TYPE 4451 && decl_function_context (decl) == 0) 4452 { 4453 DECL_STATIC_CONSTRUCTOR (decl) = 1; 4454 TREE_USED (decl) = 1; 4455 } 4456 else 4457 { |
4587 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4458 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4588 *no_add_attrs = true; 4589 } 4590 4591 return NULL_TREE; 4592} 4593 4594/* Handle a "destructor" attribute; arguments as in 4595 struct attribute_spec.handler. */ 4596 4597static tree 4598handle_destructor_attribute (tree *node, tree name, | 4459 *no_add_attrs = true; 4460 } 4461 4462 return NULL_TREE; 4463} 4464 4465/* Handle a "destructor" attribute; arguments as in 4466 struct attribute_spec.handler. */ 4467 4468static tree 4469handle_destructor_attribute (tree *node, tree name, |
4599 tree args ATTRIBUTE_UNUSED, 4600 int flags ATTRIBUTE_UNUSED, | 4470 tree ARG_UNUSED (args), 4471 int ARG_UNUSED (flags), |
4601 bool *no_add_attrs) 4602{ 4603 tree decl = *node; 4604 tree type = TREE_TYPE (decl); 4605 4606 if (TREE_CODE (decl) == FUNCTION_DECL 4607 && TREE_CODE (type) == FUNCTION_TYPE 4608 && decl_function_context (decl) == 0) 4609 { 4610 DECL_STATIC_DESTRUCTOR (decl) = 1; 4611 TREE_USED (decl) = 1; 4612 } 4613 else 4614 { | 4472 bool *no_add_attrs) 4473{ 4474 tree decl = *node; 4475 tree type = TREE_TYPE (decl); 4476 4477 if (TREE_CODE (decl) == FUNCTION_DECL 4478 && TREE_CODE (type) == FUNCTION_TYPE 4479 && decl_function_context (decl) == 0) 4480 { 4481 DECL_STATIC_DESTRUCTOR (decl) = 1; 4482 TREE_USED (decl) = 1; 4483 } 4484 else 4485 { |
4615 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4486 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4616 *no_add_attrs = true; 4617 } 4618 4619 return NULL_TREE; 4620} 4621 4622/* Handle a "mode" attribute; arguments as in 4623 struct attribute_spec.handler. */ 4624 4625static tree | 4487 *no_add_attrs = true; 4488 } 4489 4490 return NULL_TREE; 4491} 4492 4493/* Handle a "mode" attribute; arguments as in 4494 struct attribute_spec.handler. */ 4495 4496static tree |
4626handle_mode_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 4627 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4497handle_mode_attribute (tree *node, tree name, tree args, 4498 int ARG_UNUSED (flags), bool *no_add_attrs) |
4628{ 4629 tree type = *node; 4630 4631 *no_add_attrs = true; 4632 4633 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE) | 4499{ 4500 tree type = *node; 4501 4502 *no_add_attrs = true; 4503 4504 if (TREE_CODE (TREE_VALUE (args)) != IDENTIFIER_NODE) |
4634 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4505 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4635 else 4636 { 4637 int j; 4638 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args)); 4639 int len = strlen (p); 4640 enum machine_mode mode = VOIDmode; 4641 tree typefm; | 4506 else 4507 { 4508 int j; 4509 const char *p = IDENTIFIER_POINTER (TREE_VALUE (args)); 4510 int len = strlen (p); 4511 enum machine_mode mode = VOIDmode; 4512 tree typefm; |
4642 tree ptr_type; | 4513 bool valid_mode; |
4643 4644 if (len > 4 && p[0] == '_' && p[1] == '_' 4645 && p[len - 1] == '_' && p[len - 2] == '_') 4646 { | 4514 4515 if (len > 4 && p[0] == '_' && p[1] == '_' 4516 && p[len - 1] == '_' && p[len - 2] == '_') 4517 { |
4647 char *newp = alloca (len - 1); | 4518 char *newp = (char *) alloca (len - 1); |
4648 4649 strcpy (newp, &p[2]); 4650 newp[len - 4] = '\0'; 4651 p = newp; 4652 } 4653 4654 /* Change this type to have a type with the specified mode. 4655 First check for the special modes. */ | 4519 4520 strcpy (newp, &p[2]); 4521 newp[len - 4] = '\0'; 4522 p = newp; 4523 } 4524 4525 /* Change this type to have a type with the specified mode. 4526 First check for the special modes. */ |
4656 if (! strcmp (p, "byte")) | 4527 if (!strcmp (p, "byte")) |
4657 mode = byte_mode; 4658 else if (!strcmp (p, "word")) 4659 mode = word_mode; | 4528 mode = byte_mode; 4529 else if (!strcmp (p, "word")) 4530 mode = word_mode; |
4660 else if (! strcmp (p, "pointer")) | 4531 else if (!strcmp (p, "pointer")) |
4661 mode = ptr_mode; 4662 else 4663 for (j = 0; j < NUM_MACHINE_MODES; j++) 4664 if (!strcmp (p, GET_MODE_NAME (j))) 4665 { 4666 mode = (enum machine_mode) j; 4667 break; 4668 } 4669 4670 if (mode == VOIDmode) | 4532 mode = ptr_mode; 4533 else 4534 for (j = 0; j < NUM_MACHINE_MODES; j++) 4535 if (!strcmp (p, GET_MODE_NAME (j))) 4536 { 4537 mode = (enum machine_mode) j; 4538 break; 4539 } 4540 4541 if (mode == VOIDmode) |
4671 error ("unknown machine mode `%s'", p); 4672 else if (0 == (typefm = (*lang_hooks.types.type_for_mode) 4673 (mode, TREE_UNSIGNED (type)))) 4674 error ("no data type for mode `%s'", p); 4675 else if ((TREE_CODE (type) == POINTER_TYPE 4676 || TREE_CODE (type) == REFERENCE_TYPE) 4677 && !(*targetm.valid_pointer_mode) (mode)) 4678 error ("invalid pointer mode `%s'", p); 4679 else | |
4680 { | 4542 { |
4681 /* If this is a vector, make sure we either have hardware 4682 support, or we can emulate it. */ 4683 if (VECTOR_MODE_P (mode) && !vector_mode_valid_p (mode)) | 4543 error ("unknown machine mode %qs", p); 4544 return NULL_TREE; 4545 } 4546 4547 valid_mode = false; 4548 switch (GET_MODE_CLASS (mode)) 4549 { 4550 case MODE_INT: 4551 case MODE_PARTIAL_INT: 4552 case MODE_FLOAT: 4553 case MODE_DECIMAL_FLOAT: 4554 valid_mode = targetm.scalar_mode_supported_p (mode); 4555 break; 4556 4557 case MODE_COMPLEX_INT: 4558 case MODE_COMPLEX_FLOAT: 4559 valid_mode = targetm.scalar_mode_supported_p (GET_MODE_INNER (mode)); 4560 break; 4561 4562 case MODE_VECTOR_INT: 4563 case MODE_VECTOR_FLOAT: 4564 warning (OPT_Wattributes, "specifying vector types with " 4565 "__attribute__ ((mode)) is deprecated"); 4566 warning (OPT_Wattributes, 4567 "use __attribute__ ((vector_size)) instead"); 4568 valid_mode = vector_mode_valid_p (mode); 4569 break; 4570 4571 default: 4572 break; 4573 } 4574 if (!valid_mode) 4575 { 4576 error ("unable to emulate %qs", p); 4577 return NULL_TREE; 4578 } 4579 4580 if (POINTER_TYPE_P (type)) 4581 { 4582 tree (*fn)(tree, enum machine_mode, bool); 4583 4584 if (!targetm.valid_pointer_mode (mode)) |
4684 { | 4585 { |
4685 error ("unable to emulate '%s'", GET_MODE_NAME (mode)); | 4586 error ("invalid pointer mode %qs", p); |
4686 return NULL_TREE; 4687 } 4688 4689 if (TREE_CODE (type) == POINTER_TYPE) | 4587 return NULL_TREE; 4588 } 4589 4590 if (TREE_CODE (type) == POINTER_TYPE) |
4591 fn = build_pointer_type_for_mode; 4592 else 4593 fn = build_reference_type_for_mode; 4594 typefm = fn (TREE_TYPE (type), mode, false); 4595 } 4596 else 4597 typefm = lang_hooks.types.type_for_mode (mode, TYPE_UNSIGNED (type)); 4598 4599 if (typefm == NULL_TREE) 4600 { 4601 error ("no data type for mode %qs", p); 4602 return NULL_TREE; 4603 } 4604 else if (TREE_CODE (type) == ENUMERAL_TYPE) 4605 { 4606 /* For enumeral types, copy the precision from the integer 4607 type returned above. If not an INTEGER_TYPE, we can't use 4608 this mode for this type. */ 4609 if (TREE_CODE (typefm) != INTEGER_TYPE) |
|
4690 { | 4610 { |
4691 ptr_type = build_pointer_type_for_mode (TREE_TYPE (type), 4692 mode); 4693 *node = ptr_type; | 4611 error ("cannot use mode %qs for enumeral types", p); 4612 return NULL_TREE; |
4694 } | 4613 } |
4695 else if (TREE_CODE (type) == REFERENCE_TYPE) 4696 { 4697 ptr_type = build_reference_type_for_mode (TREE_TYPE (type), 4698 mode); 4699 *node = ptr_type; 4700 } 4701 else if (TREE_CODE (type) == ENUMERAL_TYPE) 4702 { 4703 /* For enumeral types, copy the precision from the integer 4704 type returned above. If not an INTEGER_TYPE, we can't use 4705 this mode for this type. */ 4706 if (TREE_CODE (typefm) != INTEGER_TYPE) 4707 { 4708 error ("cannot use mode %qs for enumeral types", p); 4709 return NULL_TREE; 4710 } | |
4711 | 4614 |
4712 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) 4713 type = build_type_copy (type); 4714 4715 /* We cannot use layout_type here, because that will attempt 4716 to re-layout all variants, corrupting our original. */ | 4615 if (flags & ATTR_FLAG_TYPE_IN_PLACE) 4616 { |
4717 TYPE_PRECISION (type) = TYPE_PRECISION (typefm); | 4617 TYPE_PRECISION (type) = TYPE_PRECISION (typefm); |
4718 TYPE_MIN_VALUE (type) = TYPE_MIN_VALUE (typefm); 4719 TYPE_MAX_VALUE (type) = TYPE_MAX_VALUE (typefm); 4720 TYPE_SIZE (type) = TYPE_SIZE (typefm); 4721 TYPE_SIZE_UNIT (type) = TYPE_SIZE_UNIT (typefm); 4722 TYPE_MODE (type) = TYPE_MODE (typefm); 4723 if (!TYPE_USER_ALIGN (type)) 4724 TYPE_ALIGN (type) = TYPE_ALIGN (typefm); 4725 4726 *node = type; | 4618 typefm = type; |
4727 } | 4619 } |
4728 else if (VECTOR_MODE_P (mode) 4729 ? TREE_CODE (type) != TREE_CODE (TREE_TYPE (typefm)) 4730 : TREE_CODE (type) != TREE_CODE (typefm)) 4731 | 4620 else |
4732 { | 4621 { |
4733 error ("mode `%s' applied to inappropriate type", p); 4734 return NULL_TREE; | 4622 /* We cannot build a type variant, as there's code that assumes 4623 that TYPE_MAIN_VARIANT has the same mode. This includes the 4624 debug generators. Instead, create a subrange type. This 4625 results in all of the enumeral values being emitted only once 4626 in the original, and the subtype gets them by reference. */ 4627 if (TYPE_UNSIGNED (type)) 4628 typefm = make_unsigned_type (TYPE_PRECISION (typefm)); 4629 else 4630 typefm = make_signed_type (TYPE_PRECISION (typefm)); 4631 TREE_TYPE (typefm) = type; |
4735 } | 4632 } |
4736 else 4737 *node = typefm; 4738 4739 /* No need to layout the type here. The caller should do this. */ | |
4740 } | 4633 } |
4634 else if (VECTOR_MODE_P (mode) 4635 ? TREE_CODE (type) != TREE_CODE (TREE_TYPE (typefm)) 4636 : TREE_CODE (type) != TREE_CODE (typefm)) 4637 { 4638 error ("mode %qs applied to inappropriate type", p); 4639 return NULL_TREE; 4640 } 4641 4642 *node = typefm; |
|
4741 } 4742 4743 return NULL_TREE; 4744} 4745 4746/* Handle a "section" attribute; arguments as in 4747 struct attribute_spec.handler. */ 4748 4749static tree | 4643 } 4644 4645 return NULL_TREE; 4646} 4647 4648/* Handle a "section" attribute; arguments as in 4649 struct attribute_spec.handler. */ 4650 4651static tree |
4750handle_section_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args, 4751 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4652handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args, 4653 int ARG_UNUSED (flags), bool *no_add_attrs) |
4752{ 4753 tree decl = *node; 4754 4755 if (targetm.have_named_sections) 4756 { | 4654{ 4655 tree decl = *node; 4656 4657 if (targetm.have_named_sections) 4658 { |
4659 user_defined_section_attribute = true; 4660 |
|
4757 if ((TREE_CODE (decl) == FUNCTION_DECL 4758 || TREE_CODE (decl) == VAR_DECL) 4759 && TREE_CODE (TREE_VALUE (args)) == STRING_CST) 4760 { 4761 if (TREE_CODE (decl) == VAR_DECL 4762 && current_function_decl != NULL_TREE | 4661 if ((TREE_CODE (decl) == FUNCTION_DECL 4662 || TREE_CODE (decl) == VAR_DECL) 4663 && TREE_CODE (TREE_VALUE (args)) == STRING_CST) 4664 { 4665 if (TREE_CODE (decl) == VAR_DECL 4666 && current_function_decl != NULL_TREE |
4763 && ! TREE_STATIC (decl)) | 4667 && !TREE_STATIC (decl)) |
4764 { 4765 error ("%Jsection attribute cannot be specified for " | 4668 { 4669 error ("%Jsection attribute cannot be specified for " |
4766 "local variables", decl); | 4670 "local variables", decl); |
4767 *no_add_attrs = true; 4768 } 4769 4770 /* The decl may have already been given a section attribute 4771 from a previous declaration. Ensure they match. */ 4772 else if (DECL_SECTION_NAME (decl) != NULL_TREE 4773 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), 4774 TREE_STRING_POINTER (TREE_VALUE (args))) != 0) 4775 { | 4671 *no_add_attrs = true; 4672 } 4673 4674 /* The decl may have already been given a section attribute 4675 from a previous declaration. Ensure they match. */ 4676 else if (DECL_SECTION_NAME (decl) != NULL_TREE 4677 && strcmp (TREE_STRING_POINTER (DECL_SECTION_NAME (decl)), 4678 TREE_STRING_POINTER (TREE_VALUE (args))) != 0) 4679 { |
4776 error ("%Jsection of '%D' conflicts with previous declaration", 4777 *node, *node); | 4680 error ("section of %q+D conflicts with previous declaration", 4681 *node); |
4778 *no_add_attrs = true; 4779 } 4780 else 4781 DECL_SECTION_NAME (decl) = TREE_VALUE (args); 4782 } 4783 else 4784 { | 4682 *no_add_attrs = true; 4683 } 4684 else 4685 DECL_SECTION_NAME (decl) = TREE_VALUE (args); 4686 } 4687 else 4688 { |
4785 error ("%Jsection attribute not allowed for '%D'", *node, *node); | 4689 error ("section attribute not allowed for %q+D", *node); |
4786 *no_add_attrs = true; 4787 } 4788 } 4789 else 4790 { 4791 error ("%Jsection attributes are not supported for this target", *node); 4792 *no_add_attrs = true; 4793 } 4794 4795 return NULL_TREE; 4796} 4797 4798/* Handle a "aligned" attribute; arguments as in 4799 struct attribute_spec.handler. */ 4800 4801static tree | 4690 *no_add_attrs = true; 4691 } 4692 } 4693 else 4694 { 4695 error ("%Jsection attributes are not supported for this target", *node); 4696 *no_add_attrs = true; 4697 } 4698 4699 return NULL_TREE; 4700} 4701 4702/* Handle a "aligned" attribute; arguments as in 4703 struct attribute_spec.handler. */ 4704 4705static tree |
4802handle_aligned_attribute (tree *node, tree name ATTRIBUTE_UNUSED, tree args, | 4706handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args, |
4803 int flags, bool *no_add_attrs) 4804{ 4805 tree decl = NULL_TREE; 4806 tree *type = NULL; 4807 int is_type = 0; 4808 tree align_expr = (args ? TREE_VALUE (args) 4809 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); 4810 int i; 4811 4812 if (DECL_P (*node)) 4813 { 4814 decl = *node; 4815 type = &TREE_TYPE (decl); 4816 is_type = TREE_CODE (*node) == TYPE_DECL; 4817 } 4818 else if (TYPE_P (*node)) 4819 type = node, is_type = 1; 4820 | 4707 int flags, bool *no_add_attrs) 4708{ 4709 tree decl = NULL_TREE; 4710 tree *type = NULL; 4711 int is_type = 0; 4712 tree align_expr = (args ? TREE_VALUE (args) 4713 : size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); 4714 int i; 4715 4716 if (DECL_P (*node)) 4717 { 4718 decl = *node; 4719 type = &TREE_TYPE (decl); 4720 is_type = TREE_CODE (*node) == TYPE_DECL; 4721 } 4722 else if (TYPE_P (*node)) 4723 type = node, is_type = 1; 4724 |
4821 /* Strip any NOPs of any kind. */ 4822 while (TREE_CODE (align_expr) == NOP_EXPR 4823 || TREE_CODE (align_expr) == CONVERT_EXPR 4824 || TREE_CODE (align_expr) == NON_LVALUE_EXPR) 4825 align_expr = TREE_OPERAND (align_expr, 0); 4826 | |
4827 if (TREE_CODE (align_expr) != INTEGER_CST) 4828 { 4829 error ("requested alignment is not a constant"); 4830 *no_add_attrs = true; 4831 } 4832 else if ((i = tree_log2 (align_expr)) == -1) 4833 { 4834 error ("requested alignment is not a power of 2"); --- 7 unchanged lines hidden (view full) --- 4842 else if (is_type) 4843 { 4844 /* If we have a TYPE_DECL, then copy the type, so that we 4845 don't accidentally modify a builtin type. See pushdecl. */ 4846 if (decl && TREE_TYPE (decl) != error_mark_node 4847 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE) 4848 { 4849 tree tt = TREE_TYPE (decl); | 4725 if (TREE_CODE (align_expr) != INTEGER_CST) 4726 { 4727 error ("requested alignment is not a constant"); 4728 *no_add_attrs = true; 4729 } 4730 else if ((i = tree_log2 (align_expr)) == -1) 4731 { 4732 error ("requested alignment is not a power of 2"); --- 7 unchanged lines hidden (view full) --- 4740 else if (is_type) 4741 { 4742 /* If we have a TYPE_DECL, then copy the type, so that we 4743 don't accidentally modify a builtin type. See pushdecl. */ 4744 if (decl && TREE_TYPE (decl) != error_mark_node 4745 && DECL_ORIGINAL_TYPE (decl) == NULL_TREE) 4746 { 4747 tree tt = TREE_TYPE (decl); |
4850 *type = build_type_copy (*type); | 4748 *type = build_variant_type_copy (*type); |
4851 DECL_ORIGINAL_TYPE (decl) = tt; 4852 TYPE_NAME (*type) = decl; 4853 TREE_USED (*type) = TREE_USED (decl); 4854 TREE_TYPE (decl) = *type; 4855 } 4856 else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) | 4749 DECL_ORIGINAL_TYPE (decl) = tt; 4750 TYPE_NAME (*type) = decl; 4751 TREE_USED (*type) = TREE_USED (decl); 4752 TREE_TYPE (decl) = *type; 4753 } 4754 else if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) |
4857 *type = build_type_copy (*type); | 4755 *type = build_variant_type_copy (*type); |
4858 4859 TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT; 4860 TYPE_USER_ALIGN (*type) = 1; 4861 } 4862 else if (TREE_CODE (decl) != VAR_DECL 4863 && TREE_CODE (decl) != FIELD_DECL) 4864 { | 4756 4757 TYPE_ALIGN (*type) = (1 << i) * BITS_PER_UNIT; 4758 TYPE_USER_ALIGN (*type) = 1; 4759 } 4760 else if (TREE_CODE (decl) != VAR_DECL 4761 && TREE_CODE (decl) != FIELD_DECL) 4762 { |
4865 error ("%Jalignment may not be specified for '%D'", decl, decl); | 4763 error ("alignment may not be specified for %q+D", decl); |
4866 *no_add_attrs = true; 4867 } 4868 else 4869 { 4870 DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT; 4871 DECL_USER_ALIGN (decl) = 1; 4872 } 4873 4874 return NULL_TREE; 4875} 4876 4877/* Handle a "weak" attribute; arguments as in 4878 struct attribute_spec.handler. */ 4879 4880static tree | 4764 *no_add_attrs = true; 4765 } 4766 else 4767 { 4768 DECL_ALIGN (decl) = (1 << i) * BITS_PER_UNIT; 4769 DECL_USER_ALIGN (decl) = 1; 4770 } 4771 4772 return NULL_TREE; 4773} 4774 4775/* Handle a "weak" attribute; arguments as in 4776 struct attribute_spec.handler. */ 4777 4778static tree |
4881handle_weak_attribute (tree *node, tree name ATTRIBUTE_UNUSED, 4882 tree args ATTRIBUTE_UNUSED, 4883 int flags ATTRIBUTE_UNUSED, 4884 bool *no_add_attrs ATTRIBUTE_UNUSED) | 4779handle_weak_attribute (tree *node, tree name, 4780 tree ARG_UNUSED (args), 4781 int ARG_UNUSED (flags), 4782 bool * ARG_UNUSED (no_add_attrs)) |
4885{ | 4783{ |
4886 declare_weak (*node); | 4784 if (TREE_CODE (*node) == FUNCTION_DECL 4785 || TREE_CODE (*node) == VAR_DECL) 4786 declare_weak (*node); 4787 else 4788 warning (OPT_Wattributes, "%qE attribute ignored", name); 4789 |
4887 4888 return NULL_TREE; 4889} 4890 4891/* Handle an "alias" attribute; arguments as in 4892 struct attribute_spec.handler. */ 4893 4894static tree 4895handle_alias_attribute (tree *node, tree name, tree args, | 4790 4791 return NULL_TREE; 4792} 4793 4794/* Handle an "alias" attribute; arguments as in 4795 struct attribute_spec.handler. */ 4796 4797static tree 4798handle_alias_attribute (tree *node, tree name, tree args, |
4896 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 4799 int ARG_UNUSED (flags), bool *no_add_attrs) |
4897{ 4898 tree decl = *node; 4899 4900 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl)) | 4800{ 4801 tree decl = *node; 4802 4803 if ((TREE_CODE (decl) == FUNCTION_DECL && DECL_INITIAL (decl)) |
4901 || (TREE_CODE (decl) != FUNCTION_DECL && ! DECL_EXTERNAL (decl))) | 4804 || (TREE_CODE (decl) != FUNCTION_DECL 4805 && TREE_PUBLIC (decl) && !DECL_EXTERNAL (decl)) 4806 /* A static variable declaration is always a tentative definition, 4807 but the alias is a non-tentative definition which overrides. */ 4808 || (TREE_CODE (decl) != FUNCTION_DECL 4809 && ! TREE_PUBLIC (decl) && DECL_INITIAL (decl))) |
4902 { | 4810 { |
4903 error ("%J'%D' defined both normally and as an alias", decl, decl); | 4811 error ("%q+D defined both normally and as an alias", decl); |
4904 *no_add_attrs = true; 4905 } | 4812 *no_add_attrs = true; 4813 } |
4906 else if (decl_function_context (decl) == 0) | 4814 4815 /* Note that the very first time we process a nested declaration, 4816 decl_function_context will not be set. Indeed, *would* never 4817 be set except for the DECL_INITIAL/DECL_EXTERNAL frobbery that 4818 we do below. After such frobbery, pushdecl would set the context. 4819 In any case, this is never what we want. */ 4820 else if (decl_function_context (decl) == 0 && current_function_decl == NULL) |
4907 { 4908 tree id; 4909 4910 id = TREE_VALUE (args); 4911 if (TREE_CODE (id) != STRING_CST) 4912 { | 4821 { 4822 tree id; 4823 4824 id = TREE_VALUE (args); 4825 if (TREE_CODE (id) != STRING_CST) 4826 { |
4913 error ("alias arg not a string"); | 4827 error ("alias argument not a string"); |
4914 *no_add_attrs = true; 4915 return NULL_TREE; 4916 } 4917 id = get_identifier (TREE_STRING_POINTER (id)); 4918 /* This counts as a use of the object pointed to. */ 4919 TREE_USED (id) = 1; 4920 4921 if (TREE_CODE (decl) == FUNCTION_DECL) 4922 DECL_INITIAL (decl) = error_mark_node; 4923 else | 4828 *no_add_attrs = true; 4829 return NULL_TREE; 4830 } 4831 id = get_identifier (TREE_STRING_POINTER (id)); 4832 /* This counts as a use of the object pointed to. */ 4833 TREE_USED (id) = 1; 4834 4835 if (TREE_CODE (decl) == FUNCTION_DECL) 4836 DECL_INITIAL (decl) = error_mark_node; 4837 else |
4924 DECL_EXTERNAL (decl) = 0; | 4838 { 4839 if (lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))) 4840 DECL_EXTERNAL (decl) = 1; 4841 else 4842 DECL_EXTERNAL (decl) = 0; 4843 TREE_STATIC (decl) = 1; 4844 } |
4925 } 4926 else 4927 { | 4845 } 4846 else 4847 { |
4928 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4848 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4929 *no_add_attrs = true; 4930 } 4931 4932 return NULL_TREE; 4933} 4934 | 4849 *no_add_attrs = true; 4850 } 4851 4852 return NULL_TREE; 4853} 4854 |
4855/* Handle a "weakref" attribute; arguments as in struct 4856 attribute_spec.handler. */ 4857 4858static tree 4859handle_weakref_attribute (tree *node, tree ARG_UNUSED (name), tree args, 4860 int flags, bool *no_add_attrs) 4861{ 4862 tree attr = NULL_TREE; 4863 4864 /* We must ignore the attribute when it is associated with 4865 local-scoped decls, since attribute alias is ignored and many 4866 such symbols do not even have a DECL_WEAK field. */ 4867 if (decl_function_context (*node) || current_function_decl) 4868 { 4869 warning (OPT_Wattributes, "%qE attribute ignored", name); 4870 *no_add_attrs = true; 4871 return NULL_TREE; 4872 } 4873 4874 /* The idea here is that `weakref("name")' mutates into `weakref, 4875 alias("name")', and weakref without arguments, in turn, 4876 implicitly adds weak. */ 4877 4878 if (args) 4879 { 4880 attr = tree_cons (get_identifier ("alias"), args, attr); 4881 attr = tree_cons (get_identifier ("weakref"), NULL_TREE, attr); 4882 4883 *no_add_attrs = true; 4884 4885 decl_attributes (node, attr, flags); 4886 } 4887 else 4888 { 4889 if (lookup_attribute ("alias", DECL_ATTRIBUTES (*node))) 4890 error ("%Jweakref attribute must appear before alias attribute", 4891 *node); 4892 4893 /* Can't call declare_weak because it wants this to be TREE_PUBLIC, 4894 and that isn't supported; and because it wants to add it to 4895 the list of weak decls, which isn't helpful. */ 4896 DECL_WEAK (*node) = 1; 4897 } 4898 4899 return NULL_TREE; 4900} 4901 |
|
4935/* Handle an "visibility" attribute; arguments as in 4936 struct attribute_spec.handler. */ 4937 4938static tree 4939handle_visibility_attribute (tree *node, tree name, tree args, | 4902/* Handle an "visibility" attribute; arguments as in 4903 struct attribute_spec.handler. */ 4904 4905static tree 4906handle_visibility_attribute (tree *node, tree name, tree args, |
4940 int flags ATTRIBUTE_UNUSED, 4941 bool *no_add_attrs) | 4907 int ARG_UNUSED (flags), 4908 bool *ARG_UNUSED (no_add_attrs)) |
4942{ 4943 tree decl = *node; 4944 tree id = TREE_VALUE (args); | 4909{ 4910 tree decl = *node; 4911 tree id = TREE_VALUE (args); |
4912 enum symbol_visibility vis; |
|
4945 | 4913 |
4946 *no_add_attrs = true; 4947 4948 if (decl_function_context (decl) != 0 || ! TREE_PUBLIC (decl)) | 4914 if (TYPE_P (*node)) |
4949 { | 4915 { |
4950 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 4916 if (TREE_CODE (*node) == ENUMERAL_TYPE) 4917 /* OK */; 4918 else if (TREE_CODE (*node) != RECORD_TYPE && TREE_CODE (*node) != UNION_TYPE) 4919 { 4920 warning (OPT_Wattributes, "%qE attribute ignored on non-class types", 4921 name); 4922 return NULL_TREE; 4923 } 4924 else if (TYPE_FIELDS (*node)) 4925 { 4926 error ("%qE attribute ignored because %qT is already defined", 4927 name, *node); 4928 return NULL_TREE; 4929 } 4930 } 4931 else if (decl_function_context (decl) != 0 || !TREE_PUBLIC (decl)) 4932 { 4933 warning (OPT_Wattributes, "%qE attribute ignored", name); |
4951 return NULL_TREE; 4952 } 4953 4954 if (TREE_CODE (id) != STRING_CST) 4955 { | 4934 return NULL_TREE; 4935 } 4936 4937 if (TREE_CODE (id) != STRING_CST) 4938 { |
4956 error ("visibility arg not a string"); | 4939 error ("visibility argument not a string"); |
4957 return NULL_TREE; 4958 } 4959 | 4940 return NULL_TREE; 4941 } 4942 |
4943 /* If this is a type, set the visibility on the type decl. */ 4944 if (TYPE_P (decl)) 4945 { 4946 decl = TYPE_NAME (decl); 4947 if (!decl) 4948 return NULL_TREE; 4949 if (TREE_CODE (decl) == IDENTIFIER_NODE) 4950 { 4951 warning (OPT_Wattributes, "%qE attribute ignored on types", 4952 name); 4953 return NULL_TREE; 4954 } 4955 } 4956 |
|
4960 if (strcmp (TREE_STRING_POINTER (id), "default") == 0) | 4957 if (strcmp (TREE_STRING_POINTER (id), "default") == 0) |
4961 DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; | 4958 vis = VISIBILITY_DEFAULT; |
4962 else if (strcmp (TREE_STRING_POINTER (id), "internal") == 0) | 4959 else if (strcmp (TREE_STRING_POINTER (id), "internal") == 0) |
4963 DECL_VISIBILITY (decl) = VISIBILITY_INTERNAL; | 4960 vis = VISIBILITY_INTERNAL; |
4964 else if (strcmp (TREE_STRING_POINTER (id), "hidden") == 0) | 4961 else if (strcmp (TREE_STRING_POINTER (id), "hidden") == 0) |
4965 DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN; | 4962 vis = VISIBILITY_HIDDEN; |
4966 else if (strcmp (TREE_STRING_POINTER (id), "protected") == 0) | 4963 else if (strcmp (TREE_STRING_POINTER (id), "protected") == 0) |
4967 DECL_VISIBILITY (decl) = VISIBILITY_PROTECTED; | 4964 vis = VISIBILITY_PROTECTED; |
4968 else | 4965 else |
4969 error ("visibility arg must be one of \"default\", \"hidden\", \"protected\" or \"internal\""); | 4966 { 4967 error ("visibility argument must be one of \"default\", \"hidden\", \"protected\" or \"internal\""); 4968 vis = VISIBILITY_DEFAULT; 4969 } |
4970 | 4970 |
4971 if (DECL_VISIBILITY_SPECIFIED (decl) 4972 && vis != DECL_VISIBILITY (decl) 4973 && lookup_attribute ("visibility", (TYPE_P (*node) 4974 ? TYPE_ATTRIBUTES (*node) 4975 : DECL_ATTRIBUTES (decl)))) 4976 error ("%qD redeclared with different visibility", decl); 4977 4978 DECL_VISIBILITY (decl) = vis; 4979 DECL_VISIBILITY_SPECIFIED (decl) = 1; 4980 4981 /* Go ahead and attach the attribute to the node as well. This is needed 4982 so we can determine whether we have VISIBILITY_DEFAULT because the 4983 visibility was not specified, or because it was explicitly overridden 4984 from the containing scope. */ 4985 |
|
4971 return NULL_TREE; 4972} 4973 | 4986 return NULL_TREE; 4987} 4988 |
4989/* Determine the ELF symbol visibility for DECL, which is either a 4990 variable or a function. It is an error to use this function if a 4991 definition of DECL is not available in this translation unit. 4992 Returns true if the final visibility has been determined by this 4993 function; false if the caller is free to make additional 4994 modifications. */ 4995 4996bool 4997c_determine_visibility (tree decl) 4998{ 4999 gcc_assert (TREE_CODE (decl) == VAR_DECL 5000 || TREE_CODE (decl) == FUNCTION_DECL); 5001 5002 /* If the user explicitly specified the visibility with an 5003 attribute, honor that. DECL_VISIBILITY will have been set during 5004 the processing of the attribute. We check for an explicit 5005 attribute, rather than just checking DECL_VISIBILITY_SPECIFIED, 5006 to distinguish the use of an attribute from the use of a "#pragma 5007 GCC visibility push(...)"; in the latter case we still want other 5008 considerations to be able to overrule the #pragma. */ 5009 if (lookup_attribute ("visibility", DECL_ATTRIBUTES (decl))) 5010 return true; 5011 5012 /* Anything that is exported must have default visibility. */ 5013 if (TARGET_DLLIMPORT_DECL_ATTRIBUTES 5014 && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))) 5015 { 5016 DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT; 5017 DECL_VISIBILITY_SPECIFIED (decl) = 1; 5018 return true; 5019 } 5020 5021 /* Set default visibility to whatever the user supplied with 5022 visibility_specified depending on #pragma GCC visibility. */ 5023 if (!DECL_VISIBILITY_SPECIFIED (decl)) 5024 { 5025 DECL_VISIBILITY (decl) = default_visibility; 5026 DECL_VISIBILITY_SPECIFIED (decl) = visibility_options.inpragma; 5027 } 5028 return false; 5029} 5030 |
|
4974/* Handle an "tls_model" attribute; arguments as in 4975 struct attribute_spec.handler. */ 4976 4977static tree 4978handle_tls_model_attribute (tree *node, tree name, tree args, | 5031/* Handle an "tls_model" attribute; arguments as in 5032 struct attribute_spec.handler. */ 5033 5034static tree 5035handle_tls_model_attribute (tree *node, tree name, tree args, |
4979 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5036 int ARG_UNUSED (flags), bool *no_add_attrs) |
4980{ | 5037{ |
5038 tree id; |
|
4981 tree decl = *node; | 5039 tree decl = *node; |
5040 enum tls_model kind; |
|
4982 | 5041 |
4983 if (! DECL_THREAD_LOCAL (decl)) | 5042 *no_add_attrs = true; 5043 5044 if (!DECL_THREAD_LOCAL_P (decl)) |
4984 { | 5045 { |
4985 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); 4986 *no_add_attrs = true; | 5046 warning (OPT_Wattributes, "%qE attribute ignored", name); 5047 return NULL_TREE; |
4987 } | 5048 } |
4988 else 4989 { 4990 tree id; | |
4991 | 5049 |
4992 id = TREE_VALUE (args); 4993 if (TREE_CODE (id) != STRING_CST) 4994 { 4995 error ("tls_model arg not a string"); 4996 *no_add_attrs = true; 4997 return NULL_TREE; 4998 } 4999 if (strcmp (TREE_STRING_POINTER (id), "local-exec") 5000 && strcmp (TREE_STRING_POINTER (id), "initial-exec") 5001 && strcmp (TREE_STRING_POINTER (id), "local-dynamic") 5002 && strcmp (TREE_STRING_POINTER (id), "global-dynamic")) 5003 { 5004 error ("tls_model arg must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\""); 5005 *no_add_attrs = true; 5006 return NULL_TREE; 5007 } | 5050 kind = DECL_TLS_MODEL (decl); 5051 id = TREE_VALUE (args); 5052 if (TREE_CODE (id) != STRING_CST) 5053 { 5054 error ("tls_model argument not a string"); 5055 return NULL_TREE; |
5008 } 5009 | 5056 } 5057 |
5058 if (!strcmp (TREE_STRING_POINTER (id), "local-exec")) 5059 kind = TLS_MODEL_LOCAL_EXEC; 5060 else if (!strcmp (TREE_STRING_POINTER (id), "initial-exec")) 5061 kind = TLS_MODEL_INITIAL_EXEC; 5062 else if (!strcmp (TREE_STRING_POINTER (id), "local-dynamic")) 5063 kind = optimize ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC; 5064 else if (!strcmp (TREE_STRING_POINTER (id), "global-dynamic")) 5065 kind = TLS_MODEL_GLOBAL_DYNAMIC; 5066 else 5067 error ("tls_model argument must be one of \"local-exec\", \"initial-exec\", \"local-dynamic\" or \"global-dynamic\""); 5068 5069 DECL_TLS_MODEL (decl) = kind; |
|
5010 return NULL_TREE; 5011} 5012 5013/* Handle a "no_instrument_function" attribute; arguments as in 5014 struct attribute_spec.handler. */ 5015 5016static tree 5017handle_no_instrument_function_attribute (tree *node, tree name, | 5070 return NULL_TREE; 5071} 5072 5073/* Handle a "no_instrument_function" attribute; arguments as in 5074 struct attribute_spec.handler. */ 5075 5076static tree 5077handle_no_instrument_function_attribute (tree *node, tree name, |
5018 tree args ATTRIBUTE_UNUSED, 5019 int flags ATTRIBUTE_UNUSED, | 5078 tree ARG_UNUSED (args), 5079 int ARG_UNUSED (flags), |
5020 bool *no_add_attrs) 5021{ 5022 tree decl = *node; 5023 5024 if (TREE_CODE (decl) != FUNCTION_DECL) 5025 { | 5080 bool *no_add_attrs) 5081{ 5082 tree decl = *node; 5083 5084 if (TREE_CODE (decl) != FUNCTION_DECL) 5085 { |
5026 error ("%J'%E' attribute applies only to functions", decl, name); | 5086 error ("%J%qE attribute applies only to functions", decl, name); |
5027 *no_add_attrs = true; 5028 } 5029 else if (DECL_INITIAL (decl)) 5030 { | 5087 *no_add_attrs = true; 5088 } 5089 else if (DECL_INITIAL (decl)) 5090 { |
5031 error ("%Jcan't set '%E' attribute after definition", decl, name); | 5091 error ("%Jcan%'t set %qE attribute after definition", decl, name); |
5032 *no_add_attrs = true; 5033 } 5034 else 5035 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1; 5036 5037 return NULL_TREE; 5038} 5039 5040/* Handle a "malloc" attribute; arguments as in 5041 struct attribute_spec.handler. */ 5042 5043static tree | 5092 *no_add_attrs = true; 5093 } 5094 else 5095 DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1; 5096 5097 return NULL_TREE; 5098} 5099 5100/* Handle a "malloc" attribute; arguments as in 5101 struct attribute_spec.handler. */ 5102 5103static tree |
5044handle_malloc_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 5045 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5104handle_malloc_attribute (tree *node, tree name, tree ARG_UNUSED (args), 5105 int ARG_UNUSED (flags), bool *no_add_attrs) |
5046{ | 5106{ |
5047 if (TREE_CODE (*node) == FUNCTION_DECL) | 5107 if (TREE_CODE (*node) == FUNCTION_DECL 5108 && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (*node)))) |
5048 DECL_IS_MALLOC (*node) = 1; | 5109 DECL_IS_MALLOC (*node) = 1; |
5049 /* ??? TODO: Support types. */ | |
5050 else 5051 { | 5110 else 5111 { |
5052 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5112 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5053 *no_add_attrs = true; 5054 } 5055 5056 return NULL_TREE; 5057} 5058 | 5113 *no_add_attrs = true; 5114 } 5115 5116 return NULL_TREE; 5117} 5118 |
5119/* Handle a "returns_twice" attribute; arguments as in 5120 struct attribute_spec.handler. */ 5121 5122static tree 5123handle_returns_twice_attribute (tree *node, tree name, tree ARG_UNUSED (args), 5124 int ARG_UNUSED (flags), bool *no_add_attrs) 5125{ 5126 if (TREE_CODE (*node) == FUNCTION_DECL) 5127 DECL_IS_RETURNS_TWICE (*node) = 1; 5128 else 5129 { 5130 warning (OPT_Wattributes, "%qE attribute ignored", name); 5131 *no_add_attrs = true; 5132 } 5133 5134 return NULL_TREE; 5135} 5136 |
|
5059/* Handle a "no_limit_stack" attribute; arguments as in 5060 struct attribute_spec.handler. */ 5061 5062static tree 5063handle_no_limit_stack_attribute (tree *node, tree name, | 5137/* Handle a "no_limit_stack" attribute; arguments as in 5138 struct attribute_spec.handler. */ 5139 5140static tree 5141handle_no_limit_stack_attribute (tree *node, tree name, |
5064 tree args ATTRIBUTE_UNUSED, 5065 int flags ATTRIBUTE_UNUSED, | 5142 tree ARG_UNUSED (args), 5143 int ARG_UNUSED (flags), |
5066 bool *no_add_attrs) 5067{ 5068 tree decl = *node; 5069 5070 if (TREE_CODE (decl) != FUNCTION_DECL) 5071 { | 5144 bool *no_add_attrs) 5145{ 5146 tree decl = *node; 5147 5148 if (TREE_CODE (decl) != FUNCTION_DECL) 5149 { |
5072 error ("%J'%E' attribute applies only to functions", decl, name); | 5150 error ("%J%qE attribute applies only to functions", decl, name); |
5073 *no_add_attrs = true; 5074 } 5075 else if (DECL_INITIAL (decl)) 5076 { | 5151 *no_add_attrs = true; 5152 } 5153 else if (DECL_INITIAL (decl)) 5154 { |
5077 error ("%Jcan't set '%E' attribute after definition", decl, name); | 5155 error ("%Jcan%'t set %qE attribute after definition", decl, name); |
5078 *no_add_attrs = true; 5079 } 5080 else 5081 DECL_NO_LIMIT_STACK (decl) = 1; 5082 5083 return NULL_TREE; 5084} 5085 5086/* Handle a "pure" attribute; arguments as in 5087 struct attribute_spec.handler. */ 5088 5089static tree | 5156 *no_add_attrs = true; 5157 } 5158 else 5159 DECL_NO_LIMIT_STACK (decl) = 1; 5160 5161 return NULL_TREE; 5162} 5163 5164/* Handle a "pure" attribute; arguments as in 5165 struct attribute_spec.handler. */ 5166 5167static tree |
5090handle_pure_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 5091 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5168handle_pure_attribute (tree *node, tree name, tree ARG_UNUSED (args), 5169 int ARG_UNUSED (flags), bool *no_add_attrs) |
5092{ 5093 if (TREE_CODE (*node) == FUNCTION_DECL) 5094 DECL_IS_PURE (*node) = 1; 5095 /* ??? TODO: Support types. */ 5096 else 5097 { | 5170{ 5171 if (TREE_CODE (*node) == FUNCTION_DECL) 5172 DECL_IS_PURE (*node) = 1; 5173 /* ??? TODO: Support types. */ 5174 else 5175 { |
5098 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5176 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5099 *no_add_attrs = true; 5100 } 5101 5102 return NULL_TREE; 5103} 5104 | 5177 *no_add_attrs = true; 5178 } 5179 5180 return NULL_TREE; 5181} 5182 |
5183/* Handle a "no vops" attribute; arguments as in 5184 struct attribute_spec.handler. */ 5185 5186static tree 5187handle_novops_attribute (tree *node, tree ARG_UNUSED (name), 5188 tree ARG_UNUSED (args), int ARG_UNUSED (flags), 5189 bool *ARG_UNUSED (no_add_attrs)) 5190{ 5191 gcc_assert (TREE_CODE (*node) == FUNCTION_DECL); 5192 DECL_IS_NOVOPS (*node) = 1; 5193 return NULL_TREE; 5194} 5195 |
|
5105/* Handle a "deprecated" attribute; arguments as in 5106 struct attribute_spec.handler. */ 5107 5108static tree 5109handle_deprecated_attribute (tree *node, tree name, | 5196/* Handle a "deprecated" attribute; arguments as in 5197 struct attribute_spec.handler. */ 5198 5199static tree 5200handle_deprecated_attribute (tree *node, tree name, |
5110 tree args ATTRIBUTE_UNUSED, int flags, | 5201 tree ARG_UNUSED (args), int flags, |
5111 bool *no_add_attrs) 5112{ 5113 tree type = NULL_TREE; 5114 int warn = 0; | 5202 bool *no_add_attrs) 5203{ 5204 tree type = NULL_TREE; 5205 int warn = 0; |
5115 const char *what = NULL; | 5206 tree what = NULL_TREE; |
5116 5117 if (DECL_P (*node)) 5118 { 5119 tree decl = *node; 5120 type = TREE_TYPE (decl); 5121 5122 if (TREE_CODE (decl) == TYPE_DECL 5123 || TREE_CODE (decl) == PARM_DECL 5124 || TREE_CODE (decl) == VAR_DECL 5125 || TREE_CODE (decl) == FUNCTION_DECL 5126 || TREE_CODE (decl) == FIELD_DECL) 5127 TREE_DEPRECATED (decl) = 1; 5128 else 5129 warn = 1; 5130 } 5131 else if (TYPE_P (*node)) 5132 { 5133 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) | 5207 5208 if (DECL_P (*node)) 5209 { 5210 tree decl = *node; 5211 type = TREE_TYPE (decl); 5212 5213 if (TREE_CODE (decl) == TYPE_DECL 5214 || TREE_CODE (decl) == PARM_DECL 5215 || TREE_CODE (decl) == VAR_DECL 5216 || TREE_CODE (decl) == FUNCTION_DECL 5217 || TREE_CODE (decl) == FIELD_DECL) 5218 TREE_DEPRECATED (decl) = 1; 5219 else 5220 warn = 1; 5221 } 5222 else if (TYPE_P (*node)) 5223 { 5224 if (!(flags & (int) ATTR_FLAG_TYPE_IN_PLACE)) |
5134 *node = build_type_copy (*node); | 5225 *node = build_variant_type_copy (*node); |
5135 TREE_DEPRECATED (*node) = 1; 5136 type = *node; 5137 } 5138 else 5139 warn = 1; 5140 5141 if (warn) 5142 { 5143 *no_add_attrs = true; 5144 if (type && TYPE_NAME (type)) 5145 { 5146 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) | 5226 TREE_DEPRECATED (*node) = 1; 5227 type = *node; 5228 } 5229 else 5230 warn = 1; 5231 5232 if (warn) 5233 { 5234 *no_add_attrs = true; 5235 if (type && TYPE_NAME (type)) 5236 { 5237 if (TREE_CODE (TYPE_NAME (type)) == IDENTIFIER_NODE) |
5147 what = IDENTIFIER_POINTER (TYPE_NAME (*node)); | 5238 what = TYPE_NAME (*node); |
5148 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 5149 && DECL_NAME (TYPE_NAME (type))) | 5239 else if (TREE_CODE (TYPE_NAME (type)) == TYPE_DECL 5240 && DECL_NAME (TYPE_NAME (type))) |
5150 what = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))); | 5241 what = DECL_NAME (TYPE_NAME (type)); |
5151 } 5152 if (what) | 5242 } 5243 if (what) |
5153 warning ("`%s' attribute ignored for `%s'", 5154 IDENTIFIER_POINTER (name), what); | 5244 warning (OPT_Wattributes, "%qE attribute ignored for %qE", name, what); |
5155 else | 5245 else |
5156 warning ("`%s' attribute ignored", 5157 IDENTIFIER_POINTER (name)); | 5246 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5158 } 5159 5160 return NULL_TREE; 5161} 5162 | 5247 } 5248 5249 return NULL_TREE; 5250} 5251 |
5163/* Keep a list of vector type nodes we created in handle_vector_size_attribute, 5164 to prevent us from duplicating type nodes unnecessarily. 5165 The normal mechanism to prevent duplicates is to use type_hash_canon, but 5166 since we want to distinguish types that are essentially identical (except 5167 for their debug representation), we use a local list here. */ 5168static GTY(()) tree vector_type_node_list = 0; 5169 | |
5170/* Handle a "vector_size" attribute; arguments as in 5171 struct attribute_spec.handler. */ 5172 5173static tree 5174handle_vector_size_attribute (tree *node, tree name, tree args, | 5252/* Handle a "vector_size" attribute; arguments as in 5253 struct attribute_spec.handler. */ 5254 5255static tree 5256handle_vector_size_attribute (tree *node, tree name, tree args, |
5175 int flags ATTRIBUTE_UNUSED, | 5257 int ARG_UNUSED (flags), |
5176 bool *no_add_attrs) 5177{ 5178 unsigned HOST_WIDE_INT vecsize, nunits; | 5258 bool *no_add_attrs) 5259{ 5260 unsigned HOST_WIDE_INT vecsize, nunits; |
5179 enum machine_mode mode, orig_mode, new_mode; 5180 tree type = *node, new_type = NULL_TREE; 5181 tree type_list_node; | 5261 enum machine_mode orig_mode; 5262 tree type = *node, new_type, size; |
5182 5183 *no_add_attrs = true; 5184 | 5263 5264 *no_add_attrs = true; 5265 |
5185 if (! host_integerp (TREE_VALUE (args), 1)) | 5266 size = TREE_VALUE (args); 5267 5268 if (!host_integerp (size, 1)) |
5186 { | 5269 { |
5187 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5270 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5188 return NULL_TREE; 5189 } 5190 5191 /* Get the vector size (in bytes). */ | 5271 return NULL_TREE; 5272 } 5273 5274 /* Get the vector size (in bytes). */ |
5192 vecsize = tree_low_cst (TREE_VALUE (args), 1); | 5275 vecsize = tree_low_cst (size, 1); |
5193 5194 /* We need to provide for vector pointers, vector arrays, and 5195 functions returning vectors. For example: 5196 5197 __attribute__((vector_size(16))) short *foo; 5198 5199 In this case, the mode is SI, but the type being modified is 5200 HI, so we need to look further. */ 5201 5202 while (POINTER_TYPE_P (type) 5203 || TREE_CODE (type) == FUNCTION_TYPE 5204 || TREE_CODE (type) == METHOD_TYPE 5205 || TREE_CODE (type) == ARRAY_TYPE) 5206 type = TREE_TYPE (type); 5207 5208 /* Get the mode of the type being modified. */ 5209 orig_mode = TYPE_MODE (type); 5210 5211 if (TREE_CODE (type) == RECORD_TYPE | 5276 5277 /* We need to provide for vector pointers, vector arrays, and 5278 functions returning vectors. For example: 5279 5280 __attribute__((vector_size(16))) short *foo; 5281 5282 In this case, the mode is SI, but the type being modified is 5283 HI, so we need to look further. */ 5284 5285 while (POINTER_TYPE_P (type) 5286 || TREE_CODE (type) == FUNCTION_TYPE 5287 || TREE_CODE (type) == METHOD_TYPE 5288 || TREE_CODE (type) == ARRAY_TYPE) 5289 type = TREE_TYPE (type); 5290 5291 /* Get the mode of the type being modified. */ 5292 orig_mode = TYPE_MODE (type); 5293 5294 if (TREE_CODE (type) == RECORD_TYPE |
5212 || (GET_MODE_CLASS (orig_mode) != MODE_FLOAT | 5295 || TREE_CODE (type) == UNION_TYPE 5296 || TREE_CODE (type) == VECTOR_TYPE 5297 || (!SCALAR_FLOAT_MODE_P (orig_mode) |
5213 && GET_MODE_CLASS (orig_mode) != MODE_INT) | 5298 && GET_MODE_CLASS (orig_mode) != MODE_INT) |
5214 || ! host_integerp (TYPE_SIZE_UNIT (type), 1)) | 5299 || !host_integerp (TYPE_SIZE_UNIT (type), 1)) |
5215 { | 5300 { |
5216 error ("invalid vector type for attribute `%s'", 5217 IDENTIFIER_POINTER (name)); | 5301 error ("invalid vector type for attribute %qE", name); |
5218 return NULL_TREE; 5219 } 5220 | 5302 return NULL_TREE; 5303 } 5304 |
5221 /* Calculate how many units fit in the vector. */ 5222 nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1); 5223 5224 /* Find a suitably sized vector. */ 5225 new_mode = VOIDmode; 5226 for (mode = GET_CLASS_NARROWEST_MODE (GET_MODE_CLASS (orig_mode) == MODE_INT 5227 ? MODE_VECTOR_INT 5228 : MODE_VECTOR_FLOAT); 5229 mode != VOIDmode; 5230 mode = GET_MODE_WIDER_MODE (mode)) 5231 if (vecsize == GET_MODE_SIZE (mode) 5232 && nunits == (unsigned HOST_WIDE_INT) GET_MODE_NUNITS (mode)) 5233 { 5234 new_mode = mode; 5235 break; 5236 } 5237 5238 if (new_mode == VOIDmode) | 5305 if (vecsize % tree_low_cst (TYPE_SIZE_UNIT (type), 1)) |
5239 { | 5306 { |
5240 error ("no vector mode with the size and type specified could be found"); 5241 return NULL_TREE; | 5307 error ("vector size not an integral multiple of component size"); 5308 return NULL; |
5242 } 5243 | 5309 } 5310 |
5244 for (type_list_node = vector_type_node_list; type_list_node; 5245 type_list_node = TREE_CHAIN (type_list_node)) | 5311 if (vecsize == 0) |
5246 { | 5312 { |
5247 tree other_type = TREE_VALUE (type_list_node); 5248 tree record = TYPE_DEBUG_REPRESENTATION_TYPE (other_type); 5249 tree fields = TYPE_FIELDS (record); 5250 tree field_type = TREE_TYPE (fields); 5251 tree array_type = TREE_TYPE (field_type); 5252 if (TREE_CODE (fields) != FIELD_DECL 5253 || TREE_CODE (field_type) != ARRAY_TYPE) 5254 abort (); 5255 5256 if (TYPE_MODE (other_type) == mode && type == array_type) 5257 { 5258 new_type = other_type; 5259 break; 5260 } | 5313 error ("zero vector size"); 5314 return NULL; |
5261 } 5262 | 5315 } 5316 |
5263 if (new_type == NULL_TREE) | 5317 /* Calculate how many units fit in the vector. */ 5318 nunits = vecsize / tree_low_cst (TYPE_SIZE_UNIT (type), 1); 5319 if (nunits & (nunits - 1)) |
5264 { | 5320 { |
5265 tree index, array, rt, list_node; 5266 5267 new_type = (*lang_hooks.types.type_for_mode) (new_mode, 5268 TREE_UNSIGNED (type)); 5269 5270 if (!new_type) 5271 { 5272 error ("no vector mode with the size and type specified could be found"); 5273 return NULL_TREE; 5274 } 5275 5276 new_type = build_type_copy (new_type); 5277 5278 /* If this is a vector, make sure we either have hardware 5279 support, or we can emulate it. */ 5280 if ((GET_MODE_CLASS (mode) == MODE_VECTOR_INT 5281 || GET_MODE_CLASS (mode) == MODE_VECTOR_FLOAT) 5282 && !vector_mode_valid_p (mode)) 5283 { 5284 error ("unable to emulate '%s'", GET_MODE_NAME (mode)); 5285 return NULL_TREE; 5286 } 5287 5288 /* Set the debug information here, because this is the only 5289 place where we know the underlying type for a vector made 5290 with vector_size. For debugging purposes we pretend a vector 5291 is an array within a structure. */ 5292 index = build_int_2 (TYPE_VECTOR_SUBPARTS (new_type) - 1, 0); 5293 array = build_array_type (type, build_index_type (index)); 5294 rt = make_node (RECORD_TYPE); 5295 5296 TYPE_FIELDS (rt) = build_decl (FIELD_DECL, get_identifier ("f"), array); 5297 DECL_CONTEXT (TYPE_FIELDS (rt)) = rt; 5298 layout_type (rt); 5299 TYPE_DEBUG_REPRESENTATION_TYPE (new_type) = rt; 5300 5301 list_node = build_tree_list (NULL, new_type); 5302 TREE_CHAIN (list_node) = vector_type_node_list; 5303 vector_type_node_list = list_node; | 5321 error ("number of components of the vector not a power of two"); 5322 return NULL_TREE; |
5304 } 5305 | 5323 } 5324 |
5325 new_type = build_vector_type (type, nunits); 5326 |
|
5306 /* Build back pointers if needed. */ 5307 *node = reconstruct_complex_type (*node, new_type); 5308 5309 return NULL_TREE; 5310} 5311 5312/* Handle the "nonnull" attribute. */ 5313static tree | 5327 /* Build back pointers if needed. */ 5328 *node = reconstruct_complex_type (*node, new_type); 5329 5330 return NULL_TREE; 5331} 5332 5333/* Handle the "nonnull" attribute. */ 5334static tree |
5314handle_nonnull_attribute (tree *node, tree name ATTRIBUTE_UNUSED, 5315 tree args, int flags ATTRIBUTE_UNUSED, | 5335handle_nonnull_attribute (tree *node, tree ARG_UNUSED (name), 5336 tree args, int ARG_UNUSED (flags), |
5316 bool *no_add_attrs) 5317{ 5318 tree type = *node; 5319 unsigned HOST_WIDE_INT attr_arg_num; 5320 5321 /* If no arguments are specified, all pointer arguments should be 5322 non-null. Verify a full prototype is given so that the arguments 5323 will have the correct types when we actually check them later. */ | 5337 bool *no_add_attrs) 5338{ 5339 tree type = *node; 5340 unsigned HOST_WIDE_INT attr_arg_num; 5341 5342 /* If no arguments are specified, all pointer arguments should be 5343 non-null. Verify a full prototype is given so that the arguments 5344 will have the correct types when we actually check them later. */ |
5324 if (! args) | 5345 if (!args) |
5325 { | 5346 { |
5326 if (! TYPE_ARG_TYPES (type)) | 5347 if (!TYPE_ARG_TYPES (type)) |
5327 { 5328 error ("nonnull attribute without arguments on a non-prototype"); | 5348 { 5349 error ("nonnull attribute without arguments on a non-prototype"); |
5329 *no_add_attrs = true; | 5350 *no_add_attrs = true; |
5330 } 5331 return NULL_TREE; 5332 } 5333 5334 /* Argument list specified. Verify that each argument number references 5335 a pointer argument. */ 5336 for (attr_arg_num = 1; args; args = TREE_CHAIN (args)) 5337 { 5338 tree argument; | 5351 } 5352 return NULL_TREE; 5353 } 5354 5355 /* Argument list specified. Verify that each argument number references 5356 a pointer argument. */ 5357 for (attr_arg_num = 1; args; args = TREE_CHAIN (args)) 5358 { 5359 tree argument; |
5339 unsigned HOST_WIDE_INT arg_num, ck_num; | 5360 unsigned HOST_WIDE_INT arg_num = 0, ck_num; |
5340 | 5361 |
5341 if (! get_nonnull_operand (TREE_VALUE (args), &arg_num)) | 5362 if (!get_nonnull_operand (TREE_VALUE (args), &arg_num)) |
5342 { | 5363 { |
5343 error ("nonnull argument has invalid operand number (arg %lu)", | 5364 error ("nonnull argument has invalid operand number (argument %lu)", |
5344 (unsigned long) attr_arg_num); 5345 *no_add_attrs = true; 5346 return NULL_TREE; 5347 } 5348 5349 argument = TYPE_ARG_TYPES (type); 5350 if (argument) 5351 { 5352 for (ck_num = 1; ; ck_num++) 5353 { | 5365 (unsigned long) attr_arg_num); 5366 *no_add_attrs = true; 5367 return NULL_TREE; 5368 } 5369 5370 argument = TYPE_ARG_TYPES (type); 5371 if (argument) 5372 { 5373 for (ck_num = 1; ; ck_num++) 5374 { |
5354 if (! argument || ck_num == arg_num) | 5375 if (!argument || ck_num == arg_num) |
5355 break; 5356 argument = TREE_CHAIN (argument); 5357 } 5358 | 5376 break; 5377 argument = TREE_CHAIN (argument); 5378 } 5379 |
5359 if (! argument | 5380 if (!argument |
5360 || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE) 5361 { | 5381 || TREE_CODE (TREE_VALUE (argument)) == VOID_TYPE) 5382 { |
5362 error ("nonnull argument with out-of-range operand number (arg %lu, operand %lu)", | 5383 error ("nonnull argument with out-of-range operand number (argument %lu, operand %lu)", |
5363 (unsigned long) attr_arg_num, (unsigned long) arg_num); 5364 *no_add_attrs = true; 5365 return NULL_TREE; 5366 } 5367 | 5384 (unsigned long) attr_arg_num, (unsigned long) arg_num); 5385 *no_add_attrs = true; 5386 return NULL_TREE; 5387 } 5388 |
5368 if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE) | 5389 if (TREE_CODE (TREE_VALUE (argument)) != POINTER_TYPE) |
5369 { | 5390 { |
5370 error ("nonnull argument references non-pointer operand (arg %lu, operand %lu)", | 5391 error ("nonnull argument references non-pointer operand (argument %lu, operand %lu)", |
5371 (unsigned long) attr_arg_num, (unsigned long) arg_num); 5372 *no_add_attrs = true; 5373 return NULL_TREE; 5374 } 5375 } 5376 } 5377 5378 return NULL_TREE; --- 7 unchanged lines hidden (view full) --- 5386{ 5387 tree a, args, param; 5388 int param_num; 5389 5390 for (a = attrs; a; a = TREE_CHAIN (a)) 5391 { 5392 if (is_attribute_p ("nonnull", TREE_PURPOSE (a))) 5393 { | 5392 (unsigned long) attr_arg_num, (unsigned long) arg_num); 5393 *no_add_attrs = true; 5394 return NULL_TREE; 5395 } 5396 } 5397 } 5398 5399 return NULL_TREE; --- 7 unchanged lines hidden (view full) --- 5407{ 5408 tree a, args, param; 5409 int param_num; 5410 5411 for (a = attrs; a; a = TREE_CHAIN (a)) 5412 { 5413 if (is_attribute_p ("nonnull", TREE_PURPOSE (a))) 5414 { |
5394 args = TREE_VALUE (a); | 5415 args = TREE_VALUE (a); |
5395 | 5416 |
5396 /* Walk the argument list. If we encounter an argument number we 5397 should check for non-null, do it. If the attribute has no args, 5398 then every pointer argument is checked (in which case the check | 5417 /* Walk the argument list. If we encounter an argument number we 5418 should check for non-null, do it. If the attribute has no args, 5419 then every pointer argument is checked (in which case the check |
5399 for pointer type is done in check_nonnull_arg). */ | 5420 for pointer type is done in check_nonnull_arg). */ |
5400 for (param = params, param_num = 1; ; 5401 param_num++, param = TREE_CHAIN (param)) 5402 { 5403 if (! param) | 5421 for (param = params, param_num = 1; ; 5422 param_num++, param = TREE_CHAIN (param)) 5423 { 5424 if (!param) |
5404 break; | 5425 break; |
5405 if (! args || nonnull_check_p (args, param_num)) | 5426 if (!args || nonnull_check_p (args, param_num)) |
5406 check_function_arguments_recurse (check_nonnull_arg, NULL, 5407 TREE_VALUE (param), 5408 param_num); | 5427 check_function_arguments_recurse (check_nonnull_arg, NULL, 5428 TREE_VALUE (param), 5429 param_num); |
5409 } | 5430 } |
5410 } 5411 } 5412} 5413 | 5431 } 5432 } 5433} 5434 |
5435/* Check that the Nth argument of a function call (counting backwards 5436 from the end) is a (pointer)0. */ 5437 5438static void 5439check_function_sentinel (tree attrs, tree params, tree typelist) 5440{ 5441 tree attr = lookup_attribute ("sentinel", attrs); 5442 5443 if (attr) 5444 { 5445 /* Skip over the named arguments. */ 5446 while (typelist && params) 5447 { 5448 typelist = TREE_CHAIN (typelist); 5449 params = TREE_CHAIN (params); 5450 } 5451 5452 if (typelist || !params) 5453 warning (OPT_Wformat, 5454 "not enough variable arguments to fit a sentinel"); 5455 else 5456 { 5457 tree sentinel, end; 5458 unsigned pos = 0; 5459 5460 if (TREE_VALUE (attr)) 5461 { 5462 tree p = TREE_VALUE (TREE_VALUE (attr)); 5463 pos = TREE_INT_CST_LOW (p); 5464 } 5465 5466 sentinel = end = params; 5467 5468 /* Advance `end' ahead of `sentinel' by `pos' positions. */ 5469 while (pos > 0 && TREE_CHAIN (end)) 5470 { 5471 pos--; 5472 end = TREE_CHAIN (end); 5473 } 5474 if (pos > 0) 5475 { 5476 warning (OPT_Wformat, 5477 "not enough variable arguments to fit a sentinel"); 5478 return; 5479 } 5480 5481 /* Now advance both until we find the last parameter. */ 5482 while (TREE_CHAIN (end)) 5483 { 5484 end = TREE_CHAIN (end); 5485 sentinel = TREE_CHAIN (sentinel); 5486 } 5487 5488 /* Validate the sentinel. */ 5489 if ((!POINTER_TYPE_P (TREE_TYPE (TREE_VALUE (sentinel))) 5490 || !integer_zerop (TREE_VALUE (sentinel))) 5491 /* Although __null (in C++) is only an integer we allow it 5492 nevertheless, as we are guaranteed that it's exactly 5493 as wide as a pointer, and we don't want to force 5494 users to cast the NULL they have written there. 5495 We warn with -Wstrict-null-sentinel, though. */ 5496 && (warn_strict_null_sentinel 5497 || null_node != TREE_VALUE (sentinel))) 5498 warning (OPT_Wformat, "missing sentinel in function call"); 5499 } 5500 } 5501} 5502 |
|
5414/* Helper for check_function_nonnull; given a list of operands which 5415 must be non-null in ARGS, determine if operand PARAM_NUM should be 5416 checked. */ 5417 5418static bool 5419nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num) 5420{ | 5503/* Helper for check_function_nonnull; given a list of operands which 5504 must be non-null in ARGS, determine if operand PARAM_NUM should be 5505 checked. */ 5506 5507static bool 5508nonnull_check_p (tree args, unsigned HOST_WIDE_INT param_num) 5509{ |
5421 unsigned HOST_WIDE_INT arg_num; | 5510 unsigned HOST_WIDE_INT arg_num = 0; |
5422 5423 for (; args; args = TREE_CHAIN (args)) 5424 { | 5511 5512 for (; args; args = TREE_CHAIN (args)) 5513 { |
5425 if (! get_nonnull_operand (TREE_VALUE (args), &arg_num)) 5426 abort (); | 5514 bool found = get_nonnull_operand (TREE_VALUE (args), &arg_num); |
5427 | 5515 |
5516 gcc_assert (found); 5517 |
|
5428 if (arg_num == param_num) 5429 return true; 5430 } 5431 return false; 5432} 5433 5434/* Check that the function argument PARAM (which is operand number 5435 PARAM_NUM) is non-null. This is called by check_function_nonnull 5436 via check_function_arguments_recurse. */ 5437 5438static void | 5518 if (arg_num == param_num) 5519 return true; 5520 } 5521 return false; 5522} 5523 5524/* Check that the function argument PARAM (which is operand number 5525 PARAM_NUM) is non-null. This is called by check_function_nonnull 5526 via check_function_arguments_recurse. */ 5527 5528static void |
5439check_nonnull_arg (void *ctx ATTRIBUTE_UNUSED, tree param, | 5529check_nonnull_arg (void * ARG_UNUSED (ctx), tree param, |
5440 unsigned HOST_WIDE_INT param_num) 5441{ 5442 /* Just skip checking the argument if it's not a pointer. This can 5443 happen if the "nonnull" attribute was given without an operand 5444 list (which means to check every pointer argument). */ 5445 5446 if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE) 5447 return; 5448 5449 if (integer_zerop (param)) | 5530 unsigned HOST_WIDE_INT param_num) 5531{ 5532 /* Just skip checking the argument if it's not a pointer. This can 5533 happen if the "nonnull" attribute was given without an operand 5534 list (which means to check every pointer argument). */ 5535 5536 if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE) 5537 return; 5538 5539 if (integer_zerop (param)) |
5450 warning ("null argument where non-null required (arg %lu)", 5451 (unsigned long) param_num); | 5540 warning (OPT_Wnonnull, "null argument where non-null required " 5541 "(argument %lu)", (unsigned long) param_num); |
5452} 5453 5454/* Helper for nonnull attribute handling; fetch the operand number 5455 from the attribute argument list. */ 5456 5457static bool 5458get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp) 5459{ | 5542} 5543 5544/* Helper for nonnull attribute handling; fetch the operand number 5545 from the attribute argument list. */ 5546 5547static bool 5548get_nonnull_operand (tree arg_num_expr, unsigned HOST_WIDE_INT *valp) 5549{ |
5460 /* Strip any conversions from the arg number and verify they 5461 are constants. */ 5462 while (TREE_CODE (arg_num_expr) == NOP_EXPR 5463 || TREE_CODE (arg_num_expr) == CONVERT_EXPR 5464 || TREE_CODE (arg_num_expr) == NON_LVALUE_EXPR) 5465 arg_num_expr = TREE_OPERAND (arg_num_expr, 0); 5466 | 5550 /* Verify the arg number is a constant. */ |
5467 if (TREE_CODE (arg_num_expr) != INTEGER_CST 5468 || TREE_INT_CST_HIGH (arg_num_expr) != 0) 5469 return false; 5470 5471 *valp = TREE_INT_CST_LOW (arg_num_expr); 5472 return true; 5473} 5474 5475/* Handle a "nothrow" attribute; arguments as in 5476 struct attribute_spec.handler. */ 5477 5478static tree | 5551 if (TREE_CODE (arg_num_expr) != INTEGER_CST 5552 || TREE_INT_CST_HIGH (arg_num_expr) != 0) 5553 return false; 5554 5555 *valp = TREE_INT_CST_LOW (arg_num_expr); 5556 return true; 5557} 5558 5559/* Handle a "nothrow" attribute; arguments as in 5560 struct attribute_spec.handler. */ 5561 5562static tree |
5479handle_nothrow_attribute (tree *node, tree name, tree args ATTRIBUTE_UNUSED, 5480 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5563handle_nothrow_attribute (tree *node, tree name, tree ARG_UNUSED (args), 5564 int ARG_UNUSED (flags), bool *no_add_attrs) |
5481{ 5482 if (TREE_CODE (*node) == FUNCTION_DECL) 5483 TREE_NOTHROW (*node) = 1; 5484 /* ??? TODO: Support types. */ 5485 else 5486 { | 5565{ 5566 if (TREE_CODE (*node) == FUNCTION_DECL) 5567 TREE_NOTHROW (*node) = 1; 5568 /* ??? TODO: Support types. */ 5569 else 5570 { |
5487 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5571 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5488 *no_add_attrs = true; 5489 } 5490 5491 return NULL_TREE; 5492} 5493 5494/* Handle a "cleanup" attribute; arguments as in 5495 struct attribute_spec.handler. */ 5496 5497static tree 5498handle_cleanup_attribute (tree *node, tree name, tree args, | 5572 *no_add_attrs = true; 5573 } 5574 5575 return NULL_TREE; 5576} 5577 5578/* Handle a "cleanup" attribute; arguments as in 5579 struct attribute_spec.handler. */ 5580 5581static tree 5582handle_cleanup_attribute (tree *node, tree name, tree args, |
5499 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5583 int ARG_UNUSED (flags), bool *no_add_attrs) |
5500{ 5501 tree decl = *node; 5502 tree cleanup_id, cleanup_decl; 5503 5504 /* ??? Could perhaps support cleanups on TREE_STATIC, much like we do 5505 for global destructors in C++. This requires infrastructure that 5506 we don't have generically at the moment. It's also not a feature 5507 we'd be missing too much, since we do have attribute constructor. */ 5508 if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl)) 5509 { | 5584{ 5585 tree decl = *node; 5586 tree cleanup_id, cleanup_decl; 5587 5588 /* ??? Could perhaps support cleanups on TREE_STATIC, much like we do 5589 for global destructors in C++. This requires infrastructure that 5590 we don't have generically at the moment. It's also not a feature 5591 we'd be missing too much, since we do have attribute constructor. */ 5592 if (TREE_CODE (decl) != VAR_DECL || TREE_STATIC (decl)) 5593 { |
5510 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5594 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5511 *no_add_attrs = true; 5512 return NULL_TREE; 5513 } 5514 5515 /* Verify that the argument is a function in scope. */ 5516 /* ??? We could support pointers to functions here as well, if 5517 that was considered desirable. */ 5518 cleanup_id = TREE_VALUE (args); 5519 if (TREE_CODE (cleanup_id) != IDENTIFIER_NODE) 5520 { | 5595 *no_add_attrs = true; 5596 return NULL_TREE; 5597 } 5598 5599 /* Verify that the argument is a function in scope. */ 5600 /* ??? We could support pointers to functions here as well, if 5601 that was considered desirable. */ 5602 cleanup_id = TREE_VALUE (args); 5603 if (TREE_CODE (cleanup_id) != IDENTIFIER_NODE) 5604 { |
5521 error ("cleanup arg not an identifier"); | 5605 error ("cleanup argument not an identifier"); |
5522 *no_add_attrs = true; 5523 return NULL_TREE; 5524 } 5525 cleanup_decl = lookup_name (cleanup_id); 5526 if (!cleanup_decl || TREE_CODE (cleanup_decl) != FUNCTION_DECL) 5527 { | 5606 *no_add_attrs = true; 5607 return NULL_TREE; 5608 } 5609 cleanup_decl = lookup_name (cleanup_id); 5610 if (!cleanup_decl || TREE_CODE (cleanup_decl) != FUNCTION_DECL) 5611 { |
5528 error ("cleanup arg not a function"); | 5612 error ("cleanup argument not a function"); |
5529 *no_add_attrs = true; 5530 return NULL_TREE; 5531 } 5532 5533 /* That the function has proper type is checked with the 5534 eventual call to build_function_call. */ 5535 5536 return NULL_TREE; 5537} 5538 5539/* Handle a "warn_unused_result" attribute. No special handling. */ 5540 5541static tree 5542handle_warn_unused_result_attribute (tree *node, tree name, | 5613 *no_add_attrs = true; 5614 return NULL_TREE; 5615 } 5616 5617 /* That the function has proper type is checked with the 5618 eventual call to build_function_call. */ 5619 5620 return NULL_TREE; 5621} 5622 5623/* Handle a "warn_unused_result" attribute. No special handling. */ 5624 5625static tree 5626handle_warn_unused_result_attribute (tree *node, tree name, |
5543 tree args ATTRIBUTE_UNUSED, 5544 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) | 5627 tree ARG_UNUSED (args), 5628 int ARG_UNUSED (flags), bool *no_add_attrs) |
5545{ 5546 /* Ignore the attribute for functions not returning any value. */ 5547 if (VOID_TYPE_P (TREE_TYPE (*node))) 5548 { | 5629{ 5630 /* Ignore the attribute for functions not returning any value. */ 5631 if (VOID_TYPE_P (TREE_TYPE (*node))) 5632 { |
5549 warning ("`%s' attribute ignored", IDENTIFIER_POINTER (name)); | 5633 warning (OPT_Wattributes, "%qE attribute ignored", name); |
5550 *no_add_attrs = true; 5551 } 5552 5553 return NULL_TREE; 5554} | 5634 *no_add_attrs = true; 5635 } 5636 5637 return NULL_TREE; 5638} |
5639 5640/* Handle a "sentinel" attribute. */ 5641 5642static tree 5643handle_sentinel_attribute (tree *node, tree name, tree args, 5644 int ARG_UNUSED (flags), bool *no_add_attrs) 5645{ 5646 tree params = TYPE_ARG_TYPES (*node); 5647 5648 if (!params) 5649 { 5650 warning (OPT_Wattributes, 5651 "%qE attribute requires prototypes with named arguments", name); 5652 *no_add_attrs = true; 5653 } 5654 else 5655 { 5656 while (TREE_CHAIN (params)) 5657 params = TREE_CHAIN (params); 5658 5659 if (VOID_TYPE_P (TREE_VALUE (params))) 5660 { 5661 warning (OPT_Wattributes, 5662 "%qE attribute only applies to variadic functions", name); 5663 *no_add_attrs = true; 5664 } 5665 } 5666 5667 if (args) 5668 { 5669 tree position = TREE_VALUE (args); 5670 5671 if (TREE_CODE (position) != INTEGER_CST) 5672 { 5673 warning (0, "requested position is not an integer constant"); 5674 *no_add_attrs = true; 5675 } 5676 else 5677 { 5678 if (tree_int_cst_lt (position, integer_zero_node)) 5679 { 5680 warning (0, "requested position is less than zero"); 5681 *no_add_attrs = true; 5682 } 5683 } 5684 } 5685 5686 return NULL_TREE; 5687} |
|
5555 5556/* Check for valid arguments being passed to a function. */ 5557void | 5688 5689/* Check for valid arguments being passed to a function. */ 5690void |
5558check_function_arguments (tree attrs, tree params) | 5691check_function_arguments (tree attrs, tree params, tree typelist) |
5559{ 5560 /* Check for null being passed in a pointer argument that must be 5561 non-null. We also need to do this if format checking is enabled. */ 5562 5563 if (warn_nonnull) 5564 check_function_nonnull (attrs, params); 5565 5566 /* Check for errors in format strings. */ 5567 | 5692{ 5693 /* Check for null being passed in a pointer argument that must be 5694 non-null. We also need to do this if format checking is enabled. */ 5695 5696 if (warn_nonnull) 5697 check_function_nonnull (attrs, params); 5698 5699 /* Check for errors in format strings. */ 5700 |
5701 if (warn_format || warn_missing_format_attribute) 5702 check_function_format (attrs, params); 5703 |
|
5568 if (warn_format) | 5704 if (warn_format) |
5569 check_function_format (NULL, attrs, params); | 5705 check_function_sentinel (attrs, params, typelist); |
5570} 5571 5572/* Generic argument checking recursion routine. PARAM is the argument to 5573 be checked. PARAM_NUM is the number of the argument. CALLBACK is invoked 5574 once the argument is resolved. CTX is context for the callback. */ 5575void 5576check_function_arguments_recurse (void (*callback) 5577 (void *, tree, unsigned HOST_WIDE_INT), 5578 void *ctx, tree param, 5579 unsigned HOST_WIDE_INT param_num) 5580{ | 5706} 5707 5708/* Generic argument checking recursion routine. PARAM is the argument to 5709 be checked. PARAM_NUM is the number of the argument. CALLBACK is invoked 5710 once the argument is resolved. CTX is context for the callback. */ 5711void 5712check_function_arguments_recurse (void (*callback) 5713 (void *, tree, unsigned HOST_WIDE_INT), 5714 void *ctx, tree param, 5715 unsigned HOST_WIDE_INT param_num) 5716{ |
5581 if (TREE_CODE (param) == NOP_EXPR) | 5717 if ((TREE_CODE (param) == NOP_EXPR || TREE_CODE (param) == CONVERT_EXPR) 5718 && (TYPE_PRECISION (TREE_TYPE (param)) 5719 == TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (param, 0))))) |
5582 { 5583 /* Strip coercion. */ 5584 check_function_arguments_recurse (callback, ctx, | 5720 { 5721 /* Strip coercion. */ 5722 check_function_arguments_recurse (callback, ctx, |
5585 TREE_OPERAND (param, 0), param_num); | 5723 TREE_OPERAND (param, 0), param_num); |
5586 return; 5587 } 5588 5589 if (TREE_CODE (param) == CALL_EXPR) 5590 { 5591 tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0))); 5592 tree attrs; 5593 bool found_format_arg = false; --- 10 unchanged lines hidden (view full) --- 5604 tree inner_args; 5605 tree format_num_expr; 5606 int format_num; 5607 int i; 5608 5609 /* Extract the argument number, which was previously checked 5610 to be valid. */ 5611 format_num_expr = TREE_VALUE (TREE_VALUE (attrs)); | 5724 return; 5725 } 5726 5727 if (TREE_CODE (param) == CALL_EXPR) 5728 { 5729 tree type = TREE_TYPE (TREE_TYPE (TREE_OPERAND (param, 0))); 5730 tree attrs; 5731 bool found_format_arg = false; --- 10 unchanged lines hidden (view full) --- 5742 tree inner_args; 5743 tree format_num_expr; 5744 int format_num; 5745 int i; 5746 5747 /* Extract the argument number, which was previously checked 5748 to be valid. */ 5749 format_num_expr = TREE_VALUE (TREE_VALUE (attrs)); |
5612 while (TREE_CODE (format_num_expr) == NOP_EXPR 5613 || TREE_CODE (format_num_expr) == CONVERT_EXPR 5614 || TREE_CODE (format_num_expr) == NON_LVALUE_EXPR) 5615 format_num_expr = TREE_OPERAND (format_num_expr, 0); | |
5616 | 5750 |
5617 if (TREE_CODE (format_num_expr) != INTEGER_CST 5618 || TREE_INT_CST_HIGH (format_num_expr) != 0) 5619 abort (); | 5751 gcc_assert (TREE_CODE (format_num_expr) == INTEGER_CST 5752 && !TREE_INT_CST_HIGH (format_num_expr)); |
5620 5621 format_num = TREE_INT_CST_LOW (format_num_expr); 5622 5623 for (inner_args = TREE_OPERAND (param, 1), i = 1; 5624 inner_args != 0; 5625 inner_args = TREE_CHAIN (inner_args), i++) 5626 if (i == format_num) 5627 { --- 11 unchanged lines hidden (view full) --- 5639 if (found_format_arg) 5640 return; 5641 } 5642 5643 if (TREE_CODE (param) == COND_EXPR) 5644 { 5645 /* Check both halves of the conditional expression. */ 5646 check_function_arguments_recurse (callback, ctx, | 5753 5754 format_num = TREE_INT_CST_LOW (format_num_expr); 5755 5756 for (inner_args = TREE_OPERAND (param, 1), i = 1; 5757 inner_args != 0; 5758 inner_args = TREE_CHAIN (inner_args), i++) 5759 if (i == format_num) 5760 { --- 11 unchanged lines hidden (view full) --- 5772 if (found_format_arg) 5773 return; 5774 } 5775 5776 if (TREE_CODE (param) == COND_EXPR) 5777 { 5778 /* Check both halves of the conditional expression. */ 5779 check_function_arguments_recurse (callback, ctx, |
5647 TREE_OPERAND (param, 1), param_num); | 5780 TREE_OPERAND (param, 1), param_num); |
5648 check_function_arguments_recurse (callback, ctx, | 5781 check_function_arguments_recurse (callback, ctx, |
5649 TREE_OPERAND (param, 2), param_num); | 5782 TREE_OPERAND (param, 2), param_num); |
5650 return; 5651 } 5652 5653 (*callback) (ctx, param, param_num); 5654} 5655 5656/* Function to help qsort sort FIELD_DECLs by name order. */ 5657 5658int 5659field_decl_cmp (const void *x_p, const void *y_p) 5660{ | 5783 return; 5784 } 5785 5786 (*callback) (ctx, param, param_num); 5787} 5788 5789/* Function to help qsort sort FIELD_DECLs by name order. */ 5790 5791int 5792field_decl_cmp (const void *x_p, const void *y_p) 5793{ |
5661 const tree *const x = x_p; 5662 const tree *const y = y_p; | 5794 const tree *const x = (const tree *const) x_p; 5795 const tree *const y = (const tree *const) y_p; 5796 |
5663 if (DECL_NAME (*x) == DECL_NAME (*y)) 5664 /* A nontype is "greater" than a type. */ 5665 return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL); 5666 if (DECL_NAME (*x) == NULL_TREE) 5667 return -1; 5668 if (DECL_NAME (*y) == NULL_TREE) 5669 return 1; 5670 if (DECL_NAME (*x) < DECL_NAME (*y)) --- 7 unchanged lines hidden (view full) --- 5678} resort_data; 5679 5680/* This routine compares two fields like field_decl_cmp but using the 5681pointer operator in resort_data. */ 5682 5683static int 5684resort_field_decl_cmp (const void *x_p, const void *y_p) 5685{ | 5797 if (DECL_NAME (*x) == DECL_NAME (*y)) 5798 /* A nontype is "greater" than a type. */ 5799 return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL); 5800 if (DECL_NAME (*x) == NULL_TREE) 5801 return -1; 5802 if (DECL_NAME (*y) == NULL_TREE) 5803 return 1; 5804 if (DECL_NAME (*x) < DECL_NAME (*y)) --- 7 unchanged lines hidden (view full) --- 5812} resort_data; 5813 5814/* This routine compares two fields like field_decl_cmp but using the 5815pointer operator in resort_data. */ 5816 5817static int 5818resort_field_decl_cmp (const void *x_p, const void *y_p) 5819{ |
5686 const tree *const x = x_p; 5687 const tree *const y = y_p; | 5820 const tree *const x = (const tree *const) x_p; 5821 const tree *const y = (const tree *const) y_p; |
5688 5689 if (DECL_NAME (*x) == DECL_NAME (*y)) 5690 /* A nontype is "greater" than a type. */ 5691 return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL); 5692 if (DECL_NAME (*x) == NULL_TREE) 5693 return -1; 5694 if (DECL_NAME (*y) == NULL_TREE) 5695 return 1; --- 7 unchanged lines hidden (view full) --- 5703 } 5704 return 1; 5705} 5706 5707/* Resort DECL_SORTED_FIELDS because pointers have been reordered. */ 5708 5709void 5710resort_sorted_fields (void *obj, | 5822 5823 if (DECL_NAME (*x) == DECL_NAME (*y)) 5824 /* A nontype is "greater" than a type. */ 5825 return (TREE_CODE (*y) == TYPE_DECL) - (TREE_CODE (*x) == TYPE_DECL); 5826 if (DECL_NAME (*x) == NULL_TREE) 5827 return -1; 5828 if (DECL_NAME (*y) == NULL_TREE) 5829 return 1; --- 7 unchanged lines hidden (view full) --- 5837 } 5838 return 1; 5839} 5840 5841/* Resort DECL_SORTED_FIELDS because pointers have been reordered. */ 5842 5843void 5844resort_sorted_fields (void *obj, |
5711 void *orig_obj ATTRIBUTE_UNUSED , 5712 gt_pointer_operator new_value, 5713 void *cookie) | 5845 void * ARG_UNUSED (orig_obj), 5846 gt_pointer_operator new_value, 5847 void *cookie) |
5714{ | 5848{ |
5715 struct sorted_fields_type *sf = obj; | 5849 struct sorted_fields_type *sf = (struct sorted_fields_type *) obj; |
5716 resort_data.new_value = new_value; 5717 resort_data.cookie = cookie; 5718 qsort (&sf->elts[0], sf->len, sizeof (tree), | 5850 resort_data.new_value = new_value; 5851 resort_data.cookie = cookie; 5852 qsort (&sf->elts[0], sf->len, sizeof (tree), |
5719 resort_field_decl_cmp); | 5853 resort_field_decl_cmp); |
5720} 5721 | 5854} 5855 |
5722/* Used by estimate_num_insns. Estimate number of instructions seen 5723 by given statement. */ 5724static tree 5725c_estimate_num_insns_1 (tree *tp, int *walk_subtrees, void *data) | 5856/* Subroutine of c_parse_error. 5857 Return the result of concatenating LHS and RHS. RHS is really 5858 a string literal, its first character is indicated by RHS_START and 5859 RHS_SIZE is its length (including the terminating NUL character). 5860 5861 The caller is responsible for deleting the returned pointer. */ 5862 5863static char * 5864catenate_strings (const char *lhs, const char *rhs_start, int rhs_size) |
5726{ | 5865{ |
5727 int *count = data; 5728 tree x = *tp; | 5866 const int lhs_size = strlen (lhs); 5867 char *result = XNEWVEC (char, lhs_size + rhs_size); 5868 strncpy (result, lhs, lhs_size); 5869 strncpy (result + lhs_size, rhs_start, rhs_size); 5870 return result; 5871} |
5729 | 5872 |
5730 if (TYPE_P (x) || DECL_P (x)) | 5873/* Issue the error given by GMSGID, indicating that it occurred before 5874 TOKEN, which had the associated VALUE. */ 5875 5876void 5877c_parse_error (const char *gmsgid, enum cpp_ttype token, tree value) 5878{ 5879#define catenate_messages(M1, M2) catenate_strings ((M1), (M2), sizeof (M2)) 5880 5881 char *message = NULL; 5882 5883 if (token == CPP_EOF) 5884 message = catenate_messages (gmsgid, " at end of input"); 5885 else if (token == CPP_CHAR || token == CPP_WCHAR) |
5731 { | 5886 { |
5732 *walk_subtrees = 0; 5733 return NULL; | 5887 unsigned int val = TREE_INT_CST_LOW (value); 5888 const char *const ell = (token == CPP_CHAR) ? "" : "L"; 5889 if (val <= UCHAR_MAX && ISGRAPH (val)) 5890 message = catenate_messages (gmsgid, " before %s'%c'"); 5891 else 5892 message = catenate_messages (gmsgid, " before %s'\\x%x'"); 5893 5894 error (message, ell, val); 5895 free (message); 5896 message = NULL; |
5734 } | 5897 } |
5735 /* Assume that constants and references counts nothing. These should 5736 be majorized by amount of operations among them we count later 5737 and are common target of CSE and similar optimizations. */ 5738 if (TREE_CODE_CLASS (TREE_CODE (x)) == 'c' 5739 || TREE_CODE_CLASS (TREE_CODE (x)) == 'r') 5740 return NULL; 5741 switch (TREE_CODE (x)) 5742 { 5743 /* Recognize assignments of large structures and constructors of 5744 big arrays. */ 5745 case MODIFY_EXPR: 5746 case CONSTRUCTOR: 5747 { 5748 HOST_WIDE_INT size; | 5898 else if (token == CPP_STRING || token == CPP_WSTRING) 5899 message = catenate_messages (gmsgid, " before string constant"); 5900 else if (token == CPP_NUMBER) 5901 message = catenate_messages (gmsgid, " before numeric constant"); 5902 else if (token == CPP_NAME) 5903 { 5904 message = catenate_messages (gmsgid, " before %qE"); 5905 error (message, value); 5906 free (message); 5907 message = NULL; 5908 } 5909 else if (token == CPP_PRAGMA) 5910 message = catenate_messages (gmsgid, " before %<#pragma%>"); 5911 else if (token == CPP_PRAGMA_EOL) 5912 message = catenate_messages (gmsgid, " before end of line"); 5913 else if (token < N_TTYPES) 5914 { 5915 message = catenate_messages (gmsgid, " before %qs token"); 5916 error (message, cpp_type2name (token)); 5917 free (message); 5918 message = NULL; 5919 } 5920 else 5921 error (gmsgid); |
5749 | 5922 |
5750 size = int_size_in_bytes (TREE_TYPE (x)); | 5923 if (message) 5924 { 5925 error (message); 5926 free (message); 5927 } 5928#undef catenate_messages 5929} |
5751 | 5930 |
5752 if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO) 5753 *count += 10; 5754 else 5755 *count += ((size + MOVE_MAX_PIECES - 1) / MOVE_MAX_PIECES); 5756 } | 5931/* Walk a gimplified function and warn for functions whose return value is 5932 ignored and attribute((warn_unused_result)) is set. This is done before 5933 inlining, so we don't have to worry about that. */ 5934 5935void 5936c_warn_unused_result (tree *top_p) 5937{ 5938 tree t = *top_p; 5939 tree_stmt_iterator i; 5940 tree fdecl, ftype; 5941 5942 switch (TREE_CODE (t)) 5943 { 5944 case STATEMENT_LIST: 5945 for (i = tsi_start (*top_p); !tsi_end_p (i); tsi_next (&i)) 5946 c_warn_unused_result (tsi_stmt_ptr (i)); |
5757 break; | 5947 break; |
5758 case CALL_EXPR: 5759 { 5760 tree decl = get_callee_fndecl (x); | |
5761 | 5948 |
5762 if (decl && DECL_BUILT_IN (decl)) 5763 switch (DECL_FUNCTION_CODE (decl)) 5764 { 5765 case BUILT_IN_CONSTANT_P: 5766 *walk_subtrees = 0; 5767 return NULL_TREE; 5768 case BUILT_IN_EXPECT: 5769 return NULL_TREE; 5770 default: 5771 break; 5772 } 5773 *count += 10; 5774 break; 5775 } 5776 /* Few special cases of expensive operations. This is usefull 5777 to avoid inlining on functions having too many of these. */ 5778 case TRUNC_DIV_EXPR: 5779 case CEIL_DIV_EXPR: 5780 case FLOOR_DIV_EXPR: 5781 case ROUND_DIV_EXPR: 5782 case TRUNC_MOD_EXPR: 5783 case CEIL_MOD_EXPR: 5784 case FLOOR_MOD_EXPR: 5785 case ROUND_MOD_EXPR: 5786 case RDIV_EXPR: 5787 *count += 10; | 5949 case COND_EXPR: 5950 c_warn_unused_result (&COND_EXPR_THEN (t)); 5951 c_warn_unused_result (&COND_EXPR_ELSE (t)); |
5788 break; | 5952 break; |
5789 /* Various containers that will produce no code themselves. */ 5790 case INIT_EXPR: 5791 case TARGET_EXPR: | |
5792 case BIND_EXPR: | 5953 case BIND_EXPR: |
5793 case BLOCK: 5794 case TREE_LIST: 5795 case TREE_VEC: 5796 case IDENTIFIER_NODE: 5797 case PLACEHOLDER_EXPR: 5798 case WITH_CLEANUP_EXPR: 5799 case CLEANUP_POINT_EXPR: 5800 case NOP_EXPR: 5801 case VIEW_CONVERT_EXPR: 5802 case SAVE_EXPR: 5803 case UNSAVE_EXPR: 5804 case COMPLEX_EXPR: 5805 case REALPART_EXPR: 5806 case IMAGPART_EXPR: 5807 case TRY_CATCH_EXPR: | 5954 c_warn_unused_result (&BIND_EXPR_BODY (t)); 5955 break; |
5808 case TRY_FINALLY_EXPR: | 5956 case TRY_FINALLY_EXPR: |
5809 case LABEL_EXPR: 5810 case EXIT_EXPR: 5811 case LABELED_BLOCK_EXPR: 5812 case EXIT_BLOCK_EXPR: 5813 case EXPR_WITH_FILE_LOCATION: | 5957 case TRY_CATCH_EXPR: 5958 c_warn_unused_result (&TREE_OPERAND (t, 0)); 5959 c_warn_unused_result (&TREE_OPERAND (t, 1)); 5960 break; 5961 case CATCH_EXPR: 5962 c_warn_unused_result (&CATCH_BODY (t)); 5963 break; 5964 case EH_FILTER_EXPR: 5965 c_warn_unused_result (&EH_FILTER_FAILURE (t)); 5966 break; |
5814 | 5967 |
5815 case EXPR_STMT: 5816 case COMPOUND_STMT: 5817 case RETURN_STMT: 5818 case LABEL_STMT: 5819 case SCOPE_STMT: 5820 case FILE_STMT: 5821 case CASE_LABEL: 5822 case STMT_EXPR: 5823 case CLEANUP_STMT: | 5968 case CALL_EXPR: 5969 if (TREE_USED (t)) 5970 break; |
5824 | 5971 |
5825 case SIZEOF_EXPR: 5826 case ARROW_EXPR: 5827 case ALIGNOF_EXPR: | 5972 /* This is a naked call, as opposed to a CALL_EXPR nested inside 5973 a MODIFY_EXPR. All calls whose value is ignored should be 5974 represented like this. Look for the attribute. */ 5975 fdecl = get_callee_fndecl (t); 5976 if (fdecl) 5977 ftype = TREE_TYPE (fdecl); 5978 else 5979 { 5980 ftype = TREE_TYPE (TREE_OPERAND (t, 0)); 5981 /* Look past pointer-to-function to the function type itself. */ 5982 ftype = TREE_TYPE (ftype); 5983 } 5984 5985 if (lookup_attribute ("warn_unused_result", TYPE_ATTRIBUTES (ftype))) 5986 { 5987 if (fdecl) 5988 warning (0, "%Hignoring return value of %qD, " 5989 "declared with attribute warn_unused_result", 5990 EXPR_LOCUS (t), fdecl); 5991 else 5992 warning (0, "%Hignoring return value of function " 5993 "declared with attribute warn_unused_result", 5994 EXPR_LOCUS (t)); 5995 } |
5828 break; | 5996 break; |
5829 case DECL_STMT: 5830 /* Do not account static initializers. */ 5831 if (TREE_STATIC (TREE_OPERAND (x, 0))) 5832 *walk_subtrees = 0; | 5997 5998 default: 5999 /* Not a container, not a call, or a call whose value is used. */ |
5833 break; | 6000 break; |
6001 } 6002} 6003 6004/* Convert a character from the host to the target execution character 6005 set. cpplib handles this, mostly. */ 6006 6007HOST_WIDE_INT 6008c_common_to_target_charset (HOST_WIDE_INT c) 6009{ 6010 /* Character constants in GCC proper are sign-extended under -fsigned-char, 6011 zero-extended under -fno-signed-char. cpplib insists that characters 6012 and character constants are always unsigned. Hence we must convert 6013 back and forth. */ 6014 cppchar_t uc = ((cppchar_t)c) & ((((cppchar_t)1) << CHAR_BIT)-1); 6015 6016 uc = cpp_host_to_exec_charset (parse_in, uc); 6017 6018 if (flag_signed_char) 6019 return ((HOST_WIDE_INT)uc) << (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE) 6020 >> (HOST_BITS_PER_WIDE_INT - CHAR_TYPE_SIZE); 6021 else 6022 return uc; 6023} 6024 6025/* Build the result of __builtin_offsetof. EXPR is a nested sequence of 6026 component references, with STOP_REF, or alternatively an INDIRECT_REF of 6027 NULL, at the bottom; much like the traditional rendering of offsetof as a 6028 macro. Returns the folded and properly cast result. */ 6029 6030static tree 6031fold_offsetof_1 (tree expr, tree stop_ref) 6032{ 6033 enum tree_code code = PLUS_EXPR; 6034 tree base, off, t; 6035 6036 if (expr == stop_ref && TREE_CODE (expr) != ERROR_MARK) 6037 return size_zero_node; 6038 6039 switch (TREE_CODE (expr)) 6040 { 6041 case ERROR_MARK: 6042 return expr; 6043 6044 case VAR_DECL: 6045 error ("cannot apply %<offsetof%> to static data member %qD", expr); 6046 return error_mark_node; 6047 6048 case CALL_EXPR: 6049 error ("cannot apply %<offsetof%> when %<operator[]%> is overloaded"); 6050 return error_mark_node; 6051 6052 case INTEGER_CST: 6053 gcc_assert (integer_zerop (expr)); 6054 return size_zero_node; 6055 6056 case NOP_EXPR: 6057 case INDIRECT_REF: 6058 base = fold_offsetof_1 (TREE_OPERAND (expr, 0), stop_ref); 6059 gcc_assert (base == error_mark_node || base == size_zero_node); 6060 return base; 6061 6062 case COMPONENT_REF: 6063 base = fold_offsetof_1 (TREE_OPERAND (expr, 0), stop_ref); 6064 if (base == error_mark_node) 6065 return base; 6066 6067 t = TREE_OPERAND (expr, 1); 6068 if (DECL_C_BIT_FIELD (t)) 6069 { 6070 error ("attempt to take address of bit-field structure " 6071 "member %qD", t); 6072 return error_mark_node; 6073 } 6074 off = size_binop (PLUS_EXPR, DECL_FIELD_OFFSET (t), 6075 size_int (tree_low_cst (DECL_FIELD_BIT_OFFSET (t), 1) 6076 / BITS_PER_UNIT)); 6077 break; 6078 6079 case ARRAY_REF: 6080 base = fold_offsetof_1 (TREE_OPERAND (expr, 0), stop_ref); 6081 if (base == error_mark_node) 6082 return base; 6083 6084 t = TREE_OPERAND (expr, 1); 6085 if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) < 0) 6086 { 6087 code = MINUS_EXPR; 6088 t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t); 6089 } 6090 t = convert (sizetype, t); 6091 off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t); 6092 break; 6093 6094 case COMPOUND_EXPR: 6095 /* Handle static members of volatile structs. */ 6096 t = TREE_OPERAND (expr, 1); 6097 gcc_assert (TREE_CODE (t) == VAR_DECL); 6098 return fold_offsetof_1 (t, stop_ref); 6099 |
|
5834 default: | 6100 default: |
5835 (*count)++; | 6101 gcc_unreachable (); |
5836 } | 6102 } |
5837 return NULL; | 6103 6104 return size_binop (code, base, off); |
5838} 5839 | 6105} 6106 |
5840/* Estimate number of instructions that will be created by expanding the body. */ | 6107tree 6108fold_offsetof (tree expr, tree stop_ref) 6109{ 6110 /* Convert back from the internal sizetype to size_t. */ 6111 return convert (size_type_node, fold_offsetof_1 (expr, stop_ref)); 6112} 6113 6114/* Print an error message for an invalid lvalue. USE says 6115 how the lvalue is being used and so selects the error message. */ 6116 6117void 6118lvalue_error (enum lvalue_use use) 6119{ 6120 switch (use) 6121 { 6122 case lv_assign: 6123 error ("lvalue required as left operand of assignment"); 6124 break; 6125 case lv_increment: 6126 error ("lvalue required as increment operand"); 6127 break; 6128 case lv_decrement: 6129 error ("lvalue required as decrement operand"); 6130 break; 6131 case lv_addressof: 6132 error ("lvalue required as unary %<&%> operand"); 6133 break; 6134 case lv_asm: 6135 error ("lvalue required in asm statement"); 6136 break; 6137 default: 6138 gcc_unreachable (); 6139 } 6140} 6141 6142/* *PTYPE is an incomplete array. Complete it with a domain based on 6143 INITIAL_VALUE. If INITIAL_VALUE is not present, use 1 if DO_DEFAULT 6144 is true. Return 0 if successful, 1 if INITIAL_VALUE can't be deciphered, 6145 2 if INITIAL_VALUE was NULL, and 3 if INITIAL_VALUE was empty. */ 6146 |
5841int | 6147int |
5842c_estimate_num_insns (tree decl) | 6148complete_array_type (tree *ptype, tree initial_value, bool do_default) |
5843{ | 6149{ |
5844 int num = 0; 5845 walk_tree_without_duplicates (&DECL_SAVED_TREE (decl), c_estimate_num_insns_1, &num); 5846 return num; | 6150 tree maxindex, type, main_type, elt, unqual_elt; 6151 int failure = 0, quals; 6152 6153 maxindex = size_zero_node; 6154 if (initial_value) 6155 { 6156 if (TREE_CODE (initial_value) == STRING_CST) 6157 { 6158 int eltsize 6159 = int_size_in_bytes (TREE_TYPE (TREE_TYPE (initial_value))); 6160 maxindex = size_int (TREE_STRING_LENGTH (initial_value)/eltsize - 1); 6161 } 6162 else if (TREE_CODE (initial_value) == CONSTRUCTOR) 6163 { 6164 VEC(constructor_elt,gc) *v = CONSTRUCTOR_ELTS (initial_value); 6165 6166 if (VEC_empty (constructor_elt, v)) 6167 { 6168 if (pedantic) 6169 failure = 3; 6170 maxindex = integer_minus_one_node; 6171 } 6172 else 6173 { 6174 tree curindex; 6175 unsigned HOST_WIDE_INT cnt; 6176 constructor_elt *ce; 6177 6178 if (VEC_index (constructor_elt, v, 0)->index) 6179 maxindex = fold_convert (sizetype, 6180 VEC_index (constructor_elt, 6181 v, 0)->index); 6182 curindex = maxindex; 6183 6184 for (cnt = 1; 6185 VEC_iterate (constructor_elt, v, cnt, ce); 6186 cnt++) 6187 { 6188 if (ce->index) 6189 curindex = fold_convert (sizetype, ce->index); 6190 else 6191 curindex = size_binop (PLUS_EXPR, curindex, size_one_node); 6192 6193 if (tree_int_cst_lt (maxindex, curindex)) 6194 maxindex = curindex; 6195 } 6196 } 6197 } 6198 else 6199 { 6200 /* Make an error message unless that happened already. */ 6201 if (initial_value != error_mark_node) 6202 failure = 1; 6203 } 6204 } 6205 else 6206 { 6207 failure = 2; 6208 if (!do_default) 6209 return failure; 6210 } 6211 6212 type = *ptype; 6213 elt = TREE_TYPE (type); 6214 quals = TYPE_QUALS (strip_array_types (elt)); 6215 if (quals == 0) 6216 unqual_elt = elt; 6217 else 6218 unqual_elt = c_build_qualified_type (elt, TYPE_UNQUALIFIED); 6219 6220 /* Using build_distinct_type_copy and modifying things afterward instead 6221 of using build_array_type to create a new type preserves all of the 6222 TYPE_LANG_FLAG_? bits that the front end may have set. */ 6223 main_type = build_distinct_type_copy (TYPE_MAIN_VARIANT (type)); 6224 TREE_TYPE (main_type) = unqual_elt; 6225 TYPE_DOMAIN (main_type) = build_index_type (maxindex); 6226 layout_type (main_type); 6227 6228 if (quals == 0) 6229 type = main_type; 6230 else 6231 type = c_build_qualified_type (main_type, quals); 6232 6233 *ptype = type; 6234 return failure; |
5847} 5848 | 6235} 6236 |
5849/* Used by c_decl_uninit to find where expressions like x = x + 1; */ | 6237 6238/* Used to help initialize the builtin-types.def table. When a type of 6239 the correct size doesn't exist, use error_mark_node instead of NULL. 6240 The later results in segfaults even when a decl using the type doesn't 6241 get invoked. */ |
5850 | 6242 |
6243tree 6244builtin_type_for_size (int size, bool unsignedp) 6245{ 6246 tree type = lang_hooks.types.type_for_size (size, unsignedp); 6247 return type ? type : error_mark_node; 6248} 6249 6250/* A helper function for resolve_overloaded_builtin in resolving the 6251 overloaded __sync_ builtins. Returns a positive power of 2 if the 6252 first operand of PARAMS is a pointer to a supported data type. 6253 Returns 0 if an error is encountered. */ 6254 6255static int 6256sync_resolve_size (tree function, tree params) 6257{ 6258 tree type; 6259 int size; 6260 6261 if (params == NULL) 6262 { 6263 error ("too few arguments to function %qE", function); 6264 return 0; 6265 } 6266 6267 type = TREE_TYPE (TREE_VALUE (params)); 6268 if (TREE_CODE (type) != POINTER_TYPE) 6269 goto incompatible; 6270 6271 type = TREE_TYPE (type); 6272 if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type)) 6273 goto incompatible; 6274 6275 size = tree_low_cst (TYPE_SIZE_UNIT (type), 1); 6276 if (size == 1 || size == 2 || size == 4 || size == 8 || size == 16) 6277 return size; 6278 6279 incompatible: 6280 error ("incompatible type for argument %d of %qE", 1, function); 6281 return 0; 6282} 6283 6284/* A helper function for resolve_overloaded_builtin. Adds casts to 6285 PARAMS to make arguments match up with those of FUNCTION. Drops 6286 the variadic arguments at the end. Returns false if some error 6287 was encountered; true on success. */ 6288 6289static bool 6290sync_resolve_params (tree orig_function, tree function, tree params) 6291{ 6292 tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (function)); 6293 tree ptype; 6294 int number; 6295 6296 /* We've declared the implementation functions to use "volatile void *" 6297 as the pointer parameter, so we shouldn't get any complaints from the 6298 call to check_function_arguments what ever type the user used. */ 6299 arg_types = TREE_CHAIN (arg_types); 6300 ptype = TREE_TYPE (TREE_TYPE (TREE_VALUE (params))); 6301 number = 2; 6302 6303 /* For the rest of the values, we need to cast these to FTYPE, so that we 6304 don't get warnings for passing pointer types, etc. */ 6305 while (arg_types != void_list_node) 6306 { 6307 tree val; 6308 6309 params = TREE_CHAIN (params); 6310 if (params == NULL) 6311 { 6312 error ("too few arguments to function %qE", orig_function); 6313 return false; 6314 } 6315 6316 /* ??? Ideally for the first conversion we'd use convert_for_assignment 6317 so that we get warnings for anything that doesn't match the pointer 6318 type. This isn't portable across the C and C++ front ends atm. */ 6319 val = TREE_VALUE (params); 6320 val = convert (ptype, val); 6321 val = convert (TREE_VALUE (arg_types), val); 6322 TREE_VALUE (params) = val; 6323 6324 arg_types = TREE_CHAIN (arg_types); 6325 number++; 6326 } 6327 6328 /* The definition of these primitives is variadic, with the remaining 6329 being "an optional list of variables protected by the memory barrier". 6330 No clue what that's supposed to mean, precisely, but we consider all 6331 call-clobbered variables to be protected so we're safe. */ 6332 TREE_CHAIN (params) = NULL; 6333 6334 return true; 6335} 6336 6337/* A helper function for resolve_overloaded_builtin. Adds a cast to 6338 RESULT to make it match the type of the first pointer argument in 6339 PARAMS. */ 6340 |
|
5851static tree | 6341static tree |
5852c_decl_uninit_1 (tree *t, int *walk_sub_trees, void *x) | 6342sync_resolve_return (tree params, tree result) |
5853{ | 6343{ |
5854 /* If x = EXP(&x)EXP, then do not warn about the use of x. */ 5855 if (TREE_CODE (*t) == ADDR_EXPR && TREE_OPERAND (*t, 0) == x) | 6344 tree ptype = TREE_TYPE (TREE_TYPE (TREE_VALUE (params))); 6345 ptype = TYPE_MAIN_VARIANT (ptype); 6346 return convert (ptype, result); 6347} 6348 6349/* Some builtin functions are placeholders for other expressions. This 6350 function should be called immediately after parsing the call expression 6351 before surrounding code has committed to the type of the expression. 6352 6353 FUNCTION is the DECL that has been invoked; it is known to be a builtin. 6354 PARAMS is the argument list for the call. The return value is non-null 6355 when expansion is complete, and null if normal processing should 6356 continue. */ 6357 6358tree 6359resolve_overloaded_builtin (tree function, tree params) 6360{ 6361 enum built_in_function orig_code = DECL_FUNCTION_CODE (function); 6362 switch (DECL_BUILT_IN_CLASS (function)) |
5856 { | 6363 { |
5857 *walk_sub_trees = 0; | 6364 case BUILT_IN_NORMAL: 6365 break; 6366 case BUILT_IN_MD: 6367 if (targetm.resolve_overloaded_builtin) 6368 return targetm.resolve_overloaded_builtin (function, params); 6369 else 6370 return NULL_TREE; 6371 default: |
5858 return NULL_TREE; 5859 } | 6372 return NULL_TREE; 6373 } |
5860 if (*t == x) 5861 return *t; 5862 return NULL_TREE; 5863} | |
5864 | 6374 |
5865/* Find out if a variable is uninitialized based on DECL_INITIAL. */ | 6375 /* Handle BUILT_IN_NORMAL here. */ 6376 switch (orig_code) 6377 { 6378 case BUILT_IN_FETCH_AND_ADD_N: 6379 case BUILT_IN_FETCH_AND_SUB_N: 6380 case BUILT_IN_FETCH_AND_OR_N: 6381 case BUILT_IN_FETCH_AND_AND_N: 6382 case BUILT_IN_FETCH_AND_XOR_N: 6383 case BUILT_IN_FETCH_AND_NAND_N: 6384 case BUILT_IN_ADD_AND_FETCH_N: 6385 case BUILT_IN_SUB_AND_FETCH_N: 6386 case BUILT_IN_OR_AND_FETCH_N: 6387 case BUILT_IN_AND_AND_FETCH_N: 6388 case BUILT_IN_XOR_AND_FETCH_N: 6389 case BUILT_IN_NAND_AND_FETCH_N: 6390 case BUILT_IN_BOOL_COMPARE_AND_SWAP_N: 6391 case BUILT_IN_VAL_COMPARE_AND_SWAP_N: 6392 case BUILT_IN_LOCK_TEST_AND_SET_N: 6393 case BUILT_IN_LOCK_RELEASE_N: 6394 { 6395 int n = sync_resolve_size (function, params); 6396 tree new_function, result; |
5866 | 6397 |
6398 if (n == 0) 6399 return error_mark_node; 6400 6401 new_function = built_in_decls[orig_code + exact_log2 (n) + 1]; 6402 if (!sync_resolve_params (function, new_function, params)) 6403 return error_mark_node; 6404 6405 result = build_function_call (new_function, params); 6406 if (orig_code != BUILT_IN_BOOL_COMPARE_AND_SWAP_N 6407 && orig_code != BUILT_IN_LOCK_RELEASE_N) 6408 result = sync_resolve_return (params, result); 6409 6410 return result; 6411 } 6412 6413 default: 6414 return NULL_TREE; 6415 } 6416} 6417 6418/* Ignoring their sign, return true if two scalar types are the same. */ |
|
5867bool | 6419bool |
5868c_decl_uninit (tree t) | 6420same_scalar_type_ignoring_signedness (tree t1, tree t2) |
5869{ | 6421{ |
5870 /* int x = x; is GCC extension to turn off this warning, only if warn_init_self is zero. */ 5871 if (DECL_INITIAL (t) == t) 5872 return warn_init_self ? true : false; | 6422 enum tree_code c1 = TREE_CODE (t1), c2 = TREE_CODE (t2); |
5873 | 6423 |
5874 /* Walk the trees looking for the variable itself. */ 5875 if (walk_tree_without_duplicates (&DECL_INITIAL (t), c_decl_uninit_1, t)) 5876 return true; 5877 return false; | 6424 gcc_assert ((c1 == INTEGER_TYPE || c1 == REAL_TYPE) 6425 && (c2 == INTEGER_TYPE || c2 == REAL_TYPE)); 6426 6427 /* Equality works here because c_common_signed_type uses 6428 TYPE_MAIN_VARIANT. */ 6429 return lang_hooks.types.signed_type (t1) 6430 == lang_hooks.types.signed_type (t2); |
5878} 5879 | 6431} 6432 |
5880/* Issue the error given by MSGID, indicating that it occurred before 5881 TOKEN, which had the associated VALUE. */ | 6433/* Check for missing format attributes on function pointers. LTYPE is 6434 the new type or left-hand side type. RTYPE is the old type or 6435 right-hand side type. Returns TRUE if LTYPE is missing the desired 6436 attribute. */ |
5882 | 6437 |
5883void 5884c_parse_error (const char *msgid, enum cpp_ttype token, tree value) | 6438bool 6439check_missing_format_attribute (tree ltype, tree rtype) |
5885{ | 6440{ |
5886 const char *string = _(msgid); | 6441 tree const ttr = TREE_TYPE (rtype), ttl = TREE_TYPE (ltype); 6442 tree ra; |
5887 | 6443 |
5888 if (token == CPP_EOF) 5889 error ("%s at end of input", string); 5890 else if (token == CPP_CHAR || token == CPP_WCHAR) | 6444 for (ra = TYPE_ATTRIBUTES (ttr); ra; ra = TREE_CHAIN (ra)) 6445 if (is_attribute_p ("format", TREE_PURPOSE (ra))) 6446 break; 6447 if (ra) |
5891 { | 6448 { |
5892 unsigned int val = TREE_INT_CST_LOW (value); 5893 const char *const ell = (token == CPP_CHAR) ? "" : "L"; 5894 if (val <= UCHAR_MAX && ISGRAPH (val)) 5895 error ("%s before %s'%c'", string, ell, val); 5896 else 5897 error ("%s before %s'\\x%x'", string, ell, val); | 6449 tree la; 6450 for (la = TYPE_ATTRIBUTES (ttl); la; la = TREE_CHAIN (la)) 6451 if (is_attribute_p ("format", TREE_PURPOSE (la))) 6452 break; 6453 return !la; |
5898 } | 6454 } |
5899 else if (token == CPP_STRING 5900 || token == CPP_WSTRING) 5901 error ("%s before string constant", string); 5902 else if (token == CPP_NUMBER) 5903 error ("%s before numeric constant", string); 5904 else if (token == CPP_NAME) 5905 error ("%s before \"%s\"", string, IDENTIFIER_POINTER (value)); 5906 else if (token < N_TTYPES) 5907 error ("%s before '%s' token", string, cpp_type2name (token)); | |
5908 else | 6455 else |
5909 error ("%s", string); | 6456 return false; |
5910} 5911 | 6457} 6458 |
6459/* Subscripting with type char is likely to lose on a machine where 6460 chars are signed. So warn on any machine, but optionally. Don't 6461 warn for unsigned char since that type is safe. Don't warn for 6462 signed char because anyone who uses that must have done so 6463 deliberately. Furthermore, we reduce the false positive load by 6464 warning only for non-constant value of type char. */ 6465 6466void 6467warn_array_subscript_with_type_char (tree index) 6468{ 6469 if (TYPE_MAIN_VARIANT (TREE_TYPE (index)) == char_type_node 6470 && TREE_CODE (index) != INTEGER_CST) 6471 warning (OPT_Wchar_subscripts, "array subscript has type %<char%>"); 6472} 6473 6474 |
|
5912#include "gt-c-common.h" | 6475#include "gt-c-common.h" |