f95-lang.c 39.7 KB
Newer Older
1
/* gfortran backend interface
2
   Copyright (C) 2000-2013 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 30
#include "ansidecl.h"
#include "system.h"
#include "coretypes.h"
#include "tree.h"
31
#include "gimple.h"
32 33 34 35 36 37 38 39 40 41 42
#include "flags.h"
#include "langhooks.h"
#include "langhooks-def.h"
#include "timevar.h"
#include "tm.h"
#include "function.h"
#include "ggc.h"
#include "toplev.h"
#include "target.h"
#include "debug.h"
#include "diagnostic.h"
43
#include "dumpfile.h"
44 45
#include "cgraph.h"
#include "gfortran.h"
46
#include "cpp.h"
47 48 49 50 51 52
#include "trans.h"
#include "trans-types.h"
#include "trans-const.h"

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

53 54
struct GTY(())
lang_identifier {
55 56 57 58 59
  struct tree_identifier common;
};

/* The resulting tree type.  */

60
union GTY((desc ("TREE_CODE (&%h.generic) == IDENTIFIER_NODE"),
61
     chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
62
lang_tree_node {
63 64 65 66 67 68 69 70 71
  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.  */

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

static void gfc_init_decl_processing (void);
static void gfc_init_builtin_functions (void);
80
static bool global_bindings_p (void);
81 82 83 84

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

#undef LANG_HOOKS_NAME
#undef LANG_HOOKS_INIT
#undef LANG_HOOKS_FINISH
94
#undef LANG_HOOKS_WRITE_GLOBALS
95
#undef LANG_HOOKS_OPTION_LANG_MASK
96
#undef LANG_HOOKS_INIT_OPTIONS_STRUCT
97 98 99 100 101 102 103
#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
104
#undef LANG_HOOKS_GET_ALIAS_SET
105
#undef LANG_HOOKS_INIT_TS
106 107
#undef LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE
#undef LANG_HOOKS_OMP_PREDETERMINED_SHARING
108
#undef LANG_HOOKS_OMP_REPORT_DECL
109
#undef LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR
110 111 112
#undef LANG_HOOKS_OMP_CLAUSE_COPY_CTOR
#undef LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP
#undef LANG_HOOKS_OMP_CLAUSE_DTOR
113 114
#undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
#undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE
115
#undef LANG_HOOKS_OMP_PRIVATE_OUTER_REF
116
#undef LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES
117
#undef LANG_HOOKS_BUILTIN_FUNCTION
118
#undef LANG_HOOKS_BUILTIN_FUNCTION
119
#undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
120 121

/* Define lang hooks.  */
122
#define LANG_HOOKS_NAME                 "GNU Fortran"
123 124
#define LANG_HOOKS_INIT                 gfc_init
#define LANG_HOOKS_FINISH               gfc_finish
125
#define LANG_HOOKS_WRITE_GLOBALS	gfc_write_global_declarations
126
#define LANG_HOOKS_OPTION_LANG_MASK	gfc_option_lang_mask
127
#define LANG_HOOKS_INIT_OPTIONS_STRUCT  gfc_init_options_struct
128 129 130 131
#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
132 133 134 135
#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
136 137
#define LANG_HOOKS_OMP_PRIVATIZE_BY_REFERENCE	gfc_omp_privatize_by_reference
#define LANG_HOOKS_OMP_PREDETERMINED_SHARING	gfc_omp_predetermined_sharing
138
#define LANG_HOOKS_OMP_REPORT_DECL		gfc_omp_report_decl
139
#define LANG_HOOKS_OMP_CLAUSE_DEFAULT_CTOR	gfc_omp_clause_default_ctor
140 141 142
#define LANG_HOOKS_OMP_CLAUSE_COPY_CTOR		gfc_omp_clause_copy_ctor
#define LANG_HOOKS_OMP_CLAUSE_ASSIGN_OP		gfc_omp_clause_assign_op
#define LANG_HOOKS_OMP_CLAUSE_DTOR		gfc_omp_clause_dtor
143 144
#define LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR	gfc_omp_disregard_value_expr
#define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE	gfc_omp_private_debug_clause
145
#define LANG_HOOKS_OMP_PRIVATE_OUTER_REF	gfc_omp_private_outer_ref
146 147
#define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
  gfc_omp_firstprivatize_type_sizes
148
#define LANG_HOOKS_BUILTIN_FUNCTION          gfc_builtin_function
149
#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	     gfc_get_array_descr_info
150

Diego Novillo committed
151
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
152 153 154 155 156 157 158

#define NULL_BINDING_LEVEL (struct binding_level *) NULL

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

static GTY(()) struct binding_level *free_binding_level;

159
/* True means we've initialized exception handling.  */
160
static bool gfc_eh_initialized_p;
161

162 163 164
/* The current translation unit.  */
static GTY(()) tree current_translation_unit;

165

166 167 168 169 170 171 172 173 174 175
static void
gfc_create_decls (void)
{
  /* GCC builtins.  */
  gfc_init_builtin_functions ();

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

  gfc_init_constants ();
176 177 178

  /* Build our translation-unit decl.  */
  current_translation_unit = build_translation_unit_decl (NULL_TREE);
179 180
}

181

182
static void
183
gfc_be_parse_file (void)
184 185 186 187 188 189 190 191
{
  int errors;
  int warnings;

  gfc_create_decls ();
  gfc_parse_file ();
  gfc_generate_constructors ();

192
  /* Tell the frontend about any errors.  */
193 194 195
  gfc_get_errors (&warnings, &errors);
  errorcount += errors;
  warningcount += warnings;
196

197 198 199
  /* Clear the binding level stack.  */
  while (!global_bindings_p ())
    poplevel (0, 0);
200
}
201 202


203 204 205 206 207
/* Initialize everything.  */

static bool
gfc_init (void)
{
208 209 210 211 212 213 214
  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 ();
215

216 217 218
  gfc_init_decl_processing ();
  gfc_static_ctors = NULL_TREE;

219 220 221
  if (gfc_cpp_enabled ())
    gfc_cpp_init ();

222 223
  gfc_init_1 ();

224
  if (!gfc_new_file ())
225
    fatal_error ("can't open input file: %s", gfc_source_file);
226

227 228 229 230 231 232 233
  return true;
}


static void
gfc_finish (void)
{
234
  gfc_cpp_done ();
235 236 237 238 239
  gfc_done_1 ();
  gfc_release_include_path ();
  return;
}

240 241 242
/* ??? This is something of a hack.

   Emulated tls lowering needs to see all TLS variables before we call
243
   finalize_compilation_unit.  The C/C++ front ends manage this
244 245 246
   by calling decl_rest_of_compilation on each global and static variable
   as they are seen.  The Fortran front end waits until this hook.

247
   A Correct solution is for finalize_compilation_unit not to be
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
   called during the WRITE_GLOBALS langhook, and have that hook only do what
   its name suggests and write out globals.  But the C++ and Java front ends
   have (unspecified) problems with aliases that gets in the way.  It has
   been suggested that these problems would be solved by completing the
   conversion to cgraph-based aliases.  */

static void
gfc_write_global_declarations (void)
{
  tree decl;

  /* Finalize all of the globals.  */
  for (decl = getdecls(); decl ; decl = DECL_CHAIN (decl))
    rest_of_decl_compilation (decl, true, true);

  write_global_declarations ();
}

266 267 268 269 270
/* 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.  */

271 272 273
/* For each binding contour we allocate a binding_level structure which
   records the entities defined or declared in that contour.  Contours
   include:
274 275 276 277 278 279 280

        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.  */

281 282
struct GTY(())
binding_level {
283 284
  /* A chain of ..._DECL nodes for all variables, constants, functions,
     parameters and type declarations.  These ..._DECL nodes are chained
285
     through the DECL_CHAIN field.  */
286 287 288 289
  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;
290
  /* The binding level containing this one (the enclosing binding level).  */
291 292 293 294 295 296 297 298 299 300 301
  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.  */
302
static struct binding_level clear_binding_level = { NULL, NULL, NULL };
303 304


305
/* Return true if we are in the global binding level.  */
306

307
bool
308 309
global_bindings_p (void)
{
310
  return current_binding_level == global_binding_level;
311 312 313 314 315 316 317 318
}

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

319
/* Enter a new binding level. */
320 321

void
322
pushlevel (void)
323
{
324
  struct binding_level *newlevel = ggc_alloc_binding_level ();
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343

  *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
344
   label names.  */
345 346

tree
347
poplevel (int keep, int functionbody)
348
{
349
  /* Points to a BLOCK tree node. This is the BLOCK node constructed for the
350 351 352
     binding level that we are about to exit and which is returned by this
     routine.  */
  tree block_node = NULL_TREE;
353
  tree decl_chain = current_binding_level->names;
354 355 356 357 358 359
  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.  */
360
  if (keep || functionbody)
361
    block_node = build_block (keep ? decl_chain : 0, subblock_chain, 0, 0);
362 363 364

  /* Record the BLOCK node just built as the subblock its enclosing scope.  */
  for (subblock_node = subblock_chain; subblock_node;
365
       subblock_node = BLOCK_CHAIN (subblock_node))
366 367 368 369 370
    BLOCK_SUPERCONTEXT (subblock_node) = block_node;

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

  for (subblock_node = decl_chain; subblock_node;
371
       subblock_node = DECL_CHAIN (subblock_node))
372 373
    if (DECL_NAME (subblock_node) != 0)
      /* If the identifier was used or addressed via a local extern decl,
374
         don't forget that fact.  */
375 376 377 378 379 380 381 382 383 384 385 386
      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)
387 388
    /* This is the top level block of a function. */
    DECL_INITIAL (current_function_decl) = block_node;
389 390
  else if (current_binding_level == global_binding_level)
    /* When using gfc_start_block/gfc_finish_block from middle-end hooks,
391
       don't add newly created BLOCKs as subblocks of global_binding_level.  */
392
    ;
393 394
  else if (block_node)
    {
395
      current_binding_level->blocks
396
	= block_chainon (current_binding_level->blocks, block_node);
397 398 399 400 401 402 403 404
    }

  /* 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
405
      = block_chainon (current_binding_level->blocks, subblock_chain);
406 407 408 409 410
  if (block_node)
    TREE_USED (block_node) = 1;

  return block_node;
}
411 412


413
/* Records a ..._DECL node DECL as belonging to the current lexical scope.
414
   Returns the ..._DECL node.  */
415 416 417 418

tree
pushdecl (tree decl)
{
419
  if (global_bindings_p ())
420
    DECL_CONTEXT (decl) = current_translation_unit;
421
  else
422 423 424 425 426 427 428 429 430 431 432
    {
      /* 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;
    }
433

434
  /* Put the declaration on the list.  */
435
  DECL_CHAIN (decl) = current_binding_level->names;
436 437
  current_binding_level->names = decl;

438
  /* For the declaration of a type, set its name if it is not already set.  */
439 440 441 442 443 444 445 446 447 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

  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.  */
490
  pushlevel ();
491 492 493 494
  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
495
     want double_type_node to actually have double precision.  */
496
  build_common_tree_nodes (false, false);
497

498
  void_list_node = build_tree_list (NULL_TREE, void_type_node);
499 500

  /* Set up F95 type nodes.  */
501
  gfc_init_kinds ();
502
  gfc_init_types ();
503
  gfc_init_c_interop_kinds ();
504 505
}

506

507 508 509
/* 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.  */

510
static alias_set_type
511 512 513 514 515 516 517 518 519 520 521 522 523 524
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;
}

525
/* Builtin function initialization.  */
526

527
static tree
528
gfc_builtin_function (tree decl)
529 530 531 532 533
{
  pushdecl (decl);
  return decl;
}

534 535
/* So far we need just these 4 attribute types.  */
#define ATTR_NOTHROW_LEAF_LIST		(ECF_NOTHROW | ECF_LEAF)
536
#define ATTR_NOTHROW_LEAF_MALLOC_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_MALLOC)
537 538 539
#define ATTR_CONST_NOTHROW_LEAF_LIST	(ECF_NOTHROW | ECF_LEAF | ECF_CONST)
#define ATTR_NOTHROW_LIST		(ECF_NOTHROW)
#define ATTR_CONST_NOTHROW_LIST		(ECF_NOTHROW | ECF_CONST)
540 541

static void
542
gfc_define_builtin (const char *name, tree type, enum built_in_function code,
543
		    const char *library_name, int attr)
544 545 546
{
  tree decl;

547 548
  decl = add_builtin_function (name, type, code, BUILT_IN_NORMAL,
			       library_name, NULL_TREE);
549
  set_call_expr_flags (decl, attr);
550

551
  set_builtin_decl (code, decl, true);
552 553 554
}


555
#define DO_DEFINE_MATH_BUILTIN(code, name, argtype, tbase) \
556
    gfc_define_builtin ("__builtin_" name "l", tbase##longdouble[argtype], \
557 558
			BUILT_IN_ ## code ## L, name "l", \
			ATTR_CONST_NOTHROW_LEAF_LIST); \
559
    gfc_define_builtin ("__builtin_" name, tbase##double[argtype], \
560 561
			BUILT_IN_ ## code, name, \
			ATTR_CONST_NOTHROW_LEAF_LIST); \
562
    gfc_define_builtin ("__builtin_" name "f", tbase##float[argtype], \
563 564
			BUILT_IN_ ## code ## F, name "f", \
			ATTR_CONST_NOTHROW_LEAF_LIST);
565

566 567 568 569
#define DEFINE_MATH_BUILTIN(code, name, argtype) \
    DO_DEFINE_MATH_BUILTIN (code, name, argtype, mfunc_)

#define DEFINE_MATH_BUILTIN_C(code, name, argtype) \
570 571
    DO_DEFINE_MATH_BUILTIN (code, name, argtype, mfunc_) \
    DO_DEFINE_MATH_BUILTIN (C##code, "c" name, argtype, mfunc_c)
572 573 574 575 576


/* Create function types for builtin functions.  */

static void
577
build_builtin_fntypes (tree *fntype, tree type)
578 579
{
  /* type (*) (type) */
580
  fntype[0] = build_function_type_list (type, type, NULL_TREE);
581
  /* type (*) (type, type) */
582
  fntype[1] = build_function_type_list (type, type, type, NULL_TREE);
583
  /* type (*) (type, int) */
584 585 586 587
  fntype[2] = build_function_type_list (type,
                                        type, integer_type_node, NULL_TREE);
  /* type (*) (void) */
  fntype[3] = build_function_type_list (type, NULL_TREE);
588 589
  /* type (*) (type, &int) */
  fntype[4] = build_function_type_list (type, type,
590 591 592 593 594
                                        build_pointer_type (integer_type_node),
                                        NULL_TREE);
  /* type (*) (int, type) */
  fntype[5] = build_function_type_list (type,
                                        integer_type_node, type, NULL_TREE);
595 596
}

597

598 599 600
static tree
builtin_type_for_size (int size, bool unsignedp)
{
601
  tree type = gfc_type_for_size (size, unsignedp);
602 603
  return type ? type : error_mark_node;
}
604

605
/* Initialization of builtin function nodes.  */
606

607 608 609
static void
gfc_init_builtin_functions (void)
{
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637
  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,
#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_VAR_0(NAME, RETURN) NAME,
#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
#undef DEF_FUNCTION_TYPE_VAR_0
#undef DEF_POINTER_TYPE
    BT_LAST
  };

638 639 640 641 642 643
  tree mfunc_float[6];
  tree mfunc_double[6];
  tree mfunc_longdouble[6];
  tree mfunc_cfloat[6];
  tree mfunc_cdouble[6];
  tree mfunc_clongdouble[6];
644 645 646 647 648 649 650
  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;
651
  tree builtin_types[(int) BT_LAST + 1];
652

653 654
  build_builtin_fntypes (mfunc_float, float_type_node);
  build_builtin_fntypes (mfunc_double, double_type_node);
655
  build_builtin_fntypes (mfunc_longdouble, long_double_type_node);
656 657
  build_builtin_fntypes (mfunc_cfloat, complex_float_type_node);
  build_builtin_fntypes (mfunc_cdouble, complex_double_type_node);
658
  build_builtin_fntypes (mfunc_clongdouble, complex_long_double_type_node);
659

660 661 662
  func_cfloat_float = build_function_type_list (float_type_node,
                                                complex_float_type_node,
                                                NULL_TREE);
663

664 665
  func_float_cfloat = build_function_type_list (complex_float_type_node,
                                                float_type_node, NULL_TREE);
666

667 668 669
  func_cdouble_double = build_function_type_list (double_type_node,
                                                  complex_double_type_node,
                                                  NULL_TREE);
670

671 672
  func_double_cdouble = build_function_type_list (complex_double_type_node,
                                                  double_type_node, NULL_TREE);
673

674
  func_clongdouble_longdouble =
675 676
    build_function_type_list (long_double_type_node,
                              complex_long_double_type_node, NULL_TREE);
677

678
  func_longdouble_clongdouble =
679 680
    build_function_type_list (complex_long_double_type_node,
                              long_double_type_node, NULL_TREE);
681 682 683

  ptype = build_pointer_type (float_type_node);
  func_float_floatp_floatp =
684
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
685 686 687

  ptype = build_pointer_type (double_type_node);
  func_double_doublep_doublep =
688
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
689 690 691

  ptype = build_pointer_type (long_double_type_node);
  func_longdouble_longdoublep_longdoublep =
692
    build_function_type_list (void_type_node, ptype, ptype, NULL_TREE);
693

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

697 698
#include "mathbuiltins.def"

699
  gfc_define_builtin ("__builtin_roundl", mfunc_longdouble[0], 
700
		      BUILT_IN_ROUNDL, "roundl", ATTR_CONST_NOTHROW_LEAF_LIST);
701
  gfc_define_builtin ("__builtin_round", mfunc_double[0], 
702
		      BUILT_IN_ROUND, "round", ATTR_CONST_NOTHROW_LEAF_LIST);
703
  gfc_define_builtin ("__builtin_roundf", mfunc_float[0], 
704
		      BUILT_IN_ROUNDF, "roundf", ATTR_CONST_NOTHROW_LEAF_LIST);
705 706

  gfc_define_builtin ("__builtin_truncl", mfunc_longdouble[0],
707
		      BUILT_IN_TRUNCL, "truncl", ATTR_CONST_NOTHROW_LEAF_LIST);
708
  gfc_define_builtin ("__builtin_trunc", mfunc_double[0],
709
		      BUILT_IN_TRUNC, "trunc", ATTR_CONST_NOTHROW_LEAF_LIST);
710
  gfc_define_builtin ("__builtin_truncf", mfunc_float[0],
711
		      BUILT_IN_TRUNCF, "truncf", ATTR_CONST_NOTHROW_LEAF_LIST);
712

713
  gfc_define_builtin ("__builtin_cabsl", func_clongdouble_longdouble, 
714
		      BUILT_IN_CABSL, "cabsl", ATTR_CONST_NOTHROW_LEAF_LIST);
715
  gfc_define_builtin ("__builtin_cabs", func_cdouble_double, 
716
		      BUILT_IN_CABS, "cabs", ATTR_CONST_NOTHROW_LEAF_LIST);
717
  gfc_define_builtin ("__builtin_cabsf", func_cfloat_float, 
718
		      BUILT_IN_CABSF, "cabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
719
 
720
  gfc_define_builtin ("__builtin_copysignl", mfunc_longdouble[1], 
721 722
		      BUILT_IN_COPYSIGNL, "copysignl",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
723
  gfc_define_builtin ("__builtin_copysign", mfunc_double[1], 
724 725
		      BUILT_IN_COPYSIGN, "copysign",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
726
  gfc_define_builtin ("__builtin_copysignf", mfunc_float[1], 
727 728
		      BUILT_IN_COPYSIGNF, "copysignf",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
729
 
730
  gfc_define_builtin ("__builtin_nextafterl", mfunc_longdouble[1], 
731 732
		      BUILT_IN_NEXTAFTERL, "nextafterl",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
733
  gfc_define_builtin ("__builtin_nextafter", mfunc_double[1], 
734 735
		      BUILT_IN_NEXTAFTER, "nextafter",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
736
  gfc_define_builtin ("__builtin_nextafterf", mfunc_float[1], 
737 738
		      BUILT_IN_NEXTAFTERF, "nextafterf",
		      ATTR_CONST_NOTHROW_LEAF_LIST);
739 740
 
  gfc_define_builtin ("__builtin_frexpl", mfunc_longdouble[4], 
741
		      BUILT_IN_FREXPL, "frexpl", ATTR_NOTHROW_LEAF_LIST);
742
  gfc_define_builtin ("__builtin_frexp", mfunc_double[4], 
743
		      BUILT_IN_FREXP, "frexp", ATTR_NOTHROW_LEAF_LIST);
744
  gfc_define_builtin ("__builtin_frexpf", mfunc_float[4], 
745
		      BUILT_IN_FREXPF, "frexpf", ATTR_NOTHROW_LEAF_LIST);
746 747
 
  gfc_define_builtin ("__builtin_fabsl", mfunc_longdouble[0], 
748
		      BUILT_IN_FABSL, "fabsl", ATTR_CONST_NOTHROW_LEAF_LIST);
749
  gfc_define_builtin ("__builtin_fabs", mfunc_double[0], 
750
		      BUILT_IN_FABS, "fabs", ATTR_CONST_NOTHROW_LEAF_LIST);
751
  gfc_define_builtin ("__builtin_fabsf", mfunc_float[0], 
752
		      BUILT_IN_FABSF, "fabsf", ATTR_CONST_NOTHROW_LEAF_LIST);
753 754
 
  gfc_define_builtin ("__builtin_scalbnl", mfunc_longdouble[5], 
755
		      BUILT_IN_SCALBNL, "scalbnl", ATTR_CONST_NOTHROW_LEAF_LIST);
756
  gfc_define_builtin ("__builtin_scalbn", mfunc_double[5], 
757
		      BUILT_IN_SCALBN, "scalbn", ATTR_CONST_NOTHROW_LEAF_LIST);
758
  gfc_define_builtin ("__builtin_scalbnf", mfunc_float[5], 
759
		      BUILT_IN_SCALBNF, "scalbnf", ATTR_CONST_NOTHROW_LEAF_LIST);
760
 
761
  gfc_define_builtin ("__builtin_fmodl", mfunc_longdouble[1], 
762
		      BUILT_IN_FMODL, "fmodl", ATTR_CONST_NOTHROW_LEAF_LIST);
763
  gfc_define_builtin ("__builtin_fmod", mfunc_double[1], 
764
		      BUILT_IN_FMOD, "fmod", ATTR_CONST_NOTHROW_LEAF_LIST);
765
  gfc_define_builtin ("__builtin_fmodf", mfunc_float[1], 
766
		      BUILT_IN_FMODF, "fmodf", ATTR_CONST_NOTHROW_LEAF_LIST);
767

768 769 770 771 772
  /* 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);
773 774 775
  ftype = build_function_type_list (long_integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lroundf", ftype, BUILT_IN_LROUNDF,
776
		      "lroundf", ATTR_CONST_NOTHROW_LEAF_LIST);
777 778 779
  ftype = build_function_type_list (long_long_integer_type_node,
                                    float_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_llroundf", ftype, BUILT_IN_LLROUNDF,
780
		      "llroundf", ATTR_CONST_NOTHROW_LEAF_LIST);
781

782 783 784 785
  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);
786 787 788
  ftype = build_function_type_list (long_integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lround", ftype, BUILT_IN_LROUND,
789
		      "lround", ATTR_CONST_NOTHROW_LEAF_LIST);
790 791 792
  ftype = build_function_type_list (long_long_integer_type_node,
                                    double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_llround", ftype, BUILT_IN_LLROUND,
793
		      "llround", ATTR_CONST_NOTHROW_LEAF_LIST);
794

795 796 797 798
  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);
799 800 801
  ftype = build_function_type_list (long_integer_type_node,
                                    long_double_type_node, NULL_TREE); 
  gfc_define_builtin ("__builtin_lroundl", ftype, BUILT_IN_LROUNDL,
802
		      "lroundl", ATTR_CONST_NOTHROW_LEAF_LIST);
803 804 805
  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,
806
		      "llroundl", ATTR_CONST_NOTHROW_LEAF_LIST);
807

808
  /* These are used to implement the ** operator.  */
809
  gfc_define_builtin ("__builtin_powl", mfunc_longdouble[1], 
810
		      BUILT_IN_POWL, "powl", ATTR_CONST_NOTHROW_LEAF_LIST);
811
  gfc_define_builtin ("__builtin_pow", mfunc_double[1], 
812
		      BUILT_IN_POW, "pow", ATTR_CONST_NOTHROW_LEAF_LIST);
813
  gfc_define_builtin ("__builtin_powf", mfunc_float[1], 
814
		      BUILT_IN_POWF, "powf", ATTR_CONST_NOTHROW_LEAF_LIST);
815
  gfc_define_builtin ("__builtin_cpowl", mfunc_clongdouble[1], 
816
		      BUILT_IN_CPOWL, "cpowl", ATTR_CONST_NOTHROW_LEAF_LIST);
817
  gfc_define_builtin ("__builtin_cpow", mfunc_cdouble[1], 
818
		      BUILT_IN_CPOW, "cpow", ATTR_CONST_NOTHROW_LEAF_LIST);
819
  gfc_define_builtin ("__builtin_cpowf", mfunc_cfloat[1], 
820
		      BUILT_IN_CPOWF, "cpowf", ATTR_CONST_NOTHROW_LEAF_LIST);
821
  gfc_define_builtin ("__builtin_powil", mfunc_longdouble[2], 
822
		      BUILT_IN_POWIL, "powil", ATTR_CONST_NOTHROW_LEAF_LIST);
823
  gfc_define_builtin ("__builtin_powi", mfunc_double[2], 
824
		      BUILT_IN_POWI, "powi", ATTR_CONST_NOTHROW_LEAF_LIST);
825
  gfc_define_builtin ("__builtin_powif", mfunc_float[2], 
826
		      BUILT_IN_POWIF, "powif", ATTR_CONST_NOTHROW_LEAF_LIST);
827

828

829 830 831
  if (TARGET_C99_FUNCTIONS)
    {
      gfc_define_builtin ("__builtin_cbrtl", mfunc_longdouble[0],
832 833
			  BUILT_IN_CBRTL, "cbrtl",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
834
      gfc_define_builtin ("__builtin_cbrt", mfunc_double[0],
835 836
			  BUILT_IN_CBRT, "cbrt",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
837
      gfc_define_builtin ("__builtin_cbrtf", mfunc_float[0],
838 839
			  BUILT_IN_CBRTF, "cbrtf",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
840
      gfc_define_builtin ("__builtin_cexpil", func_longdouble_clongdouble, 
841 842
			  BUILT_IN_CEXPIL, "cexpil",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
843
      gfc_define_builtin ("__builtin_cexpi", func_double_cdouble,
844 845
			  BUILT_IN_CEXPI, "cexpi",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
846
      gfc_define_builtin ("__builtin_cexpif", func_float_cfloat,
847 848
			  BUILT_IN_CEXPIF, "cexpif",
			  ATTR_CONST_NOTHROW_LEAF_LIST);
849 850 851 852 853 854
    }

  if (TARGET_HAS_SINCOS)
    {
      gfc_define_builtin ("__builtin_sincosl",
			  func_longdouble_longdoublep_longdoublep,
855
			  BUILT_IN_SINCOSL, "sincosl", ATTR_NOTHROW_LEAF_LIST);
856
      gfc_define_builtin ("__builtin_sincos", func_double_doublep_doublep,
857
			  BUILT_IN_SINCOS, "sincos", ATTR_NOTHROW_LEAF_LIST);
858
      gfc_define_builtin ("__builtin_sincosf", func_float_floatp_floatp,
859
			  BUILT_IN_SINCOSF, "sincosf", ATTR_NOTHROW_LEAF_LIST);
860 861
    }

862
  /* For LEADZ, TRAILZ, POPCNT and POPPAR.  */
863 864
  ftype = build_function_type_list (integer_type_node,
                                    unsigned_type_node, NULL_TREE);
865
  gfc_define_builtin ("__builtin_clz", ftype, BUILT_IN_CLZ,
866
		      "__builtin_clz", ATTR_CONST_NOTHROW_LEAF_LIST);
867
  gfc_define_builtin ("__builtin_ctz", ftype, BUILT_IN_CTZ,
868
		      "__builtin_ctz", ATTR_CONST_NOTHROW_LEAF_LIST);
869
  gfc_define_builtin ("__builtin_parity", ftype, BUILT_IN_PARITY,
870
		      "__builtin_parity", ATTR_CONST_NOTHROW_LEAF_LIST);
871
  gfc_define_builtin ("__builtin_popcount", ftype, BUILT_IN_POPCOUNT,
872
		      "__builtin_popcount", ATTR_CONST_NOTHROW_LEAF_LIST);
873

874 875 876
  ftype = build_function_type_list (integer_type_node,
                                    long_unsigned_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_clzl", ftype, BUILT_IN_CLZL,
877
		      "__builtin_clzl", ATTR_CONST_NOTHROW_LEAF_LIST);
878
  gfc_define_builtin ("__builtin_ctzl", ftype, BUILT_IN_CTZL,
879
		      "__builtin_ctzl", ATTR_CONST_NOTHROW_LEAF_LIST);
880
  gfc_define_builtin ("__builtin_parityl", ftype, BUILT_IN_PARITYL,
881
		      "__builtin_parityl", ATTR_CONST_NOTHROW_LEAF_LIST);
882
  gfc_define_builtin ("__builtin_popcountl", ftype, BUILT_IN_POPCOUNTL,
883
		      "__builtin_popcountl", ATTR_CONST_NOTHROW_LEAF_LIST);
884

885 886 887
  ftype = build_function_type_list (integer_type_node,
                                    long_long_unsigned_type_node, NULL_TREE);
  gfc_define_builtin ("__builtin_clzll", ftype, BUILT_IN_CLZLL,
888
		      "__builtin_clzll", ATTR_CONST_NOTHROW_LEAF_LIST);
889
  gfc_define_builtin ("__builtin_ctzll", ftype, BUILT_IN_CTZLL,
890
		      "__builtin_ctzll", ATTR_CONST_NOTHROW_LEAF_LIST);
891
  gfc_define_builtin ("__builtin_parityll", ftype, BUILT_IN_PARITYLL,
892
		      "__builtin_parityll", ATTR_CONST_NOTHROW_LEAF_LIST);
893
  gfc_define_builtin ("__builtin_popcountll", ftype, BUILT_IN_POPCOUNTLL,
894
		      "__builtin_popcountll", ATTR_CONST_NOTHROW_LEAF_LIST);
895

896 897
  /* Other builtin functions we use.  */

898 899 900
  ftype = build_function_type_list (long_integer_type_node,
                                    long_integer_type_node,
                                    long_integer_type_node, NULL_TREE);
901
  gfc_define_builtin ("__builtin_expect", ftype, BUILT_IN_EXPECT,
902
		      "__builtin_expect", ATTR_CONST_NOTHROW_LEAF_LIST);
903

904 905
  ftype = build_function_type_list (void_type_node,
                                    pvoid_type_node, NULL_TREE);
906
  gfc_define_builtin ("__builtin_free", ftype, BUILT_IN_FREE,
907
		      "free", ATTR_NOTHROW_LEAF_LIST);
908

909 910
  ftype = build_function_type_list (pvoid_type_node,
                                    size_type_node, NULL_TREE);
911
  gfc_define_builtin ("__builtin_malloc", ftype, BUILT_IN_MALLOC,
912
		      "malloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
913

914 915 916
  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,
917
		      "calloc", ATTR_NOTHROW_LEAF_MALLOC_LIST);
918 919
  DECL_IS_MALLOC (builtin_decl_explicit (BUILT_IN_CALLOC)) = 1;

920 921 922
  ftype = build_function_type_list (pvoid_type_node,
                                    size_type_node, pvoid_type_node,
                                    NULL_TREE);
923
  gfc_define_builtin ("__builtin_realloc", ftype, BUILT_IN_REALLOC,
924
		      "realloc", ATTR_NOTHROW_LEAF_LIST);
925

926 927
  ftype = build_function_type_list (integer_type_node,
                                    void_type_node, NULL_TREE);
928
  gfc_define_builtin ("__builtin_isnan", ftype, BUILT_IN_ISNAN,
929
		      "__builtin_isnan", ATTR_CONST_NOTHROW_LEAF_LIST);
930

931 932
#define DEF_PRIMITIVE_TYPE(ENUM, VALUE) \
  builtin_types[(int) ENUM] = VALUE;
933 934 935 936
#define DEF_FUNCTION_TYPE_0(ENUM, RETURN)                       \
  builtin_types[(int) ENUM]                                     \
    = build_function_type_list (builtin_types[(int) RETURN],	\
                                NULL_TREE);
937 938
#define DEF_FUNCTION_TYPE_1(ENUM, RETURN, ARG1)				\
  builtin_types[(int) ENUM]						\
939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954
    = 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);
955 956
#define DEF_FUNCTION_TYPE_4(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4)	\
  builtin_types[(int) ENUM]						\
957 958 959 960 961 962
    = 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);
963 964
#define DEF_FUNCTION_TYPE_5(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5)	\
  builtin_types[(int) ENUM]						\
965 966 967 968 969 970 971
    = 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);
972 973 974
#define DEF_FUNCTION_TYPE_6(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6)					\
  builtin_types[(int) ENUM]						\
975 976 977 978 979 980 981 982
    = 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);
983 984 985
#define DEF_FUNCTION_TYPE_7(ENUM, RETURN, ARG1, ARG2, ARG3, ARG4, ARG5, \
			    ARG6, ARG7)					\
  builtin_types[(int) ENUM]						\
986 987 988 989 990 991 992 993 994
    = 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);
995 996
#define DEF_FUNCTION_TYPE_VAR_0(ENUM, RETURN)				\
  builtin_types[(int) ENUM]						\
997 998
    = build_varargs_function_type_list (builtin_types[(int) RETURN],    \
                                        NULL_TREE);
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
#define DEF_POINTER_TYPE(ENUM, TYPE)			\
  builtin_types[(int) ENUM]				\
    = build_pointer_type (builtin_types[(int) TYPE]);
#include "types.def"
#undef DEF_PRIMITIVE_TYPE
#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_VAR_0
#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, \
1018
			attr);
1019 1020 1021
#include "../sync-builtins.def"
#undef DEF_SYNC_BUILTIN

1022
  if (gfc_option.gfc_flag_openmp || flag_tree_parallelize_loops)
1023 1024 1025 1026
    {
#undef DEF_GOMP_BUILTIN
#define DEF_GOMP_BUILTIN(code, name, type, attr) \
      gfc_define_builtin ("__builtin_" name, builtin_types[type], \
1027
			  code, name, attr);
1028 1029 1030 1031 1032
#include "../omp-builtins.def"
#undef DEF_GOMP_BUILTIN
    }

  gfc_define_builtin ("__builtin_trap", builtin_types[BT_FN_VOID],
1033
		      BUILT_IN_TRAP, NULL, ATTR_NOTHROW_LEAF_LIST);
1034
  TREE_THIS_VOLATILE (builtin_decl_explicit (BUILT_IN_TRAP)) = 1;
1035

1036
  gfc_define_builtin ("__emutls_get_address",
1037 1038 1039
		      builtin_types[BT_FN_PTR_PTR],
		      BUILT_IN_EMUTLS_GET_ADDRESS,
		      "__emutls_get_address", ATTR_CONST_NOTHROW_LEAF_LIST);
1040 1041 1042
  gfc_define_builtin ("__emutls_register_common",
		      builtin_types[BT_FN_VOID_PTR_WORD_WORD_PTR],
		      BUILT_IN_EMUTLS_REGISTER_COMMON,
1043
		      "__emutls_register_common", ATTR_NOTHROW_LEAF_LIST);
1044

1045
  build_common_builtin_nodes ();
1046
  targetm.init_builtins ();
1047 1048
}

1049
#undef DEFINE_MATH_BUILTIN_C
1050 1051
#undef DEFINE_MATH_BUILTIN

1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
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;
}

1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
void
gfc_maybe_initialize_eh (void)
{
  if (!flag_exceptions || gfc_eh_initialized_p)
    return;

  gfc_eh_initialized_p = true;
  using_eh_for_cleanups ();
}


1073 1074
#include "gt-fortran-f95-lang.h"
#include "gtype-fortran.h"