f95-lang.c 46.6 KB
Newer Older
1
/* gfortran backend interface
Jakub Jelinek committed
2
   Copyright (C) 2000-2015 Free Software Foundation, Inc.
3 4
   Contributed by Paul Brook.

5
This file is part of GCC.
6

7 8
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
9
Software Foundation; either version 3, or (at your option) any later
10
version.
11

12 13 14 15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.
16 17

You should have received a copy of the GNU General Public License
18 19
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */
20 21 22 23 24 25

/* f95-lang.c-- GCC backend interface stuff */

/* declare required prototypes: */

#include "config.h"
26
#include "system.h"
27 28 29
#include "ansidecl.h"
#include "system.h"
#include "coretypes.h"
30
#include "gfortran.h"
31 32 33
#include "alias.h"
#include "symtab.h"
#include "options.h"
34 35 36 37 38 39
#include "tree.h"
#include "flags.h"
#include "langhooks.h"
#include "langhooks-def.h"
#include "timevar.h"
#include "tm.h"
40
#include "hard-reg-set.h"
41 42 43 44
#include "function.h"
#include "toplev.h"
#include "target.h"
#include "debug.h"
45
#include "diagnostic.h" /* For errorcount/warningcount */
46
#include "dumpfile.h"
47
#include "cgraph.h"
48
#include "cpp.h"
49 50 51 52 53 54
#include "trans.h"
#include "trans-types.h"
#include "trans-const.h"

/* Language-dependent contents of an identifier.  */

55 56
struct GTY(())
lang_identifier {
57 58 59 60 61
  struct tree_identifier common;
};

/* The resulting tree type.  */

62
union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
63
     chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
64
lang_tree_node {
65 66 67 68 69 70 71 72 73
  union tree_node GTY((tag ("0"),
		       desc ("tree_node_structure (&%h)"))) generic;
  struct lang_identifier GTY((tag ("1"))) identifier;
};

/* Save and restore the variables in this file and elsewhere
   that keep track of the progress of compilation of the current function.
   Used for nested functions.  */

74 75
struct GTY(())
language_function {
76 77 78 79 80 81
  /* struct gfc_language_function base; */
  struct binding_level *binding_level;
};

static void gfc_init_decl_processing (void);
static void gfc_init_builtin_functions (void);
82
static bool global_bindings_p (void);
83 84 85 86

/* Each front end provides its own.  */
static bool gfc_init (void);
static void gfc_finish (void);
87
static void gfc_be_parse_file (void);
88
static alias_set_type gfc_get_alias_set (tree);
89
static void gfc_init_ts (void);
90
static tree gfc_builtin_function (tree);
91

92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
/* Handle an "omp declare target" attribute; arguments as in
   struct attribute_spec.handler.  */
static tree
gfc_handle_omp_declare_target_attribute (tree *, tree, tree, int, bool *)
{
  return NULL_TREE;
}

/* Table of valid Fortran attributes.  */
static const struct attribute_spec gfc_attribute_table[] =
{
  /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler,
       affects_type_identity } */
  { "omp declare target", 0, 0, true,  false, false,
    gfc_handle_omp_declare_target_attribute, false },
  { NULL,		  0, 0, false, false, false, NULL, false }
};

110 111 112
#undef LANG_HOOKS_NAME
#undef LANG_HOOKS_INIT
#undef LANG_HOOKS_FINISH
113
#undef LANG_HOOKS_OPTION_LANG_MASK
114
#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
115 116 117 118 119 120 121
#undef LANG_HOOKS_INIT_OPTIONS
#undef LANG_HOOKS_HANDLE_OPTION
#undef LANG_HOOKS_POST_OPTIONS
#undef LANG_HOOKS_PARSE_FILE
#undef LANG_HOOKS_MARK_ADDRESSABLE
#undef LANG_HOOKS_TYPE_FOR_MODE
#undef LANG_HOOKS_TYPE_FOR_SIZE
122
#undef LANG_HOOKS_GET_ALIAS_SET
123
#undef LANG_HOOKS_INIT_TS
124 125
#undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
#undef LANG_HOOKS_OMP_PREDETERMINED_SHARING
126
#undef LANG_HOOKS_OMP_REPORT_DECL
127
#undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR
128 129
#undef LANG_HOOKS_OMP_CLAUSE_COPY_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP
130
#undef LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR
131
#undef LANG_HOOKS_OMP_CLAUSE_DTOR
132
#undef LANG_HOOKS_OMP_FINISH_CLAUSE
133 134
#undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
#undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE
135
#undef LANG_HOOKS_OMP_PRIVATE_OUTER_REF
136
#undef LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES
137
#undef LANG_HOOKS_BUILTIN_FUNCTION
138
#undef LANG_HOOKS_BUILTIN_FUNCTION
139
#undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
140
#undef LANG_HOOKS_ATTRIBUTE_TABLE
141 142

/* Define lang hooks.  */
143
#define LANG_HOOKS_NAME                 "GNU Fortran"
144 145
#define LANG_HOOKS_INIT                 gfc_init
#define LANG_HOOKS_FINISH               gfc_finish
146
#define LANG_HOOKS_OPTION_LANG_MASK	gfc_option_lang_mask
147
#define LANG_HOOKS_INIT_OPTIONS_STRUCT  gfc_init_options_struct
148 149 150 151
#define LANG_HOOKS_INIT_OPTIONS         gfc_init_options
#define LANG_HOOKS_HANDLE_OPTION        gfc_handle_option
#define LANG_HOOKS_POST_OPTIONS		gfc_post_options
#define LANG_HOOKS_PARSE_FILE           gfc_be_parse_file
152 153 154 155
#define LANG_HOOKS_TYPE_FOR_MODE	gfc_type_for_mode
#define LANG_HOOKS_TYPE_FOR_SIZE	gfc_type_for_size
#define LANG_HOOKS_GET_ALIAS_SET	gfc_get_alias_set
#define LANG_HOOKS_INIT_TS		gfc_init_ts
156 157
#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE	gfc_omp_privatize_by_reference
#define LANG_HOOKS_OMP_PREDETERMINED_SHARING	gfc_omp_predetermined_sharing
158
#define LANG_HOOKS_OMP_REPORT_DECL		gfc_omp_report_decl
159
#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR	gfc_omp_clause_default_ctor
160 161
#define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR		gfc_omp_clause_copy_ctor
#define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP		gfc_omp_clause_assign_op
162
#define LANG_HOOKS_OMP_CLAUSE_LINEAR_CTOR	gfc_omp_clause_linear_ctor
163
#define LANG_HOOKS_OMP_CLAUSE_DTOR		gfc_omp_clause_dtor
164
#define LANG_HOOKS_OMP_FINISH_CLAUSE		gfc_omp_finish_clause
165 166
#define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR	gfc_omp_disregard_value_expr
#define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE	gfc_omp_private_debug_clause
167
#define LANG_HOOKS_OMP_PRIVATE_OUTER_REF	gfc_omp_private_outer_ref
168 169
#define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
  gfc_omp_firstprivatize_type_sizes
170 171 172
#define LANG_HOOKS_BUILTIN_FUNCTION	gfc_builtin_function
#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	gfc_get_array_descr_info
#define LANG_HOOKS_ATTRIBUTE_TABLE	gfc_attribute_table
173

Diego Novillo committed
174
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
175 176 177 178 179 180 181

