updated lexer_lex and ir
[henge/webcc.git] / src / apc / irmem.c
index 67068d9..3716d59 100644 (file)
@@ -26,7 +26,7 @@ curr_vdat(void);
 struct set*
 curr_set(void);
 struct ref*
-prev_ref(void);
+curr_ref(void);
 struct model*
 curr_model(void);
 void
@@ -34,7 +34,6 @@ inc_posts(void);
 
 #define PAGES_PER_CHUNK 16
 
-#define CURR_CDAT  (*cdat_stackp)
 //"type free" chunk stacking
 struct chunk_stack
 { void* chunks[MAX_CHUNKS];
@@ -47,6 +46,8 @@ struct chunk_stack
 //type safety handled by macro expansion (do not call these directly from code, make dependent macros for access to these)
 #define CHUNKS_LEN(STACK)         ((STACK).csp - (STACK).chunks)
 #define CURRENT_CHUNK(STACK)      ((STACK).chunks[CHUNKS_LEN(STACK) - 1])
+#define CHUNKS_FULL(STACK)        ( (STACK).csp >= \
+                                    (STACK).chunks + MAX_CHUNKS * (STACK).chunk_size)
 #define CURRENT_DSP(STACK,TYPE)   ((TYPE*) ((STACK).dsp[CHUNKS_LEN(STACK) - 1]))
 #define DATA_FULL(STACK,TYPE)     ((void*) CURRENT_DSP(STACK,TYPE) >=  \
                                   (CURRENT_CHUNK(STACK) + (STACK).chunk_size))
@@ -54,32 +55,47 @@ struct chunk_stack
 #define CURRENT_DATP(STACK,TYPE)  (((TYPE**)(STACK).dsp)[CHUNKS_LEN(STACK) - 1])
 #define PREVIOUS_DATP(STACK,TYPE) (((TYPE**)(STACK).dsp)[CHUNKS_LEN(STACK) - 2])
 #define ALLOC_DAT(STACK,TYPE)     (++CURRENT_DATP(STACK,TYPE))
-#define INIT_STACK(STACK,TYPE)                                 \
-  do {                                                         \
-    (STACK).chunk_size = PAGES_PER_CHUNK;                      \
+#define INIT_STACK(STACK,TYPE) \
+  { int i; \
+    (STACK).chunk_size = PAGES_PER_CHUNK * pagesize;            \
     (STACK).max_dats = (STACK).chunk_size / sizeof (TYPE);     \
-    CSP_PUSH(STACK);                                           \
-  } while (0)
+    CSP_PUSH(STACK); \
+    for( i = 0; i < MAX_CHUNKS; i++){ \
+      (STACK).dsp[i] += pagesize; \
+    } \
+  }
 //Stack-specific macros (called directly from code (safety enforcement)
+#define INIT_ODAT()     (INIT_STACK(ocs, struct odat))
 #define CURRENT_ODAT()  (CURRENT_DATP(ocs,struct odat))
 #define ODAT_FULL()     (DATA_FULL(ocs,struct odat))
 #define ODAT_ALLOC()    (ALLOC_DAT(ocs,struct odat))
+#define OCS_FULL()      (CHUNKS_FULL(ocs))
+#define INIT_VDAT()     (INIT_STACK(vcs, struct vdat))
 #define CURRENT_VDAT()  (CURRENT_DATP(vcs,struct vdat))
 #define VDAT_FULL()     (DATA_FULL(vcs,struct vdat))
 #define VDAT_ALLOC()    (ALLOC_DAT(vcs,struct vdat))
+#define VCS_FULL()      (CHUNKS_FULL(vcs))
+#define INIT_CDAT()     (INIT_STACK(ccs, struct cdat))
 #define CURRENT_CDAT()  (CURRENT_DATP(ccs,struct cdat))
 #define CDAT_FULL()     (DATA_FULL(ccs, struct cdat))
 #define CDAT_ALLOC()    (ALLOC_DAT(ccs, struct cdat))
