Skip to content

Commit

Permalink
Merge branch 'Dan12-reflection_additions'
Browse files Browse the repository at this point in the history
  • Loading branch information
dz333 committed Oct 30, 2018
2 parents 4bae550 + 68a87d3 commit f70a16e
Show file tree
Hide file tree
Showing 26 changed files with 781 additions and 163 deletions.
26 changes: 0 additions & 26 deletions .idea/inspectionProfiles/Project_Default.xml

This file was deleted.

59 changes: 51 additions & 8 deletions compiler/src/jlang/extension/JLangClassDeclExt.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ public Node leaveTranslateLLVM(LLVMTranslator v) {
return super.leaveTranslateLLVM(v);
}

private static LLVMValueRef getTypePointer(LLVMTranslator v, Type t) {
Type erasedType = v.utils.erasureLL(t);
if (erasedType.isPrimitive()) {
LLVMValueRef primPtr = v.utils.getGlobal("Polyglot_native_"+erasedType.toString(), v.utils.toLL(v.ts.Class()));
return v.utils.buildCastToBytePtr(primPtr);
} else {
return v.utils.buildCastToBytePtr(v.utils.getClassObjectGlobal(erasedType.toClass()));
}
}

/**
* Builds a function that runs static initializers, and
* creates the java.lang.Class object representing this class.
Expand All @@ -43,6 +53,8 @@ public Node leaveTranslateLLVM(LLVMTranslator v) {
*/
public static void buildClassLoadingFunc(LLVMTranslator v, ClassType ct, ClassBody cb) {

// System.out.println("building class loading function for "+ct);

// Declare class object.
LLVMTypeRef classType = v.utils.toLL(v.ts.Class());
LLVMValueRef classObjectGlobal = v.utils.getClassObjectGlobal(ct);
Expand All @@ -51,23 +63,31 @@ public static void buildClassLoadingFunc(LLVMTranslator v, ClassType ct, ClassBo
// Instance field info.
LLVMTypeRef fieldInfoType = v.utils.structType(
v.utils.i8Ptr(), // char* name
v.utils.i32() // int32_t offset
v.utils.i32(), // int32_t offset
v.utils.i32(), // int32_t modifiers
v.utils.i8Ptr(), // jclass* type_ptr
v.utils.i8Ptr() // char* sig
);
LLVMValueRef[] fieldInfoElems = ct.fields().stream().filter(fi -> !fi.flags().isStatic())
.map(fi -> {
.map(fi -> {
LLVMValueRef name = v.utils.buildGlobalCStr(fi.name());
LLVMValueRef nullPtr = LLVMConstNull(v.utils.toLL(ct));
LLVMValueRef gep = v.obj.buildFieldElementPtr(nullPtr, fi);
LLVMValueRef offset = LLVMConstPtrToInt(gep, v.utils.i32());
return v.utils.buildConstStruct(name, offset);
LLVMValueRef modifiers = LLVMConstInt(v.utils.i32(), fi.flags().toModifiers(), 1);
LLVMValueRef typeClass = getTypePointer(v, fi.type());
LLVMValueRef signature = v.utils.buildGlobalCStr(v.mangler.jniUnescapedSignature(fi.type()));
return v.utils.buildConstStruct(name, offset, modifiers, typeClass, signature);
})
.toArray(LLVMValueRef[]::new);

// Static field info.
LLVMTypeRef staticFieldType = v.utils.structType(
v.utils.i8Ptr(), // char* name
v.utils.i8Ptr(), // char* sig (field type)
v.utils.i8Ptr() // void* to field, stored as global var
v.utils.i8Ptr(), // void* to field, stored as global var
v.utils.i32(), // int32_t modifiers
v.utils.i8Ptr() // jclass* type_ptr
);

LLVMValueRef[] staticFieldElems = ct.fields().stream().filter(fi -> fi.flags().isStatic())
Expand All @@ -76,7 +96,9 @@ public static void buildClassLoadingFunc(LLVMTranslator v, ClassType ct, ClassBo
LLVMValueRef signature = v.utils.buildGlobalCStr(v.mangler.jniUnescapedSignature(fi.type()));
LLVMValueRef ptr = v.utils.getStaticField(fi);
LLVMValueRef staticPtr = LLVMConstBitCast(ptr, v.utils.i8Ptr());
return v.utils.buildConstStruct(name, signature, staticPtr);
LLVMValueRef modifiers = LLVMConstInt(v.utils.i32(), fi.flags().toModifiers(), 1);
LLVMValueRef typeClass = getTypePointer(v, fi.type());
return v.utils.buildConstStruct(name, signature, staticPtr, modifiers, typeClass);
})
.toArray(LLVMValueRef[]::new);

Expand All @@ -88,13 +110,15 @@ public static void buildClassLoadingFunc(LLVMTranslator v, ClassType ct, ClassBo
v.utils.i8Ptr(), // void* function pointer
v.utils.i8Ptr() , // void* trampoline pointer
v.utils.i8Ptr(), // void* for interface methods, the interface method id.
v.utils.i32() // int32_t A precomputed hash of the intf_id.
v.utils.i32(), // int32_t A precomputed hash of the intf_id.
v.utils.i32(), // modifiers
v.utils.i8Ptr() // return type
);
LLVMValueRef[] methodInfoElems = Stream.concat(
ct.methods().stream(), ct.constructors().stream())
.map(pi -> buildMethodInfo(v, ct, pi))
.toArray(LLVMValueRef[]::new);

//Info about implemented interfaces. Needed by runtime reflection
LLVMValueRef[] interfaceInfoElems = v.allInterfaces(ct).stream()
.map(intf -> v.utils.getClassObjectGlobal(intf))
Expand Down Expand Up @@ -228,6 +252,8 @@ public static void buildClassLoadingFunc(LLVMTranslator v, ClassType ct, ClassBo
funcName, debugName,
v.ts.Class(), Collections.emptyList(),
buildBody);

// System.out.println("done building class loading function");
}

/**
Expand Down Expand Up @@ -279,7 +305,24 @@ protected static LLVMValueRef buildMethodInfo(
v.mangler.procJniTrampoline(pi), v.utils.toLLTrampoline(pi));
LLVMValueRef trampolineCast = LLVMConstBitCast(trampoline, v.utils.i8Ptr());

return v.utils.buildConstStruct(name, sig, offset, fnPtrCast, trampolineCast, intfPtr, hash);
LLVMValueRef modifiers = LLVMConstInt(v.utils.i32(), pi.flags().toModifiers(), 1);

LLVMValueRef returnType;

// System.out.println("CI: "+ci.toString());returnType
// for(Type t : ci.formalTypes()) {
// System.out.println(t);
// }

if (pi instanceof ConstructorInstance) {
ConstructorInstance ci = (ConstructorInstance) pi;
returnType = getTypePointer(v, ci.container());
} else {
MethodInstance mi = (MethodInstance) pi;
returnType = getTypePointer(v, mi.returnType());
}

return v.utils.buildConstStruct(name, sig, offset, fnPtrCast, trampolineCast, intfPtr, hash, modifiers, returnType);
}

@SuppressWarnings("WeakerAccess")
Expand Down
6 changes: 6 additions & 0 deletions compiler/src/jlang/extension/JLangStringLitExt.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import jlang.ast.JLangExt;
import jlang.visit.LLVMTranslator;

import static jlang.util.Constants.INTERN_STRING_FUNC;
import static org.bytedeco.javacpp.LLVM.*;

public class JLangStringLitExt extends JLangExt {
Expand Down Expand Up @@ -58,6 +59,11 @@ public Node leaveTranslateLLVM(LLVMTranslator v) {
LLVMSetLinkage(stringVar, LLVMLinkOnceODRLinkage);
LLVMSetInitializer(stringVar, string);

LLVMTypeRef internStringFuncType = v.utils.functionType(v.utils.voidType(), LLVMTypeOf(stringVar));
LLVMValueRef internString = v.utils.getFunction(INTERN_STRING_FUNC, internStringFuncType);
v.utils.buildProcCall(internString, stringVar);


v.addTranslation(n,LLVMConstBitCast(stringVar, v.utils.toLL(n.type())));
return super.leaveTranslateLLVM(v);
}
Expand Down
1 change: 1 addition & 0 deletions compiler/src/jlang/util/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public class Constants {
public static final int CTOR_METHOD_INFO_OFFSET = -2;
public static final int STATIC_METHOD_INFO_OFFSET = -1;
public static final String REGISTER_CLASS_FUNC = "RegisterJavaClass";
public static final String INTERN_STRING_FUNC = "InternStringLit";
public static final String GET_NATIVE_FUNC = "GetJavaNativeFunc";
public static final String PERSONALITY_FUNC = "__java_personality_v0";
public static final String CREATE_EXCEPTION = "createUnwindException";
Expand Down
1 change: 1 addition & 0 deletions runtime/linux_version.map
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SUNWprivate_1.1 {
jio*;
Java_sun_misc_Unsafe*;
RegisterJavaClass; #TODO rename all of the functions called from JLang-compiled code to have same prefix
InternStringLit;
GetJavaNativeFunc; #Then we can just export PREFIX*
createUnwindException;
extractJavaExceptionObject;
Expand Down
Loading

0 comments on commit f70a16e

Please sign in to comment.