#define NULL_BINDING_LEVEL (struct binding_level *) NULL

/* A chain of binding_level structures awaiting reuse.  */

static GTY(()) struct binding_level *free_binding_level;

182
/* True means we've initialized exception handling.  */
183
static bool gfc_eh_initialized_p;
184

185 186 187
/* The current translation unit.  */
static GTY(()) tree current_translation_unit;

188

189 190 191 192 193 194 195 196 197 198
static void
gfc_create_decls (void)
{
  /* GCC builtins.  */
  gfc_init_builtin_functions ();

  /* Runtime/IO library functions.  */
  gfc_build_builtin_function_decls ();

  gfc_init_constants ();
199 200 201

  /* Build our translation-unit decl.  */
  current_translation_unit = build_translation_unit_decl (NULL_TREE);
202
  debug_hooks->register_main_translation_unit (current_translation_unit);
203 204
}

205

206
static void
207
gfc_be_parse_file (void)
208 209 210 211 212
{
  gfc_create_decls ();
  gfc_parse_file ();
  gfc_generate_constructors ();

213 214 215
  /* Clear the binding level stack.  */
  while (!global_bindings_p ())
    poplevel (0, 0);
216

217 218 219 220 221 222 223 224 225 226
  /* Finalize all of the globals.

     Emulated tls lowering needs to see all TLS variables before we
     call finalize_compilation_unit.  The C/C++ front ends manage this
     by calling decl_rest_of_compilation on each global and static
     variable as they are seen.  The Fortran front end waits until
     here.  */
  for (tree decl = getdecls (); decl ; decl = DECL_CHAIN (decl))
    rest_of_decl_compilation (decl, true, true);

227 228 229
  /* Switch to the default tree diagnostics here, because there may be
     diagnostics before gfc_finish().  */
  gfc_diagnostics_finish ();
230 231

  global_decl_processing ();
232
}
233 234


235 236 237 238 239
/* Initialize everything.  */

static bool
gfc_init (void)
{
240 241 242 243 244 245 246
  if (!gfc_cpp_enabled ())
    {
      linemap_add (line_table, LC_ENTER, false, gfc_source_file, 1);
      linemap_add (line_table, LC_RENAME, false, "<built-in>", 0);
    }
  else
    gfc_cpp_init_0 ();
247

248 249 250
  gfc_init_decl_processing ();
  gfc_static_ctors = NULL_TREE;

251 252 253
  if (gfc_cpp_enabled ())
    gfc_cpp_init ();

254 255
  gfc_init_1 ();

256
  if (!gfc_new_file ())
257
    fatal_error (input_location, "can't open input file: %s", gfc_source_file);
258

259 260 261
  if (flag_preprocess_only)
    return false;

262 263 264 265 266 267 268
  return true;
}


static void
gfc_finish (void)
{
269
  gfc_cpp_done ();
270 271 272 273 274 275 276 277 278 279
  gfc_done_1 ();
  gfc_release_include_path ();
  return;
}

/* These functions and variables deal with binding contours.  We only
   need these functions for the list of PARM_DECLs, but we leave the
   functions more general; these are a simplified version of the
   functions from GNAT.  */

280 281 282
/* For each binding contour we allocate a binding_level structure which
   records the entities defined or declared in that contour.  Contours
   include:
283 284 285 286 287 288 289

        the global one
        one for each subprogram definition
        one for each compound statement (declare block)

   Binding contours are used to create GCC tree BLOCK nodes.  */

290 291
struct GTY(())
binding_level {
292 293
  /* A chain of ..._DECL nodes for all variables, constants, functions,
     parameters and type declarations.  These ..._DECL nodes are chained
294
     through the DECL_CHAIN field.  */
295 296 297 298
  tree names;
  /* For each level (except the global one), a chain of BLOCK nodes for all
     the levels that were entered and exited one level down from this one.  */
  tree blocks;
299
  /* The binding level containing this one (the enclosing binding level).  */
300 301 302 303 304 305 306 307 308 309 310
  struct binding_level *level_chain;
};

/* The binding level currently in effect.  */
static GTY(()) struct binding_level *current_binding_level = NULL;

/* The outermost binding level. This binding level is created when the
   compiler is started and it will exist through the entire compilation.  */
static GTY(()) struct binding_level *global_binding_level;

/* Binding level structures are initialized by copying this one.  */
311
static struct binding_level clear_binding_level = { NULL, NULL, NULL };
312 313


314
/* Return true if we are in the global binding level.  */
315

316
bool
317 318
global_bindings_p (void)
{
319
  return current_binding_level == global_binding_level;
320 321 322 323 324 325 326 327
}

tree
getdecls (void)
{
  return current_binding_level->names;
}

328
/* Enter a new binding level.  */
329 330

void
331
pushlevel (void)
332
{
333
  struct binding_level *newlevel = ggc_alloc<binding_level> ();
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352

  *newlevel = clear_binding_level;

  /* Add this level to the front of the chain (stack) of levels that are
     active.  */
  newlevel->level_chain = current_binding_level;
  current_binding_level = newlevel;
}

/* Exit a binding level.
   Pop the level off, and restore the state of the identifier-decl mappings
   that were in effect when this level was entered.

   If KEEP is nonzero, this level had explicit declarations, so
   and create a "block" (a BLOCK node) for the level
   to record its declarations and subblocks for symbol table output.

   If FUNCTIONBODY is nonzero, this level is the body of a function,
   so create a block as if KEEP were set and also clear out all
353
   label names.  */
354 355

tree
356
poplevel (int keep, int functionbody)
357
{
358
  /* Points to a BLOCK tree node. This is the BLOCK node constructed for the
359 360 361
     binding level that we are about to exit and which is returned by this
     routine.  */
  tree block_node = NULL_TREE;
362
  tree decl_chain = current_binding_level->names;
363 364 365 366 367 368
  tree subblock_chain = current_binding_level->blocks;
  tree subblock_node;

  /* If there were any declarations in the current binding level, or if this
     binding level is a function body, or if there are any nested blocks then
     create a BLOCK node to record them for the life of this function.  */
369
  if (keep || functionbody)
370
    block_node = build_block (keep ? decl_chain : 0, subblock_chain, 0, 0);
371 372 373

  /* Record the BLOCK node just built as the subblock its enclosing scope.  */
  for (subblock_node = subblock_chain; subblock_node;
374
       subblock_node = BLOCK_CHAIN (subblock_node))
375 376 377 378 379
    BLOCK_SUPERCONTEXT (subblock_node) = block_node;

  /* Clear out the meanings of the local variables of this level.  */

  for (subblock_node = decl_chain; subblock_node;
380
       subblock_node = DECL_CHAIN (subblock_node))
381 382
    if (DECL_NAME (subblock_node) != 0)
      /* If the identifier was used or addressed via a local extern decl,
383
         don't forget that fact.  */
384 385 386 387 388 389 390 391 392 393 394 395
      if (DECL_EXTERNAL (subblock_node))
	{
	  if (TREE_USED (subblock_node))
	    TREE_USED (DECL_NAME (subblock_node)) = 1;
	  if (TREE_ADDRESSABLE (subblock_node))
	    TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (subblock_node)) = 1;
	}

  /* Pop the current level.  */
  current_binding_level = current_binding_level->level_chain;

  if (functionbody)
396
    /* This is the top level block of a function.  */
397
    DECL_INITIAL (current_function_decl) = block_node;
