PIPS
distribution_context.c
Go to the documentation of this file.
1 /*
2 
3  $Id: distribution_context.c 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 /**
28  * General computation for PHRASE distribution
29  * DISTRIBUTION CONTEXT
30  */
31 
32 #include <stdio.h>
33 #include <ctype.h>
34 
35 #include "genC.h"
36 #include "linear.h"
37 #include "ri.h"
38 #include "effects.h"
39 
40 #include "resources.h"
41 
42 #include "misc.h"
43 #include "ri-util.h"
44 #include "prettyprint.h"
45 #include "effects-util.h"
46 
47 #include "text-util.h"
48 
49 
50 #include "dg.h"
51 
54 
55 #include "graph.h"
56 
57 #include "ray_dte.h"
58 #include "sommet.h"
59 #include "sg.h"
60 #include "polyedre.h"
61 
62 #include "phrase_tools.h"
63 
64 #include "effects-generic.h"
65 #include "effects-simple.h"
66 #include "effects-convex.h"
67 
68 #include "phrase_distribution.h"
69 
70 bool internal_compute_distribution_context (statement externalized_code,
71  hash_table* ht_params,
72  hash_table* ht_private,
73  hash_table* ht_in_regions,
74  hash_table* ht_out_regions,
75  void* key_value);
76 /**
77  * This function is called during PHRASE distribution
78  *
79  * The goal here is to compute the context of the distribution from a
80  * given list of statements (after distribution initialization). Those
81  * results are stored in following hashtable:
82  *
83  * HT_STATS: This hashtable stores the statement (values)
84  * associated to names (keys) of externalized function.
85  *
86  * HT_PARAMS: This hashtable stores the list of regions (values)
87  * associated to names (keys) of externalized function. Those regions are
88  * computed as union of IN and OUT regions of specified statement. If two
89  * or more regions refer to the same variable (entity), those regions are
90  * transformed into ONE region (which could be converted to a MAY region).
91  * This hashtable is used to compute the parameters of specified
92  * externalized function.
93  *
94  * HT_PRIVATE: This hashtable stores the list of privates regions (values)
95  * associated to names (keys) of externalized function. This hashtable is
96  * used to compute the private working area in specified externalized
97  * function.
98  *
99  * HT_IN_REGIONS: This hashtable stores the list of IN regions (values)
100  * associated to names (keys) of externalized function. This hashtable is
101  * used to compute OUTPUT communication after externalized function
102  * execution.
103  *
104  * HT_OUT_REGIONS: This hashtable stores the list of OUT regions (values)
105  * associated to names (keys) of externalized function. This hashtable is
106  * used to compute OUTPUT communication after externalized function
107  * execution.
108  *
109  * Return true if everything is OK
110  *
111  * NB: All lists are sorted using externalized fonction name
112  */
114  statement module_stat,
115  entity module,
116  hash_table* ht_stats,
117  hash_table* ht_params,
118  hash_table* ht_private,
119  hash_table* ht_in_regions,
120  hash_table* ht_out_regions)
121 {
122  bool returned_value = true;
123 
124  pips_debug(5, "[BEGIN] compute_distribution_context for %s: \n",
126 
127  *ht_stats = hash_table_make (hash_pointer, 0); /* lazy init */
128  *ht_params = hash_table_make (hash_pointer, 0); /* lazy init */
129  *ht_private = hash_table_make (hash_pointer, 0); /* lazy init */
130  *ht_in_regions = hash_table_make (hash_pointer, 0); /* lazy init */
131  *ht_out_regions = hash_table_make (hash_pointer, 0); /* lazy init */
132 
133  MAP (STATEMENT, s, {
134  statement externalized_code = NULL;
135  int stats_nb;
136  string function_name = get_externalized_and_analyzed_function_name(s, &stats_nb);
137  if (stats_nb > 1) {
138  externalized_code = sequence_statement_containing (module_stat, s);
139  }
140  else if (stats_nb == 1) {
141  externalized_code = s;
142  }
143  else {
144  pips_internal_error("Strange externalized code");
145  }
146 
147  /* Register new externalized function */
148  pips_debug(5, "Register externalized function %s: \n",
149  function_name);
150  if (!hash_defined_p(*ht_stats,function_name)) {
151  hash_put(*ht_stats,function_name,externalized_code);
152  }
153  else {
154  pips_user_warning("Multiply defined value in STATS hash_table!\n");
155  returned_value = false;
156  }
157 
158  pips_debug(3, "ANALYSING function named [%s]..................\n",
159  function_name);
160 
161  if (!internal_compute_distribution_context (externalized_code,
162  ht_params,
163  ht_private,
164  ht_in_regions,
165  ht_out_regions,
166  function_name)) {
167  returned_value = false;
168  }
169  }, l_stats);
170 
171  pips_debug(5, "[END] compute_distribution_context for %s: \n",
173 
174  return returned_value;
175 }
176 
177 /**
178  * This function is called during PHRASE distribution controlization
179  *
180  * The goal here is to compute the context of the distribution from a
181  * given list of call statements (after distribution). Those results are
182  * stored in following hashtable:
183  *
184  * HT_CALLS: This hashtable stores the list of call statements (values)
185  * associated to entity representing the external function (keys). This is
186  * a list because a same function can be called from multiple points of
187  * original program
188  *
189  * HT_PARAMS: This hashtable stores the list of regions (values)
190  * associated to entity representing the external function (keys). Those
191  * regions are computed as union of IN and OUT regions of specified
192  * statement. If two or more regions refer to the same variable (entity),
193  * those regions are transformed into ONE region (which could be converted
194  * to a MAY region). This hashtable is used to compute the parameters of
195  * specified externalized function.
196  *
197  * HT_PRIVATE: This hashtable stores the list of privates regions (values)
198  * associated to entity representing the external function (keys). This
199  * hashtable is used to compute the private working area in specified
200  * externalized function.
201  *
202  * HT_IN_REGIONS: This hashtable stores the list of IN regions (values)
203  * associated to entity representing the external function (keys). This
204  * hashtable is used to compute OUTPUT communication after externalized
205  * function execution.
206  *
207  * HT_OUT_REGIONS: This hashtable stores the list of OUT regions (values)
208  * associated to entity representing the external function (keys). This
209  * hashtable is used to compute OUTPUT communication after externalized
210  * function execution.
211  *
212  * Return true if everything is OK
213  *
214  * NB: All lists are sorted using externalized fonction name
215  */
217  statement module_stat,
218  entity module,
219  hash_table* ht_calls,
220  hash_table* ht_params,
221  hash_table* ht_private,
222  hash_table* ht_in_regions,
223  hash_table* ht_out_regions)
224 {
225  bool returned_value = true;
226  string function_name;
227  entity externalized_function;
228 
229  pips_debug(5, "[BEGIN] compute_distribution_controlization_context for %s: \n",
231  ifdebug(9) {
232  print_statement(module_stat);
233  }
234 
235  *ht_calls = hash_table_make (hash_pointer, 0); /* lazy init */
236  *ht_params = hash_table_make (hash_pointer, 0); /* lazy init */
237  *ht_private = hash_table_make (hash_pointer, 0); /* lazy init */
238  *ht_in_regions = hash_table_make (hash_pointer, 0); /* lazy init */
239  *ht_out_regions = hash_table_make (hash_pointer, 0); /* lazy init */
240 
241 
242  MAP (STATEMENT, s, {
243 
244  function_name = get_externalized_function_name(s);
245 
246  pips_debug(5, "Register statement calling externalized function %s: \n",
247  function_name);
248 
249  externalized_function = module_name_to_entity(function_name);
250 
251  /* Register new externalized function */
252 
253  if (!hash_defined_p(*ht_calls,externalized_function)) {
254  /* This function has NOT been already defined,
255  Register it */
256  pips_debug(2, "Register statement for NEW function %s\n", function_name);
257  hash_put(*ht_calls,externalized_function,CONS(STATEMENT, s, NIL));
259  ht_params,
260  ht_private,
261  ht_in_regions,
262  ht_out_regions,
263  externalized_function)) {
264  returned_value = false;
265  }
266  }
267  else {
268  /* This function has already been defined,
269  add this statement to the list */
270  list l_stats = (list)hash_get(*ht_calls,externalized_function);
271  hash_put(*ht_calls,externalized_function,CONS(STATEMENT, s, l_stats));
272  /* Check that IN and OUT regions match ! */
273  /* NOT IMPLEMENTED Yet ! */
274  pips_debug(2, "Adding statement to function %s\n", function_name);
275  }
276 
277  pips_debug(3, "ANALYSING function named [%s]..................\n",
278  function_name);
279 
280  }, l_calls);
281 
282  pips_debug(5, "[END] compute_distribution_controlization_context for %s: \n",
284 
285  return returned_value;
286 }
287 
288 /**
289  * Compute union of exact regions.
290  */
292 {
293  list l_union = gen_copy_seq (l_in);
294 
295  pips_debug(4, "BEGIN of computing regions UNION\n");
296  MAP (REGION, reg, {
297  entity e = region_entity (reg);
298  bool is_already_present = false;
299  region reg_already_present = NULL;
300  MAP (REGION, union_reg, {
301  entity e2 = region_entity (union_reg);
302  if (same_entity_p(e, e2)) {
303  is_already_present = true;
304  reg_already_present = union_reg;
305  }
306  }, l_union);
307  if (is_already_present) {
308  if (region_scalar_p(reg)) {
309  pips_debug(6, "Found SCALAR region already present [%s]. Ignored.\n",
310  entity_local_name(e));
311  }
312  else {
313  list new_regions;
314  pips_debug(6, "Found ARRAY region already present [%s].\n",
315  entity_local_name(e));
316  pips_debug(6, "Making UNION of:\n");
317  print_region(reg);
318  pips_debug(6, "and:\n");
319  print_region(reg_already_present);
320  new_regions = region_must_union(reg,reg_already_present);
321  pips_debug(6, "Getting:\n");
322  print_regions(new_regions);
323  if (gen_length(new_regions) > 1) {
324  pips_internal_error("Regions union must refer to only ONE region !");
325  }
326  else {
327  gen_remove (&l_union, reg_already_present);
328  l_union = CONS (REGION, REGION(gen_nth(0,new_regions)), l_union);
329  }
330  }
331  }
332  else {
333  pips_debug(6, "Adding region for [%s]\n", entity_local_name(e));
334  l_union = CONS(REGION, reg, l_union);
335  }
336  }, l_out);
337 
338  pips_debug(4, "END of computing regions UNION\n");
339  return l_union;
340 }
341 
342 /**
343  * Internally used to compute distribution context for statement
344  * externalized_code
345  */
347  hash_table* ht_params,
348  hash_table* ht_private,
349  hash_table* ht_in_regions,
350  hash_table* ht_out_regions,
351  void* key_value)
352 {
353  bool returned_value = true;
354 
355  list l_read, l_write, l_in, l_out;
356  list l_params = NIL;
357  list l_priv = NIL;
358 
359  pips_debug(6, "Compute regions\n");
360 
361  l_write = regions_dup
363  l_read = regions_dup
364  (regions_read_regions(load_statement_local_regions(externalized_code)));
365  l_in = regions_dup(load_statement_in_regions(externalized_code));
366  l_out = regions_dup(load_statement_out_regions(externalized_code));
367 
368  ifdebug(6) {
369  pips_debug(6, "READ regions: \n");
370  print_regions(l_read);
371  pips_debug(6, "WRITE regions: \n");
372  print_regions(l_write);
373  }
374 
375  l_params = compute_regions_union (l_in, l_out);
376 
377  l_in = regions_dup(load_statement_in_regions(externalized_code));
378  l_out = regions_dup(load_statement_out_regions(externalized_code));
379  l_priv = RegionsEntitiesInfDifference(l_write, l_in, w_r_combinable_p);
380  l_priv = RegionsEntitiesInfDifference(l_priv, l_out, w_w_combinable_p);
381 
382  l_in = regions_dup(load_statement_in_regions(externalized_code));
383  l_out = regions_dup(load_statement_out_regions(externalized_code));
384 
389 
390  ifdebug(2)
391  {
392  pips_debug(2, "IN regions: \n");
393  print_regions(l_in);
394  pips_debug(2, "OUT regions: \n");
395  print_regions(l_out);
396  pips_debug(2, "Params regions: \n");
397  print_regions(l_params);
398  pips_debug(2, "Private regions: \n");
399  print_regions(l_priv);
400  }
401 
402  /* Storing results in hash_tables */
403 
404  pips_debug(2, "Storing in hash_tables with key %s: \n", (string)key_value);
405 
406  pips_debug(5, "Storing in ht_param: \n");
407  if (!hash_defined_p(*ht_params,key_value)) {
408  hash_put(*ht_params,key_value,l_params);
409  }
410  else {
411  pips_user_warning("Multiply defined value in PARAMS hash_table!\n");
412  returned_value = false;
413  }
414 
415  pips_debug(5, "Storing in ht_private: \n");
416  if (!hash_defined_p(*ht_private,key_value)) {
417  hash_put(*ht_private,key_value,l_priv);
418  }
419  else {
420  pips_user_warning("Multiply defined value in PRIVATE hash_table!\n");
421  returned_value = false;
422  }
423 
424  pips_debug(5, "Storing in ht_in_regions: \n");
425  if (!hash_defined_p(*ht_in_regions,key_value)) {
426  hash_put(*ht_in_regions,key_value,l_in);
427  }
428  else {
429  pips_user_warning("Multiply defined value in IN_REGIONS hash_table!\n");
430  returned_value = false;
431  }
432 
433  pips_debug(5, "Storing in ht_out_regions: \n");
434  if (!hash_defined_p(*ht_out_regions,key_value)) {
435  hash_put(*ht_out_regions,key_value,l_out);
436  }
437  else {
438  pips_user_warning("Multiply defined value in OUT_REGIONS hash_table!\n");
439  returned_value = false;
440  }
441 
442  return returned_value;
443 }
444 
445 /**
446  * Return the identified function name of the externalized portion of code
447  * by searching comment matching tag EXTERNALIZED_CODE_PRAGMA_BEGIN
448  */
450 {
453 }
454 
455 /**
456  * Return the identified function name of the externalized portion of code
457  * by searching comment matching tag EXTERNALIZED_CODE_PRAGMA_CALL
458  */
460 {
463 }
464 
465 /**
466  * Return the identified function name of the externalized portion of code
467  * by searching comment matching tags EXTERNALIZED_CODE_PRAGMA_ANALYZED
468  * Sets the number of statements of this externalizable statement
469  */
471  int* stats_nb)
472 {
473  string comments;
474  string searched_string;
475  string comment_portion = strdup(EXTERNALIZED_CODE_PRAGMA_ANALYZED);
476  char* function_name = NULL;
477  char* next_line;
479 
482  }
483 
484  if (!statement_with_empty_comment_p(stat)) {
485  searched_string = strdup(comment_portion);
486  searched_string[strcspn(comment_portion, "%s")] = '\0';
487  comments = strdup(statement_comments(stat));
488  next_line = strtok (comments, "\n");
489  if (next_line != NULL) {
490  do {
491  string first_occurence = strstr(next_line,searched_string);
492  if (first_occurence != NULL) {
493  function_name = malloc(256);
494  pips_debug(5, "Scanning: [%s] with [%s]", first_occurence, comment_portion);
495  sscanf (first_occurence, comment_portion, function_name, stats_nb);
496  pips_debug(5, "Found function: [%s] and %d stats \n", function_name, *stats_nb);
497  }
498  next_line = strtok(NULL, "\n");
499  }
500  while (next_line != NULL);
501  }
502  }
503 
504  return function_name;
505 }
506 
507 /**
508  * Return a unique (regarding variable_equal_p(var1,var2)) string
509  * representation of a variable var
510  */
512 {
513  string returned_value;
514  intptr_t low, up;
515 
516  returned_value = basic_to_string(variable_basic(var));
517  (strchr(returned_value,'*'))[0] = '\0';
519  if ((expression_integer_value(dimension_lower(dim), &low))
520  && (expression_integer_value(dimension_upper(dim), &up))) {
521  char buffer[256];
522  sprintf (buffer, VARIABLE_NAME_FORMAT, low, up);
523  returned_value = strdup(concatenate(returned_value,strdup(buffer),NULL));
524  }
525  else {
526  returned_value = strdup(concatenate(returned_value,":UNDEFINED",NULL));
527  }
528  }
529 
530  return returned_value;
531 }
532 
533 /**
534  * Build an HASHTABLE where keys are VARIABLE and values are HASHTABLE
535  * where keys are modules or externalized function (ENTITY) and values are
536  * list of regions
537  */
539  entity function,
540  list l_regions)
541 {
542 
543  /* Iterate on all regions of the given list */
544  MAP (REGION, reg, {
545 
546  if (region_scalar_p(reg)) {
547 
548  bool already_present = false;
549  variable already_registered_variable = NULL;
550 
551  /* Get the variable type */
553 
554  pips_debug(2, "Variable %s %zd \n", basic_to_string(variable_basic(var)), gen_length(variable_dimensions(var)));
555  print_region(reg);
556 
557  /* Look if this variable is already registered */
558  HASH_MAP (var2, l2, {
559  if (variable_equal_p(var,var2)) {
560  already_present = true;
561  already_registered_variable = var2;
562  }
563  },*ht_communications);
564 
565  if (already_present) {
566  hash_table ht_for_variable
567  = (hash_table)hash_get(*ht_communications,
568  already_registered_variable);
569  if (hash_defined_p(ht_for_variable,function)) {
570  list old_regs = hash_get(ht_for_variable,
571  function);
572  hash_update(ht_for_variable, function,
573  CONS(REGION,reg,old_regs));
574  pips_debug(2, "Add region for existing function\n");
575  }
576  else {
577  hash_put(ht_for_variable, function,
578  CONS(REGION,reg,NIL));
579  pips_debug(2, "New region for existing function\n");
580  }
581  }
582  else {
583  hash_table new_ht_for_variable
585  hash_put(new_ht_for_variable, function,
586  CONS(REGION,reg,NIL));
587  hash_put(*ht_communications,var,new_ht_for_variable);
588  pips_debug(2, "New function\n");
589  }
590  }
591  }, l_regions);
592 }
int compare_effect_reference(effect *e1, effect *e2)
int compare_effect_reference(e1, e2):
Definition: compare.c:210
string get_externalizable_function_name(statement stat)
Return the identified function name of the externalized portion of code by searching comment matching...
string variable_to_string(variable var)
Return a unique (regarding variable_equal_p(var1,var2)) string representation of a variable var.
bool internal_compute_distribution_context(statement externalized_code, hash_table *ht_params, hash_table *ht_private, hash_table *ht_in_regions, hash_table *ht_out_regions, void *key_value)
Internally used to compute distribution context for statement externalized_code.
void register_scalar_communications(hash_table *ht_communications, entity function, list l_regions)
Build an HASHTABLE where keys are VARIABLE and values are HASHTABLE where keys are modules or externa...
string get_externalized_and_analyzed_function_name(statement stat, int *stats_nb)
Return the identified function name of the externalized portion of code by searching comment matching...
dg_vertex_label vertex_label
dg_arc_label arc_label
General computation for PHRASE distribution DISTRIBUTION CONTEXT.
string get_externalized_function_name(statement stat)
Return the identified function name of the externalized portion of code by searching comment matching...
bool compute_distribution_context(list l_stats, statement module_stat, entity module, hash_table *ht_stats, hash_table *ht_params, hash_table *ht_private, hash_table *ht_in_regions, hash_table *ht_out_regions)
This function is called during PHRASE distribution.
list compute_regions_union(list l_in, list l_out)
Compute union of exact regions.
bool compute_distribution_controlization_context(list l_calls, statement module_stat, entity module, hash_table *ht_calls, hash_table *ht_params, hash_table *ht_private, hash_table *ht_in_regions, hash_table *ht_out_regions)
This function is called during PHRASE distribution controlization.
#define region_entity(reg)
#define REGION
#define region
simulation of the type region
#define region_scalar_p(reg)
list region_must_union(region r1, region r2)
computes the must union of two combinable array regions
list RegionsEntitiesInfDifference(list l1, list l2, bool(*difference_combinable_p)(effect, effect))
list RegionsEntitiesInfDifference(list l1, l2) input : two lists of regions output : a list of region...
list regions_write_regions(list)
list regions_read_regions(list)
void print_regions(list)
list regions_dup(list)
bool w_r_combinable_p(effect, effect)
bool w_w_combinable_p(effect, effect)
list load_statement_out_regions(statement)
list load_statement_in_regions(statement)
list load_statement_local_regions(statement)
void * malloc(YYSIZE_T)
void gen_remove(list *cpp, const void *o)
remove all occurences of item o from list *cpp, which is thus modified.
Definition: list.c:685
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
list gen_copy_seq(list l)
Copy a list structure.
Definition: list.c:501
size_t gen_length(const list l)
Definition: list.c:150
#define CONS(_t_, _i_, _l_)
List element cell constructor (insert an element at the beginning of a list)
Definition: newgen_list.h:150
#define FOREACH(_fe_CASTER, _fe_item, _fe_list)
Apply/map an instruction block on all the elements of a list.
Definition: newgen_list.h:179
gen_chunk gen_nth(int n, const list l)
to be used as ENTITY(gen_nth(3, l))...
Definition: list.c:710
#define MAP(_map_CASTER, _map_item, _map_code, _map_list)
Apply/map an instruction block on all the elements of a list (old fashioned)
Definition: newgen_list.h:226
void gen_sort_list(list l, gen_cmp_func_t compare)
Sorts a list of gen_chunks in place, to avoid allocations...
Definition: list.c:796
bool statement_with_empty_comment_p(statement)
Return true if the statement has an empty statement:
Definition: statement.c:126
hash_table hash_table_make(hash_key_type key_type, size_t size)
Definition: hash.c:294
void * hash_get(const hash_table htp, const void *key)
this function retrieves in the hash table pointed to by htp the couple whose key is equal to key.
Definition: hash.c:449
void hash_put(hash_table htp, const void *key, const void *val)
This functions stores a couple (key,val) in the hash table pointed to by htp.
Definition: hash.c:364
void hash_update(hash_table htp, const void *key, const void *val)
update key->val in htp, that MUST be pre-existent.
Definition: hash.c:491
bool hash_defined_p(const hash_table htp, const void *key)
true if key has e value in htp.
Definition: hash.c:484
#define pips_debug
these macros use the GNU extensions that allow variadic macros, including with an empty list.
Definition: misc-local.h:145
#define pips_user_warning
Definition: misc-local.h:146
#define pips_internal_error
Definition: misc-local.h:149
string concatenate(const char *,...)
Return the concatenation of the given strings.
Definition: string.c:183
#define HASH_MAP(k, v, code, ht)
Definition: newgen_hash.h:60
@ hash_pointer
Definition: newgen_hash.h:32
struct __hash_table * hash_table
Define hash_table structure which is hidden.
Definition: newgen_hash.h:43
struct cons * list
Definition: newgen_types.h:106
int(* gen_cmp_func_t)(const void *, const void *)
Definition: newgen_types.h:114
statement sequence_statement_containing(statement, statement)
Definition: phrase_tools.c:536
string get_function_name_by_searching_tag(statement, const char *)
phrase_distributor.c
#define EXTERNALIZED_CODE_PRAGMA_BEGIN
#define EXTERNALIZED_CODE_PRAGMA_CALL
#define EXTERNALIZED_CODE_PRAGMA_ANALYZED
#define VARIABLE_NAME_FORMAT
Stuff for SEND_PARAM....
static char * module
Definition: pips.c:74
#define print_region(x)
Definition: print.c:343
string basic_to_string(basic)
Definition: type.c:87
void print_statement(statement)
Print a statement on stderr.
Definition: statement.c:98
const char * entity_local_name(entity e)
entity_local_name modified so that it does not core when used in vect_fprint, since someone thought t...
Definition: entity.c:453
bool same_entity_p(entity e1, entity e2)
predicates on entities
Definition: entity.c:1321
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
bool expression_integer_value(expression e, intptr_t *pval)
Definition: eval.c:792
bool variable_equal_p(variable, variable)
Definition: type.c:819
#define dimension_lower(x)
Definition: ri.h:980
#define type_variable(x)
Definition: ri.h:2949
@ is_instruction_sequence
Definition: ri.h:1469
#define instruction_tag(x)
Definition: ri.h:1511
#define sequence_statements(x)
Definition: ri.h:2360
#define dimension_upper(x)
Definition: ri.h:982
#define instruction_sequence(x)
Definition: ri.h:1514
#define variable_dimensions(x)
Definition: ri.h:3122
#define statement_instruction(x)
Definition: ri.h:2458
#define statement_comments(x)
Definition: ri.h:2456
#define entity_type(x)
Definition: ri.h:2792
#define variable_basic(x)
Definition: ri.h:3120
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
char * strdup()
#define ifdebug(n)
Definition: sg.c:47
#define intptr_t
Definition: stdint.in.h:294
static string buffer
Definition: string.c:113
The structure used to build lists in NewGen.
Definition: newgen_list.h:41