Created
December 20, 2015 23:34
-
-
Save piroux/a856aa31525ca23238be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
target triple = "x86_64-none-linux-gnu" | |
declare i32 @printf(i8*, ...) nounwind | |
declare i32* @malloc(i32) nounwind | |
declare void @free(i32*) nounwind | |
@format_int_s = internal constant [3 x i8] c"%d\00" | |
@format_char_s = internal constant [3 x i8] c"%c\00" | |
@format_debug_int_s = internal constant [19 x i8] c"[DEBUG] int: <%d>\0A\00" | |
@runtime_warning_s = internal constant [18 x i8] c"RUNTIME: warning\0A\00" | |
@runtime_warning_bad_slice_s = internal constant [31 x i8] c"[RUNTIME] warning : bad slice\0A\00" | |
@runtime_warning_bad_index_s = internal constant [31 x i8] c"[RUNTIME] warning : bad index\0A\00" | |
@argcount_s = internal constant [11 x i8] c"nbarg: %d\0A\00" | |
@array_begin_s = internal constant [2 x i8] c"[\00" | |
@array_inner_sep_s = internal constant [3 x i8] c", \00" | |
@array_finish_s = internal constant [7 x i8] c"\1b\5b\32\44]\0A\00" | |
define void @print_int(i64 %i) { | |
call i32 (i8*, ...)* @printf(i8* getelementptr ([3 x i8]* @format_int_s, i32 0, i32 0), i64 %i) | |
ret void | |
} | |
define void @print_char(i8 %c) { | |
call i32 (i8*, ...)* @printf(i8* getelementptr ([3 x i8]* @format_char_s, i32 0, i32 0), i8 %c) | |
ret void | |
} | |
define void @debug_int(i64 %i) { | |
call i32 (i8*, ...)* @printf(i8* getelementptr ([19 x i8]* @format_debug_int_s, i32 0, i32 0), i64 %i) | |
ret void | |
} | |
%DynArrayI = type { | |
i32, ; length | |
i64* ; start of data | |
} | |
@DynArrayI_size = constant i32 ptrtoint (%DynArrayI* getelementptr (%DynArrayI* null, i32 1) to i32) | |
define %DynArrayI* @DynArrayI__new(i32 %n) { | |
%dynarray_size = load i32* @DynArrayI_size | |
%1 = call i32* @malloc(i32 %dynarray_size) | |
%dynarray = bitcast i32* %1 to %DynArrayI* | |
%data_size = mul i32 %n, 8 | |
%2 = call i32* @malloc(i32 %data_size) | |
%3 = bitcast i32* %2 to i64* | |
%4 = getelementptr %DynArrayI* %dynarray, i32 0, i32 0 | |
store i32 %n, i32* %4 | |
%5 = getelementptr %DynArrayI* %dynarray, i32 0, i32 1 | |
store i64* %3, i64** %5 | |
ret %DynArrayI* %dynarray | |
} | |
define void @DynArrayI__delete(%DynArrayI* %dynarray) { | |
%1 = getelementptr %DynArrayI* %dynarray, i32 0, i32 1 | |
%2 = load i64** %1 | |
%3 = bitcast i64* %2 to i32* | |
call void @free(i32* %3) | |
%4 = bitcast %DynArrayI* %dynarray to i32* | |
call void @free(i32* %4) | |
ret void | |
} | |
define %DynArrayI* @DynArrayI__slice(%DynArrayI* %dynarray, i32 %a, i32 %b) { | |
%dynarray_size = load i32* @DynArrayI_size | |
%n = sub i32 %b, %a | |
;call void @print_char(i8 65) ;; | |
;%lol.a = zext i32 %a to i64 ;; | |
;call void @debug_int(i64 %lol.a) ;; | |
;call void @print_char(i8 66) ;; | |
;%lol.b = zext i32 %b to i64 ;; | |
;call void @debug_int(i64 %lol.b) ;; | |
;call void @print_char(i8 78) ;; | |
;%lol.n = zext i32 %n to i64 ;; | |
;call void @debug_int(i64 %lol.n) ;; | |
; begin check | |
%len = call i32 @DynArrayI__len(%DynArrayI* %dynarray) | |
%bad_index_a1 = icmp slt i32 %a, 0 | |
%bad_index_a2 = icmp sgt i32 %a, %len | |
%bad_index_a = or i1 %bad_index_a1, %bad_index_a2 | |
%bad_index_b1 = icmp slt i32 %b, 0 | |
%bad_index_b2 = icmp sgt i32 %b, %len | |
%bad_index_b = or i1 %bad_index_b1, %bad_index_b2 | |
%bad_index_ = or i1 %bad_index_a, %bad_index_b | |
%bad_slice_ = icmp slt i32 %n, 0 | |
%bad_slice = or i1 %bad_index_, %bad_slice_ | |
br i1 %bad_slice, label %.slice_bad, label %.slice_ok | |
.slice_bad: | |
call i32 (i8*, ...)* @printf(i8* getelementptr([31 x i8]* @runtime_warning_bad_slice_s, i32 0, i32 0)) | |
br label %.slice_ok | |
.slice_ok: | |
; end check | |
%dynarray_slice = call %DynArrayI* @DynArrayI__new(i32 %n) | |
%i_ = alloca i32 | |
store i32 0, i32* %i_ | |
br label %.loop_head | |
.loop_head: | |
%i = load i32* %i_ | |
%cond = icmp slt i32 %i, %n | |
br i1 %cond, label %.loop_body, label %.loop_tail | |
.loop_body: | |
%elt_index = add i32 %a, %i | |
;%lol.index = zext i32 %elt_index to i64 ;; | |
;call void @debug_int(i64 %lol.index) ;; | |
%elt = call i64 @DynArrayI__get(%DynArrayI* %dynarray, i32 %elt_index) | |
call void @DynArrayI__set(%DynArrayI* %dynarray_slice, i32 %i, i64 %elt) | |
%i_new = add i32 %i, 1 | |
store i32 %i_new, i32* %i_ | |
br label %.loop_head | |
.loop_tail: | |
ret %DynArrayI* %dynarray_slice | |
} | |
define %DynArrayI* @DynArrayI__copy(%DynArrayI* %dynarray) { | |
%dynarray_len = call i32 @DynArrayI__len(%DynArrayI* %dynarray) | |
%dynarray_copy = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %dynarray, i32 0, i32 %dynarray_len) | |
ret %DynArrayI* %dynarray_copy | |
} | |
define i32 @DynArrayI__len(%DynArrayI* %dynarray) { | |
%1 = getelementptr %DynArrayI* %dynarray, i32 0, i32 0 | |
%n = load i32* %1 | |
ret i32 %n | |
} | |
define i64 @DynArrayI__get(%DynArrayI* %dynarray, i32 %i) { | |
%1 = getelementptr %DynArrayI* %dynarray, i32 0, i32 1 | |
; begin check | |
%len = call i32 @DynArrayI__len(%DynArrayI* %dynarray) | |
%bad_index_1 = icmp slt i32 %i, 0 | |
%bad_index_2 = icmp sge i32 %i, %len | |
%bad_index = or i1 %bad_index_1, %bad_index_2 | |
br i1 %bad_index, label %.index_bad, label %.index_ok | |
.index_bad: | |
call i32 (i8*, ...)* @printf(i8* getelementptr([31 x i8]* @runtime_warning_bad_index_s, i32 0, i32 0)) | |
br label %.index_ok | |
.index_ok: | |
; end check | |
%dynarray_data = load i64** %1 | |
%3 = getelementptr i64* %dynarray_data, i32 %i | |
%elt = load i64* %3 | |
ret i64 %elt | |
} | |
define void @DynArrayI__set(%DynArrayI* %dynarray, i32 %i, i64 %elt) { | |
%1 = getelementptr %DynArrayI* %dynarray, i32 0, i32 1 | |
; begin check | |
%len = call i32 @DynArrayI__len(%DynArrayI* %dynarray) | |
%bad_index_1 = icmp slt i32 %i, 0 | |
%bad_index_2 = icmp sge i32 %i, %len | |
%bad_index = or i1 %bad_index_1, %bad_index_2 | |
br i1 %bad_index, label %.index_bad, label %.index_ok | |
.index_bad: | |
call i32 (i8*, ...)* @printf(i8* getelementptr([31 x i8]* @runtime_warning_bad_index_s, i32 0, i32 0)) | |
br label %.index_ok | |
.index_ok: | |
; end check | |
%dynarray_data = load i64** %1 | |
%3 = getelementptr i64* %dynarray_data, i32 %i | |
store i64 %elt, i64* %3 | |
ret void | |
} | |
define void @DynArrayI__print(%DynArrayI* %dynarray) { | |
%n = call i32 @DynArrayI__len(%DynArrayI* %dynarray) | |
%i_ = alloca i32 | |
store i32 0, i32* %i_ | |
call i32 (i8*, ...)* @printf(i8* getelementptr([2 x i8]* @array_begin_s, i32 0, i32 0)) | |
%empty = icmp sle i32 %n, 0 | |
br i1 %empty, label %.fix_display, label %.loop_head | |
.fix_display: ; for empty arrays | |
call void @print_char(i8 32) | |
call void @print_char(i8 32) | |
br label %.loop_head | |
.loop_head: | |
%i = load i32* %i_ | |
%cond = icmp slt i32 %i, %n | |
br i1 %cond, label %.loop_body, label %.loop_tail | |
.loop_body: | |
%elt = call i64 @DynArrayI__get(%DynArrayI* %dynarray, i32 %i) | |
call void @print_int(i64 %elt) | |
call i32 (i8*, ...)* @printf(i8* getelementptr([3 x i8]* @array_inner_sep_s, i32 0, i32 0)) | |
%i_new = add i32 %i, 1 | |
store i32 %i_new, i32* %i_ | |
br label %.loop_head | |
.loop_tail: | |
call i32 (i8*, ...)* @printf(i8* getelementptr([7 x i8]* @array_finish_s, i32 0, i32 0)) | |
ret void | |
} | |
;%lol_cond = zext i1 %cond to i64 ;; | |
;call void @debug_int(i64 %lol_cond) ;; | |
define i32 @test_01() { | |
call void @debug_int(i64 100000) | |
%array = call %DynArrayI* @DynArrayI__new(i32 1) | |
call void @debug_int(i64 100001) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 100002) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 0, i64 6) | |
call void @debug_int(i64 100003) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 100004) | |
%array2 = call %DynArrayI* @DynArrayI__copy(%DynArrayI* %array) | |
call void @debug_int(i64 100005) | |
call void @DynArrayI__print(%DynArrayI* %array2) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 100006) | |
%array3 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 0, i32 0) | |
call void @debug_int(i64 100007) | |
call void @DynArrayI__print(%DynArrayI* %array3) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 100008) | |
%array4 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 0, i32 1) | |
call void @debug_int(i64 100009) | |
call void @DynArrayI__print(%DynArrayI* %array4) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 100010) | |
call void @debug_int(i64 100011) | |
call void @DynArrayI__delete(%DynArrayI* %array) | |
call void @DynArrayI__delete(%DynArrayI* %array2) | |
call void @DynArrayI__delete(%DynArrayI* %array3) | |
call void @DynArrayI__delete(%DynArrayI* %array4) | |
call void @debug_int(i64 100012) | |
ret i32 0 | |
} | |
; -- TESTS --------------------------------------------------------------------- | |
define i32 @test_02() { | |
call void @debug_int(i64 100000) | |
%array = call %DynArrayI* @DynArrayI__new(i32 8) | |
call void @debug_int(i64 200001) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 200002) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 0, i64 1) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 1, i64 1) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 2, i64 2) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 3, i64 3) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 4, i64 5) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 5, i64 8) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 6, i64 13) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 7, i64 21) | |
call void @debug_int(i64 200003) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 200004) | |
%array2 = call %DynArrayI* @DynArrayI__copy(%DynArrayI* %array) | |
call void @debug_int(i64 200005) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array2) | |
call void @debug_int(i64 200006) | |
%array3 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 2, i32 6) | |
call void @debug_int(i64 200007) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array3) | |
call void @debug_int(i64 200008) | |
%array4 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 1, i32 7) | |
call void @debug_int(i64 200009) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array4) | |
call void @debug_int(i64 200010) | |
%array5 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 5, i32 8) | |
call void @debug_int(i64 200011) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array5) | |
call void @debug_int(i64 2000012) | |
%array6 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 0, i32 2) | |
call void @debug_int(i64 200013) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array6) | |
call void @debug_int(i64 200014) | |
%array7 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 1, i32 1) | |
call void @debug_int(i64 200015) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array7) | |
call void @debug_int(i64 200016) | |
%array8 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 8, i32 8) | |
call void @debug_int(i64 200017) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array8) | |
call void @debug_int(i64 200018) | |
%array9 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 1, i32 5) | |
call void @debug_int(i64 200019) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array9) | |
call void @debug_int(i64 200020) | |
call void @debug_int(i64 200021) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 0, i64 55) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 2, i64 56) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 1, i64 57) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 4, i64 58) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 200022) | |
call void @debug_int(i64 200023) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 0) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 2) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 1) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 5) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 7) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 6) | |
call void @debug_int(i64 200024) | |
call void @debug_int(i64 200025) | |
call void @DynArrayI__delete(%DynArrayI* %array) | |
call void @DynArrayI__delete(%DynArrayI* %array2) | |
call void @DynArrayI__delete(%DynArrayI* %array3) | |
call void @DynArrayI__delete(%DynArrayI* %array4) | |
call void @DynArrayI__delete(%DynArrayI* %array5) | |
call void @DynArrayI__delete(%DynArrayI* %array6) | |
call void @DynArrayI__delete(%DynArrayI* %array7) | |
call void @DynArrayI__delete(%DynArrayI* %array8) | |
call void @DynArrayI__delete(%DynArrayI* %array9) | |
call void @debug_int(i64 200026) | |
ret i32 0 | |
} | |
define i32 @test_03() { | |
call void @debug_int(i64 300000) | |
%array = call %DynArrayI* @DynArrayI__new(i32 1000000) | |
call void @debug_int(i64 300001) | |
;call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 300002) | |
%array1 = call %DynArrayI* @DynArrayI__copy(%DynArrayI* %array) | |
call void @debug_int(i64 300003) | |
;call void @DynArrayI__print(%DynArrayI* %array) | |
;call void @DynArrayI__print(%DynArrayI* %array1) | |
call void @debug_int(i64 300004) | |
%array2 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 500001, i32 1000000) | |
call void @debug_int(i64 300005) | |
;call void @DynArrayI__print(%DynArrayI* %array) | |
;call void @DynArrayI__print(%DynArrayI* %array2) | |
call void @debug_int(i64 300006) | |
call void @debug_int(i64 300007) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 999990, i64 55) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 999993, i64 56) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 999996, i64 57) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 999999, i64 58) | |
;call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 300008) | |
%array3 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 999990, i32 1000000) | |
call void @debug_int(i64 300009) | |
;call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array3) | |
call void @debug_int(i64 300010) | |
call void @debug_int(i64 300011) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 0) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 1) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 2) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 999990) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 999996) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 999999) | |
call void @debug_int(i64 3000012) | |
call void @debug_int(i64 3000013) | |
call void @DynArrayI__delete(%DynArrayI* %array) | |
call void @debug_int(i64 3000014) | |
call void @DynArrayI__delete(%DynArrayI* %array1) | |
call void @debug_int(i64 3000015) | |
call void @DynArrayI__delete(%DynArrayI* %array2) | |
call void @debug_int(i64 3000016) | |
call void @DynArrayI__delete(%DynArrayI* %array3) | |
call void @debug_int(i64 3000017) | |
ret i32 0 | |
} | |
;; warning: this deliberate buggy code can segfault | |
define i32 @test_04() { | |
call void @debug_int(i64 400000) | |
%array = call %DynArrayI* @DynArrayI__new(i32 8) | |
call void @debug_int(i64 400001) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 400002) | |
%array1 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 2, i32 1) ; bad | |
call void @debug_int(i64 400003) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array1) | |
call void @debug_int(i64 400004) | |
%array2 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 -5, i32 -5) ; bad | |
call void @debug_int(i64 400005) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array2) | |
call void @debug_int(i64 400006) | |
%array3 = call %DynArrayI* @DynArrayI__slice(%DynArrayI* %array, i32 15, i32 15) ; bad | |
call void @debug_int(i64 400007) | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @DynArrayI__print(%DynArrayI* %array3) | |
call void @debug_int(i64 400008) | |
call void @debug_int(i64 400009) | |
call void @DynArrayI__set(%DynArrayI* %array, i32 -1, i64 55) ; bad | |
call void @DynArrayI__set(%DynArrayI* %array, i32 8, i64 56) ; bad | |
call void @DynArrayI__set(%DynArrayI* %array, i32 9, i64 57) ; bad | |
call void @DynArrayI__set(%DynArrayI* %array, i32 10, i64 58) ; bad | |
call void @DynArrayI__print(%DynArrayI* %array) | |
call void @debug_int(i64 400010) | |
call void @debug_int(i64 400011) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 -2) ; bad | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 -1) ; bad | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 0) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 7) | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 8) ; bad | |
call i64 @DynArrayI__get(%DynArrayI* %array, i32 9) ; bad | |
call void @debug_int(i64 400012) | |
call void @debug_int(i64 400013) | |
call void @DynArrayI__delete(%DynArrayI* %array) | |
call void @debug_int(i64 400014) | |
call void @DynArrayI__delete(%DynArrayI* %array1) | |
call void @debug_int(i64 400015) | |
call void @DynArrayI__delete(%DynArrayI* %array2) | |
call void @debug_int(i64 400016) | |
call void @DynArrayI__delete(%DynArrayI* %array3) | |
call void @debug_int(i64 400017) | |
ret i32 0 | |
} | |
define i32 @main() #0 { | |
call i32 @test_01() | |
call i32 @test_02() | |
call i32 @test_03() | |
;call i32 @test_04() | |
ret i32 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment