PIPS
unary_operators.c
Go to the documentation of this file.
1 /*
2 
3  $Id: unary_operators.c 23412 2017-08-09 15:07:09Z irigoin $
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 /* package simple effects : Be'atrice Creusillet 6/97
28  *
29  * File: unary_operators.c
30  * ~~~~~~~~~~~~~~~~~~~~~~~
31  *
32  * This File contains the intanciation of the generic functions necessary
33  * for the computation of all types of simple effects.
34  *
35  */
36 
37 #include <stdio.h>
38 #include <string.h>
39 
40 #include "genC.h"
41 #include "linear.h"
42 #include "ri.h"
43 #include "effects.h"
44 
45 #include "misc.h"
46 #include "text.h"
47 #include "text-util.h"
48 #include "ri-util.h"
49 #include "prettyprint.h"
50 #include "effects-util.h"
51 #include "properties.h"
52 
53 #include "effects-generic.h"
54 #include "effects-simple.h"
55 //#include "alias-classes.h"
56 
57 
58 
59 
60 /**
61  @param ref is a reference
62  @param act is an action tag
63  act don't have to be use by another effects (make a copy)
64  @param use_preference_p is a bool true when the returned effect cell
65  is a preference if possible.
66  @return a simple effect representing a memory access.
67 
68  This function trusts the reference ref : no check is done to know
69  if the effect is legal (for instance a read effect on a partially
70  subscripted array). This has to be done at a higher level. (BC)
71 
72  */
74  bool use_preference_p)
75 {
78 
79  pips_debug(8, "Begins for reference: \"%s\"\n",
81 
82  if (dummy_parameter_entity_p(ent))
83  pips_internal_error("the input reference entity is a dummy parameter (%s)",
84  entity_name(ent));
85 
86  if (entity_all_locations_p(ent))
87  {
88  /* anywhere effect */
90  act,
93  }
94  else
95  {
96  list ind = reference_indices(ref);
98 
99  if(type_variable_p(ut))
100  {
101  variable utv = type_variable(ut);
102  list utd = variable_dimensions(utv);
103  bool is_array_p = !ENDP(utd);
104 
105  if (is_array_p)
106  {
107  if(gen_length(ind) == type_depth(ut))
108  {
109  /* The dimensionalities of the index and type are the same: */
110  cell cell_ref;
111  if (use_preference_p)
112  // FI: this effect use ind, no matter how complex it is as
113  // in Points-to/array09.c
115  else
116  cell_ref = make_cell_reference(ref);
118  eff = make_effect(cell_ref, act, ap, make_descriptor_none());
119  }
120  else
121  {
122 
123  /* if we are in C we trust the reference */
125  {
126  cell cell_ref;
127  if (use_preference_p)
129  else
130  cell_ref = make_cell_reference(ref);
132  eff = make_effect(cell_ref, act, ap,
134  }
135  else
136  {
137  /* we are in Fortran. A reference to TAB with no
138  * index is a reference to the whole array
139  */
140  pips_assert("invalid number of reference indices \n",
142  gen_length(ind));
143 
144  pips_debug(7, "less ref indices than number of dimensions\n");
145  /* generate effects on whole (sub-)array */
146  /* it is necessary to copy the reference because
147  * we add dimensions afterwards.
148  * this may lead to memory leaks, but I assume that this
149  * case only arises when dealing with actual program
150  * references
151  */
152  eff = make_effect
155 
156  FOREACH(DIMENSION, c_t_dim,
157  gen_nthcdr((int) gen_length(ind),
158  variable_dimensions(utv)))
159  {
161  (eff, make_unbounded_expression());
162  } /* FOREACH */
163 
164  }
165  }
166  }
167  else
168  {
169  /* It is a scalar : keep the actual reference */
170  cell cell_ref;
171  if (use_preference_p)
173  else
174  cell_ref = make_cell_reference(ref);
176  eff = make_effect(cell_ref, act, ap, make_descriptor_none());
177  }
178  }
179  else
180  {
181  /* reference n_ref = copy_reference(ref); */
182  /* cell cell_ref = make_cell_reference(n_ref); */
183  cell cell_ref;
184  if (use_preference_p)
186  else
187  cell_ref = make_cell_reference(ref);
189  eff = make_effect(cell_ref, act, ap, make_descriptor_none());
190  }
191  }
192 
193  ifdebug(8)
194  {
195  pips_debug(8, "end with effect\n");
196  print_effect(eff);
197  }
198 
199  return eff;
200 }
201 
202 
203 
204 
205 /* void simple_effect_add_expression_dimension(effect eff, expression exp)
206  * input : a simple effect and an expression
207  * output : nothing
208  * modifies : the effect eff, and normalizes the expression
209  * comment : adds a last dimension [exp] to the effect if the expression
210  * is normalizable. If not adds a last dimension [*], and changes
211  * the approximation into may.
212  */
214 {
215 
216  cell eff_c = effect_cell(eff);
217  reference ref;
218 
219  ifdebug(8)
220  {
221  pips_debug(8, "begin with effect :\n");
222  print_effect(eff);
223  }
224 
225  if (cell_preference_p(eff_c))
226  {
227  /* it's a preference : we change for a reference cell */
228  pips_debug(8, "It's a preference\n");
230  free_cell(eff_c);
232  }
233  else
234  {
235  /* it's a reference : let'us modify it */
236  ref = cell_reference(eff_c);
237  }
238 
242  NIL));
243 
244 
246  {
248  }
249  ifdebug(8)
250  {
251  pips_debug(8, "end with effect :\n");
252  print_effect(eff);
253  pips_assert("the effect is not consistent", effect_consistent_p(eff));
254  }
255 
256  return;
257 }
258 
259 
260 /**
261  This function changes the ith index of the effect reference
262  into the given expression exp if it is normalizable, and into and
263  unbounded expression otherwise (in which case the effect approximation is
264  set to may).
265 
266  @param eff is a simple effect
267  @param exp is the new expression for the ith index
268  @param i is the range of the index to change.
269 
270  */
272  int i)
273 {
274 
275  cell eff_c = effect_cell(eff);
276  reference ref;
278  list l_ind;
279 
280  ifdebug(8)
281  {
282  pips_debug(8, "begin with effect :\n");
283  print_effect(eff);
284  }
285 
286  if (cell_preference_p(eff_c))
287  {
288  /* it's a preference : we change for a reference cell */
289  pips_debug(8, "It's a preference\n");
291  free_cell(eff_c);
293  }
294  else
295  {
296  /* it's a reference : let'us modify it */
297  ref = cell_reference(eff_c);
298  }
299 
300  l_ind = gen_nthcdr(i-1,reference_indices(ref));
301  pips_assert("ith index must exist",!ENDP(l_ind));
302 
303  free_expression(EXPRESSION(CAR(l_ind)));
304 
305  if (normalized_linear_p(nexp))
306  {
307  EXPRESSION_(CAR(l_ind)) = copy_expression(exp);
308  }
309  else
310  {
313  }
314 
315  ifdebug(8)
316  {
317  pips_debug(8, "end with effect :\n");
318  print_effect(eff);
319  }
320 
321  return;
322 }
323 
324 /**
325  @brief copies the input_effect and converts all it's reference indices that refer to
326  field entities to an integer which is their rank in the field list
327  of the ancestor derived type.
328  @input input_effect is simple effect, and is not modified.
329  @return a new effect.
330  */
332 {
333  effect eff = copy_effect(input_effect);
334  cell c = effect_cell(input_effect);
335  /* if it's a preference, we are sure there are no field dimensions */
336  if (cell_reference_p(c))
337  {
338  reference r = cell_reference(c);
339  list l_ind = reference_indices(r);
340 
341  FOREACH(EXPRESSION, ind, l_ind)
342  {
343  syntax s = expression_syntax(ind);
344  if (syntax_reference_p(s))
345  {
347  if (entity_field_p(ind_e))
348  {
349  int rank = entity_field_rank(ind_e);
350  expression new_ind = int_to_expression(rank);
351 
352  free_syntax(s);
354  free_expression(new_ind);
355  }
356  }
357  } /* FOREACH*/
358  }
359  return eff;
360 }
361 
362 /*********************************************************************************/
363 /* SIMPLE EFFECTS */
364 /*********************************************************************************/
365 
366 /**
367  @param eff is a simple effect
368  @return another effect, whose cell is a reference cell, which is a copy
369  of the initial effect reference, even if it were a preference.
370  Ther is no sharing between the initial effect and the returned one.
371  */
372 effect
374 {
375  effect new_eff = effect_undefined;
376 
377 
379  {
384  }
385  else
386  {
387  new_eff = copy_effect(eff);
388 
389  }
390 
391  ifdebug(8) pips_assert("the new effect is consistent", effect_consistent_p(new_eff));
392 
393  return(new_eff);
394 }
395 
396 /**
397  @param ref is a program reference
398  @param act is the action tag of the returned effect
399  act don't have to be use by another effects (make a copy)
400  @return an effect whose cell is a preference pointing
401  to the original program reference.
402  */
403  effect
405  bool __attribute__((unused)) use_preference_p)
406  {
407  /*
408  entity rv = reference_variable(ref);
409  type rvt = ultimate_type(entity_type(rv));
410  pips_assert("The referenced symbol has type variable. It is not a function",
411  type_variable_p(rvt));
412  */
415  effect eff;
416 
417  eff = make_effect(cell_ref, act, ap, make_descriptor(is_descriptor_none,UU));
418  return(eff);
419  }
420 
421 /**
422  * /param l_eff can be consume, don't reuse it
423  */
425  entity i,
426  range r,
427  descriptor d __attribute__ ((unused)))
428 {
429  /* FI: effects in index and in in range must be taken into account. it
430  would be easier to have the loop proper effects as argument instead
431  of recomputing it. */
432  if(false) {
433  list c_eff = list_undefined;
438 
439  list r_eff_l = proper_effects_of_range(r);
440  list h_eff_l = CONS(EFFECT, i_eff, r_eff_l);
441  list ch_eff = list_undefined;
442 
443  for(ch_eff=h_eff_l; !ENDP(ch_eff); POP(ch_eff)) {
444  effect h_eff = EFFECT(CAR(ch_eff));
445 
446  for(c_eff = l_eff; !ENDP(c_eff); POP(c_eff)) {
447  effect eff = EFFECT(CAR(c_eff));
448 
449  eff = effect_interference(eff, h_eff);
450 
451  EFFECT_(CAR(c_eff)) = eff;
452  }
453  }
454 
455  //gen_full_free_list(h_eff_l);
456  }
457  if (range_contains_nothing_p(r)) {
458  //l_eff must had been a duplicated effect, so need to free them
459  gen_full_free_list(l_eff);
460  l_eff = NIL;
461  }
462  else if (!get_bool_property("ONE_TRIP_DO")
464  {
465  effects_to_may_effects(l_eff);
466  }
467  return l_eff;
468 }
469 
470 
471 /*
472  @brief change the reference indices into store independent expressions
473 
474  @param r is an input reference, and may be modified by side effect.
475  @return true if an element of the reference has been changed into an unbounded expression.
476 */
478 {
479  *changed_p = false;
480 
481  list l_inds = reference_indices(r);
482  list cind = list_undefined;
483 
484  for(cind = l_inds; !ENDP(cind); POP(cind))
485  {
486  expression se = EXPRESSION(CAR(cind));
487 
489  {
490  if(!unbounded_expression_p(se))
491  {
492  /* it may still be a field entity */
493  if (!(expression_reference_p(se) &&
495  {
496  *changed_p = true;
497  free_expression(se);
499  }
500  }
501  }
502  }
503 
504  return r;
505 }
506 
507 
508 /*
509  @brief change the cell indices into store independent expressions
510 
511  @param c is an input cell, and may be modified by side effect.
512  @return true if an element of the cell has been changed into an unbounded expression.
513 */
515 {
516  pips_assert("gaps not handled yet\n", !cell_gap_p(c));
518 
520  return c;
521 
522 }
523 
524 
525 /* FI: instead of simply getting rid of indices, I preserve constant
526  indices for the semantics analysis. Instead of stripping the
527  indices, they are replaced by unbounded expressions to keep the
528  difference between p and p[*] when p is a pointer.
529 
530  This is not as strong as store_independent_effect_p() which would
531  require that the reference is not pointer dependent.
532 
533  No memory allocation, side effects on eff? Side effects on the
534  reference too in spite of the persistant reference? No, it's not
535  possible. It's easier to work on a copy of the reference when a
536  "preference" is used.
537 */
538 list
539 effect_to_store_independent_sdfi_list(effect eff, bool force_may_p)
540 {
541  cell c = effect_cell(eff);
544  : effect_any_reference(eff);
545  list ind = reference_indices(r);
546  list cind = list_undefined;
547  bool may_p = false;
548 
549  for(cind = ind; !ENDP(cind); POP(cind)) {
550  expression se = EXPRESSION(CAR(cind));
551 
552  if(!unbounded_expression_p(se)
554 
555  /* it may still be a field entity */
556  if (!(expression_reference_p(se) &&
558  {
559  may_p = true;
560  free_expression(se);
562  }
563  }
564  }
565 
566  /* FI: Why is MAY always forced? Because of the semantics of the function! */
567  if(may_p || force_may_p)
569 
570  /* FI: if necessary, use the reference copy in the cell */
571  if(cell_preference_p(c)) {
574  cell_reference(c) = r;
575  }
576 
577  ifdebug(1)
578  pips_assert("eff is consistent", effect_consistent_p(eff));
579 
580  return(CONS(EFFECT,eff,NIL));
581 }
582 
583 list
585 {
586  return effect_to_store_independent_sdfi_list(eff, true);
587 }
588 
589 /* FI: instead of simpy getting rid of indices, I preserve cosntant
590  indices for the semantics analysis. */
591 list
593 {
594  return effect_to_store_independent_sdfi_list(eff, false);
595 }
596 
597 void
599 {
600  return;
601 }
602 
603 
604 /*
605  * It's not yet completely safe for C code when pointers are
606  * modified.
607 */
609  transformer trans
610  __attribute__((__unused__)))
611 {
612  list l_res=NIL;
613 
614  ifdebug(8)
615  {
616  pips_debug(8, "Begin\n");
617  print_effects(l_eff);
618  }
619 
620  FOREACH (EFFECT, eff, l_eff)
621  {
622  l_res =
623  gen_nconc(l_res,
625  );
626  }
627 
628  ifdebug(8)
629  {
630  pips_debug(8, "End\n");
631  print_effects(l_res);
632  }
633 
634  return(l_res);
635 }
636 
637 /* This function does not do what it was designed for :
638  It should transform the effects l_eff corresponding to S2 with
639  transformer T1 corresponding to S1.
640  But it uses effects from S2 instead of effects from S1.
641  (see r_rw_effects_of_sequence)
642  I keep it for future reuse after modification.
643  BC.
644 */
646  transformer trans __attribute__((__unused__)))
647 {
648  /* FI: used to be nop and wrong information is now preserved
649  intraprocedurally with loops, maybe because I modified simple
650  effects; since we do not have transformers, we use instead the
651  effects themselves, which could be transformed into a
652  transformer...
653 
654  The effects are supposed to be ordered. A write effect must
655  appears before another effect to require an update.
656 */
657  list l1 = list_undefined;
658  list l2 = list_undefined;
659 
660  ifdebug(8) {
661  pips_debug(8, "Begin: %zd effects before composition:\n", gen_length(l_eff));
662  MAP(EFFECT, eff, {
663  print_effect(eff);
664  }, l_eff);
665  }
666 
667  for(l1= l_eff; !ENDP(l1); POP(l1)) {
668  effect e1 = EFFECT(CAR(l1));
669  for(l2 = CDR(l1); !ENDP(l2); POP(l2)) {
670  effect e2 = EFFECT(CAR(l2));
671 
672  ifdebug(1) {
673  pips_assert("Effect e1 is consitent", effect_consistent_p(e1));
674  pips_assert("Effect e2 is consitent", effect_consistent_p(e2));
675  }
676 
677  ifdebug(8) {
678  (void) fprintf(stderr, "e1: \n");
679  print_effect(e1);
680  (void) fprintf(stderr, "e2: \n");
681  print_effect(e2);
682  }
683 
684  e2 = effect_interference(e2, e1);
685 
686  ifdebug(8) {
687  (void) fprintf(stderr, "resulting effect e2: \n");
688  print_effect(e2);
689  }
690 
691  EFFECT_(CAR(l2)) = e2;
692  }
693  }
694 
695  ifdebug(8) {
696  pips_debug(8, "End: %zd effects before composition:\n", gen_length(l_eff));
697  (*effects_prettyprint_func)(l_eff);
698  }
699 
700  /* FI: Not generic. */
701  l_eff = proper_effects_combine(l_eff, false);
702 
703 
704  ifdebug(8) {
705  pips_debug(8, "End: %zd effects after composition:\n", gen_length(l_eff));
706  (*effects_prettyprint_func)(l_eff);
707  }
708 
709  return l_eff;
710 }
711 
float a2sf[2] __attribute__((aligned(16)))
USER generates a user error (i.e., non fatal) by printing the given MSG according to the FMT.
Definition: 3dnow.h:3
cell make_cell_reference(reference _field_)
Definition: effects.c:293
action copy_action(action p)
ACTION.
Definition: effects.c:77
descriptor make_descriptor(enum descriptor_utype tag, void *val)
Definition: effects.c:433
cell make_cell(enum cell_utype tag, void *val)
Definition: effects.c:290
bool effect_consistent_p(effect p)
Definition: effects.c:457
void free_cell(cell p)
Definition: effects.c:249
approximation make_approximation_exact(void)
Definition: effects.c:185
approximation make_approximation(enum approximation_utype tag, void *val)
Definition: effects.c:176
approximation copy_approximation(approximation p)
APPROXIMATION.
Definition: effects.c:132
approximation make_approximation_may(void)
Definition: effects.c:179
effect make_effect(cell a1, action a2, approximation a3, descriptor a4)
Definition: effects.c:484
descriptor copy_descriptor(descriptor p)
DESCRIPTOR.
Definition: effects.c:389
effect copy_effect(effect p)
EFFECT.
Definition: effects.c:448
descriptor make_descriptor_none(void)
Definition: effects.c:442
cell make_cell_preference(preference _field_)
Definition: effects.c:296
void free_preference(preference p)
Definition: ri.c:1829
expression copy_expression(expression p)
EXPRESSION.
Definition: ri.c:850
reference make_reference(entity a1, list a2)
Definition: ri.c:2083
syntax copy_syntax(syntax p)
SYNTAX.
Definition: ri.c:2442
void free_expression(expression p)
Definition: ri.c:853
reference copy_reference(reference p)
REFERENCE.
Definition: ri.c:2047
void free_syntax(syntax p)
Definition: ri.c:2445
preference make_preference(reference a1)
Definition: ri.c:1862
static reference ref
Current stmt (an integer)
Definition: adg_read_paf.c:163
bool entity_all_locations_p(entity e)
test if an entity is the top of the lattice
void effects_to_may_effects(list)
list proper_effects_combine(list, bool)
effect reference_to_reference_effect(reference, action, bool)
list effect_to_store_independent_sdfi_list(effect, bool)
void simple_effects_descriptor_normalize(list)
void simple_effect_change_ith_dimension_expression(effect, expression, int)
void simple_effect_add_expression_dimension(effect, expression)
list effect_to_sdfi_list(effect)
effect reference_to_simple_effect(reference, action, bool)
unary_operators.c
reference simple_reference_to_store_independent_reference(reference, bool *)
cell simple_cell_to_store_independent_cell(cell, bool *)
list effect_to_may_sdfi_list(effect)
effect simple_effect_field_to_rank_conversion(effect)
list proper_effects_of_range(range)
effect simple_effect_dup(effect)
list simple_effects_composition_with_effect_transformer(list, transformer)
list simple_effects_union_over_range(list, entity, range, descriptor)
list old_effects_composition_with_effect_transformer(list, transformer)
#define effect_any_reference(e)
FI: cannot be used as a left hand side.
#define effect_approximation_tag(eff)
action make_action_write_memory(void)
To ease the extension of action with action_kind.
Definition: effects.c:1011
effect effect_interference(effect, effect)
Modifies effect eff1 to make sure that any memory state modification abstracted by eff2 preserves the...
Definition: effects.c:863
#define cell_reference(x)
Definition: effects.h:469
#define cell_preference(x)
Definition: effects.h:472
#define cell_reference_p(x)
Definition: effects.h:467
#define effect_action(x)
Definition: effects.h:642
#define effect_undefined
Definition: effects.h:614
#define cell_gap_p(x)
Definition: effects.h:473
@ is_cell_reference
Definition: effects.h:445
@ is_cell_preference
Definition: effects.h:446
@ is_descriptor_none
Definition: effects.h:576
#define cell_tag(x)
Definition: effects.h:466
#define effect_descriptor(x)
Definition: effects.h:646
#define cell_preference_p(x)
Definition: effects.h:470
#define EFFECT_(x)
Definition: effects.h:611
@ is_approximation_may
Definition: effects.h:341
@ is_approximation_exact
Definition: effects.h:343
#define effect_approximation(x)
Definition: effects.h:644
#define EFFECT(x)
EFFECT.
Definition: effects.h:608
#define effect_cell(x)
Definition: effects.h:640
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
void gen_full_free_list(list l)
Definition: genClib.c:1023
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
bool range_contains_at_least_one_point_p(range r)
Definition: loop.c:911
bool range_contains_nothing_p(range r)
Definition: loop.c:943
#define ENDP(l)
Test if a list is empty.
Definition: newgen_list.h:66
#define POP(l)
Modify a list pointer to point on the next element of the list.
Definition: newgen_list.h:59
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
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
list gen_nconc(list cp1, list cp2)
physically concatenates CP1 and CP2 but do not duplicates the elements
Definition: list.c:344
#define CAR(pcons)
Get the value of the first element of a list.
Definition: newgen_list.h:92
#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
#define CDR(pcons)
Get the list less its first element.
Definition: newgen_list.h:111
list gen_nthcdr(int n, const list lx)
caution: the first item is 0! was: return( (n<=0) ? l : gen_nthcdr( n-1, CDR( l ))) ; if n>gen_length...
Definition: list.c:700
#define list_undefined
Undefined list definition :-)
Definition: newgen_list.h:69
#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
#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_assert(what, predicate)
common macros, two flavors depending on NDEBUG
Definition: misc-local.h:172
#define pips_internal_error
Definition: misc-local.h:149
static entity rank
#define UU
Definition: newgen_types.h:98
string reference_to_string(reference r)
Definition: expression.c:87
#define print_effect(e)
Definition: print.c:336
#define print_effects(e)
Definition: print.c:334
#define NORMALIZE_EXPRESSION(e)
bool dummy_parameter_entity_p(entity p)
is p a dummy parameter?
Definition: entity.c:1941
bool c_module_p(entity m)
Test if a module "m" is written in C.
Definition: entity.c:2777
bool entity_field_p(entity e)
e is the field of a structure
Definition: entity.c:857
int entity_field_rank(entity f)
f is a field of a structure or of an union: what is its rank?
Definition: entity.c:940
bool extended_integer_constant_expression_p(expression e)
More extensive than next function.
Definition: expression.c:858
expression make_unbounded_expression()
Definition: expression.c:4339
expression int_to_expression(_int i)
transform an int into an expression and generate the corresponding entity if necessary; it is not cle...
Definition: expression.c:1188
bool expression_reference_p(expression e)
Test if an expression is a reference.
Definition: expression.c:528
bool unbounded_expression_p(expression e)
Definition: expression.c:4329
entity expression_variable(expression e)
Definition: expression.c:532
type entity_basic_concrete_type(entity)
retrieves or computes and then returns the basic concrete type of an entity
Definition: type.c:3677
size_t type_depth(type)
Number of steps to access the lowest leave of type t without dereferencing.
Definition: type.c:4880
#define syntax_reference_p(x)
Definition: ri.h:2728
#define syntax_reference(x)
Definition: ri.h:2730
#define normalized_linear_p(x)
Definition: ri.h:1779
#define EXPRESSION_(x)
Definition: ri.h:1220
#define reference_variable(x)
Definition: ri.h:2326
#define type_variable(x)
Definition: ri.h:2949
#define EXPRESSION(x)
EXPRESSION.
Definition: ri.h:1217
#define entity_name(x)
Definition: ri.h:2790
#define reference_indices(x)
Definition: ri.h:2328
#define preference_reference(x)
Definition: ri.h:2102
#define variable_dimensions(x)
Definition: ri.h:3122
#define expression_syntax(x)
Definition: ri.h:1247
#define type_variable_p(x)
Definition: ri.h:2947
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
return(s1)
#define ifdebug(n)
Definition: sg.c:47
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
#define exp
Avoid some warnings from "gcc -Wshadow".
Definition: vasnprintf.c:207