[vmkit-commits] [vmkit] r137022 - in /vmkit/trunk/lib: J3/VMCore/JavaClass.cpp J3/VMCore/JavaClass.h J3/VMCore/Jnjvm.cpp J3/VMCore/JnjvmClassLoader.h J3/VMCore/Precompiled.cpp Mvm/StaticGCPrinter/VmkitGCPrinter.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sat Aug 6 11:17:11 PDT 2011
Author: geoffray
Date: Sat Aug 6 13:17:11 2011
New Revision: 137022
URL: http://llvm.org/viewvc/llvm-project?rev=137022&view=rev
Log:
No need to read the frames when reading precompiled methods: the JavaMethod metadata is already encoded.
Modified:
vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.h
vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sat Aug 6 13:17:11 2011
@@ -1737,15 +1737,6 @@
}
-void JavaMethod::updateFrames() {
- mvm::FrameIterator iterator(*frames);
-
- while (iterator.hasNext()) {
- mvm::FrameInfo* frame = iterator.next();
- frame->Metadata = this;
- }
-}
-
void Class::acquire() {
JavaObject* delegatee = NULL;
llvm_gcroot(delegatee, 0);
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sat Aug 6 13:17:11 2011
@@ -902,10 +902,6 @@
///
uint32 offset;
- /// updateFrames - Set the meta information on frames.
- ///
- void updateFrames();
-
/// lookupAttribut - Look up an attribut in the method's attributs. Returns
/// null if the attribut is not found.
///
Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Sat Aug 6 13:17:11 2011
@@ -1326,8 +1326,6 @@
bootstrapLoader = loader;
upcalls = bootstrapLoader->upcalls;
throwable = upcalls->newThrowable;
-
- Precompiled::ReadFrames(this, this->bootstrapLoader);
}
Jnjvm::~Jnjvm() {
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Sat Aug 6 13:17:11 2011
@@ -426,7 +426,6 @@
class Precompiled {
public:
static bool Init(JnjvmBootstrapLoader* loader);
- static void ReadFrames(Jnjvm* vm, JnjvmClassLoader* loader);
};
/// VMClassLoader - The vmdata object that will be placed in and will only
Modified: vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Precompiled.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Precompiled.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Precompiled.cpp Sat Aug 6 13:17:11 2011
@@ -121,29 +121,6 @@
}
-void Precompiled::ReadFrames(Jnjvm* vm, JnjvmClassLoader* loader) {
- for (ClassMap::iterator i = loader->getClasses()->map.begin(),
- e = loader->getClasses()->map.end(); i != e; ++i) {
- CommonClass* cl = i->second;
- if (cl->isClass()) {
- Class* C = cl->asClass();
- for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
- JavaMethod& meth = C->virtualMethods[i];
- if (meth.code != NULL) {
- meth.updateFrames();
- }
- }
-
- for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
- JavaMethod& meth = C->staticMethods[i];
- if (meth.code != NULL) {
- meth.updateFrames();
- }
- }
- }
- }
-}
-
bool Precompiled::Init(JnjvmBootstrapLoader* loader) {
Class* javaLangObject = (Class*)dlsym(SELF_HANDLE, "java_lang_Object");
void* nativeHandle = SELF_HANDLE;
Modified: vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp (original)
+++ vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp Sat Aug 6 13:17:11 2011
@@ -7,6 +7,9 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Type.h"
#include "llvm/CodeGen/GCs.h"
#include "llvm/CodeGen/GCStrategy.h"
#include "llvm/CodeGen/AsmPrinter.h"
@@ -24,7 +27,9 @@
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FormattedStream.h"
+#include "llvm/Support/raw_ostream.h"
#include <cctype>
+#include <cstdio>
using namespace llvm;
@@ -112,6 +117,37 @@
AP.OutStreamer.EmitLabel(Sym);
}
+Constant* FindMetadata(const Function& F) {
+ LLVMContext& context = F.getParent()->getContext();
+ for (Value::const_use_iterator I = F.use_begin(), E = F.use_end(); I != E; ++I) {
+ if (const Constant* C = dyn_cast<Constant>(*I)) {
+ if (PointerType* PTy = dyn_cast<PointerType>(C->getType())) {
+ if (isa<IntegerType>(PTy->getContainedType(0))) {
+ // We have found the bitcast constant that casts the method in a i8*
+ for (Value::const_use_iterator CI = C->use_begin(), CE = C->use_end(); CI != CE; ++CI) {
+ if (StructType* STy = dyn_cast<StructType>((*CI)->getType())) {
+ if (STy->getName().equals("JavaMethod")) {
+ const Constant* Method = dyn_cast<Constant>(*CI);
+ const Constant* Array = dyn_cast<Constant>(*((*CI)->use_begin()));
+ Constant* VirtualMethods = dyn_cast<Constant>(const_cast<User*>((*(Array->use_begin()))));
+ uint32_t index = 0;
+ for (; index < Array->getNumOperands(); index++) {
+ if (Array->getOperand(index) == Method) break;
+ }
+ assert(index != Array->getNumOperands());
+ Constant* GEPs[2] = { ConstantInt::get(Type::getInt32Ty(context), 0),
+ ConstantInt::get(Type::getInt32Ty(context), index) };
+ return ConstantExpr::getGetElementPtr(VirtualMethods, GEPs, 2);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return NULL;
+}
+
/// emitAssembly - Print the frametable. The ocaml frametable format is thus:
///
/// extern "C" struct align(sizeof(intptr_t)) {
@@ -146,6 +182,8 @@
for (iterator I = begin(), IE = end(); I != IE; ++I) {
GCFunctionInfo &FI = **I;
+ Constant* Metadata = FindMetadata(FI.getFunction());
+
// Emit the frame symbol
SmallString<128> TmpStr;
AP.Mang->getNameWithPrefix(TmpStr, FI.getFunction().getName() + "_frame");
@@ -189,11 +227,16 @@
DebugLoc DL = J->Loc;
uint32_t sourceIndex = DL.getLine();
- // Metada
- AP.EmitInt32(0);
- if (IntPtrSize == 8) {
+ // Metadata
+ if (Metadata != NULL) {
+ AP.EmitGlobalConstant(Metadata);
+ } else {
AP.EmitInt32(0);
+ if (IntPtrSize == 8) {
+ AP.EmitInt32(0);
+ }
}
+
// Return address
AP.OutStreamer.EmitSymbolValue(J->Label, IntPtrSize, 0);
AP.EmitInt16(sourceIndex);
More information about the vmkit-commits
mailing list