# HG changeset patch # User Kaito Tokumori # Date 1413905881 -32400 # Node ID ba74047a4d786c02c240eb283deed28b068b55c8 # Parent bacef8675607493c19b1f2e5647a0cdaab67d168 add Makefile for arg, bug, conv, normal and fix these .c file diff -r bacef8675607 -r ba74047a4d78 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Wed Oct 22 00:38:01 2014 +0900 @@ -0,0 +1,14 @@ +CC=/Users/e105711/prog/seminar/CbC/llvmInst/Debug+Asserts/bin/clang +TARGET=arg bug conv normal +CFLAGS=-O2 -D"CLANG" + +.SUFFIXES: .c .o + +.c.o: + $(CC) $(CFLAGS) -o $< + +all: $(TARGET) + +clean: + rm -f $(TARGET) + rm -f *.o diff -r bacef8675607 -r ba74047a4d78 arg.c --- a/arg.c Tue Oct 14 17:34:59 2014 +0900 +++ b/arg.c Wed Oct 22 00:38:01 2014 +0900 @@ -1,11 +1,7 @@ #include "stdio.h" -#define __environment _CbC_environment -#define __return _CbC_return - - struct arg { - int a0;int a1;int a2;int a3;int a4; + int a0;int a1;int a2;int a3;int a4; }; extern void exit(int); @@ -13,71 +9,79 @@ void *exit_env; __code (*exit___code)(); +__code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env); +__code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env); +__code cargs(struct arg args0,__code(*exit1)(int, void*),void *env); +__code carg3(struct arg args0,struct arg args1,int i, int j,int k,int l); +__code carg4(struct arg args0,struct arg args1,int i, int j,int k,int l); +__code carg5(struct arg args0,struct arg args1,int i, int j,int k,int l); +__code carg6(int i, int j,int k,int l,struct arg args0); +int main1(int n); + __code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env) { - printf("#0017:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env); - goto carg2(arg1,arg2,arg3,arg4,arg0,exit1,env); + printf("#0017:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env); + goto carg2(arg1,arg2,arg3,arg4,arg0,exit1,env); } __code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env) { - struct arg args0; - printf("#0024:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env ); - args0.a0 = arg0; - args0.a1 = arg1; - args0.a2 = arg2; - args0.a3 = arg3; - args0.a4 = arg4; - goto cargs(args0,exit1,env); + struct arg args0; + printf("#0024:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env ); + args0.a0 = arg0; + args0.a1 = arg1; + args0.a2 = arg2; + args0.a3 = arg3; + args0.a4 = arg4; + goto cargs(args0,exit1,env); } __code cargs(struct arg args0,__code(*exit1)(int, void*),void *env) { - printf("#0035:args: %d %d %d %d %d : %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, - exit1==exit___code,env==exit_env); - // goto exit1(321),env; - goto (*exit1)(0,env); + printf("#0035:args: %d %d %d %d %d : %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, + exit1==exit___code,env==exit_env); + goto (*exit1)(0,env); } __code carg3(struct arg args0,struct arg args1,int i, int j,int k,int l) { - printf("#0045:args3: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - printf("#0047:args3: args0 %d %d %d %d %d : args1 %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, - args1.a0,args1.a1,args1.a2,args1.a3,args1.a4, - i,j,k,l); - if (args0.a0==args1.a0) exit(0); - goto carg4(args0,args1,j,k,l,i); + printf("#0045:args3: %d %d %d %d %d : %x %x %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); + printf("#0047:args3: args0 %d %d %d %d %d : args1 %d %d %d %d %d : %x %x %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, + args1.a0,args1.a1,args1.a2,args1.a3,args1.a4, + i,j,k,l); + if (args0.a0==args1.a0) exit(0); + goto carg4(args0,args1,j,k,l,i); } __code carg4(struct arg args0,struct arg args1,int i, int j,int k,int l) { - printf("#0057:args4: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg5(args1,args0,j,k,l,i); + printf("#0057:args4: %d %d %d %d %d : %x %x %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); + goto carg5(args1,args0,j,k,l,i); } __code carg5(struct arg args0,struct arg args1,int i, int j,int k,int l) { - printf("#0064:args5: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg6(i,j,k,l,args0); + printf("#0064:args5: %d %d %d %d %d : %x %x %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); + goto carg6(i,j,k,l,args0); } __code carg6(int i, int j,int k,int l,struct arg args0) { - printf("#0071:args6: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg3(args0,args0,i,j,k,l); + printf("#0071:args6: %d %d %d %d %d : %x %x %x %x\n", + args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); + goto carg3(args0,args0,i,j,k,l); } int main1(int n) { - goto carg1(0,1,2,3,4,exit___code=__return,exit_env=__environment); - return n; + goto carg1(0,1,2,3,4,exit___code=__return,exit_env=__environment); + return n; } struct arg a00; @@ -85,20 +89,20 @@ int main( int ac, char *av[]) { - int n; - n = main1(123); - printf("#0089:321=%d\n",n); + int n; + n = main1(123); + printf("#0089:321=%d\n",n); - a00.a0 = 11; - a00.a1 = 22; - a00.a2 = 33; - a00.a3 = 44; - a00.a4 = 55; - a01.a0 = 66; - a01.a1 = 77; - a01.a2 = 88; - a01.a3 = 99; - a01.a4 = 10; - goto carg3(a00,a01,1,2,3,4); + a00.a0 = 11; + a00.a1 = 22; + a00.a2 = 33; + a00.a3 = 44; + a00.a4 = 55; + a01.a0 = 66; + a01.a1 = 77; + a01.a2 = 88; + a01.a3 = 99; + a01.a4 = 10; + goto carg3(a00,a01,1,2,3,4); } diff -r bacef8675607 -r ba74047a4d78 argForClang.c --- a/argForClang.c Tue Oct 14 17:34:59 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,109 +0,0 @@ -#include "stdio.h" - -struct arg { - int a0;int a1;int a2;int a3;int a4; -}; - -extern void exit(int); - -void *exit_env; -__code (*exit___code)(); - -__code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env); -__code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env); -__code cargs(struct arg args0,__code(*exit1)(int, void*),void *env); -__code carg3(struct arg args0,struct arg args1,int i, int j,int k,int l); -__code carg4(struct arg args0,struct arg args1,int i, int j,int k,int l); -__code carg5(struct arg args0,struct arg args1,int i, int j,int k,int l); -__code carg6(int i, int j,int k,int l,struct arg args0); -int main1(int n); - -__code carg1(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env) -{ - printf("#0017:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env); - goto carg2(arg1,arg2,arg3,arg4,arg0,exit1,env); -} - -__code carg2(int arg0,int arg1,int arg2,int arg3,int arg4,__code(*exit1)(int, void*),void *env) -{ - struct arg args0; - printf("#0024:arg1: %d %d %d %d %d : %x %x\n",arg0,arg1,arg2,arg3,arg4,exit1==exit___code,env==exit_env ); - args0.a0 = arg0; - args0.a1 = arg1; - args0.a2 = arg2; - args0.a3 = arg3; - args0.a4 = arg4; - goto cargs(args0,exit1,env); -} - -__code cargs(struct arg args0,__code(*exit1)(int, void*),void *env) -{ - printf("#0035:args: %d %d %d %d %d : %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, - exit1==exit___code,env==exit_env); - // goto exit1(321),env; - goto (*exit1)(0,env); -} - - -__code carg3(struct arg args0,struct arg args1,int i, int j,int k,int l) -{ - printf("#0045:args3: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - printf("#0047:args3: args0 %d %d %d %d %d : args1 %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4, - args1.a0,args1.a1,args1.a2,args1.a3,args1.a4, - i,j,k,l); - if (args0.a0==args1.a0) exit(0); - goto carg4(args0,args1,j,k,l,i); -} - -__code carg4(struct arg args0,struct arg args1,int i, int j,int k,int l) -{ - printf("#0057:args4: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg5(args1,args0,j,k,l,i); -} - -__code carg5(struct arg args0,struct arg args1,int i, int j,int k,int l) -{ - printf("#0064:args5: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg6(i,j,k,l,args0); -} - -__code carg6(int i, int j,int k,int l,struct arg args0) -{ - printf("#0071:args6: %d %d %d %d %d : %x %x %x %x\n", - args0.a0,args0.a1,args0.a2,args0.a3,args0.a4,i,j,k,l); - goto carg3(args0,args0,i,j,k,l); -} - -int main1(int n) -{ - goto carg1(0,1,2,3,4,exit___code=__return,exit_env=__environment); - return n; -} - -struct arg a00; -struct arg a01; - -int main( int ac, char *av[]) -{ - int n; - n = main1(123); - printf("#0089:321=%d\n",n); - - a00.a0 = 11; - a00.a1 = 22; - a00.a2 = 33; - a00.a3 = 44; - a00.a4 = 55; - a01.a0 = 66; - a01.a1 = 77; - a01.a2 = 88; - a01.a3 = 99; - a01.a4 = 10; - goto carg3(a00,a01,1,2,3,4); -} - diff -r bacef8675607 -r ba74047a4d78 argForClang.ll --- a/argForClang.ll Tue Oct 14 17:34:59 2014 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,281 +0,0 @@ -; ModuleID = 'argForClang.c' -target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.9.0" - -%struct.arg = type { i32, i32, i32, i32, i32 } -%struct.__CbC_env = type { i8*, i32* } - -@.str = private unnamed_addr constant [36 x i8] c"#0017:arg1: %d %d %d %d %d : %x %x\0A\00", align 1 -@exit___code = common global void (...)* null, align 8 -@exit_env = common global i8* null, align 8 -@.str1 = private unnamed_addr constant [36 x i8] c"#0024:arg1: %d %d %d %d %d : %x %x\0A\00", align 1 -@.str2 = private unnamed_addr constant [36 x i8] c"#0035:args: %d %d %d %d %d : %x %x\0A\00", align 1 -@.str3 = private unnamed_addr constant [43 x i8] c"#0045:args3: %d %d %d %d %d : %x %x %x %x\0A\00", align 1 -@.str4 = private unnamed_addr constant [72 x i8] c"#0047:args3: args0 %d %d %d %d %d : args1 %d %d %d %d %d : %x %x %x %x\0A\00", align 1 -@.str5 = private unnamed_addr constant [43 x i8] c"#0057:args4: %d %d %d %d %d : %x %x %x %x\0A\00", align 1 -@.str6 = private unnamed_addr constant [43 x i8] c"#0064:args5: %d %d %d %d %d : %x %x %x %x\0A\00", align 1 -@.str7 = private unnamed_addr constant [43 x i8] c"#0071:args6: %d %d %d %d %d : %x %x %x %x\0A\00", align 1 -@.str8 = private unnamed_addr constant [14 x i8] c"#0089:321=%d\0A\00", align 1 -@a00 = common global %struct.arg zeroinitializer, align 4 -@a01 = common global %struct.arg zeroinitializer, align 4 - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg1(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, void (i32, i8*)* %exit1, i8* %env) #0 { -entry: - %0 = load void (...)** @exit___code, align 8 - %1 = bitcast void (...)* %0 to void (i32, i8*)* - %cmp = icmp eq void (i32, i8*)* %exit1, %1 - %conv = zext i1 %cmp to i32 - %2 = load i8** @exit_env, align 8 - %cmp1 = icmp eq i8* %env, %2 - %conv2 = zext i1 %cmp1 to i32 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([36 x i8]* @.str, i32 0, i32 0), i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %conv, i32 %conv2) - tail call fastcc void @carg2(i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %arg0, void (i32, i8*)* %exit1, i8* %env) - ret void -} - -declare i32 @printf(i8*, ...) #1 - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg2(i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, void (i32, i8*)* %exit1, i8* %env) #0 { -entry: - %args0 = alloca %struct.arg, align 8 - %0 = load void (...)** @exit___code, align 8 - %1 = bitcast void (...)* %0 to void (i32, i8*)* - %cmp = icmp eq void (i32, i8*)* %exit1, %1 - %conv = zext i1 %cmp to i32 - %2 = load i8** @exit_env, align 8 - %cmp1 = icmp eq i8* %env, %2 - %conv2 = zext i1 %cmp1 to i32 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([36 x i8]* @.str1, i32 0, i32 0), i32 %arg0, i32 %arg1, i32 %arg2, i32 %arg3, i32 %arg4, i32 %conv, i32 %conv2) - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - store i32 %arg0, i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - store i32 %arg1, i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - store i32 %arg2, i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - store i32 %arg3, i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - store i32 %arg4, i32* %a4, align 4 - call fastcc void @cargs(%struct.arg* byval align 8 %args0, void (i32, i8*)* %exit1, i8* %env) - ret void -} - -; Function Attrs: nounwind ssp uwtable -define fastcc void @cargs(%struct.arg* byval align 8 %args0, void (i32, i8*)* %exit1, i8* %env) #0 { -entry: - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - %0 = load i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - %1 = load i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - %2 = load i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - %3 = load i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - %4 = load i32* %a4, align 4 - %5 = load void (...)** @exit___code, align 8 - %6 = bitcast void (...)* %5 to void (i32, i8*)* - %cmp = icmp eq void (i32, i8*)* %exit1, %6 - %conv = zext i1 %cmp to i32 - %7 = load i8** @exit_env, align 8 - %cmp1 = icmp eq i8* %env, %7 - %conv2 = zext i1 %cmp1 to i32 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([36 x i8]* @.str2, i32 0, i32 0), i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %conv, i32 %conv2) - tail call fastcc void %exit1(i32 0, i8* %env) - ret void -} - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg3(%struct.arg* byval align 8 %args0, %struct.arg* byval align 8 %args1, i32 %i, i32 %j, i32 %k, i32 %l) #0 { -entry: - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - %0 = load i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - %1 = load i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - %2 = load i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - %3 = load i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - %4 = load i32* %a4, align 4 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([43 x i8]* @.str3, i32 0, i32 0), i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %i, i32 %j, i32 %k, i32 %l) - %5 = load i32* %a0, align 4 - %6 = load i32* %a1, align 4 - %7 = load i32* %a2, align 4 - %8 = load i32* %a3, align 4 - %9 = load i32* %a4, align 4 - %a06 = getelementptr inbounds %struct.arg* %args1, i32 0, i32 0 - %10 = load i32* %a06, align 4 - %a17 = getelementptr inbounds %struct.arg* %args1, i32 0, i32 1 - %11 = load i32* %a17, align 4 - %a28 = getelementptr inbounds %struct.arg* %args1, i32 0, i32 2 - %12 = load i32* %a28, align 4 - %a39 = getelementptr inbounds %struct.arg* %args1, i32 0, i32 3 - %13 = load i32* %a39, align 4 - %a410 = getelementptr inbounds %struct.arg* %args1, i32 0, i32 4 - %14 = load i32* %a410, align 4 - %call11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([72 x i8]* @.str4, i32 0, i32 0), i32 %5, i32 %6, i32 %7, i32 %8, i32 %9, i32 %10, i32 %11, i32 %12, i32 %13, i32 %14, i32 %i, i32 %j, i32 %k, i32 %l) - %15 = load i32* %a0, align 4 - %16 = load i32* %a06, align 4 - %cmp = icmp eq i32 %15, %16 - br i1 %cmp, label %if.then, label %if.end - -if.then: ; preds = %entry - call void @exit(i32 0) #5 - unreachable - -if.end: ; preds = %entry - tail call fastcc void @carg4(%struct.arg* byval align 8 %args0, %struct.arg* byval align 8 %args1, i32 %j, i32 %k, i32 %l, i32 %i) - ret void -} - -; Function Attrs: noreturn -declare void @exit(i32) #2 - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg4(%struct.arg* byval align 8 %args0, %struct.arg* byval align 8 %args1, i32 %i, i32 %j, i32 %k, i32 %l) #0 { -entry: - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - %0 = load i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - %1 = load i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - %2 = load i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - %3 = load i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - %4 = load i32* %a4, align 4 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([43 x i8]* @.str5, i32 0, i32 0), i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %i, i32 %j, i32 %k, i32 %l) - tail call fastcc void @carg5(%struct.arg* byval align 8 %args1, %struct.arg* byval align 8 %args0, i32 %j, i32 %k, i32 %l, i32 %i) - ret void -} - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg5(%struct.arg* byval align 8 %args0, %struct.arg* byval align 8 %args1, i32 %i, i32 %j, i32 %k, i32 %l) #0 { -entry: - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - %0 = load i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - %1 = load i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - %2 = load i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - %3 = load i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - %4 = load i32* %a4, align 4 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([43 x i8]* @.str6, i32 0, i32 0), i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %i, i32 %j, i32 %k, i32 %l) - tail call fastcc void @carg6(i32 %i, i32 %j, i32 %k, i32 %l, %struct.arg* byval align 8 %args0) - ret void -} - -; Function Attrs: nounwind ssp uwtable -define fastcc void @carg6(i32 %i, i32 %j, i32 %k, i32 %l, %struct.arg* byval align 8 %args0) #0 { -entry: - %a0 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 0 - %0 = load i32* %a0, align 4 - %a1 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 1 - %1 = load i32* %a1, align 4 - %a2 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 2 - %2 = load i32* %a2, align 4 - %a3 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 3 - %3 = load i32* %a3, align 4 - %a4 = getelementptr inbounds %struct.arg* %args0, i32 0, i32 4 - %4 = load i32* %a4, align 4 - %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([43 x i8]* @.str7, i32 0, i32 0), i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %i, i32 %j, i32 %k, i32 %l) - tail call fastcc void @carg3(%struct.arg* byval align 8 %args0, %struct.arg* byval align 8 %args0, i32 %i, i32 %j, i32 %k, i32 %l) - ret void -} - -; Function Attrs: nounwind ssp uwtable -define fastcc void @main1..ret0(i32 %retval, i8* %env) #0 { -entry: - %0 = bitcast i8* %env to %struct.__CbC_env* - %ret_p = getelementptr inbounds %struct.__CbC_env* %0, i32 0, i32 0 - %1 = load i8** %ret_p, align 8 - %2 = bitcast i8* %1 to i32* - store i32 %retval, i32* %2, align 4 - %env1 = getelementptr inbounds %struct.__CbC_env* %0, i32 0, i32 1 - %3 = load i32** %env1, align 8 - call void @longjmp(i32* %3, i32 1) #5 - unreachable -} - -; Function Attrs: noreturn -declare void @longjmp(i32*, i32) #2 - -; Function Attrs: nounwind ssp uwtable -define i32 @main1(i32 %n) #0 { -entry: - %__CbC_environment = alloca %struct.__CbC_env, align 8 - %retval3 = alloca i32, align 4 - %env_buf = alloca [37 x i32], align 16 - store void (...)* bitcast (void (i32, i8*)* @main1..ret0 to void (...)*), void (...)** @exit___code, align 8 - %0 = bitcast i32* %retval3 to i8* - %ret_p = getelementptr inbounds %struct.__CbC_env* %__CbC_environment, i32 0, i32 0 - store i8* %0, i8** %ret_p, align 8 - %arraydecay = getelementptr inbounds [37 x i32]* %env_buf, i32 0, i32 0 - %env = getelementptr inbounds %struct.__CbC_env* %__CbC_environment, i32 0, i32 1 - store i32* %arraydecay, i32** %env, align 8 - %call = call i32 @setjmp(i32* %arraydecay) #6 - %tobool = icmp ne i32 %call, 0 - br i1 %tobool, label %if.then, label %if.end - -if.then: ; preds = %entry - %1 = load i32* %retval3, align 4 - br label %return - -if.end: ; preds = %entry - %2 = bitcast %struct.__CbC_env* %__CbC_environment to i8* - store i8* %2, i8** @exit_env, align 8 - call fastcc void @carg1(i32 0, i32 1, i32 2, i32 3, i32 4, void (i32, i8*)* @main1..ret0, i8* %2) - br label %return - -return: ; preds = %if.end, %if.then - %retval.0 = phi i32 [ %1, %if.then ], [ %n, %if.end ] - ret i32 %retval.0 -} - -; Function Attrs: returns_twice -declare i32 @setjmp(i32*) #3 - -; Function Attrs: nounwind ssp uwtable -define i32 @main(i32 %ac, i8** %av) #0 { -entry: - %tmp = alloca %struct.arg, align 8 - %tmp2 = alloca %struct.arg, align 8 - %call = call i32 @main1(i32 123) - %call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([14 x i8]* @.str8, i32 0, i32 0), i32 %call) - store i32 11, i32* getelementptr inbounds (%struct.arg* @a00, i32 0, i32 0), align 4 - store i32 22, i32* getelementptr inbounds (%struct.arg* @a00, i32 0, i32 1), align 4 - store i32 33, i32* getelementptr inbounds (%struct.arg* @a00, i32 0, i32 2), align 4 - store i32 44, i32* getelementptr inbounds (%struct.arg* @a00, i32 0, i32 3), align 4 - store i32 55, i32* getelementptr inbounds (%struct.arg* @a00, i32 0, i32 4), align 4 - store i32 66, i32* getelementptr inbounds (%struct.arg* @a01, i32 0, i32 0), align 4 - store i32 77, i32* getelementptr inbounds (%struct.arg* @a01, i32 0, i32 1), align 4 - store i32 88, i32* getelementptr inbounds (%struct.arg* @a01, i32 0, i32 2), align 4 - store i32 99, i32* getelementptr inbounds (%struct.arg* @a01, i32 0, i32 3), align 4 - store i32 10, i32* getelementptr inbounds (%struct.arg* @a01, i32 0, i32 4), align 4 - %0 = bitcast %struct.arg* %tmp to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* bitcast (%struct.arg* @a00 to i8*), i64 20, i32 4, i1 false) - %1 = bitcast %struct.arg* %tmp2 to i8* - call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* bitcast (%struct.arg* @a01 to i8*), i64 20, i32 4, i1 false) - call fastcc void @carg3(%struct.arg* byval align 8 %tmp, %struct.arg* byval align 8 %tmp2, i32 1, i32 2, i32 3, i32 4) - ret i32 0 -} - -; Function Attrs: nounwind -declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #4 - -attributes #0 = { nounwind ssp uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #2 = { noreturn "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #3 = { returns_twice "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } -attributes #4 = { nounwind } -attributes #5 = { noreturn } -attributes #6 = { returns_twice } - -!llvm.ident = !{!0} - -!0 = metadata !{metadata !"clang version 3.5 (trunk)"} diff -r bacef8675607 -r ba74047a4d78 bug.c --- a/bug.c Tue Oct 14 17:34:59 2014 +0900 +++ b/bug.c Wed Oct 22 00:38:01 2014 +0900 @@ -1,3 +1,5 @@ +#include + typedef void (*atexit_callback)(void); typedef void (*cxa_atexit_callback)(void *); struct one_atexit_routine diff -r bacef8675607 -r ba74047a4d78 conv.c --- a/conv.c Tue Oct 14 17:34:59 2014 +0900 +++ b/conv.c Wed Oct 22 00:38:01 2014 +0900 @@ -1,71 +1,75 @@ #include "stdio.h" -f0(int i) { - int k,j; - k = 3+i; - j = g0(i+3); - return k+4+j; +#ifdef CLANG +#define _CbC_return __return +#define _CbC_environment __environment +#endif + +int g0(int i) { + return i+4; } -g0(int i) { - return i+4; +int f0(int i) { + int k,j; + k = 3+i; + j = g0(i+3); + return k+4+j; } - typedef void *stack; __code f_g0(int i,int k,stack sp) ; struct cont_interface { // General Return Continuation - __code (*ret)(int, void*); + __code (*ret)(int, void*); }; __code f(int i,stack sp) { - int k,j; - k = 3+i; - goto f_g0(i,k,sp); + int k,j; + k = 3+i; + goto f_g0(i,k,sp); } struct f_g0_interface { // Specialized Return Continuation - __code (*ret)(); - int i_,k_,j_; + __code (*ret)(); + int i_,k_,j_; }; __code f_g1(int j,stack sp); __code g(int i,stack sp) ; __code f_g0(int i,int k,stack sp) { // Caller - struct f_g0_interface *c = - (struct f_g0_interface *)(sp -= sizeof(struct f_g0_interface)); + struct f_g0_interface *c = + (struct f_g0_interface *)(sp -= sizeof(struct f_g0_interface)); + + c->ret = f_g1; + c->k_ = k; + c->i_ = i; - c->ret = f_g1; - c->k_ = k; - c->i_ = i; - - goto g(i+3,sp); + goto g(i+3,sp); } __code f_g1(int j,stack sp) { // Continuation - struct f_g0_interface *c = (struct f_g0_interface *)sp; - int k = c->k_; - sp += sizeof(struct f_g0_interface); - goto (( (struct cont_interface *)sp)->ret)(k+4+j,sp); + struct f_g0_interface *c = (struct f_g0_interface *)sp; + int k = c->k_; + sp += sizeof(struct f_g0_interface); + goto (( (struct cont_interface *)sp)->ret)(k+4+j,sp); } __code g(int i,stack sp) { - goto (( (struct cont_interface *)sp)->ret)(i+4,sp); + goto (( (struct cont_interface *)sp)->ret)(i+4,sp); } struct main_continuation { // General Return Continuation - __code (*ret)(int, void*); - __code (*main_ret)(int, void*); - void *env; + __code (*ret)(int, void*); + __code (*main_ret)(int, void*); + void *env; }; __code main_return(int i,stack sp) { - printf("#0061:%d\n",i); - goto (( (struct main_continuation *)sp)->main_ret)(i, - ((struct main_continuation *)sp)->env); + printf("#0061:%d\n",i); + goto (( (struct main_continuation *)sp)->main_ret)(i, + ((struct main_continuation *)sp)->env); } #define STACK_SIZE 2048 @@ -76,17 +80,17 @@ int main(int argc, char **argv) { - struct main_continuation *cont; - stack sp = stack_last; + struct main_continuation *cont; + stack sp = stack_last; - printf("#0075:%d\n",f0(233)); + printf("#0075:%d\n",f0(233)); - sp -= sizeof(*cont); - cont = (struct main_continuation *)sp; - cont->ret = main_return; - cont->main_ret = (return_type) _CbC_return; - cont->env = _CbC_environment; - goto f(233,sp); + sp -= sizeof(*cont); + cont = (struct main_continuation *)sp; + cont->ret = main_return; + cont->main_ret = (return_type) _CbC_return; + cont->env = _CbC_environment; + goto f(233,sp); } /* end */