398 399
  else if (current_binding_level == global_binding_level)
    /* When using gfc_start_block/gfc_finish_block from middle-end hooks,
400
       don't add newly created BLOCKs as subblocks of global_binding_level.  */
401
    ;
402 403
  else if (block_node)
    {
404
      current_binding_level->blocks
405
	= block_chainon (current_binding_level->blocks, block_node);
406 407 408 409 410 411 412 413
    }

  /* If we did not make a block for the level just exited, any blocks made for
     inner levels (since they cannot be recorded as subblocks in that level)
     must be carried forward so they will later become subblocks of something
     else.  */
  else if (subblock_chain)
    current_binding_level->blocks
414
      = block_chainon (current_binding_level->blocks, subblock_chain);
415 416 417 418 419
  if (block_node)
    TREE_USED (block_node) = 1;

  return block_node;
}
420 421


422
/* Records a ..._DECL node DECL as belonging to the current lexical scope.
423
   Returns the ..._DECL node.  */
424 425 426 427

tree
pushdecl (tree decl)
{
428
  if (global_bindings_p ())
429
    DECL_CONTEXT (decl) = current_translation_unit;
430
  else
431 432 433 434 435 436 437 438 439 440 441
    {
      /* External objects aren't nested.  For debug info insert a copy
         of the decl into the binding level.  */
      if (DECL_EXTERNAL (decl))
	{
	  tree orig = decl;
	  decl = copy_node (decl);
	  DECL_CONTEXT (orig) = NULL_TREE;
	}
      DECL_CONTEXT (decl) = current_function_decl;
    }
442

443
  /* Put the declaration on the list.  */
444
  DECL_CHAIN (decl) = current_binding_level->names;
445 446
  current_binding_level->names = decl;

447
  /* For the declaration of a type, set its name if it is not already set.  */
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498

  if (TREE_CODE (decl) == TYPE_DECL && TYPE_NAME (TREE_TYPE (decl)) == 0)
    {
      if (DECL_SOURCE_LINE (decl) == 0)
	TYPE_NAME (TREE_TYPE (decl)) = decl;
      else
	TYPE_NAME (TREE_TYPE (decl)) = DECL_NAME (decl);
    }

  return decl;
}


/* Like pushdecl, only it places X in GLOBAL_BINDING_LEVEL.  */

tree
pushdecl_top_level (tree x)
{
  tree t;
  struct binding_level *b = current_binding_level;

  current_binding_level = global_binding_level;
  t = pushdecl (x);
  current_binding_level = b;
  return t;
}

#ifndef CHAR_TYPE_SIZE
#define CHAR_TYPE_SIZE BITS_PER_UNIT
#endif

#ifndef INT_TYPE_SIZE
#define INT_TYPE_SIZE BITS_PER_WORD
#endif

#undef SIZE_TYPE
#define SIZE_TYPE "long unsigned int"

/* Create tree nodes for the basic scalar types of Fortran 95,
   and some nodes representing standard constants (0, 1, (void *) 0).
   Initialize the global binding level.
   Make definitions for built-in primitive functions.  */
static void
gfc_init_decl_processing (void)
{
  current_function_decl = NULL;
  current_binding_level = NULL_BINDING_LEVEL;
  free_binding_level = NULL_BINDING_LEVEL;

  /* Make the binding_level structure for global names. We move all
     variables that are in a COMMON block to this binding level.  */
499
  pushlevel ();
500 501 502 503
  global_binding_level = current_binding_level;

  /* Build common tree nodes. char_type_node is unsigned because we
     only use it for actual characters, not for INTEGER(1). Also, we
504
     want double_type_node to actually have double precision.  */
505
  build_common_tree_nodes (false, false);
506

507
  void_list_node = build_tree_list (NULL_TREE, void_type_node);
508 509

  /* Set up F95 type nodes.  */
510
  gfc_init_kinds ();
511
  gfc_init_types ();
512
  gfc_init_c_interop_kinds ();
513 514
}

515

516 517 518
/* Return the typed-based alias set for T, which may be an expression
   or a type.  Return -1 if we don't do anything special.  */

519
static alias_set_type
520 521 522 523 524 525 526 527 528 529 530 531 532 533
gfc_get_alias_set (tree t)
{
  tree u;

  /* Permit type-punning when accessing an EQUIVALENCEd variable or
     mixed type entry master's return value.  */
  for (u = t; handled_component_p (u); u = TREE_OPERAND (u, 0))
    if (TREE_CODE (u) == COMPONENT_REF
	&& TREE_CODE (TREE_TYPE (TREE_OPERAND (u, 0))) == UNION_TYPE)
      return 0;

  return -1;
}

534
/* Builtin function initialization.  */
535

536
static tree
537
gfc_builtin_function (tree decl)
538 539 540 541 542
{
  pushdecl (decl);
  return decl;
}

543
/* So far we need just these 7 attribute types.  */
Jakub Jelinek committed
544
#define ATTR_NULL			0
545
#define ATTR_LEAF_LIST			(ECF_LEAF)
546
#define ATTR_NOTHROW_LEAF_LIST		(ECF_NOTHROW | ECF_LEAF)
547
#define ATTR_NOTHROW_LEAF_MALLOC_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_MALLOC)
548
#define ATTR_CONST_NOTHROW_LEAF_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_CONST)
549
#define ATTR_PURE_NOTHROW_LEAF_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_PURE)
550 551
#define ATTR_NOTHROW_LIST		(ECF_NOTHROW)
#define ATTR_CONST_NOTHROW_LIST		(ECF_NOTHROW | ECF_CONST)
552 553

static void
554
gfc_define_builtin (const char *name, tree type, enum built_in_function code,
555
		    const char *library_name, int attr)
556 557 558
{
  tree decl;

559 560
  decl = add_builtin_function (name, type, code, BUILT_IN_NORMAL,
			       library_name, NULL_TREE);
561
  set_call_expr_flags (decl, attr);
562

563
  set_builtin_decl (code, decl, true);
564 565 566
}


567
#define DO_DEFINE_MATH_BUILTIN(code, name, argtype, tbase) \
568
    gfc_define_builtin ("__builtin_" name "l", tbase##longdouble[argtype], \
569 570
			BUILT_IN_ ## code ## L, name "l", \
			ATTR_CONST_NOTHROW_LEAF_LIST); \
571
    gfc_define_builtin ("__builtin_" name, tbase##double[argtype], \
572 573
			BUILT_IN_ ## code, name, \
			ATTR_CONST_NOTHROW_LEAF_LIST); \
574
    gfc_define_builtin ("__builtin_" name "f", tbase##float[argtype], \
575 576
			BUILT_IN_ ## code ## F, name "f", \
			ATTR_CONST_NOTHROW_LEAF_LIST);
577

578 579 580 581
#define DEFINE_MATH_BUILTIN(code, name, argtype) \
    DO_DEFINE_MATH_BUILTIN (code, name, argtype, mfunc_)

