Skip to content

Instantly share code, notes, and snippets.

@antonijn
Last active August 29, 2015 13:58
Show Gist options
  • Select an option

  • Save antonijn/10301429 to your computer and use it in GitHub Desktop.

Select an option

Save antonijn/10301429 to your computer and use it in GitHub Desktop.
;
; runtime.ll
;
; The libaquastd interface for the aqua runtime services.
;
%rt._Unwind_Exception = type { [4 x i8], void (sysint, %rt._Unwind_Exception*) *, i64, i64 }
declare sysint @_Unwind_RaiseException(%rt._Unwind_Exception* %ex) noreturn
declare void @GC_malloc(sysint)
declare void @GC_realloc(i8*, sysint)
declare void @GC_collect()
declare void @is.class.aqua.std.Array.0.1aqua.std.String.2.this.1978133948(%class.aqua.std.Array.0.1aqua.std.String.2*, i32, %class.aqua.std.String*)
declare %class.aqua.std.String* @new.class.aqua.std.String(i8*)
declare void @new.class.aqua.std.Array.0.1aqua.std.String.2(sysint)
@rt.exception = global thread_local i8* undef
define i8* @rt.alloc(sysint %bytes) {
%ptr = call i8* @GC_malloc(sysint %bytes)
ret i8* %ptr
}
define private void @rt.dispose_ex(sysint %first, %rt._Unwind_Exception* %second) {
ret void
}
define void @rt.throw(i8* %ex) {
%ptr = alloca %rt._Unwind_Exception
store %rt._Unwind_Exception { [4 x i8] [ 'a', 'q', 'u', 'a' ], void (sysint, %rt._Unwind_Exception*) * @rt.dispose_ex, i64 undef, i64 undef }, %rt._Unwind_Exception* %ptr
%rc = call sysint @_Unwind_RaiseException(%rt._Unwind_Exception* %ptr)
unreachable
}
define void @rt.throw_null_ptr_ex(%class.aqua.std.String* %desc) {
%ex = call %class.aqua.std.NullPtrException* @new.class.aqua.std.NullPtrException(%class.aqua.std.String* %desc)
%exptr = bitcast %class.aqua.std.NullPtrException* to i8*
call void @rt.throw(i8* %exptr)
unreachable
}
define void @rt.collect() {
call void @GC_collect()
ret void
}
define i8* @rt.realloc(i8* %ptr, sysint %bytes) {
%n = call i8* @GC_realloc(i8* %ptr, sysint %bytes)
ret i8* %n
}
define void @rt.exit(sysint %code) {
call void @rt.collect()
call void exit(sysint %code)
unreachable
}
define %class.aqua.std.Array.0.1aqua.std.String.2* @rt.init(i32 %argc, i8** %argv, ...) {
%ap = alloca i8*
%ap2 = bitcast i8** %ap to i8*
call void @llvm.va_start(i8* %ap2)
br label %req_loop
req_loop:
%item = va_arg %ap, void ()*
%cond = icmp eq %item, null
br i1 %cond, label %req_break, label %req_continue
req_continue:
call void %item()
br label %req_loop
req_break:
%count = zext %argc to sysint
%arr = call void @new.class.aqua.std.Array.0.1aqua.std.String.2(sysint %count)
arg_loop:
%i = phi i32 [ 1, %req_break ], [ %ni, %req_loop ]
%ni = add i32 %i, 1
%argcond = icmp lt i32 %i, %argc
br i1 %argcond, label %arg_continue, label %arg_break
arg_continue:
%ptr = getelementptr i8** %argv, i32 %i
%str = call %class.aqua.std.String* @new.class.aqua.std.String(i8* %ptr)
%tmp = call %class.aqua.std.String* @is.class.aqua.std.Array.0.1aqua.std.String.2.this.1978133948(%class.aqua.std.Array.0.1aqua.std.String.2* %arr, i32 %i, %class.aqua.std.String* %str)
br label %arg_loop
arg_break:
call void @llvm.va_end(i8* %ap2)
ret %class.aqua.std.Array.0.1aqua.std.String.2* %arr
}
@rt.version = global %struct.aqua.std.Version { i32 -1, i32 -1, i32 -1, i32 -1 }
%struct.aqua.std.Version = type { i32, i32, i32, i32 }
%vtable.class.aqua.std.Iterator.0.1char.2 = type { i8* (%class.aqua.std.Iterator.0.1char.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, i1 (%class.aqua.std.Iterator.0.1char.2*)*, i8 (%class.aqua.std.Iterator.0.1char.2*)*, void (%class.aqua.std.Iterator.0.1char.2*)* }
%class.aqua.std.Iterator.0.1char.2 = type { %vtable.class.aqua.std.Iterator.0.1char.2* }
%vtable.class.aqua.std.IndexedCollection.0.1char.2 = type { i8* (%class.aqua.std.IndexedCollection.0.1char.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.Collection.0.1char.2*)*, %class.aqua.std.Array.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i8 (%class.aqua.std.IndexedCollection.0.1char.2*,i32)* }
%class.aqua.std.IndexedCollection.0.1char.2 = type { %vtable.class.aqua.std.IndexedCollection.0.1char.2* }
%vtable.class.aqua.std.MutableIndexedCollection.0.1char.2 = type { i8* (%class.aqua.std.MutableIndexedCollection.0.1char.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.Collection.0.1char.2*)*, %class.aqua.std.Array.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i8 (%class.aqua.std.IndexedCollection.0.1char.2*,i32)*, i8 (%class.aqua.std.MutableIndexedCollection.0.1char.2*,i32)* }
%class.aqua.std.MutableIndexedCollection.0.1char.2 = type { %vtable.class.aqua.std.MutableIndexedCollection.0.1char.2* }
%vtable.class.aqua.std.Array.0.1char.2 = type { i8* (%class.aqua.std.Array.0.1char.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.Collection.0.1char.2*)*, %class.aqua.std.Array.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i8 (%class.aqua.std.IndexedCollection.0.1char.2*,i32)*, i8 (%class.aqua.std.MutableIndexedCollection.0.1char.2*,i32)* }
%class.aqua.std.Array.0.1char.2 = type { %vtable.class.aqua.std.Array.0.1char.2*, i32, i8* }
%vtable.class.aqua.std.Collection.0.1char.2 = type { i8* (%class.aqua.std.Collection.0.1char.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.Collection.0.1char.2*)*, %class.aqua.std.Array.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)* }
%class.aqua.std.Collection.0.1char.2 = type { %vtable.class.aqua.std.Collection.0.1char.2* }
%vtable.class.aqua.std.String = type { i8* (%class.aqua.std.String*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.Collection.0.1char.2*)*, %class.aqua.std.Array.0.1char.2* (%class.aqua.std.Collection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1char.2*)*, i8 (%class.aqua.std.IndexedCollection.0.1char.2*,i32)* }
%class.aqua.std.String = type { %vtable.class.aqua.std.String*, i32, i32, i8* }
%vtable.class.aqua.std.Object = type { i8* (%class.aqua.std.Object*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)* }
%class.aqua.std.Object = type { %vtable.class.aqua.std.Object* }
%vtable.class.aqua.std.Type = type { i8* (%class.aqua.std.Type*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Type*)*, i1 (%class.aqua.std.Type*,%class.aqua.std.Type*)* }
%class.aqua.std.Type = type { %vtable.class.aqua.std.Type*, %class.aqua.std.String*, %class.aqua.std.Type* }
%vtable.class.aqua.std.Iterator.0.1aqua.std.String.2 = type { i8* (%class.aqua.std.Iterator.0.1aqua.std.String.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, i1 (%class.aqua.std.Iterator.0.1aqua.std.String.2*)*, %class.aqua.std.String* (%class.aqua.std.Iterator.0.1aqua.std.String.2*)*, void (%class.aqua.std.Iterator.0.1aqua.std.String.2*)* }
%class.aqua.std.Iterator.0.1aqua.std.String.2 = type { %vtable.class.aqua.std.Iterator.0.1aqua.std.String.2* }
%vtable.class.aqua.std.Collection.0.1aqua.std.String.2 = type { i8* (%class.aqua.std.Collection.0.1aqua.std.String.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, %class.aqua.std.Array.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)* }
%class.aqua.std.Collection.0.1aqua.std.String.2 = type { %vtable.class.aqua.std.Collection.0.1aqua.std.String.2* }
%vtable.class.aqua.std.IndexedCollection.0.1aqua.std.String.2 = type { i8* (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, %class.aqua.std.Array.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, %class.aqua.std.String* (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*,i32)* }
%class.aqua.std.IndexedCollection.0.1aqua.std.String.2 = type { %vtable.class.aqua.std.IndexedCollection.0.1aqua.std.String.2* }
%vtable.class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2 = type { i8* (%class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, %class.aqua.std.Array.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, %class.aqua.std.String* (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*,i32)*, %class.aqua.std.String* (%class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2*,i32)* }
%class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2 = type { %vtable.class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2* }
%vtable.class.aqua.std.Array.0.1aqua.std.String.2 = type { i8* (%class.aqua.std.Array.0.1aqua.std.String.2*,%class.aqua.std.Type*)*, i1 (%class.aqua.std.Object*,%class.aqua.std.Object*)*, i64 (%class.aqua.std.Object*)*, %class.aqua.std.Type* (%class.aqua.std.Object*)*, %class.aqua.std.String* (%class.aqua.std.Object*)*, %class.aqua.std.Iterator.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, %class.aqua.std.Array.0.1aqua.std.String.2* (%class.aqua.std.Collection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, i32 (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*)*, %class.aqua.std.String* (%class.aqua.std.IndexedCollection.0.1aqua.std.String.2*,i32)*, %class.aqua.std.String* (%class.aqua.std.MutableIndexedCollection.0.1aqua.std.String.2*,i32)* }
%class.aqua.std.Array.0.1aqua.std.String.2 = type { %vtable.class.aqua.std.Array.0.1aqua.std.String.2*, i32, %class.aqua.std.String** }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment