Skip to content

Instantly share code, notes, and snippets.

@piroux
Created December 20, 2015 23:34
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save piroux/a856aa31525ca23238be to your computer and use it in GitHub Desktop.
Save piroux/a856aa31525ca23238be to your computer and use it in GitHub Desktop.
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