OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [c-aux-info.c] - Blame information for rev 38

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* Generate information regarding function declarations and definitions based
2
   on information stored in GCC's tree structure.  This code implements the
3
   -aux-info option.
4
   Copyright (C) 1989, 1991, 1994, 1995, 1997, 1998,
5
   1999, 2000, 2003, 2004, 2007 Free Software Foundation, Inc.
6
   Contributed by Ron Guilmette (rfg@segfault.us.com).
7
 
8
This file is part of GCC.
9
 
10
GCC is free software; you can redistribute it and/or modify it under
11
the terms of the GNU General Public License as published by the Free
12
Software Foundation; either version 3, or (at your option) any later
13
version.
14
 
15
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
16
WARRANTY; without even the implied warranty of MERCHANTABILITY or
17
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18
for more details.
19
 
20
You should have received a copy of the GNU General Public License
21
along with GCC; see the file COPYING3.  If not see
22
<http://www.gnu.org/licenses/>.  */
23
 
24
#include "config.h"
25
#include "system.h"
26
#include "coretypes.h"
27
#include "tm.h"
28
#include "flags.h"
29
#include "tree.h"
30
#include "c-tree.h"
31
#include "toplev.h"
32
 
33
enum formals_style_enum {
34
  ansi,
35
  k_and_r_names,
36
  k_and_r_decls
37
};
38
typedef enum formals_style_enum formals_style;
39
 
40
 
41
static const char *data_type;
42
 
43
static char *affix_data_type (const char *) ATTRIBUTE_MALLOC;
44
static const char *gen_formal_list_for_type (tree, formals_style);
45
static int   deserves_ellipsis (tree);
46
static const char *gen_formal_list_for_func_def (tree, formals_style);
47
static const char *gen_type (const char *, tree, formals_style);
48
static const char *gen_decl (tree, int, formals_style);
49
 
50
/* Given a string representing an entire type or an entire declaration
51
   which only lacks the actual "data-type" specifier (at its left end),
52
   affix the data-type specifier to the left end of the given type
53
   specification or object declaration.
54
 
55
   Because of C language weirdness, the data-type specifier (which normally
56
   goes in at the very left end) may have to be slipped in just to the
57
   right of any leading "const" or "volatile" qualifiers (there may be more
58
   than one).  Actually this may not be strictly necessary because it seems
59
   that GCC (at least) accepts `<data-type> const foo;' and treats it the
60
   same as `const <data-type> foo;' but people are accustomed to seeing
61
   `const char *foo;' and *not* `char const *foo;' so we try to create types
62
   that look as expected.  */
63
 
64
static char *
65
affix_data_type (const char *param)
66
{
67
  char *const type_or_decl = ASTRDUP (param);
68
  char *p = type_or_decl;
69
  char *qualifiers_then_data_type;
70
  char saved;
71
 
72
  /* Skip as many leading const's or volatile's as there are.  */
73
 
74
  for (;;)
75
    {
76
      if (!strncmp (p, "volatile ", 9))
77
        {
78
          p += 9;
79
          continue;
80
        }
81
      if (!strncmp (p, "const ", 6))
82
        {
83
          p += 6;
84
          continue;
85
        }
86
      break;
87
    }
88
 
89
  /* p now points to the place where we can insert the data type.  We have to
90
     add a blank after the data-type of course.  */
91
 
92
  if (p == type_or_decl)
93
    return concat (data_type, " ", type_or_decl, NULL);
94
 
95
  saved = *p;
96
  *p = '\0';
97
  qualifiers_then_data_type = concat (type_or_decl, data_type, NULL);
98
  *p = saved;
99
  return reconcat (qualifiers_then_data_type,
100
                   qualifiers_then_data_type, " ", p, NULL);
101
}
102
 
103
/* Given a tree node which represents some "function type", generate the
104
   source code version of a formal parameter list (of some given style) for
105
   this function type.  Return the whole formal parameter list (including
106
   a pair of surrounding parens) as a string.   Note that if the style
107
   we are currently aiming for is non-ansi, then we just return a pair
108
   of empty parens here.  */