#define DEFINE_MATH_BUILTIN_C(code, name, argtype) \
582 583
    DO_DEFINE_MATH_BUILTIN (code, name, argtype, mfunc_) \
    DO_DEFINE_MATH_BUILTIN (C##code, "c" name, argtype, mfunc_c)
584 585 586 587 588


/* Create function types for builtin functions.  */

static void
589
build_builtin_fntypes (tree *fntype, tree type)
590 591
{
  /* type (*) (type) */
592
  fntype[0] = build_function_type_list (type, type, NULL_TREE);
593
  /* type (*) (type, type) */
594
  fntype[1] = build_function_type_list (type, type, type, NULL_TREE);
595
  /* type (*) (type, int) */
596 597 598 599
  fntype[2] = build_function_type_list (type,
                                        type, integer_type_node, NULL_TREE);
  /* type (*) (void) */
  fntype[3] = build_function_type_list (type, NULL_TREE);
600 601
  /* type (*) (type, &int) */
  fntype[4] = build_function_type_list (type, type,
602 603 604 605 606
                                        build_pointer_type (integer_type_node),
                                        NULL_TREE);
  /* type (*) (int, type) */
  fntype[5] = build_function_type_list (type,
                                        integer_type_node, type, NULL_TREE);
607 608
}

609

610 611 612
static tree
builtin_type_for_size (int size, bool unsignedp)
{
613
  tree type = gfc_type_for_size (size, unsignedp);
614 615
  return type ? type : error_mark_node;
}
616

617
/* Initialization of builtin function nodes.  */
618

619 620 621
static void
gfc_init_builtin_functions (void)
{
622 623 624 625 626 627 628 629 630
  enum builtin_type
  {
#define DEF_PRIMITIVE_TYPE(NAME, VALUE) NAME,
#define DEF_FUNCTION_TYPE_0(NAME, RETURN) NAME,
#define DEF_FUNCTION_TYPE_1(NAME, RETURN, ARG1) NAME,
#define DEF_FUNCTION_TYPE_2(NAME, RETURN, ARG1, ARG2) NAME,
#define DEF_FUNCTION_TYPE_3(NAME, RETURN, ARG1, ARG2, ARG3) NAME,
#define DEF_FUNCTION_TYPE_4(NAME, RETURN, ARG1, ARG2, ARG3, ARG4) NAME,
#define DEF_FUNCTION_TYPE_5(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5) NAME,
631 632 633 634 635 636
#define DEF_FUNCTION_TYPE_6(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6) NAME,
#define DEF_FUNCTION_TYPE_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6, ARG7) NAME,
#define DEF_FUNCTION_TYPE_8(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6, ARG7, ARG8) NAME,
637
#define DEF_FUNCTION_TYPE_VAR_0(NAME, RETURN) NAME,
638
#define DEF_FUNCTION_TYPE_VAR_2(NAME, RETURN, ARG1, ARG2) NAME,
639 640 641 642
#define DEF_FUNCTION_TYPE_VAR_7(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
				ARG6, ARG7) NAME,
#define DEF_FUNCTION_TYPE_VAR_11(NAME, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
				 ARG6, ARG7, ARG8, ARG9, ARG10, ARG11) NAME,
643 644 645 646 647 648 649 650 651 652 653
#define DEF_POINTER_TYPE(NAME, TYPE) NAME,
#include "types.def"
#undef DEF_PRIMITIVE_TYPE
#undef DEF_FUNCTION_TYPE_0
#undef DEF_FUNCTION_TYPE_1
#undef DEF_FUNCTION_TYPE_2
#undef DEF_FUNCTION_TYPE_3
#undef DEF_FUNCTION_TYPE_4
#undef DEF_FUNCTION_TYPE_5
#undef DEF_FUNCTION_TYPE_6
#undef DEF_FUNCTION_TYPE_7
Jakub Jelinek committed
654
#undef DEF_FUNCTION_TYPE_8
655
#undef DEF_FUNCTION_TYPE_VAR_0
656
#undef DEF_FUNCTION_TYPE_VAR_2
657 658
#undef DEF_FUNCTION_TYPE_VAR_7
#undef DEF_FUNCTION_TYPE_VAR_11
659 660 661 662
#undef DEF_POINTER_TYPE
    BT_LAST
  };

663 664 665 666 667 668
  tree mfunc_float[6];
  tree mfunc_double[6];
  tree mfunc_longdouble[6];
  tree mfunc_cfloat[6];
  tree mfunc_cdouble[6];
  tree mfunc_clongdouble[6];
669 670 671 672 673 674 675
  tree func_cfloat_float, func_float_cfloat;
  tree func_cdouble_double, func_double_cdouble;
  tree func_clongdouble_longdouble, func_longdouble_clongdouble;
  tree func_float_floatp_floatp;
  tree func_double_doublep_doublep;
  tree func_longdouble_longdoublep_longdoublep;
  tree ftype, ptype;
676
  tree builtin_types[(int) BT_LAST + 1];
677

678 679
  int attr;

680 681
  build_builtin_fntypes (mfunc_float, float_type_node);
  build_builtin_fntypes (mfunc_double, double_type_node);
682
  build_builtin_fntypes (mfunc_longdouble, long_double_type_node);
683 684
  build_builtin_fntypes (mfunc_cfloat, complex_float_type_node);
  build_builtin_fntypes (mfunc_cdouble, complex_double_type_node);
685
  build_builtin_fntypes (mfunc_clongdouble, complex_long_double_type_node);
686

687 688 689
  func_cfloat_float = build_function_type_list (float_type_node,
                                                complex_float_type_node,
                                                NULL_TREE);
690

691 692
  func_float_cfloat = build_function_type_list (complex_float_type_node,
                                                float_type_node, NULL_TREE);
693

694 695 696
  func_cdouble_double = build_function_type_list (double_type_node,
                                                  complex_double_type_node,
                                                  NULL_TREE);
697

698 699
  func_double_cdouble = build_function_type_list (complex_double_type_node,
                                                  double_type_node, NULL_TREE);
700

701
  func_clongdouble_longdouble =
702 703
    build_function_type_list (long_double_type_node,
                              complex_long_double_type_node, NULL_TREE);
704

705
  func_longdouble_clongdouble =
706 707
    build_function_type_list (complex_long_double_type_node,
                              long_double_type_node, NULL_TREE);
708 709 710

  ptype = build_pointer_type (float_type_node);
  func_float_floatp_floatp =
711
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
712 713 714

  ptype = build_pointer_type (double_type_node);
  func_double_doublep_doublep =
715
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
716 717 718

  ptype = build_pointer_type (long_double_type_node);
  func_longdouble_longdoublep_longdoublep =
719
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
720

721
/* Non-math builtins are defined manually, so they're not included here.  */
722
#define OTHER_BUILTIN(ID,NAME,TYPE,CONST)
723

724 725
#include "mathbuiltins.def"

726
  gfc_define_builtin ("__builtin_roundl", mfunc_longdouble[0], 
727
		      BUILT_IN_ROUNDL, "roundl", ATTR_CONST_NOTHROW_LEAF_LIST);
728
  gfc_define_builtin ("__builtin_round", mfunc_double[0], 
729
		      BUILT_IN_ROUND, "round", ATTR_CONST_NOTHROW_LEAF_LIST);
730
  gfc_define_builtin ("__builtin_roundf", mfunc_float[0], 
731
		      BUILT_IN_ROUNDF, "roundf", ATTR_CONST_NOTHROW_LEAF_LIST);
732 733

  gfc_define_builtin ("__builtin_truncl", mfunc_longdouble[0],
734
		      BUILT_IN_TRUNCL, "truncl", ATTR_CONST_NOTHROW_LEAF_LIST);
735
  gfc_define_builtin ("__builtin_trunc", mfunc_double[0],
736
		      BUILT_IN_TRUNC, "trunc", ATTR_CONST_NOTHROW_LEAF_LIST);
