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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [gcc-4.5.1/] [gcc/] [fortran/] [st.c] - Blame information for rev 826

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 285 jeremybenn
/* Build executable statement trees.
2
   Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
3
   Free Software Foundation, Inc.
4
   Contributed by Andy Vaught
5
 
6
This file is part of GCC.
7
 
8
GCC is free software; you can redistribute it and/or modify it under
9
the terms of the GNU General Public License as published by the Free
10
Software Foundation; either version 3, or (at your option) any later
11
version.
12
 
13
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14
WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
for more details.
17
 
18
You should have received a copy of the GNU General Public License
19
along with GCC; see the file COPYING3.  If not see
20
<http://www.gnu.org/licenses/>.  */
21
 
22
/* Executable statements are strung together into a singly linked list
23
   of code structures.  These structures are later translated into GCC
24
   GENERIC tree structures and from there to executable code for a
25
   target.  */
26
 
27
#include "config.h"
28
#include "system.h"
29
#include "gfortran.h"
30
 
31
gfc_code new_st;
32
 
33
 
34
/* Zeroes out the new_st structure.  */
35
 
36
void
37
gfc_clear_new_st (void)
38
{
39
  memset (&new_st, '\0', sizeof (new_st));
40
  new_st.op = EXEC_NOP;
41
}
42
 
43
 
44
/* Get a gfc_code structure.  */
45
 
46
gfc_code *
47
gfc_get_code (void)
48
{
49
  gfc_code *c;
50
 
51
  c = XCNEW (gfc_code);
52
  c->loc = gfc_current_locus;
53
  return c;
54
}
55
 
56
 
57
/* Given some part of a gfc_code structure, append a set of code to
58
   its tail, returning a pointer to the new tail.  */
59
 
60
gfc_code *
61
gfc_append_code (gfc_code *tail, gfc_code *new_code)
62
{
63
  if (tail != NULL)
64
    {
65
      while (tail->next != NULL)
66
        tail = tail->next;
67
 
68
      tail->next = new_code;
69
    }
70
 
71
  while (new_code->next != NULL)
72
    new_code = new_code->next;
73
 
74
  return new_code;
75
}
76
 
77
 
78
/* Free a single code structure, but not the actual structure itself.  */
79
 
80
void
81
gfc_free_statement (gfc_code *p)
82
{
83
  if (p->expr1)
84
    gfc_free_expr (p->expr1);
85
  if (p->expr2)
86
    gfc_free_expr (p->expr2);
87
 
88
  switch (p->op)
89
    {
90
    case EXEC_NOP:
91
    case EXEC_END_BLOCK:
92
    case EXEC_ASSIGN:
93
    case EXEC_INIT_ASSIGN:
94
    case EXEC_GOTO:
95
    case EXEC_CYCLE:
96
    case EXEC_RETURN:
97
    case EXEC_END_PROCEDURE:
98
    case EXEC_IF:
99
    case EXEC_PAUSE:
100
    case EXEC_STOP:
101
    case EXEC_EXIT:
102
    case EXEC_WHERE:
103
    case EXEC_IOLENGTH:
104
    case EXEC_POINTER_ASSIGN:
105
    case EXEC_DO_WHILE:
106
    case EXEC_CONTINUE:
107
    case EXEC_TRANSFER:
108
    case EXEC_LABEL_ASSIGN:
109
    case EXEC_ENTRY:
110
    case EXEC_ARITHMETIC_IF:
111
      break;
112
 
113
    case EXEC_BLOCK:
114
      gfc_free_namespace (p->ext.ns);
115
      break;
116
 
117
    case EXEC_COMPCALL:
118
    case EXEC_CALL_PPC:
119
    case EXEC_CALL:
120
    case EXEC_ASSIGN_CALL:
121
      gfc_free_actual_arglist (p->ext.actual);
122
      break;
123
 
124
    case EXEC_SELECT:
125
    case EXEC_SELECT_TYPE:
126
      if (p->ext.case_list)
127
        gfc_free_case_list (p->ext.case_list);
128
      break;
129
 
130
    case EXEC_DO:
131
      gfc_free_iterator (p->ext.iterator, 1);
132
      break;
133
 
134
    case EXEC_ALLOCATE:
135
    case EXEC_DEALLOCATE:
136
      gfc_free_alloc_list (p->ext.alloc.list);
137
      break;
138
 
139
    case EXEC_OPEN:
140
      gfc_free_open (p->ext.open);
141
      break;
142
 
143
    case EXEC_CLOSE:
144
      gfc_free_close (p->ext.close);
145
      break;
146
 
147
    case EXEC_BACKSPACE:
148
    case EXEC_ENDFILE:
149
    case EXEC_REWIND:
150
    case EXEC_FLUSH:
151
      gfc_free_filepos (p->ext.filepos);
152
      break;
153
 
154
    case EXEC_INQUIRE:
155
      gfc_free_inquire (p->ext.inquire);
156
      break;
157
 
158
    case EXEC_WAIT:
159
      gfc_free_wait (p->ext.wait);
160
      break;
161
 
162
    case EXEC_READ:
163
    case EXEC_WRITE:
164
      gfc_free_dt (p->ext.dt);
165
      break;
166
 
167
    case EXEC_DT_END:
168
      /* The ext.dt member is a duplicate pointer and doesn't need to
169
         be freed.  */
170
      break;
171
 
172
    case EXEC_FORALL:
173
      gfc_free_forall_iterator (p->ext.forall_iterator);
174
      break;
175
 
176
    case EXEC_OMP_DO:
177
    case EXEC_OMP_END_SINGLE:
178
    case EXEC_OMP_PARALLEL:
179
    case EXEC_OMP_PARALLEL_DO:
180
    case EXEC_OMP_PARALLEL_SECTIONS:
181
    case EXEC_OMP_SECTIONS:
182
    case EXEC_OMP_SINGLE:
183
    case EXEC_OMP_TASK:
184
    case EXEC_OMP_WORKSHARE:
185
    case EXEC_OMP_PARALLEL_WORKSHARE:
186
      gfc_free_omp_clauses (p->ext.omp_clauses);
187
      break;
188
 
189
    case EXEC_OMP_CRITICAL:
190
      gfc_free (CONST_CAST (char *, p->ext.omp_name));
191
      break;
192
 
193
    case EXEC_OMP_FLUSH:
194
      gfc_free_namelist (p->ext.omp_namelist);
195
      break;
196
 
197
    case EXEC_OMP_ATOMIC:
198
    case EXEC_OMP_BARRIER:
199
    case EXEC_OMP_MASTER:
200
    case EXEC_OMP_ORDERED:
201
    case EXEC_OMP_END_NOWAIT:
202
    case EXEC_OMP_TASKWAIT:
203
      break;
204
 
205
    default:
206
      gfc_internal_error ("gfc_free_statement(): Bad statement");
207
    }
208
}
209
 
210
 
211
/* Free a code statement and all other code structures linked to it.  */
212
 
213
void
214
gfc_free_statements (gfc_code *p)
215
{
216
  gfc_code *q;
217
 
218
  for (; p; p = q)
219
    {
220
      q = p->next;
221
 
222
      if (p->block)
223
        gfc_free_statements (p->block);
224
      gfc_free_statement (p);
225
      gfc_free (p);
226
    }
227
}
228
 

powered by: WebSVN 2.1.0

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