109
 
110
static const char *
111
gen_formal_list_for_type (tree fntype, formals_style style)
112
{
113
  const char *formal_list = "";
114
  tree formal_type;
115
 
116
  if (style != ansi)
117
    return "()";
118
 
119
  formal_type = TYPE_ARG_TYPES (fntype);
120
  while (formal_type && TREE_VALUE (formal_type) != void_type_node)
121
    {
122
      const char *this_type;
123
 
124
      if (*formal_list)
125
        formal_list = concat (formal_list, ", ", NULL);
126
 
127
      this_type = gen_type ("", TREE_VALUE (formal_type), ansi);
128
      formal_list
129
        = ((strlen (this_type))
130
           ? concat (formal_list, affix_data_type (this_type), NULL)
131
           : concat (formal_list, data_type, NULL));
132
 
133
      formal_type = TREE_CHAIN (formal_type);
134
    }
135
 
136
  /* If we got to here, then we are trying to generate an ANSI style formal
137
     parameters list.
138
 
139
     New style prototyped ANSI formal parameter lists should in theory always
140
     contain some stuff between the opening and closing parens, even if it is
141
     only "void".
142
 
143
     The brutal truth though is that there is lots of old K&R code out there
144
     which contains declarations of "pointer-to-function" parameters and
145
     these almost never have fully specified formal parameter lists associated
146
     with them.  That is, the pointer-to-function parameters are declared
147
     with just empty parameter lists.
148
 
149
     In cases such as these, protoize should really insert *something* into
150
     the vacant parameter lists, but what?  It has no basis on which to insert
151
     anything in particular.
152
 
153
     Here, we make life easy for protoize by trying to distinguish between
154
     K&R empty parameter lists and new-style prototyped parameter lists
155
     that actually contain "void".  In the latter case we (obviously) want
156
     to output the "void" verbatim, and that what we do.  In the former case,
157
     we do our best to give protoize something nice to insert.
158
 
159
     This "something nice" should be something that is still valid (when
160
     re-compiled) but something that can clearly indicate to the user that
161
     more typing information (for the parameter list) should be added (by
162
     hand) at some convenient moment.
163
 
164
     The string chosen here is a comment with question marks in it.  */
165
 
166
  if (!*formal_list)
167
    {
168
      if (TYPE_ARG_TYPES (fntype))
169
        /* assert (TREE_VALUE (TYPE_ARG_TYPES (fntype)) == void_type_node);  */
170
        formal_list = "void";
171
      else
172
        formal_list = "/* ??? */";
173
    }
174
  else
175
    {
176
      /* If there were at least some parameters, and if the formals-types-list
177
         petered out to a NULL (i.e. without being terminated by a
178
         void_type_node) then we need to tack on an ellipsis.  */
179
      if (!formal_type)
180
        formal_list = concat (formal_list, ", ...", NULL);
181
    }
182
 
183
  return concat (" (", formal_list, ")", NULL);
184
}
185
 
186
/* For the generation of an ANSI prototype for a function definition, we have
187
   to look at the formal parameter list of the function's own "type" to
188
   determine if the function's formal parameter list should end with an
189
   ellipsis.  Given a tree node, the following function will return nonzero
190
   if the "function type" parameter list should end with an ellipsis.  */
191
 
192
static int
193
deserves_ellipsis (tree fntype)
194
{
195
  tree formal_type;
196
 
197
  formal_type = TYPE_ARG_TYPES (fntype);
198
  while (formal_type && TREE_VALUE (formal_type) != void_type_node)
199
    formal_type = TREE_CHAIN (formal_type);
200
 
201
  /* If there were at least some parameters, and if the formals-types-list
202
     petered out to a NULL (i.e. without being terminated by a void_type_node)
203
     then we need to tack on an ellipsis.  */
204
 
205
  return (!formal_type && TYPE_ARG_TYPES (fntype));
206
}
207
 
