Last active
August 29, 2015 13:58
-
-
Save antonijn/10301429 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
| ; | |
| ; 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