]> git.mdlowis.com Git - proto/obnc.git/commitdiff
reworked global generation to take into account export marker
authorMichael D. Lowis <mike.lowis@gentex.com>
Fri, 30 Apr 2021 20:21:41 +0000 (16:21 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Fri, 30 Apr 2021 20:21:41 +0000 (16:21 -0400)
cerise/backend/c99/codegen.c
cerise/backend/test/codegen.c
cerise/backend/x86_64/codegen.c
cerise/inc/cerise.h
cerise/oberon0/OSP.Mod
cerise/src/grammar.c

index 2df1a3d83059ca2c4046751d97a88526ec5323a6..9ce8dc1dae081ce6b328a68d1f494dd66585e4c6 100644 (file)
@@ -131,9 +131,10 @@ void codegen_imports(Parser* p)
     (void)p;
 }
 
-void codegen_global(Parser* p, char* name, Type* type)
+void codegen_global(Parser* p, Symbol* sym)
 {
-    printf("%s %s_%s;\n", TypeNames[type->form], p->name, name);
+    printf("%s%s %s_%s;\n",
+        (sym->export ? "" : "static "), TypeNames[sym->type->form], p->name, sym->name);
 }
 
 void codegen_main(Parser* p)
index 2826e8db66a99c72610a17580099c6b6949fd81d..f1cbc37233aa0d7d18fe600a7309384622df08c2 100644 (file)
@@ -51,9 +51,9 @@ void codegen_imports(Parser* p)
     (void)p;
 }
 
-void codegen_global(Parser* p, char* name, Type* type)
+void codegen_global(Parser* p, Symbol* sym)
 {
-    (void)p, (void)name, (void)type;
+    (void)p, (void)sym;
 }
 
 void codegen_main(Parser* p)
index 904ca9d327349d969be8b7b95fa9412c2233211d..d2b44ff7d20e8007e1bbd44a875eec8518d500f2 100644 (file)
@@ -216,11 +216,11 @@ void codegen_imports(Parser* p)
     }
 }
 
-void codegen_global(Parser* p, char* name, Type* type)
+void codegen_global(Parser* p, Symbol* sym)
 {
     printf("    .data\n");
-    printf("%s_%s:\n", p->name, name);
-    printf("    .zero %d\n\n", type->size);
+    printf("%s_%s:\n", p->name, sym->name);
+    printf("    .zero %d\n\n", sym->type->size);
 }
 
 void codegen_main(Parser* p)
index 47f26561225b1c0ed08cde74942a85530f12acab..1aae1fdbc9d9cc3f3ad3d6100fbe96be5c7e7da8 100644 (file)
@@ -201,7 +201,7 @@ void codegen_setint(Item* item, Type* type, long long val);
 void codegen_setreal(Item* item, double val);
 void codegen_setstr(Item* item, char* val);
 void codegen_imports(Parser* p);
-void codegen_global(Parser* p, char* name, Type* type);
+void codegen_global(Parser* p, Symbol* sym);
 void codegen_main(Parser* p);
 void codegen_startproc(Parser* p, char* name, bool exported);
 void codegen_endproc(Parser* p);
@@ -212,3 +212,34 @@ void codegen_if(Parser* p, Item* item);
 void codegen_else(Parser* p, Item* item);
 void codegen_endif(Parser* p, long elsifs, Item* item);
 
+/*
+
+typedef struct AnfNode {
+    enum {
+        ANF_VAR, ANF_BEGIN, ANF_PROC, ANF_IF, ANF_SET, ANF_LET
+    } form;
+} AnfNode;
+
+;; <prog> ::= <dec> ...
+
+;; <dec> ::= (define <var> <exp>)
+;;        |  (begin <dec> ...)
+;;        |  <exp>
+
+;; <aexp> ::= (λ (<name> ...) <exp>)
+;;         |  <number>
+;;         |  <boolean>
+;;         |  <string>
+;;         |  <var>
+;;         |  (void)
+
+;; <cexp> ::= (<aexp> <aexp> ...)
+;;         |  (if <aexp> <exp> <exp>)
+;;         |  (set! <var> <exp>)
+
+;; <exp> ::= (let ([<var> <cexp>]) <exp>)
+;;        |  <aexp>
+;;        |  <cexp>
+
+
+*/
index ef157dca9fcfe8b8b36ff07692bdc5f28a15d907..4185e42c19d4bb1ab4d4ac7e03477db73db536a0 100644 (file)
@@ -52,7 +52,12 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
 \r
   PROCEDURE OpenScope;\r
     VAR s: OSG.Object;\r
-  BEGIN NEW(s); s.class := OSG.Head; s.dsc := topScope; s.next := NIL; topScope := s\r
+  BEGIN\r
+    NEW(s);\r
+    s.class := OSG.Head;\r
+    s.dsc := topScope;\r
+    s.next := NIL;\r
+    topScope := s\r
   END OpenScope;\r
 \r
   PROCEDURE CloseScope;\r
@@ -65,6 +70,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
     VAR y: OSG.Item; obj: OSG.Object;\r
   BEGIN\r
     WHILE (sym = OSS.lbrak) OR (sym = OSS.period) DO\r
+\r
       IF sym = OSS.lbrak THEN\r
         OSS.Get(sym); expression(y);\r
         IF x.type.form = OSG.Array THEN\r
@@ -72,6 +78,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
         ELSE OSS.Mark("not an array")\r
         END ;\r
         Check(OSS.rbrak, "no ]")\r
+\r
       ELSE (*period*) OSS.Get(sym);\r
         IF sym = OSS.ident THEN\r
           IF x.type.form = OSG.Record THEN\r
@@ -299,6 +306,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
         ELSE\r
           OSG.MakeItem(x, obj, level);\r
           selector(x);\r
+\r
           IF sym = OSS.becomes THEN (*assignment*)\r
             OSS.Get(sym);\r
             expression(y);\r
@@ -307,10 +315,12 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
             ELSE\r
               OSS.Mark("incompatible assignment")\r
             END\r
+\r
           ELSIF sym = OSS.eql THEN\r
             OSS.Mark("should be :=");\r
             OSS.Get(sym);\r
             expression(y)\r
+\r
           ELSIF sym = OSS.lparen THEN (*procedure call*)\r
             OSS.Get(sym);\r
             IF (obj.class = OSG.Proc) & (obj.type = NIL) THEN\r
@@ -319,6 +329,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
             ELSE\r
               OSS.Mark("not a procedure")\r
             END\r
+\r
           ELSIF obj.class = OSG.Proc THEN (*procedure call without parameters*)\r
             IF obj.nofpar > 0 THEN\r
               OSS.Mark("missing parameters")\r
@@ -327,10 +338,13 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
               OSG.Call(obj) ELSE\r
               OSS.Mark("not a procedure")\r
             END\r
+\r
           ELSIF (obj.class = OSG.SProc) & (obj.val = 3) THEN\r
             OSG.WriteLn\r
+\r
           ELSIF obj.class = OSG.Typ THEN\r
             OSS.Mark("illegal assignment")\r
+\r
           ELSE\r
             OSS.Mark("not a procedure")\r
           END\r
index da2f7cad75dd4eb573ab5b62a0494e72e6e56a19..5503ca313676e595e0a45e2d082d7388a3bdcc9a 100644 (file)
@@ -315,7 +315,7 @@ RULE(var_decl)
         for (int i = 0; i < nsyms; i++)
         {
             sym->type = type->type;
-            codegen_global(p, sym->name, sym->type);
+            codegen_global(p, sym);
             sym = sym->next;
         }
     }