208
/* Generate a parameter list for a function definition (in some given style).
209
 
210
   Note that this routine has to be separate (and different) from the code that
211
   generates the prototype parameter lists for function declarations, because
212
   in the case of a function declaration, all we have to go on is a tree node
213
   representing the function's own "function type".  This can tell us the types
214
   of all of the formal parameters for the function, but it cannot tell us the
215
   actual *names* of each of the formal parameters.  We need to output those
216
   parameter names for each function definition.
217
 
218
   This routine gets a pointer to a tree node which represents the actual
219
   declaration of the given function, and this DECL node has a list of formal
220
   parameter (variable) declarations attached to it.  These formal parameter
221
   (variable) declaration nodes give us the actual names of the formal
222
   parameters for the given function definition.
223
 
224
   This routine returns a string which is the source form for the entire
225
   function formal parameter list.  */
226
 
227
static const char *
228
gen_formal_list_for_func_def (tree fndecl, formals_style style)
229
{
230
  const char *formal_list = "";
231
  tree formal_decl;
232
 
233
  formal_decl = DECL_ARGUMENTS (fndecl);
234
  while (formal_decl)
235
    {
236
      const char *this_formal;
237
 
238
      if (*formal_list && ((style == ansi) || (style == k_and_r_names)))
239
        formal_list = concat (formal_list, ", ", NULL);
240
      this_formal = gen_decl (formal_decl, 0, style);
241
      if (style == k_and_r_decls)
242
        formal_list = concat (formal_list, this_formal, "; ", NULL);
243
      else
244
        formal_list = concat (formal_list, this_formal, NULL);
245
      formal_decl = TREE_CHAIN (formal_decl);
246
    }
247
  if (style == ansi)
248
    {
249
      if (!DECL_ARGUMENTS (fndecl))
250
        formal_list = concat (formal_list, "void", NULL);
251
      if (deserves_ellipsis (TREE_TYPE (fndecl)))
252
        formal_list = concat (formal_list, ", ...", NULL);
253
    }
254
  if ((style == ansi) || (style == k_and_r_names))
255
    formal_list = concat (" (", formal_list, ")", NULL);
256
  return formal_list;
257
}
258
 
259
/* Generate a string which is the source code form for a given type (t).  This
260
   routine is ugly and complex because the C syntax for declarations is ugly
261
   and complex.  This routine is straightforward so long as *no* pointer types,
262
   array types, or function types are involved.
263
 
264
   In the simple cases, this routine will return the (string) value which was
265
   passed in as the "ret_val" argument.  Usually, this starts out either as an
266
   empty string, or as the name of the declared item (i.e. the formal function
267
   parameter variable).
268
 
269
   This routine will also return with the global variable "data_type" set to
270
   some string value which is the "basic" data-type of the given complete type.
271
   This "data_type" string can be concatenated onto the front of the returned
272
   string after this routine returns to its caller.
273
 
274
   In complicated cases involving pointer types, array types, or function
275
   types, the C declaration syntax requires an "inside out" approach, i.e. if
276
   you have a type which is a "pointer-to-function" type, you need to handle
277
   the "pointer" part first, but it also has to be "innermost" (relative to
278
   the declaration stuff for the "function" type).  Thus, is this case, you
279
   must prepend a "(*" and append a ")" to the name of the item (i.e. formal
280
   variable).  Then you must append and prepend the other info for the
281
   "function type" part of the overall type.
282
 
283
   To handle the "innermost precedence" rules of complicated C declarators, we
284
   do the following (in this routine).  The input parameter called "ret_val"
285
   is treated as a "seed".  Each time gen_type is called (perhaps recursively)
286
   some additional strings may be appended or prepended (or both) to the "seed"
287
   string.  If yet another (lower) level of the GCC tree exists for the given
288
   type (as in the case of a pointer type, an array type, or a function type)
289
   then the (wrapped) seed is passed to a (recursive) invocation of gen_type()
290
   this recursive invocation may again "wrap" the (new) seed with yet more
291
   declarator stuff, by appending, prepending (or both).  By the time the
292
   recursion bottoms out, the "seed value" at that point will have a value
293
   which is (almost) the complete source version of the declarator (except
294
   for the data_type info).  Thus, this deepest "seed" value is simply passed
295
   back up through all of the recursive calls until it is given (as the return
296
   value) to the initial caller of the gen_type() routine.  All that remains
297
   to do at this point is for the initial caller to prepend the "data_type"
298
   string onto the returned "seed".  */