737
  gfc_define_builtin ("__builtin_truncf", mfunc_float[0],
738
		      BUILT_IN_TRUNCF, "truncf", ATTR_CONST_NOTHROW_LEAF_LIST);
739

740
  gfc_define_builtin ("__builtin_cabsl", func_clongdouble_longdouble, 
741
		      BUILT_IN_CABSL, "cabsl", ATTR_CONST_NOTHROW_LEAF_LIST);
742
  gfc_define_builtin ("__builtin_cabs", func_cdouble_double, 
743
		      BUILT_IN_CABS, "cabs", ATTR_CONST_NOTHROW_LEAF_LIST);
744
  gfc_define_builtin ("__builtin_cabsf", func_cfloat_float, 
745
		      BUILT_IN_CABSF, "cabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
746
 
747
  gfc_define_builtin ("__builtin_copysignl", mfunc_longdouble[1], 
748 749
		      BUILT_IN_COPYSIGNL, "copysignl",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
750
  gfc_define_builtin ("__builtin_copysign", mfunc_double[1], 
751 752
		      BUILT_IN_COPYSIGN, "copysign",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
753
  gfc_define_builtin ("__builtin_copysignf", mfunc_float[1], 
754 755
		      BUILT_IN_COPYSIGNF, "copysignf",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
756
 
757
  gfc_define_builtin ("__builtin_nextafterl", mfunc_longdouble[1], 
758 759
		      BUILT_IN_NEXTAFTERL, "nextafterl",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
760
  gfc_define_builtin ("__builtin_nextafter", mfunc_double[1], 
761 762
		      BUILT_IN_NEXTAFTER, "nextafter",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
763
  gfc_define_builtin ("__builtin_nextafterf", mfunc_float[1], 
764 765
		      BUILT_IN_NEXTAFTERF, "nextafterf",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
766
 
767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
  /* Some built-ins depend on rounding mode. Depending on compilation options, they
     will be "pure" or "const".  */
  attr = flag_rounding_math ? ATTR_PURE_NOTHROW_LEAF_LIST : ATTR_CONST_NOTHROW_LEAF_LIST;

  gfc_define_builtin ("__builtin_rintl", mfunc_longdouble[0], 
		      BUILT_IN_RINTL, "rintl", attr);
  gfc_define_builtin ("__builtin_rint", mfunc_double[0], 
		      BUILT_IN_RINT, "rint", attr);
  gfc_define_builtin ("__builtin_rintf", mfunc_float[0], 
		      BUILT_IN_RINTF, "rintf", attr);

  gfc_define_builtin ("__builtin_remainderl", mfunc_longdouble[1], 
		      BUILT_IN_REMAINDERL, "remainderl", attr);
  gfc_define_builtin ("__builtin_remainder", mfunc_double[1], 
		      BUILT_IN_REMAINDER, "remainder", attr);
  gfc_define_builtin ("__builtin_remainderf", mfunc_float[1], 
		      BUILT_IN_REMAINDERF, "remainderf", attr);
 
  gfc_define_builtin ("__builtin_logbl", mfunc_longdouble[0], 
		      BUILT_IN_LOGBL, "logbl", ATTR_CONST_NOTHROW_LEAF_LIST);
  gfc_define_builtin ("__builtin_logb", mfunc_double[0], 
		      BUILT_IN_LOGB, "logb", ATTR_CONST_NOTHROW_LEAF_LIST);
  gfc_define_builtin ("__builtin_logbf", mfunc_float[0], 
		      BUILT_IN_LOGBF, "logbf", ATTR_CONST_NOTHROW_LEAF_LIST);


793
  gfc_define_builtin ("__builtin_frexpl", mfunc_longdouble[4], 
794
		      BUILT_IN_FREXPL, "frexpl", ATTR_NOTHROW_LEAF_LIST);
795
  gfc_define_builtin ("__builtin_frexp", mfunc_double[4], 
796
		      BUILT_IN_FREXP, "frexp", ATTR_NOTHROW_LEAF_LIST);
797
  gfc_define_builtin ("__builtin_frexpf", mfunc_float[4], 
798
		      BUILT_IN_FREXPF, "frexpf", ATTR_NOTHROW_LEAF_LIST);
799 800
 
  gfc_define_builtin ("__builtin_fabsl", mfunc_longdouble[0], 
801
		      BUILT_IN_FABSL, "fabsl", ATTR_CONST_NOTHROW_LEAF_LIST);
802
  gfc_define_builtin ("__builtin_fabs", mfunc_double[0], 
803
		      BUILT_IN_FABS, "fabs", ATTR_CONST_NOTHROW_LEAF_LIST);
804
  gfc_define_builtin ("__builtin_fabsf", mfunc_float[0], 
805
		      BUILT_IN_FABSF, "fabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
806
 
807
  gfc_define_builtin ("__builtin_scalbnl", mfunc_longdouble[2],
808
		      BUILT_IN_SCALBNL, "scalbnl", ATTR_CONST_NOTHROW_LEAF_LIST);
809
  gfc_define_builtin ("__builtin_scalbn", mfunc_double[2],
810
		      BUILT_IN_SCALBN, "scalbn", ATTR_CONST_NOTHROW_LEAF_LIST);
811
  gfc_define_builtin ("__builtin_scalbnf", mfunc_float[2],
812
		      BUILT_IN_SCALBNF, "scalbnf", ATTR_CONST_NOTHROW_LEAF_LIST);
813
 
814
  gfc_define_builtin ("__builtin_fmodl", mfunc_longdouble[1], 
815
		      BUILT_IN_FMODL, "fmodl", ATTR_CONST_NOTHROW_LEAF_LIST);
816
  gfc_define_builtin ("__builtin_fmod", mfunc_double[1], 
817
		      BUILT_IN_FMOD, "fmod", ATTR_CONST_NOTHROW_LEAF_LIST);
818
  gfc_define_builtin ("__builtin_fmodf", mfunc_float[1], 
819
		      BUILT_IN_FMODF, "fmodf", ATTR_CONST_NOTHROW_LEAF_LIST);
820

821 822 823 824 825
  /* iround{f,,l}, lround{f,,l} and llround{f,,l} */
  ftype = build_function_type_list (integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_iroundf", ftype, BUILT_IN_IROUNDF,
		     "iroundf", ATTR_CONST_NOTHROW_LEAF_LIST);
826 827 828
  ftype = build_function_type_list (long_integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lroundf", ftype, BUILT_IN_LROUNDF,
829
		      "lroundf", ATTR_CONST_NOTHROW_LEAF_LIST);
830 831 832
  ftype = build_function_type_list (long_long_integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_llroundf", ftype, BUILT_IN_LLROUNDF,
833
		      "llroundf", ATTR_CONST_NOTHROW_LEAF_LIST);
834

835 836 837 838
  ftype = build_function_type_list (integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_iround", ftype, BUILT_IN_IROUND,
		     "iround", ATTR_CONST_NOTHROW_LEAF_LIST);
839 840 841
  ftype = build_function_type_list (long_integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lround", ftype, BUILT_IN_LROUND,
842
		      "lround", ATTR_CONST_NOTHROW_LEAF_LIST);
843 844 845
  ftype = build_function_type_list (long_long_integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_llround", ftype, BUILT_IN_LLROUND,
846
		      "llround", ATTR_CONST_NOTHROW_LEAF_LIST);
847

848 849 850 851
  ftype = build_function_type_list (integer_type_node,
                                    long_double_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_iroundl", ftype, BUILT_IN_IROUNDL,
		     "iroundl", ATTR_CONST_NOTHROW_LEAF_LIST);
852 853 854
  ftype = build_function_type_list (long_integer_type_node,
                                    long_double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lroundl", ftype, BUILT_IN_LROUNDL,
855
		      "lroundl", ATTR_CONST_NOTHROW_LEAF_LIST);
856 857 858
  ftype = build_function_type_list (long_long_integer_type_node,
                                    long_double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_llroundl", ftype, BUILT_IN_LLROUNDL,
859
		      "llroundl", ATTR_CONST_NOTHROW_LEAF_LIST);
860

861
  /* These are used to implement the ** operator.  */
862
  gfc_define_builtin ("__builtin_powl", mfunc_longdouble[1], 
863
		      BUILT_IN_POWL, "powl", ATTR_CONST_NOTHROW_LEAF_LIST);
864
  gfc_define_builtin ("__builtin_pow", mfunc_double[1], 
865
		      BUILT_IN_POW, "pow", ATTR_CONST_NOTHROW_LEAF_LIST);
866
  gfc_define_builtin ("__builtin_powf", mfunc_float[1], 
867
		      BUILT_IN_POWF, "powf", ATTR_CONST_NOTHROW_LEAF_LIST);
868
  gfc_define_builtin ("__builtin_cpowl", mfunc_clongdouble[1], 
869
		      BUILT_IN_CPOWL, "cpowl", ATTR_CONST_NOTHROW_LEAF_LIST);
870
  gfc_define_builtin ("__builtin_cpow", mfunc_cdouble[1], 
871
		      BUILT_IN_CPOW, "cpow", ATTR_CONST_NOTHROW_LEAF_LIST);
872
  gfc_define_builtin ("__builtin_cpowf", mfunc_cfloat[1], 
873
		      BUILT_IN_CPOWF, "cpowf", ATTR_CONST_NOTHROW_LEAF_LIST);
874
  gfc_define_builtin ("__builtin_powil", mfunc_longdouble[2],
875
		      BUILT_IN_POWIL, "powil", ATTR_CONST_NOTHROW_LEAF_LIST);
876
  gfc_define_builtin ("__builtin_powi", mfunc_double[2],
877
		      BUILT_IN_POWI, "powi", ATTR_CONST_NOTHROW_LEAF_LIST);
878
  gfc_define_builtin ("__builtin_powif", mfunc_float[2],
879
		      BUILT_IN_POWIF, "powif", ATTR_CONST_NOTHROW_LEAF_LIST);
880

881

882
  if (targetm.libc_has_function (function_c99_math_complex))
883 884
    {
      gfc_define_builtin ("__builtin_cbrtl", mfunc_longdouble[0],
885 886
			  BUILT_IN_CBRTL, "cbrtl",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
887
      gfc_define_builtin ("__builtin_cbrt", mfunc_double[0],
888 889
			  BUILT_IN_CBRT, "cbrt",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
890
      gfc_define_builtin ("__builtin_cbrtf", mfunc_float[0],
891 892
			  BUILT_IN_CBRTF, "cbrtf",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
893
      gfc_define_builtin ("__builtin_cexpil", func_longdouble_clongdouble, 
894 895
			  BUILT_IN_CEXPIL, "cexpil",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
896
      gfc_define_builtin ("__builtin_cexpi", func_double_cdouble,
897 898
			  BUILT_IN_CEXPI, "cexpi",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
899
      gfc_define_builtin ("__builtin_cexpif", func_float_cfloat,
900 901
			  BUILT_IN_CEXPIF, "cexpif",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
902 903
    }

904
  if (targetm.libc_has_function (function_sincos))
905 906 907
    {
      gfc_define_builtin ("__builtin_sincosl",
			  func_longdouble_longdoublep_longdoublep,
908
			  BUILT_IN_SINCOSL, "sincosl", ATTR_NOTHROW_LEAF_LIST);
909
      gfc_define_builtin ("__builtin_sincos", func_double_doublep_doublep,
910
			  BUILT_IN_SINCOS, "sincos", ATTR_NOTHROW_LEAF_LIST);
911
      gfc_define_builtin ("__builtin_sincosf", func_float_floatp_floatp,
912
			  BUILT_IN_SINCOSF, "sincosf", ATTR_NOTHROW_LEAF_LIST);
913 914
    }

915
  /* For LEADZ, TRAILZ, POPCNT and POPPAR.  */
916 917
  ftype = build_function_type_list (integer_type_node,
                                    unsigned_type_node, NULL_TREE);
918
  gfc_define_builtin ("__builtin_clz", ftype, BUILT_IN_CLZ,
919
		      "__builtin_clz", ATTR_CONST_NOTHROW_LEAF_LIST);
920
  gfc_define_builtin ("__builtin_ctz", ftype, BUILT_IN_CTZ,
921
		      "__builtin_ctz", ATTR_CONST_NOTHROW_LEAF_LIST);
922
  gfc_define_builtin ("__builtin_parity", ftype, BUILT_IN_PARITY,
923
		      "__builtin_parity", ATTR_CONST_NOTHROW_LEAF_LIST);
924
  gfc_define_builtin ("__builtin_popcount", ftype, BUILT_IN_POPCOUNT,
925
		      "__builtin_popcount", ATTR_CONST_NOTHROW_LEAF_LIST);
926

927 928 929
  ftype = build_function_type_list (integer_type_node,
                                    long_unsigned_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_clzl", ftype, BUILT_IN_CLZL,
930
		      "__builtin_clzl", ATTR_CONST_NOTHROW_LEAF_LIST);
931
  gfc_define_builtin ("__builtin_ctzl", ftype, BUILT_IN_CTZL,
932
		      "__builtin_ctzl", ATTR_CONST_NOTHROW_LEAF_LIST);
933
  gfc_define_builtin ("__builtin_parityl", ftype, BUILT_IN_PARITYL,
934
		      "__builtin_parityl", ATTR_CONST_NOTHROW_LEAF_LIST);
935
  gfc_define_builtin ("__builtin_popcountl", ftype, BUILT_IN_POPCOUNTL,
936
		      "__builtin_popcountl", ATTR_CONST_NOTHROW_LEAF_LIST);
937

938 939 940
  ftype = build_function_type_list (integer_type_node,
                                    long_long_unsigned_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_clzll", ftype, BUILT_IN_CLZLL,
941
		      "__builtin_clzll", ATTR_CONST_NOTHROW_LEAF_LIST);
942
  gfc_define_builtin ("__builtin_ctzll", ftype, BUILT_IN_CTZLL,
943
		      "__builtin_ctzll", ATTR_CONST_NOTHROW_LEAF_LIST);
944
  gfc_define_builtin ("__builtin_parityll", ftype, BUILT_IN_PARITYLL,
945
		      "__builtin_parityll", ATTR_CONST_NOTHROW_LEAF_LIST);
946
  gfc_define_builtin ("__builtin_popcountll", ftype, BUILT_IN_POPCOUNTLL,
947
		      "__builtin_popcountll", ATTR_CONST_NOTHROW_LEAF_LIST);
948

949 950
  /* Other builtin functions we use.  */

951 952 953
  ftype = build_function_type_list (long_integer_type_node,
                                    long_integer_type_node,
                                    long_integer_type_node, NULL_TREE);
954
  gfc_define_builtin ("__builtin_expect", ftype, BUILT_IN_EXPECT,
955
		      "__builtin_expect", ATTR_CONST_NOTHROW_LEAF_LIST);
956

957 958
  ftype = build_function_type_list (void_type_node,
                                    pvoid_type_node, NULL_TREE);
959
  gfc_define_builtin ("__builtin_free", ftype, BUILT_IN_FREE,
960
		      "free", ATTR_NOTHROW_LEAF_LIST);
961

962 963
  ftype = build_function_type_list (pvoid_type_node,
                                    size_type_node, NULL_TREE);
964
  gfc_define_builtin ("__builtin_malloc", ftype, BUILT_IN_MALLOC,
965
		      "malloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
966

967 968 969
  ftype = build_function_type_list (pvoid_type_node, size_type_node,
				    size_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_calloc", ftype, BUILT_IN_CALLOC,
970
		      "calloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
971 972
  DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_CALLOC)) = 1;

973 974 975
  ftype = build_function_type_list (pvoid_type_node,
                                    size_type_node, pvoid_type_node,
                                    NULL_TREE);
976
  gfc_define_builtin ("__builtin_realloc", ftype, BUILT_IN_REALLOC,
977
		      "realloc", ATTR_NOTHROW_LEAF_LIST);
978

979 980
  ftype = build_function_type_list (integer_type_node,
                                    void_type_node, NULL_TREE);
981
  gfc_define_builtin ("__builtin_isnan", ftype, BUILT_IN_ISNAN,
982
		      "__builtin_isnan", ATTR_CONST_NOTHROW_LEAF_LIST);
983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
  gfc_define_builtin ("__builtin_isfinite", ftype, BUILT_IN_ISFINITE,
		      "__builtin_isfinite", ATTR_CONST_NOTHROW_LEAF_LIST);
  gfc_define_builtin ("__builtin_isnormal", ftype, BUILT_IN_ISNORMAL,
		      "__builtin_isnormal", ATTR_CONST_NOTHROW_LEAF_LIST);

  ftype = build_function_type_list (integer_type_node, void_type_node,
				    void_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_isunordered", ftype, BUILT_IN_ISUNORDERED,
		      "__builtin_isunordered", ATTR_CONST_NOTHROW_LEAF_LIST);
  gfc_define_builtin ("__builtin_islessequal", ftype, BUILT_IN_ISLESSEQUAL,
		      "__builtin_islessequal", ATTR_CONST_NOTHROW_LEAF_LIST);
  gfc_define_builtin ("__builtin_isgreaterequal", ftype,
		      BUILT_IN_ISGREATEREQUAL, "__builtin_isgreaterequal",
		      ATTR_CONST_NOTHROW_LEAF_LIST);

  ftype = build_function_type_list (integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_signbitf", ftype, BUILT_IN_SIGNBITF,
		     "signbitf", ATTR_CONST_NOTHROW_LEAF_LIST);
  ftype = build_function_type_list (integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_signbit", ftype, BUILT_IN_SIGNBIT,
		     "signbit", ATTR_CONST_NOTHROW_LEAF_LIST);
  ftype = build_function_type_list (integer_type_node,
                                    long_double_type_node, NULL_TREE); 
  gfc_define_builtin("__builtin_signbitl", ftype, BUILT_IN_SIGNBITL,
		     "signbitl", ATTR_CONST_NOTHROW_LEAF_LIST);

1011

1012 1013
#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
  builtin_types[(int) ENUM] = VALUE;
1014 1015 1016 1017
#define DEF_FUNCTION_TYPE_0(ENUM, RETURN)                       \
  builtin_types[(int) ENUM]                                     \
    = build_function_type_list (builtin_types[(int) RETURN],	\
                                NULL_TREE);
1018 1019
#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1)				\
  builtin_types[(int) ENUM]						\
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                NULL_TREE);
#define DEF_FUNCTION_TYPE_2(ENUM, RETURN, ARG1, ARG2)           \
  builtin_types[(int) ENUM]                                     \
    = build_function_type_list (builtin_types[(int) RETURN],    \
                                builtin_types[(int) ARG1],      \
                                builtin_types[(int) ARG2],      \
                                NULL_TREE);
#define DEF_FUNCTION_TYPE_3(ENUM, RETURN, ARG1, ARG2, ARG3)             \
  builtin_types[(int) ENUM]                                             \
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                builtin_types[(int) ARG2],              \
                                builtin_types[(int) ARG3],              \
                                NULL_TREE);
1036 1037
#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4)	\
  builtin_types[(int) ENUM]						\
1038 1039 1040 1041 1042 1043
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                builtin_types[(int) ARG2],              \
                                builtin_types[(int) ARG3],		\
                                builtin_types[(int) ARG4],              \
                                NULL_TREE);
1044 1045
#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5)	\
  builtin_types[(int) ENUM]						\
1046 1047 1048 1049 1050 1051 1052
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                builtin_types[(int) ARG2],              \
                                builtin_types[(int) ARG3],		\
                                builtin_types[(int) ARG4],              \
                                builtin_types[(int) ARG5],              \
                                NULL_TREE);
1053 1054 1055
#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6)					\
  builtin_types[(int) ENUM]						\
1056 1057 1058 1059 1060 1061 1062 1063
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                builtin_types[(int) ARG2],              \
                                builtin_types[(int) ARG3],		\
                                builtin_types[(int) ARG4],		\
                                builtin_types[(int) ARG5],              \
                                builtin_types[(int) ARG6],              \
                                NULL_TREE);
1064 1065 1066
#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6, ARG7)					\
  builtin_types[(int) ENUM]						\
1067 1068 1069 1070 1071 1072 1073 1074 1075
    = build_function_type_list (builtin_types[(int) RETURN],            \
                                builtin_types[(int) ARG1],              \
                                builtin_types[(int) ARG2],              \
                                builtin_types[(int) ARG3],		\
                                builtin_types[(int) ARG4],		\
                                builtin_types[(int) ARG5],              \
                                builtin_types[(int) ARG6],              \
                                builtin_types[(int) ARG7],              \
                                NULL_TREE);
Jakub Jelinek committed
1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
#define DEF_FUNCTION_TYPE_8(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6, ARG7, ARG8)				\
  builtin_types[(int) ENUM]						\
    = build_function_type_list (builtin_types[(int) RETURN],		\
				builtin_types[(int) ARG1],		\
				builtin_types[(int) ARG2],		\
				builtin_types[(int) ARG3],		\
				builtin_types[(int) ARG4],		\
				builtin_types[(int) ARG5],		\
				builtin_types[(int) ARG6],		\
				builtin_types[(int) ARG7],		\
				builtin_types[(int) ARG8],		\
				NULL_TREE);
1089 1090
#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN)				\
  builtin_types[(int) ENUM]						\
1091 1092
    = build_varargs_function_type_list (builtin_types[(int) RETURN],    \
                                        NULL_TREE);
1093 1094 1095 1096 1097 1098
#define DEF_FUNCTION_TYPE_VAR_2(ENUM, RETURN, ARG1, ARG2)		\
  builtin_types[(int) ENUM]						\
    = build_varargs_function_type_list (builtin_types[(int) RETURN],   	\
					builtin_types[(int) ARG1],     	\
					builtin_types[(int) ARG2],     	\
					NULL_TREE);
1099 1100
#define DEF_FUNCTION_TYPE_VAR_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
				ARG6, ARG7)				\
1101 1102 1103 1104 1105 1106 1107 1108 1109 1110
  builtin_types[(int) ENUM]						\
    = build_varargs_function_type_list (builtin_types[(int) RETURN],   	\
					builtin_types[(int) ARG1],     	\
					builtin_types[(int) ARG2],     	\
					builtin_types[(int) ARG3],	\
					builtin_types[(int) ARG4],	\
					builtin_types[(int) ARG5],	\
					builtin_types[(int) ARG6],	\
					builtin_types[(int) ARG7],	\
					NULL_TREE);
1111 1112
#define DEF_FUNCTION_TYPE_VAR_11(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
				 ARG6, ARG7, ARG8, ARG9, ARG10, ARG11)	\
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
  builtin_types[(int) ENUM]						\
    = build_varargs_function_type_list (builtin_types[(int) RETURN],   	\
					builtin_types[(int) ARG1],     	\
					builtin_types[(int) ARG2],     	\
					builtin_types[(int) ARG3],	\
					builtin_types[(int) ARG4],	\
					builtin_types[(int) ARG5],	\
					builtin_types[(int) ARG6],	\
					builtin_types[(int) ARG7],	\
					builtin_types[(int) ARG8],	\
					builtin_types[(int) ARG9],	\
					builtin_types[(int) ARG10],	\
					builtin_types[(int) ARG11],	\
					NULL_TREE);
1127 1128 1129 1130 1131
#define DEF_POINTER_TYPE(ENUM, TYPE)			\
  builtin_types[(int) ENUM]				\
    = build_pointer_type (builtin_types[(int) TYPE]);
#include "types.def"
#undef DEF_PRIMITIVE_TYPE
1132
#undef DEF_FUNCTION_TYPE_0
1133 1134 1135 1136 1137 1138
#undef DEF_FUNCTION_TYPE_1
#undef DEF_FUNCTION_TYPE_2
#undef DEF_FUNCTION_TYPE_3
#undef DEF_FUNCTION_TYPE_4
#undef DEF_FUNCTION_TYPE_5
#undef DEF_FUNCTION_TYPE_6
1139 1140
#undef DEF_FUNCTION_TYPE_7
#undef DEF_FUNCTION_TYPE_8
1141
#undef DEF_FUNCTION_TYPE_VAR_0
1142
#undef DEF_FUNCTION_TYPE_VAR_2
1143 1144
#undef DEF_FUNCTION_TYPE_VAR_7
#undef DEF_FUNCTION_TYPE_VAR_11
1145 1146 1147 1148 1149 1150 1151
#undef DEF_POINTER_TYPE
  builtin_types[(int) BT_LAST] = NULL_TREE;

  /* Initialize synchronization builtins.  */
#undef DEF_SYNC_BUILTIN
#define DEF_SYNC_BUILTIN(code, name, type, attr) \
    gfc_define_builtin (name, builtin_types[type], code, name, \
1152
			attr);
1153 1154 1155
#include "../sync-builtins.def"
#undef DEF_SYNC_BUILTIN

1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172
  if (flag_openacc)
    {
#undef DEF_GOACC_BUILTIN
#define DEF_GOACC_BUILTIN(code, name, type, attr) \
      gfc_define_builtin ("__builtin_" name, builtin_types[type], \
			  code, name, attr);
#undef DEF_GOACC_BUILTIN_COMPILER
#define DEF_GOACC_BUILTIN_COMPILER(code, name, type, attr) \
      gfc_define_builtin (name, builtin_types[type], code, name, attr);
#undef DEF_GOMP_BUILTIN
#define DEF_GOMP_BUILTIN(code, name, type, attr) /* ignore */
#include "../omp-builtins.def"
#undef DEF_GOACC_BUILTIN
#undef DEF_GOACC_BUILTIN_COMPILER
#undef DEF_GOMP_BUILTIN
    }

1173
  if (flag_openmp || flag_openmp_simd || flag_tree_parallelize_loops)
1174
    {
1175 1176 1177 1178
#undef DEF_GOACC_BUILTIN
#define DEF_GOACC_BUILTIN(code, name, type, attr) /* ignore */
#undef DEF_GOACC_BUILTIN_COMPILER
#define DEF_GOACC_BUILTIN_COMPILER(code, name, type, attr)  /* ignore */
1179 1180 1181
#undef DEF_GOMP_BUILTIN
#define DEF_GOMP_BUILTIN(code, name, type, attr) \
      gfc_define_builtin ("__builtin_" name, builtin_types[type], \
1182
			  code, name, attr);
1183
#include "../omp-builtins.def"
1184 1185
#undef DEF_GOACC_BUILTIN
#undef DEF_GOACC_BUILTIN_COMPILER
1186 1187 1188 1189
#undef DEF_GOMP_BUILTIN
    }

  gfc_define_builtin ("__builtin_trap", builtin_types[BT_FN_VOID],
1190
		      BUILT_IN_TRAP, NULL, ATTR_NOTHROW_LEAF_LIST);
1191
  TREE_THIS_VOLATILE (builtin_decl_explicit (BUILT_IN_TRAP)) = 1;
1192

1193 1194 1195 1196 1197 1198 1199
  ftype = build_varargs_function_type_list (ptr_type_node, const_ptr_type_node,
					    size_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_assume_aligned", ftype,
		      BUILT_IN_ASSUME_ALIGNED,
		      "__builtin_assume_aligned",
		      ATTR_CONST_NOTHROW_LEAF_LIST);

1200
  gfc_define_builtin ("__emutls_get_address",
1201 1202 1203
		      builtin_types[BT_FN_PTR_PTR],
		      BUILT_IN_EMUTLS_GET_ADDRESS,
		      "__emutls_get_address", ATTR_CONST_NOTHROW_LEAF_LIST);
1204 1205 1206
  gfc_define_builtin ("__emutls_register_common",
		      builtin_types[BT_FN_VOID_PTR_WORD_WORD_PTR],
		      BUILT_IN_EMUTLS_REGISTER_COMMON,
1207
		      "__emutls_register_common", ATTR_NOTHROW_LEAF_LIST);
1208

1209
  build_common_builtin_nodes ();
1210
  targetm.init_builtins ();
1211 1212
}

1213
#undef DEFINE_MATH_BUILTIN_C
1214 1215
#undef DEFINE_MATH_BUILTIN

1216 1217 1218 1219 1220 1221 1222 1223 1224 1225
static void
gfc_init_ts (void)
{
  tree_contains_struct[NAMESPACE_DECL][TS_DECL_NON_COMMON] = 1;
  tree_contains_struct[NAMESPACE_DECL][TS_DECL_WITH_VIS] = 1;
  tree_contains_struct[NAMESPACE_DECL][TS_DECL_WRTL] = 1;
  tree_contains_struct[NAMESPACE_DECL][TS_DECL_COMMON] = 1;
  tree_contains_struct[NAMESPACE_DECL][TS_DECL_MINIMAL] = 1;
}

1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236
void
gfc_maybe_initialize_eh (void)
{
  if (!flag_exceptions || gfc_eh_initialized_p)
    return;

  gfc_eh_initialized_p = true;
  using_eh_for_cleanups ();
}


1237 1238
#include "gt-fortran-f95-lang.h"
#include "gtype-fortran.h"