+#define CCS_FULL()      (CHUNKS_FULL(ccs))
+#define INIT_LINK()     (INIT_STACK(lcs, struct link))
 #define CURRENT_LINK()  (CURRENT_DATP(lcs,struct link))
 #define LDAT_FULL()     (DATA_FULL(lcs, struct link))
 #define LDAT_ALLOC()    (ALLOC_DAT(lcs, struct link))
+#define LCS_FULL()      (CHUNKS_FULL(lcs))
+#define INIT_POST()     (INIT_STACK(rcs, struct ref))
 #define CURRENT_POST()  (CURRENT_DATP(pcs,struct ref))
 #define POST_FULL()     (DATA_FULL(pcs,struct ref))
 #define POST_ALLOC()    (ALLOC_DAT(pcs,struct ref))
+#define PCS_FULL()      (CHUNKS_FULL(pcs))
+#define INIT_REF()      (INIT_STACK(rcs, struct ref))
 #define CURRENT_REF()   (CURRENT_DATP(rcs,struct ref))
 #define PREVIOUS_REF()  (PREVIOUS_DATP(rcs, struct ref))
 #define REF_FULL()      (DATA_FULL(rcs,struct ref))
 #define REF_ALLOC()     (ALLOC_DAT(rcs,struct ref))
+#define RCS_FULL()      (CHUNKS_FULL(rcs))
 //Metadata
 #define CURRENT_SET()   (CURRENT_CDAT()->set_list[CURRENT_CDAT()->num_sets])
 #define CURRENT_MODEL() (CURRENT_VDAT()->model_list[CURRENT_VDAT()->num_models])
@@ -89,13 +105,9 @@ struct chunk_stack
 
 long pagesize;
 
-int pages_per_chunk = 10;
-
 int num_cdats = 0;
-int curr_max_cdats = PTRS_IN_PAGE;
 
-struct cdat* cdat_buf[PTRS_IN_PAGE];
-struct cdat* cdat_stack[PTRS_IN_PAGE];
+struct cdat* cdat_stack[MAX_CLASSES];
 struct cdat** cdat_stackp;
 
 int num_odats = 0;
@@ -105,14 +117,9 @@ int num_vdats = 0;
 int num_refs = 0;
 uint64_t ss_ref_id = 0x00FFFFFF; /* system space for ref_ids */
 
-int num_posts = -1;
-int curr_max_posts = PTRS_IN_PAGE;
-struct ref* post_buf[PTRS_IN_PAGE];
-
+int num_posts = 0;
 
-int num_links = -1;
-int curr_max_links = PTRS_IN_PAGE;
-struct link* link_buf[PTRS_IN_PAGE];
+int num_links = 0;
 
 
 /* The initalization function of the IR. */