299
 
300
static const char *
301
gen_type (const char *ret_val, tree t, formals_style style)
302
{
303
  tree chain_p;
304
 
305
  /* If there is a typedef name for this type, use it.  */
306
  if (TYPE_NAME (t) && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
307
    data_type = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (t)));
308
  else
309
    {
310
      switch (TREE_CODE (t))
311
        {
312
        case POINTER_TYPE:
313
          if (TYPE_READONLY (t))
314
            ret_val = concat ("const ", ret_val, NULL);
315
          if (TYPE_VOLATILE (t))
316
            ret_val = concat ("volatile ", ret_val, NULL);
317
 
318
          ret_val = concat ("*", ret_val, NULL);
319
 
320
          if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
321
            ret_val = concat ("(", ret_val, ")", NULL);
322
 
323
          ret_val = gen_type (ret_val, TREE_TYPE (t), style);
324
 
325
          return ret_val;
326
 
327
        case ARRAY_TYPE:
328
          if (!COMPLETE_TYPE_P (t) || TREE_CODE (TYPE_SIZE (t)) != INTEGER_CST)
329
            ret_val = gen_type (concat (ret_val, "[]", NULL),
330
                                TREE_TYPE (t), style);
331
          else if (int_size_in_bytes (t) == 0)
332
            ret_val = gen_type (concat (ret_val, "[0]", NULL),
333
                                TREE_TYPE (t), style);
334
          else
335
            {
336
              int size = (int_size_in_bytes (t) / int_size_in_bytes (TREE_TYPE (t)));
337
              char buff[10];
338
              sprintf (buff, "[%d]", size);
339
              ret_val = gen_type (concat (ret_val, buff, NULL),
340
                                  TREE_TYPE (t), style);
341
            }
342
          break;
343
 
344
        case FUNCTION_TYPE:
345
          ret_val = gen_type (concat (ret_val,
346
                                      gen_formal_list_for_type (t, style),
347
                                      NULL),
348
                              TREE_TYPE (t), style);
349
          break;
350
 
351
        case IDENTIFIER_NODE:
352
          data_type = IDENTIFIER_POINTER (t);
353
          break;
354
 
355
        /* The following three cases are complicated by the fact that a
356
           user may do something really stupid, like creating a brand new
357
           "anonymous" type specification in a formal argument list (or as
358
           part of a function return type specification).  For example:
359
 
360
                int f (enum { red, green, blue } color);
361
 
362
           In such cases, we have no name that we can put into the prototype
363
           to represent the (anonymous) type.  Thus, we have to generate the
364
           whole darn type specification.  Yuck!  */
365
 
366
        case RECORD_TYPE:
367
          if (TYPE_NAME (t))
368
            data_type = IDENTIFIER_POINTER (TYPE_NAME (t));
369
          else
370
            {
371
              data_type = "";
372
              chain_p = TYPE_FIELDS (t);
373
              while (chain_p)
374
                {
375
                  data_type = concat (data_type, gen_decl (chain_p, 0, ansi),
376
                                      NULL);
377
                  chain_p = TREE_CHAIN (chain_p);
378
                  data_type = concat (data_type, "; ", NULL);
379
                }
380
              data_type = concat ("{ ", data_type, "}", NULL);
381
            }
382
          data_type = concat ("struct ", data_type, NULL);
383
          break;
384
 
385
        case UNION_TYPE:
386
          if (TYPE_NAME (t))
387
            data_type = IDENTIFIER_POINTER (TYPE_NAME (t));
388
          else
389
            {
390
              data_type = "";
391
              chain_p = TYPE_FIELDS (t);
392
              while (chain_p)
393
                {
394
                  data_type = concat (data_type, gen_decl (chain_p, 0, ansi),
395
                                      NULL);
396
                  chain_p = TREE_CHAIN (chain_p);
397
                  data_type = concat (data_type, "; ", NULL);
398
                }
399
              data_type = concat ("{ ", data_type, "}", NULL);
400
            }
401
          data_type = concat ("union ", data_type, NULL);
402
          break;
403
 
404
        case ENUMERAL_TYPE:
405
          if (TYPE_NAME (t))
406
            data_type = IDENTIFIER_POINTER (TYPE_NAME (t));
407
          else
408
            {
409
              data_type = "";
410
              chain_p = TYPE_VALUES (t);
411
              while (chain_p)
412
                {
413
                  data_type = concat (data_type,
414
                        IDENTIFIER_POINTER (TREE_PURPOSE (chain_p)), NULL);
415
                  chain_p = TREE_CHAIN (chain_p);
416
                  if (chain_p)
417
                    data_type = concat (data_type, ", ", NULL);
418
                }
419
              data_type = concat ("{ ", data_type, " }", NULL);
420
            }
421
          data_type = concat ("enum ", data_type, NULL);
422
          break;
423
 
424
        case TYPE_DECL:
425
          data_type = IDENTIFIER_POINTER (DECL_NAME (t));
426
          break;
427
 
428
        case INTEGER_TYPE:
429
          data_type = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (t)));
