Skip to content

Instantly share code, notes, and snippets.

@antonijn
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antonijn/9555282 to your computer and use it in GitHub Desktop.
Save antonijn/9555282 to your computer and use it in GitHub Desktop.
package my.pack;
public class MyClass {
public static boolean bar(final void() quux) {
return quux != null;
}
private static void main() {
bar(default(void()));
}
}
target triple = "x86_64-linux-gnu"
%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*)* }
%class.aqua.std.Iterator.0.1char.2 = type { %vtable.class.aqua.std.Iterator.0.1char.2* }
%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*)* }
%class.aqua.std.Collection.0.1char.2 = type { %vtable.class.aqua.std.Collection.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.IndexedCollection.0.1char.2*)* }
%class.aqua.std.IndexedCollection.0.1char.2 = type { %vtable.class.aqua.std.IndexedCollection.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.IndexedCollection.0.1char.2*)* }
%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.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*)* }
%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.IndexedCollection.0.1aqua.std.String.2*)* }
%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.IndexedCollection.0.1aqua.std.String.2*)*, %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.IndexedCollection.0.1aqua.std.String.2*)*, %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** }
declare external %class.aqua.std.Array.0.1aqua.std.String.2* @aqua_init(i32, i8**)
declare external void @aqua_exit(i32)
declare void @class.aqua.std.Object.static.0(i8*)
@class.my.pack.MyClass.static.0.called = private global i1 0
define void @class.my.pack.MyClass.static.0(i8* %this) {
%1 = load i1* @class.my.pack.MyClass.static.0.called
br i1 %1, label %2, label %3
ret void
store i1 1, i1* @class.my.pack.MyClass.static.0.called
call void @class.aqua.std.Object.static.0(i8* undef)
ret void
}
define i1 @class.my.pack.MyClass.bar.4154394454(i8* %this, { i8*, void (i8*)* } %quux) {
call void @class.my.pack.MyClass.static.0(i8* undef)
%1 = extractvalue { i8*, void (i8*)* } %quux, 0
%2 = extractvalue { i8*, void (i8*)* } zeroinitializer, 0
%3 = icmp eq i8* %1, %2
%4 = extractvalue { i8*, void (i8*)* } %quux, 1
%5 = extractvalue { i8*, void (i8*)* } zeroinitializer, 1
%6 = icmp eq void (i8*)* %4, %5
%7 = and i1 %3, %6
%8 = xor i1 %7, -1
ret i1 %8
}
define internal void @class.my.pack.MyClass.main.0(i8* %this) {
call void @class.my.pack.MyClass.static.0(i8* undef)
%1 = call i1 @class.my.pack.MyClass.bar.4154394454(i8* undef, { i8*, void (i8*)* } zeroinitializer)
ret void
}
define i32 @main(i32 %argc, i8** %argv) {
%1 = call %class.aqua.std.Array.0.1aqua.std.String.2* @aqua_init(i32 %argc, i8** %argv)
call void @class.my.pack.MyClass.main.0(i8* undef)
call void @aqua_exit(i32 0)
unreachable
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment