changeset 29:a94136a6edb2 default tip

fix for LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 17 Jul 2021 14:38:29 +0900
parents 51f8521bc5d1
children
files conv1.c fact-a.c goto.c
diffstat 3 files changed, 76 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/conv1.c	Sat May 23 07:31:02 2020 +0900
+++ b/conv1.c	Sat Jul 17 14:38:29 2021 +0900
@@ -42,7 +42,7 @@
     __code (*ret)(int, void *);
 };
 
-#ifndef __llvm__ 
+//#ifndef __llvm__ 
 __code f_g0(int i,int k,stack sp);
 __code f_g1(int j,stack sp);
 __code g(int i,stack sp);
@@ -53,7 +53,7 @@
 __code main_return2(int i,stack sp);
 __code g2_1(int k,int i,stack *sp);
 __code h2_11(int i,int k,stack *sp);
-#endif
+//#endif
 
 __code f(int i,stack sp) {
     int k,j;
--- a/fact-a.c	Sat May 23 07:31:02 2020 +0900
+++ b/fact-a.c	Sat Jul 17 14:38:29 2021 +0900
@@ -1,8 +1,13 @@
 #define __environment _CbC_environment
-#define __return _CbC_return
+#define __return _CbC_return 
 
 #include "stdio.h"
 
+/*
+ * This is a first example of CbC, but it is not work on LLVM now
+ * because of a variadic function
+ */
+
 __code factorial(int n,int result,int orig,__code(*print)(),__code(*exit1)(), void *exit1env)
 {
     if (n<0) {
--- a/goto.c	Sat May 23 07:31:02 2020 +0900
+++ b/goto.c	Sat Jul 17 14:38:29 2021 +0900
@@ -3,94 +3,104 @@
 
 extern int printf(const char *,...);
 
-__code (*conv)(int,__code (*)());
-__code a2(int i,__code conv());
-__code a3(int i,__code conv());
-__code a4(int i,__code conv());
-__code a5(int i,__code conv());
-__code a6();
-__code a7();
-__code a8();
-__code a9();
+/*
+ *   using __code a2(int i,__code conv());
+ *   make conv valiadic. It complains TCE.
+ *   use struct instead
+ */
 
-char* print_conv(__code conv());
+struct conv {
+    int i, j, k;
+    __code (*conv)(struct conv c);
+    __code (*exit)(int i, void *e);
+} g_conv;
+
+__code a2(struct conv c);
+__code a3(struct conv c);
+__code a4(struct conv c);
+__code a5(struct conv c);
+__code a6(struct conv c);
+__code a7(struct conv c);
+__code a8(struct conv c);
+__code a9(struct conv c);
+
+char* print_conv(struct conv c);
 
 __code (*exit0)(int,void*);
 void *env;
 
 __code
-a2(int i,__code conv())
-{
-    printf("#0023:a2 %d %s\n",i,print_conv(conv));
-    goto conv(i+1,a4);
+a2(struct conv c) {
+    printf("#0023:a2 %d %s\n",c.i,print_conv(c));
+    goto c.conv((struct conv){.i = c.i+1,.conv = a4});
 }
 
 __code
-a3(int i,__code (*conv)())
-{
-    printf("#0030:a3 %d %s\n",i,print_conv(conv));
-    goto conv(i+1,a5);
+a3(struct conv c) {
+    printf("#0030:a3 %d %s\n",c.i,print_conv(c));
+    goto c.conv((struct conv){.i=c.i+1,.conv=a5});
 }
 
 __code
-a4(int i,__code conv())
-{
-    printf("#0037:a4 %d %s\n",i,print_conv(conv));
-    goto (*conv)(i+1,a6);
+a4(struct conv c) {
+    printf("#0037:a4 %d %s\n",c.i,print_conv(c));
+    goto (*c.conv)((struct conv){.i=c.i+1,.conv=a6});
+}
+
+__code
+a5(struct conv c) {
+    printf("#0044:a5 %d %s\n",c.i,print_conv(c));
+    goto (*c.conv)((struct conv){.i=c.i+1,.j=c.i+2,.k=c.i+3,.conv=a7});
 }
 
 __code
-a5(int i,__code (*conv)())
-{
-    printf("#0044:a5 %d %s\n",i,print_conv(conv));
-    goto (*conv)(i+1,i+2,i+3,a7);
-}
-
-__code
-a6(int i,int j,int k,__code conv())
-{
-    printf("#0051:a6 %d %s\n",i,print_conv(conv));
-    goto conv(i+1,j,k,a8);
+a6(struct conv c) {
+    printf("#0051:a6 %d %s\n",c.i,print_conv(c));
+    c.exit = exit0;
+    c.i = c.i+1 ; c.conv = a8;
+    goto c.conv(c);
 }
 
 __code
-a7(int i,int j,int k,__code (*conv)())
-{
-    printf("#0058:a7 %d %s\n",i,print_conv(conv));
-    goto conv(i+1,j,k,a9);
+a7(struct conv c) {
+    printf("#0058:a7 %d %s\n",c.i,print_conv(c));
+    c.exit = exit0;
+    c.i = c.i+1; c.conv = a9;
+    goto c.conv(c);
 }
 
 __code
-a8(int i,int j,int k,__code conv())
-{
-    printf("#0065:a8 %d %s\n",i,print_conv(conv));
-    goto (*conv)(i+1,j,k,exit0);
+a8(struct conv c) {
+    printf("#0065:a8 %d %s\n",c.i,print_conv(c));
+    c.i = c.i+1;
+    goto c.exit(c.i,env);
 }
 
 __code
-a9(int i,int j,int k,__code (*conv)())
-{
-    printf("#0072:a9 %d %s\n",i,print_conv(conv));
-    goto (*conv)(0,env);
+a9(struct conv c) {
+    printf("#0072:a9 %d %s\n",c.i,print_conv(c));
+    goto (*c.exit)(0,env);
 }
 
 int main(int ac,char *av[]) {
     exit0 = __return;
     env   = __environment;
-    conv = a2;
-    goto conv(1,a3);
+    g_conv.conv = a2;
+    g_conv.exit = exit0;
+    g_conv.i = 1;
+    g_conv.j = 2;
+    g_conv.k = 3;
+    goto g_conv.conv(g_conv);
 }
 
-char*
-print_conv(__code conv())
-{
-    if(conv==a2) return "a2";
-    if(conv==a3) return "a3";
-    if(conv==a4) return "a4";
-    if(conv==a5) return "a5";
-    if(conv==a6) return "a6";
-    if(conv==a7) return "a7";
-    if(conv==a8) return "a8";
-    if(conv==a9) return "a9";
+char* print_conv(struct conv c) {
+    if(c.conv==a2) return "a2";
+    if(c.conv==a3) return "a3";
+    if(c.conv==a4) return "a4";
+    if(c.conv==a5) return "a5";
+    if(c.conv==a6) return "a6";
+    if(c.conv==a7) return "a7";
+    if(c.conv==a8) return "a8";
+    if(c.conv==a9) return "a9";
     else return "xx";
 }