430
          /* Normally, `unsigned' is part of the deal.  Not so if it comes
431
             with a type qualifier.  */
432
          if (TYPE_UNSIGNED (t) && TYPE_QUALS (t))
433
            data_type = concat ("unsigned ", data_type, NULL);
434
          break;
435
 
436
        case REAL_TYPE:
437
          data_type = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (t)));
438
          break;
439
 
440
        case VOID_TYPE:
441
          data_type = "void";
442
          break;
443
 
444
        case ERROR_MARK:
445
          data_type = "[ERROR]";
446
          break;
447
 
448
        default:
449
          gcc_unreachable ();
450
        }
451
    }
452
  if (TYPE_READONLY (t))
453
    ret_val = concat ("const ", ret_val, NULL);
454
  if (TYPE_VOLATILE (t))
455
    ret_val = concat ("volatile ", ret_val, NULL);
456
  if (TYPE_RESTRICT (t))
457
    ret_val = concat ("restrict ", ret_val, NULL);
458
  return ret_val;
459
}
460
 
461
/* Generate a string (source) representation of an entire entity declaration
462
   (using some particular style for function types).
463
 
464
   The given entity may be either a variable or a function.
465
 
466
   If the "is_func_definition" parameter is nonzero, assume that the thing
467
   we are generating a declaration for is a FUNCTION_DECL node which is
468
   associated with a function definition.  In this case, we can assume that
469
   an attached list of DECL nodes for function formal arguments is present.  */
470
 
