PIPS
comEngine_distribute.c
Go to the documentation of this file.
1 /*
2 
3  $Id: comEngine_distribute.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 #include <stdio.h>
28 #include <ctype.h>
29 
30 #include "genC.h"
31 #include "linear.h"
32 #include "ri.h"
33 #include "effects.h"
34 
35 #include "resources.h"
36 
37 #include "misc.h"
38 #include "ri-util.h"
39 #include "effects-util.h"
40 #include "pipsdbm.h"
41 
42 #include "text-util.h"
43 #include "properties.h"
44 #include "prettyprint.h"
45 
46 #include "transformer.h"
47 
48 #include "ray_dte.h"
49 #include "sommet.h"
50 #include "sg.h"
51 #include "polyedre.h"
52 #include "semantics.h"
53 #include "control.h"
54 #include "callgraph.h"
55 
56 #include "phrase_tools.h"
57 
58 #include "effects-generic.h"
59 #include "effects-simple.h"
60 #include "effects-convex.h"
61 
62 #include "phrase_distribution.h"
63 #include "comEngine.h"
64 #include "phrase.h"
65 
87 
88 static entity make_new_symbolic_entity(string inName)
89 {
91  MODULE_SEP_STRING, inName, NULL));
92 
93  entity newEnt = make_entity(name,
96  NIL,
97  NIL)),
100 
101  return newEnt;
102 }
103 
105 {
106  constant constVal = make_constant(is_constant_int, (void *)val);
107 
108  entity_initial(ent) = make_value(is_value_constant, constVal);
109 }
110 
111 static int gCurVar = 0;
112 static int gCurBuff = 0;
113 static int gMaxVar = 0;
114 static int gMaxBuff = 0;
115 
116 static void update_max()
117 {
118  if(gCurBuff > gMaxBuff)
119  {
120  gMaxBuff = gCurBuff;
121  }
122 
123  if(gCurVar > gMaxVar)
124  {
125  gMaxVar = gCurVar;
126  }
127 }
128 
129 static void update_HRE_mapping_from_list(list lRef, bool supRef, int inc)
130 {
131  //printf("update_HRE_mapping_from_list\n");
132  MAP(REFERENCE, curRef,
133  {
134  //printf("curRef\n");
135  //print_reference(curRef);printf("\n");
136 
137  if(supRef)
138  {
139  gCurBuff += inc;
140  hash_put(gRefToBuffSize, curRef, (void *)true);
141  }
142  else
143  {
144  gCurVar += inc;
145  }
146  }, lRef);
147 }
148 
149 static void do_HRE_memory_mapping(statement stat);
150 
152 {
153  list lSupportedRef = NIL;
154  list lUnSupportedRef = NIL;
155 
156  hash_table htOffset = hash_table_make(hash_pointer, 0);
157 
158  get_supportedRef_proc(stat, htOffset,
159  &lSupportedRef, &lUnSupportedRef);
160 
161  hash_put(gStatToHtOffset, stat, htOffset);
162 
163  update_HRE_mapping_from_list(lSupportedRef, true, 1);
164  update_HRE_mapping_from_list(lUnSupportedRef, false, 1);
165 
166  update_max();
167 
169 
170  update_HRE_mapping_from_list(lSupportedRef, true, -1);
171  update_HRE_mapping_from_list(lUnSupportedRef, false, -1);
172 }
173 
175 {
176  list lRef = hash_get(gStatToRef, stat);
177 
178  if(lRef != HASH_UNDEFINED_VALUE)
179  {
180  update_HRE_mapping_from_list(lRef, false, 1);
181 
182  update_max();
183 
184  update_HRE_mapping_from_list(lRef, false, -1);
185  }
186 }
187 
189 {
190  //printf("do_HRE_memory_mapping\n");
191 
192  instruction instr = statement_instruction(stat);
193 
194  switch(instruction_tag(instr))
195  {
197  {
199 
200  MAP(STATEMENT, curStat,
201  {
202  do_HRE_memory_mapping(curStat);
203 
205  break;
206  }
207  case is_instruction_loop:
208  {
210  break;
211  }
212  case is_instruction_call:
213  case is_instruction_test:
214  {
216  break;
217  }
218  default:
219  {
220  pips_internal_error("impossible");
221  break;
222  }
223  }
224 }
225 
226 static bool compute_HRE_memory_mapping(statement stat, int hreMemSize)
227 {
228  gCurVar = 0;
229  gCurBuff = 0;
230  gMaxVar = 0;
231  gMaxBuff = 0;
232 
233  entity newEnt = make_new_symbolic_entity("COMENGINE_BUFFER_SIZE");
234 
236 
237  do_HRE_memory_mapping(stat);
238 
239  //printf("gMaxVar %d\n", gMaxVar);
240  //printf("gMaxBuff %d\n", gMaxBuff);
241 
242  if(gMaxBuff != 0)
243  {
244  gBufferSize = (hreMemSize - gMaxVar) / gMaxBuff;
245  }
246  else
247  {
248  gBufferSize = (hreMemSize - gMaxVar);
249  }
250 
252 
253  //printf("gBufferSize %d\n", gBufferSize);
254 
255  return true;
256 }
257 
258 static void move_declarations(entity new_fun, statement stat)
259 {
260  list lEnt = NIL;
261 
262  MAP(ENTITY, curEnt,
263  {
264  if(!type_varargs_p(entity_type(curEnt)) &&
265  !type_statement_p(entity_type(curEnt)) &&
266  !type_area_p(entity_type(curEnt)))
267  {
268  lEnt = gen_nconc(lEnt, CONS(ENTITY, curEnt, NIL));
269  }
270 
272 
273  statement_declarations(stat) = lEnt;
274 
276 
278 }
279 
280 #define ALL_DECLS "PRETTYPRINT_ALL_DECLARATIONS"
281 #define STAT_ORDER "PRETTYPRINT_STATEMENT_NUMBER"
282 
283 void create_HRE_module(const char* new_module_name,
284  const char* module_name,
285  statement stat, entity new_fun)
286 {
287  //printf("new HRE module\n");
288  //print_statement(stat);
289 
291 
293 
295  const char* name = entity_local_name(cloned);
296  const char* new_name;
297  string comments;
298  //entity new_fun;
299  //statement stat;
300  bool saved_b1, saved_b2;
301  text t;
302 
303  /* builds some kind of module / statement for the clone.
304  */
305  new_name = new_module_name;
306  //new_fun = make_empty_subroutine(new_name);
307 
308  saved_b1 = get_bool_property(ALL_DECLS);
309  saved_b2 = get_bool_property(STAT_ORDER);
312 
313  //stat = comEngine_generate_HRECode(externalized_code, new_fun, l_in, l_out);
314 
315  //add_variables_to_module(l_params, l_priv,
316  // new_fun, stat);
317 
318  move_declarations(new_fun, stat);
319 
321 
323 
324  t = text_named_module(new_fun, cloned, stat);
325 
326  set_bool_property(ALL_DECLS, saved_b1);
327  set_bool_property(STAT_ORDER, saved_b2);
328 
329  /* add some comments before the code.
330  */
331  comments = strdup(concatenate(
332  "//\n"
333  "// PIPS: please caution!\n"
334  "//\n"
335  "// this routine has been generated as a clone of ", name, "\n"
336  "// the code may change significantly with respect to the original\n"
337  "// version, especially after program transformations such as dead\n"
338  "// code elimination and partial evaluation, hence the function may\n"
339  "// not have the initial behavior, if called under some other context.\n"
340  "//\n", 0));
341  text_sentences(t) =
343  text_sentences(t));
344 
345  make_text_resource_and_free(new_name, DBR_C_SOURCE_FILE, ".c", t);
346  free_statement(stat);
347 
348  /* give the clonee a user file.
349  */
350  DB_PUT_MEMORY_RESOURCE(DBR_USER_FILE, new_name,
351  strdup(db_get_memory_resource(DBR_USER_FILE, name, true)));
352 
353 }
354 
355 /*static void
356 create_HRE_modules(statement externalized_code,
357  string new_module_name,
358  list l_in, list l_out, list l_params, list l_priv,
359  const char* module_name, int hreMemSize)
360 {
361 }
362 */
363 static void comEngine_distribute_code (const char* module_name,
364  string function_name,
365  statement externalized_code,
366  list l_in,
367  list l_out,
368  list l_params,
369  list l_priv,
370  graph dg)
371 {
372  bool success = false;
373 
392 
393  statement procCode;
394 
395  success = comEngine_feasability(externalized_code, dg);
396 
397  if(success)
398  {
399  printf("distribution can be done\n");
400  }
401  else
402  {
403  printf("distribution cannot be done\n");
404  return;
405  }
406 
407  int hreMemSize = 512;
408 
409  success = compute_HRE_memory_mapping(externalized_code, hreMemSize);
410 
411  if(success)
412  {
413  printf("mapping is successful\n");
414  }
415  else
416  {
417  printf("mapping is not successful\n");
418  return;
419  }
420 
421  procCode = comEngine_generate_procCode(externalized_code, l_in, l_out);
422 
423  comEngine_generate_HRECode(externalized_code,
424  function_name,
425  l_in, l_out, l_params, l_priv,
426  module_name, hreMemSize);
427 
428 printf("mapping is not successful 1\n");
429  free_instruction(statement_instruction(externalized_code));
430 printf("comEngine_distribute_code 2\n");
431  statement_instruction(externalized_code) =
432  statement_instruction(procCode);
433 printf("comEngine_distribute_code 3\n");
434 printf("comEngine_distribute_code 4\n");
435  statement_comments(externalized_code) = string_undefined;
436  statement_number(externalized_code) = STATEMENT_NUMBER_UNDEFINED;
437  statement_label(externalized_code) = entity_empty_label();
438 printf("comEngine_distribute_code 5\n");
439 
440  HASH_MAP(loop, lEnt,
441  {
442  gen_free_list(lEnt);
443  lEnt = NIL;
444  }, gLoopToToggleEnt);
445 
446  printf("comEngine_distribute_code 8\n");
466 
467 }
468 
470  statement module_stat,
471  entity module)
472 {
473  list l_stats;
474  hash_table ht_stats;
475  hash_table ht_params;
476  hash_table ht_private;
477  hash_table ht_in_regions;
478  hash_table ht_out_regions;
479 
480  graph dg = (graph) db_get_memory_resource(DBR_DG, module_name, true);
481 
482  l_stats = identify_analyzed_statements_to_distribute (module_stat);
483 
485  module_stat,
486  module,
487  &ht_stats,
488  &ht_params,
489  &ht_private,
490  &ht_in_regions,
491  &ht_out_regions);
492 
493  HASH_MAP (function_name, stat, {
495  function_name,
496  stat,
497  hash_get(ht_in_regions,function_name),
498  hash_get(ht_out_regions,function_name),
499  hash_get(ht_params,function_name),
500  hash_get(ht_private,function_name),
501  dg);
502  },ht_stats);
503 
504  hash_table_free(ht_stats);
505  hash_table_free(ht_params);
506  hash_table_free(ht_private);
507  hash_table_free(ht_in_regions);
508  hash_table_free(ht_out_regions);
509 }
510 
512 {
513  statement module_stat;
514  entity module;
515 
517 
518  // set and get the current properties concerning regions
519  set_bool_property("MUST_REGIONS", true);
520  set_bool_property("EXACT_REGIONS", true);
522 
523  // get the resources
524  module_stat = (statement) db_get_memory_resource(DBR_CODE,
525  module_name,
526  true);
527 
529 
530  set_current_module_statement(module_stat);
531  set_current_module_entity(module_name_to_entity(module_name)); // FI: a bit redundant since module is already available
532 
534  db_get_memory_resource(DBR_CUMULATED_EFFECTS, module_name, true));
536  db_get_memory_resource(DBR_PROPER_EFFECTS, module_name, true));
538 
539  // sets dynamic_area
543  }
544 
545  debug_on("PHRASE_COMENGINE_DISTRIBUTOR_DEBUG_LEVEL");
546 
547  // Get the READ, WRITE, IN and OUT regions of the module
549  db_get_memory_resource(DBR_REGIONS, module_name, true));
551  db_get_memory_resource(DBR_IN_REGIONS, module_name, true));
553  db_get_memory_resource(DBR_OUT_REGIONS, module_name, true));
554 
555  // Now do the job
556 
557  pips_debug(2, "BEGIN of PHRASE_DISTRIBUTOR\n");
558  comEngine_distribute(module_name, module_stat, module);
559  pips_debug(2, "END of PHRASE_DISTRIBUTOR\n");
560 
561  //print_statement(module_stat);
562 
563  pips_assert("Statement structure is consistent after PHRASE_DISTRIBUTOR",
564  gen_consistent_p((gen_chunk*)module_stat));
565 
566  pips_assert("Statement is consistent after PHRASE_DISTRIBUTOR",
567  statement_consistent_p(module_stat));
568 
569  // Reorder the module, because new statements have been added
570  module_reorder(module_stat);
571  DB_PUT_MEMORY_RESOURCE(DBR_CODE, module_name, module_stat);
572  DB_PUT_MEMORY_RESOURCE(DBR_CALLEES, module_name,
573  compute_callees(module_stat));
574 
575  // update/release resources
585 
586  debug_off();
587 
588  return true;
589 }
590 
constant make_constant(enum constant_utype tag, void *val)
Definition: ri.c:406
basic make_basic(enum basic_utype tag, void *val)
Definition: ri.c:155
storage make_storage(enum storage_utype tag, void *val)
Definition: ri.c:2273
value make_value(enum value_utype tag, void *val)
Definition: ri.c:2832
bool statement_consistent_p(statement p)
Definition: ri.c:2195
variable make_variable(basic a1, list a2, list a3)
Definition: ri.c:2895
void free_expression(expression p)
Definition: ri.c:853
void free_instruction(instruction p)
Definition: ri.c:1118
void free_statement(statement p)
Definition: ri.c:2189
type make_type(enum type_utype tag, void *val)
Definition: ri.c:2706
sentence make_sentence(enum sentence_utype tag, void *val)
Definition: text.c:59
callees compute_callees(const statement stat)
Recompute the callees of a module statement.
Definition: callgraph.c:355
static graph dg
dg is the dependency graph ; FIXME : should not be static global ?
Definition: chains.c:124
struct _newgen_struct_statement_ * statement
Definition: cloning.h:21
hash_table gIsNewLoop
static void give_value_to_symbolic_entity(entity ent, intptr_t val)
entity gHREMemory
hash_table gLoopToToggleEnt
static void do_HRE_memory_mapping(statement stat)
hash_table gLoopToSupRef
hash_table gStatToRef
hash_table gRefToFifoOff
expression gBufferSizeEnt
hash_table gLoopToRef
comEngine_distribute.c
static entity make_new_symbolic_entity(string inName)
bool phrase_comEngine_distributor(const char *module_name)
hash_table gRefToFifo
hash_table gLoopToSync
static bool compute_HRE_memory_mapping(statement stat, int hreMemSize)
static void update_max()
hash_table gRefToInd
hash_table gToggleToInc
hash_table gRefToHREFifo
hash_table gRefToBuffSize
void comEngine_distribute(const char *module_name, statement module_stat, entity module)
static int gMaxVar
hash_table gStatToHtOffset
static void update_HRE_mapping_from_list(list lRef, bool supRef, int inc)
#define ALL_DECLS
static void do_HRE_memory_mapping_loop(statement stat)
static void move_declarations(entity new_fun, statement stat)
static void comEngine_distribute_code(const char *module_name, string function_name, statement externalized_code, list l_in, list l_out, list l_params, list l_priv, graph dg)
tatic void create_HRE_modules(statement externalized_code, string new_module_name,...
static int gMaxBuff
void create_HRE_module(const char *new_module_name, const char *module_name, statement stat, entity new_fun)
static int gCurBuff
static void do_HRE_memory_mapping_stat(statement stat)
int gBufferSize
hash_table gRefToToggle
hash_table gIndToNum
hash_table gEntToHREFifo
hash_table gRefToEff
hash_table gLoopToUnSupRef
static int gCurVar
#define STAT_ORDER
bool comEngine_feasability(statement externalized_code, graph dg)
statement comEngine_generate_HRECode(statement externalized_code, string new_module_name, _UNUSED_ list l_in, _UNUSED_ list l_out, _UNUSED_ list l_params, _UNUSED_ list l_priv, const char *module_name, _UNUSED_ int hreMemSize)
statement comEngine_generate_procCode(statement externalized_code, _UNUSED_ list l_in, _UNUSED_ list l_out)
void get_supportedRef_proc(statement stat, hash_table htOffset, list *lSupportedRef, list *lUnSupportedRef)
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.
void get_regions_properties(void)
void set_rw_effects(statement_effects)
void reset_out_effects(void)
void reset_proper_rw_effects(void)
void set_proper_rw_effects(statement_effects)
void set_cumulated_rw_effects(statement_effects)
void set_out_effects(statement_effects)
void set_in_effects(statement_effects)
void reset_in_effects(void)
void reset_cumulated_rw_effects(void)
void reset_rw_effects(void)
const char * module_name(const char *s)
Return the module part of an entity name.
Definition: entity_names.c:296
bool get_bool_property(const string)
FC 2015-07-20: yuk, moved out to prevent an include cycle dependency include "properties....
int gen_consistent_p(gen_chunk *obj)
GEN_CONSISTENT_P dynamically checks the type correctness of OBJ.
Definition: genClib.c:2398
bool success
Definition: gpips-local.h:59
struct _newgen_struct_graph_ * graph
Definition: graph.h:31
void reset_current_module_entity(void)
Reset the current module entity.
Definition: static.c:97
void reset_current_module_statement(void)
Reset the current module statement.
Definition: static.c:221
statement set_current_module_statement(statement)
Set the current module statement.
Definition: static.c:165
entity set_current_module_entity(entity)
static.c
Definition: static.c:66
entity get_current_module_entity(void)
Get the entity of the current module.
Definition: static.c:85
#define NIL
The empty list (nil in Lisp)
Definition: newgen_list.h:47
#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
void gen_free_list(list l)
free the spine of the list
Definition: list.c:327
#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
string db_get_memory_resource(const char *rname, const char *oname, bool pure)
Return the pointer to the resource, whatever it is.
Definition: database.c:755
#define DB_PUT_MEMORY_RESOURCE(res_name, own_name, res_val)
conform to old interface.
Definition: pipsdbm-local.h:66
loop statement_loop(statement)
Get the loop of a statement.
Definition: statement.c:1374
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_table_free(hash_table htp)
this function deletes a hash table that is no longer useful.
Definition: hash.c:327
#define debug_on(env)
Definition: misc-local.h:157
#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
#define debug_off()
Definition: misc-local.h:160
#define DYNAMIC_AREA_LOCAL_NAME
Definition: naming-local.h:69
#define TOP_LEVEL_MODULE_NAME
Module containing the global variables in Fortran and C.
Definition: naming-local.h:101
#define MODULE_SEP_STRING
Definition: naming-local.h:30
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
#define HASH_UNDEFINED_VALUE
value returned by hash_get() when the key is not found; could also be called HASH_KEY_NOT_FOUND,...
Definition: newgen_hash.h:56
#define string_undefined
Definition: newgen_types.h:40
#define UU
Definition: newgen_types.h:98
list identify_analyzed_statements_to_distribute(statement)
This function return a list of statements that were previously marked for externalization during phas...
static entity dynamic_area
static char * module
Definition: pips.c:74
text text_named_module(entity, entity, statement)
bool make_text_resource_and_free(const char *, const char *, const char *, text)
Definition: print.c:82
void set_bool_property(const char *, bool)
bool module_reorder(statement body)
Reorder a module and recompute order to statement if any.
Definition: reorder.c:244
#define make_entity(n, t, s, i)
#define STATEMENT_NUMBER_UNDEFINED
default values
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
entity FindOrCreateEntity(const char *package, const char *local_name)
Problem: A functional global entity may be referenced without parenthesis or CALL keyword in a functi...
Definition: entity.c:1586
entity module_name_to_entity(const char *mn)
This is an alias for local_name_to_top_level_entity.
Definition: entity.c:1479
entity entity_empty_label(void)
Definition: entity.c:1105
const char * module_local_name(entity e)
Returns the module local user name.
Definition: entity.c:582
expression entity_to_expression(entity e)
if v is a constant, returns a constant call.
Definition: expression.c:165
#define loop_body(x)
Definition: ri.h:1644
@ is_basic_int
Definition: ri.h:571
#define REFERENCE(x)
REFERENCE.
Definition: ri.h:2296
#define ENTITY(x)
ENTITY.
Definition: ri.h:2755
@ is_constant_int
Definition: ri.h:817
#define type_statement_p(x)
Definition: ri.h:2941
@ is_value_unknown
Definition: ri.h:3035
@ is_value_constant
Definition: ri.h:3033
#define code_declarations(x)
Definition: ri.h:784
#define statement_label(x)
Definition: ri.h:2450
@ is_storage_rom
Definition: ri.h:2494
#define entity_undefined_p(x)
Definition: ri.h:2762
#define entity_undefined
Definition: ri.h:2761
@ is_instruction_test
Definition: ri.h:1470
@ is_instruction_call
Definition: ri.h:1474
@ is_instruction_sequence
Definition: ri.h:1469
@ is_instruction_loop
Definition: ri.h:1471
#define instruction_tag(x)
Definition: ri.h:1511
#define sequence_statements(x)
Definition: ri.h:2360
#define value_code(x)
Definition: ri.h:3067
#define instruction_sequence(x)
Definition: ri.h:1514
#define type_varargs_p(x)
Definition: ri.h:2953
#define statement_declarations(x)
Definition: ri.h:2460
#define statement_instruction(x)
Definition: ri.h:2458
#define statement_comments(x)
Definition: ri.h:2456
#define type_area_p(x)
Definition: ri.h:2944
@ is_type_variable
Definition: ri.h:2900
#define entity_type(x)
Definition: ri.h:2792
#define statement_number(x)
Definition: ri.h:2452
#define STATEMENT(x)
STATEMENT.
Definition: ri.h:2413
#define entity_initial(x)
Definition: ri.h:2796
char * strdup()
int printf()
void module_to_value_mappings(entity m)
void module_to_value_mappings(entity m): build hash tables between variables and values (old,...
Definition: mappings.c:624
#define intptr_t
Definition: stdint.in.h:294
The structure used to build lists in NewGen.
Definition: newgen_list.h:41
#define SENTENCE(x)
newgen_unformatted_domain_defined
Definition: text.h:36
#define text_sentences(x)
Definition: text.h:113
@ is_sentence_formatted
Definition: text.h:57
void free_value_mappings(void)
Normal call to free the mappings.
Definition: value.c:1212
A gen_chunk is used to store every object.
Definition: genC.h:58