@@ -120,21 +127,20 @@ int
 ir_init()
 {
 
-  /* Init root cdat and stack */
   char root[4] = "root";
 
-  if( (cdat_buf[num_cdats] = (struct cdat*) malloc(sizeof(struct cdat))) == NULL)
-    {
-      perror("malloc root class failed\n");
-      return -1;
-    }
-  cdat_buf[num_cdats]->idx = num_cdats;
-  memmove(cdat_buf[num_cdats]->name, root, 4);
+  pagesize = sysconf(_SC_PAGESIZE);
 
-  cdat_stackp = cdat_stack;
-  *cdat_stackp++ = cdat_buf[num_cdats++];
+  INIT_CDAT();
+  *cdat_stackp = CURRENT_CDAT();
+  memmove((*cdat_stackp)->name, root, 32);
+
+  INIT_ODAT();
+  INIT_VDAT();
+  INIT_LINK();
+  INIT_REF();
+  INIT_POST();
 
-  pagesize = sysconf(_SC_PAGESIZE);
 
   return 0;
 
@@ -145,54 +151,68 @@ ir_quit()
 {
   int i;
 
-  for(i = 0; i <= num_odats ; i++)
+  for(i = 0; i < CHUNKS_LEN(ccs) ; i++)
     {
+      free(ccs.chunks[i]);
     }
-  for(i = 0; i <= num_cdats; i++)
+  for(i = 0; i < CHUNKS_LEN(ocs); i++)
     {
+      free(ocs.chunks[i]);
     }
-  for(i = 0; i <= num_vdats; i++)
+  for(i = 0; i < CHUNKS_LEN(vcs) ; i++)
     {
+      free(vcs.chunks[i]);
     }
-  for(i = 0; i <= num_refs; i++)
+  for(i = 0; i < CHUNKS_LEN(rcs); i++)
     {
+      free(rcs.chunks[i]);
     }
-  for(i = 0; i<= num_links; i++)
+  for(i = 0; i < CHUNKS_LEN(lcs); i++)
     {
+      free(lcs.chunks[i]);
     }
-  for(i = 0; i<= num_posts; i++)
+  for(i = 0; i < CHUNKS_LEN(pcs); i++)
     {
+      free(pcs.chunks[i]);
     }
 
 }
 
-//TODO: FREE MEMORY!
 struct cdat*
 alloc_cdat()
 {
   num_cdats++;
-  if(curr_max_cdats <= num_cdats)
-    { if( (realloc((void*) cdat_buf, PTRS_IN_PAGE * 4)) == NULL)
-        perror("realloc cdat_buf failed");
-      curr_max_cdats += PTRS_IN_PAGE;
-      if( (realloc( (void*) cdat_stack, PTRS_IN_PAGE * 4)) == NULL) //increase cdat_stack also
-        perror("realloc cdat_stack failed");
+  if(CDAT_FULL())
+    { if(CCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) cdats ", num_cdats);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(ccs);
     }
-  if( (CURR_CDAT = (struct cdat*) malloc(sizeof (struct cdat)) ) == NULL )
-    perror("malloc cdat failed");
-
-  return CURR_CDAT;
+  else
+    CDAT_ALLOC();
 
+  return CURRENT_CDAT();
 }
 
 //these should probably be inline
 struct odat*
 alloc_odat
 ()
-{ if(ODAT_FULL())
-      CSP_PUSH(ocs);
+{
+  num_odats++;
+  if(ODAT_FULL())
+    { if(!OCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) odats ", num_odats);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(ocs);
+    }
   else
     ODAT_ALLOC();
+
   return CURRENT_ODAT();
 }
 
@@ -201,7 +221,13 @@ alloc_vdat
 ()
 { num_vdats++;
   if(VDAT_FULL())
-    CSP_PUSH(vcs);
+    { if(!VCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) vdats ", num_vdats);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(vcs);
+    }
   else
     VDAT_ALLOC();
 }
@@ -211,10 +237,18 @@ alloc_link
 ()
 { num_links++;
   if(LDAT_FULL())
-    CSP_PUSH(lcs);
+    { if(!LCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) links ", num_links);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(lcs);
+    }
   else
     LDAT_ALLOC();
+
   return CURRENT_LINK();
+
 }
 
 struct ref*
@@ -222,10 +256,17 @@ alloc_ref
 ()
 { num_refs++;
   if(REF_FULL())
-    CSP_PUSH(rcs);
+    { if(!RCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) refs ", num_refs);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(rcs);
+    }
   else
     REF_ALLOC();
 
+
   if(num_refs % 16 == 0)
     { CURRENT_POST() = CURRENT_REF();
       inc_posts();
@@ -238,16 +279,23 @@ void
 inc_posts()
 { num_posts++;
   if(POST_FULL())
-    CSP_PUSH(pcs);
+    { if(!PCS_FULL())
+        { fprintf(stderr, "You have allocated to many (%d) refs ", num_posts);
+          exit(EXIT_FAILURE);
+        }
+      else
+        CSP_PUSH(pcs);
+    }
   else
     POST_ALLOC();
+
 }
 
 struct cdat*
 curr_cdat
 ()
 {
-  return CURR_CDAT;
+  return (*cdat_stackp);
 }
 
 struct odat*
@@ -269,10 +317,10 @@ curr_set
   return &CURRENT_SET();
 }
 struct ref*
-prev_ref
+curr_ref
 ()
 {
-  return PREVIOUS_REF();
+  return CURRENT_REF();
 }
 struct model*
 curr_model