471
static const char *
472
gen_decl (tree decl, int is_func_definition, formals_style style)
473
{
474
  const char *ret_val;
475
 
476
  if (DECL_NAME (decl))
477
    ret_val = IDENTIFIER_POINTER (DECL_NAME (decl));
478
  else
479
    ret_val = "";
480
 
481
  /* If we are just generating a list of names of formal parameters, we can
482
     simply return the formal parameter name (with no typing information
483
     attached to it) now.  */
484
 
485
  if (style == k_and_r_names)
486
    return ret_val;
487
 
488
  /* Note that for the declaration of some entity (either a function or a
489
     data object, like for instance a parameter) if the entity itself was
490
     declared as either const or volatile, then const and volatile properties
491
     are associated with just the declaration of the entity, and *not* with
492
     the `type' of the entity.  Thus, for such declared entities, we have to
493
     generate the qualifiers here.  */
494
 
495
  if (TREE_THIS_VOLATILE (decl))
496
    ret_val = concat ("volatile ", ret_val, NULL);
497
  if (TREE_READONLY (decl))
498
    ret_val = concat ("const ", ret_val, NULL);
499
 
500
  data_type = "";
501
 
502
  /* For FUNCTION_DECL nodes, there are two possible cases here.  First, if
503
     this FUNCTION_DECL node was generated from a function "definition", then
504
     we will have a list of DECL_NODE's, one for each of the function's formal
505
     parameters.  In this case, we can print out not only the types of each
506
     formal, but also each formal's name.  In the second case, this
507
     FUNCTION_DECL node came from an actual function declaration (and *not*
508
     a definition).  In this case, we do nothing here because the formal
509
     argument type-list will be output later, when the "type" of the function
510
     is added to the string we are building.  Note that the ANSI-style formal
511
     parameter list is considered to be a (suffix) part of the "type" of the
512
     function.  */
513
 
514
  if (TREE_CODE (decl) == FUNCTION_DECL && is_func_definition)
515
    {
516
      ret_val = concat (ret_val, gen_formal_list_for_func_def (decl, ansi),
517
                        NULL);
518
 
519
      /* Since we have already added in the formals list stuff, here we don't
520
         add the whole "type" of the function we are considering (which
521
         would include its parameter-list info), rather, we only add in
522
         the "type" of the "type" of the function, which is really just
523
         the return-type of the function (and does not include the parameter
524
         list info).  */
525
 
526
      ret_val = gen_type (ret_val, TREE_TYPE (TREE_TYPE (decl)), style);
527
    }
528
  else
529
    ret_val = gen_type (ret_val, TREE_TYPE (decl), style);
530
 
531
  ret_val = affix_data_type (ret_val);
532
 
533
  if (TREE_CODE (decl) != FUNCTION_DECL && C_DECL_REGISTER (decl))
534
    ret_val = concat ("register ", ret_val, NULL);
535
  if (TREE_PUBLIC (decl))
536
    ret_val = concat ("extern ", ret_val, NULL);
537
  if (TREE_CODE (decl) == FUNCTION_DECL && !TREE_PUBLIC (decl))
538
    ret_val = concat ("static ", ret_val, NULL);
539
 
540
  return ret_val;
541
}
542
 
543
extern FILE *aux_info_file;
544
 
545
/* Generate and write a new line of info to the aux-info (.X) file.  This
546
   routine is called once for each function declaration, and once for each
547
   function definition (even the implicit ones).  */
548
 
549
void
550
gen_aux_info_record (tree fndecl, int is_definition, int is_implicit,
551
                     int is_prototyped)
552
{
553
  if (flag_gen_aux_info)
554
    {
555
      static int compiled_from_record = 0;
556
      expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (fndecl));
557
 
558
      /* Each output .X file must have a header line.  Write one now if we
559
         have not yet done so.  */
560
 
561
      if (!compiled_from_record++)
562
        {
563
          /* The first line tells which directory file names are relative to.
564
             Currently, -aux-info works only for files in the working
565
             directory, so just use a `.' as a placeholder for now.  */
566
          fprintf (aux_info_file, "/* compiled from: . */\n");
567
        }
568
 
569
      /* Write the actual line of auxiliary info.  */
570
 
571
      fprintf (aux_info_file, "/* %s:%d:%c%c */ %s;",
572
               xloc.file, xloc.line,
573
               (is_implicit) ? 'I' : (is_prototyped) ? 'N' : 'O',
574
               (is_definition) ? 'F' : 'C',
575
               gen_decl (fndecl, is_definition, ansi));
576
 
577
      /* If this is an explicit function declaration, we need to also write
578
         out an old-style (i.e. K&R) function header, just in case the user
579
         wants to run unprotoize.  */
580
 
581
      if (is_definition)
582
        {
583
          fprintf (aux_info_file, " /*%s %s*/",
584
                   gen_formal_list_for_func_def (fndecl, k_and_r_names),
585
                   gen_formal_list_for_func_def (fndecl, k_and_r_decls));
586
        }
587
 
588
      fprintf (aux_info_file, "\n");
589
    }
590
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.