void JavaLLVMCompiler::resolveVirtualClass(Class* cl) { // Lock here because we may be called by a class resolver vmkit::VmkitModule::protectIR(); LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl); LCI->getVirtualType(); vmkit::VmkitModule::unprotectIR(); }
Type* LLVMClassInfo::getVirtualType() { if (!virtualType) { std::vector<llvm::Type*> fields; const TargetData* targetData = Compiler->TheTargetData; const StructLayout* sl = 0; StructType* structType = 0; LLVMContext& context = Compiler->getLLVMModule()->getContext(); if (classDef->super) { LLVMClassInfo* CLI = Compiler->getClassInfo(classDef->super); llvm::Type* Ty = CLI->getVirtualType()->getContainedType(0); fields.push_back(Ty); for (uint32 i = 0; i < classDef->nbVirtualFields; ++i) { JavaField& field = classDef->virtualFields[i]; Typedef* type = field.getSignature(); LLVMAssessorInfo& LAI = Compiler->getTypedefInfo(type); fields.push_back(LAI.llvmType); } structType = StructType::get(context, fields, false); virtualType = PointerType::getUnqual(structType); sl = targetData->getStructLayout(structType); } else { virtualType = Compiler->getIntrinsics()->JavaObjectType; assert(virtualType && "intrinsics not initalized"); structType = dyn_cast<StructType>(virtualType->getContainedType(0)); sl = targetData->getStructLayout(structType); } uint64 size = targetData->getTypeAllocSize(structType); virtualSizeConstant = ConstantInt::get(Type::getInt32Ty(context), size); // TODO: put that elsewhere. // The class is resolved if it was precompiled. if ((!classDef->isResolved() || Compiler->isStaticCompiling()) && Compiler == classDef->classLoader->getCompiler()) { for (uint32 i = 0; i < classDef->nbVirtualFields; ++i) { JavaField& field = classDef->virtualFields[i]; field.ptrOffset = sl->getElementOffset(i + 1); field.num = i + 1; } classDef->virtualSize = (uint32)size; classDef->alignment = sl->getAlignment(); Compiler->makeVT(classDef); Compiler->makeIMT(classDef); } } return virtualType; }