You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by mf...@apache.org on 2008/02/01 15:43:12 UTC
svn commit: r617509 - in /harmony/enhanced/drlvm/trunk/vm: jitrino/src/jet/
jitrino/src/optimizer/ jitrino/src/translator/java/ vmcore/build/
vmcore/include/ vmcore/src/kernel_classes/javasrc/java/lang/
vmcore/src/kernel_classes/javasrc/org/apache/harm...
Author: mfursov
Date: Fri Feb 1 06:43:01 2008
New Revision: 617509
URL: http://svn.apache.org/viewvc?rev=617509&view=rev
Log:
Fix for HARMONY-5409 [drlvm][opt] Object.getClass() VMMagic based implementation
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/build/vmcore.exp
harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.h
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp
harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/jet/cg_meth.cpp Fri Feb 1 06:43:01 2008
@@ -848,6 +848,7 @@
mov(cs_vtbl.get(0), thiz.as_opnd());
}
gen_call_vm(cs_vtbl, rt_helper_get_vtable, 1, klass);
+
//
// Method's vtable is in gr_ret now, prepare stack
//
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/FlowGraph.cpp Fri Feb 1 06:43:01 2008
@@ -35,6 +35,7 @@
#include "deadcodeeliminator.h"
#include "TranslatorIntfc.h"
#include "LoopTree.h"
+#include "inliner.h"
#include <stdlib.h>
#include <string.h>
@@ -1158,6 +1159,7 @@
}
}
}
+
// Remove extra PseudoThrow insts
if (irm.getOptimizerFlags().rept_aggressive) {
DeadCodeEliminator dce(irm);
@@ -1166,19 +1168,29 @@
normalizePseudoThrow(irm);
}
+
+ //process all methods marked with @Inline pragma
+ if (Log::isLogEnabled(LogStream::IRDUMP)) {
+ LogStream& irdump = Log::log(LogStream::IRDUMP);
+ Log::printIRDumpBegin(irdump.out(), id, stage, "before_pragma_inline");
+ printHIR(irdump.out(), irm.getFlowGraph(), irm.getMethodDesc());
+ Log::printIRDumpEnd(irdump.out(), id, stage, "before_pragma_inline");
+ }
+ Inliner::processInlinePragmas(irm);
+
+
//
// a quick cleanup of unreachable and empty basic blocks
//
fg.purgeUnreachableNodes();
fg.purgeEmptyNodes(false);
-
+
if (Log::isLogEnabled(LogStream::IRDUMP)) {
LogStream& irdump = Log::log(LogStream::IRDUMP);
Log::printStageEnd(irdump.out(), id, "TRANS", stage, stage);
}
-}
-
+}
void FlowGraph::printHIR(std::ostream& os, ControlFlowGraph& fg, MethodDesc& methodDesc) {
const char* methodName = methodDesc.getName();
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp Fri Feb 1 06:43:01 2008
@@ -341,6 +341,7 @@
break;
case Op_Conv: // conv
+ case Op_ConvUnmanaged:
if (inst->getDst()->getType()->isObject()) {
type=inst->getDst()->getType();
assert(findCnGNode_op(inst->getDst()->getId())==NULL);
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.cpp Fri Feb 1 06:43:01 2008
@@ -67,8 +67,6 @@
#define INLINE_EXACT_ALL_BONUS 0
#define INLINE_SKIP_EXCEPTION_PATH false
-#define PRAGMA_INLINE_BENEFIT (2*1000*1000*1000)
-
DEFINE_SESSION_ACTION(InlinePass, inline, "Method Inlining");
Inliner::Inliner(SessionAction* argSource, MemoryManager& mm, IRManager& irm,
@@ -80,7 +78,7 @@
_inlineCandidates(mm), _initByteSize(irm.getMethodDesc().getByteCodeSize()),
_currentByteSize(irm.getMethodDesc().getByteCodeSize()),
_inlineTree(new (mm) InlineNode(irm, 0, 0)),
- translatorAction(NULL), inlinePragma(NULL),
+ translatorAction(NULL),
usePriorityQueue(_usePriorityQueue), inlinerPipelineName(inlinePipeline),
connectEarly(true), isPseudoThrowInserted(false)
{
@@ -158,9 +156,6 @@
}
_usesOptimisticBalancedSync = argSource->getBoolArg("sync_optimistic", false) ? argSource->getBoolArg("sync_optcatch", true) : false;
-
- // Avoid class resolution during compilation. VMMagic package should be loaded & resolved at start up.
- inlinePragma = irm.getCompilationInterface().findClassUsingBootstrapClassloader(PRAGMA_INLINE_TYPE_NAME);
}
int32
@@ -173,11 +168,6 @@
<< methodDesc.getParentType()->getName()
<< "." << methodDesc.getName() << ::std::endl;
}
- if (inlinePragma!=NULL && methodDesc.hasAnnotation(inlinePragma)) {
- //methods marked with inline pragma processed separately and are always inlined
- //regardless of it benefits and size limitations.
- assert(0);
- }
if (_inlineBonusMethodTable!=NULL && _inlineBonusMethodTable->accept_this_method(methodDesc)) {
benefit+=1000;
if (Log::isEnabled()) {
@@ -834,7 +824,7 @@
scaleBlockCounts(callNode, inlinedIRM);
}
- // Update priority queue with calls in this region and check @Inline pragmas
+ // Update priority queue with calls in this region
processRegion(inlineNode, dtree, ltree);
// If top level flowgraph
@@ -916,7 +906,6 @@
call = ((Inst*)callNode->getLastInst())->asMethodCallInst();
assert(call != NULL);
methodDesc = call->getMethodDesc();
- bool isPragmaInline = inlinePragma != NULL && methodDesc->hasAnnotation(inlinePragma);;
// If candidate would cause top level method to exceed size threshold, throw away.
@@ -924,7 +913,7 @@
methodByteSize = (methodByteSize <= CALL_COST) ? 1 : methodByteSize-CALL_COST;
newByteSize = _currentByteSize + methodByteSize;
double factor = ((double) newByteSize) / ((double) _initByteSize);
- if(isPragmaInline || newByteSize < _minInlineStop || factor <= _maxInlineGrowthFactor || (methodByteSize < _inlineSmallMaxByteSize)) {
+ if(newByteSize < _minInlineStop || factor <= _maxInlineGrowthFactor || (methodByteSize < _inlineSmallMaxByteSize)) {
found = true;
} else {
Log::out() << "Skip inlining " << methodDesc->getParentType()->getName() << "." << methodDesc->getName() << ::std::endl;
@@ -959,9 +948,7 @@
InlineNode* Inliner::createInlineNode(CompilationContext& inlineCC, MethodCallInst* call) {
MethodDesc *methodDesc = call->getMethodDesc();
IRManager* inlinedIRM = new (_tmpMM) IRManager(_tmpMM, _toplevelIRM, *methodDesc, NULL);
- // Augment inline tree
- bool forceInline = inlinePragma != NULL && methodDesc->hasAnnotation(inlinePragma);
- InlineNode *inlineNode = new (_tmpMM) InlineNode(*inlinedIRM, call, call->getNode(), forceInline);
+ InlineNode *inlineNode = new (_tmpMM) InlineNode(*inlinedIRM, call, call->getNode(), false);
inlineCC.setHIRManager(inlinedIRM);
@@ -998,19 +985,12 @@
MethodDesc* methodDesc = call->getMethodDesc();
Log::out() << "Considering inlining instruction I" << (int)call->getId() << ::std::endl;
- if (inlinePragma != NULL && methodDesc->hasAnnotation(inlinePragma)) {
- assert(!methodDesc->isSynchronized()); //not tested!
- if (Log::isEnabled()) {
- Log::out()<<"Found Inline pragma, adding to the queue:";call->print(Log::out());Log::out()<<std::endl;
- }
- _inlineCandidates.push(CallSite(PRAGMA_INLINE_BENEFIT, node, inlineNode));
- } else if (usePriorityQueue && canInlineInto(*methodDesc)) {
+ if (usePriorityQueue && canInlineInto(*methodDesc)) {
uint32 size = methodDesc->getByteCodeSize();
int32 benefit = computeInlineBenefit(node, *methodDesc, inlineNode, ltree->getLoopDepth(node));
assert(size > 0);
Log::out() << "Inline benefit " << methodDesc->getParentType()->getName() << "." << methodDesc->getName() << " == " << (int) benefit << ::std::endl;
if(0 < size && benefit > _minBenefitThreshold) {
- assert(benefit < PRAGMA_INLINE_BENEFIT);
// Inline candidate
Log::out() << "Add to queue" << std::endl;
_inlineCandidates.push(CallSite(benefit, node, inlineNode));
@@ -1173,20 +1153,22 @@
}
//inline current region
inlineRegion(regionNode);
- // Limit inlining by node count. All @Inline methods still must be inlined.
- if (!regionNode->isForced() && _toplevelIRM.getFlowGraph().getNodeCount() > _inlineMaxNodeThreshold) {
+ // Limit inlining by node count.
+ if (_toplevelIRM.getFlowGraph().getNodeCount() > _inlineMaxNodeThreshold) {
break;
}
} while (true);
// Clean up phase.
- DeadCodeEliminator dce(_toplevelIRM);
- dce.eliminateUnreachableCode();
- assert(_toplevelIRM.getInSsa());
- OptPass::fixupSsa(_toplevelIRM);
- if (isPseudoThrowInserted && _toplevelIRM.getOptimizerFlags().rept_aggressive) {
- dce.removeExtraPseudoThrow();
+ if (_toplevelIRM.getInSsa()) {
+ DeadCodeEliminator dce(_toplevelIRM);
+ dce.eliminateUnreachableCode();
+ assert(_toplevelIRM.getInSsa());
+ OptPass::fixupSsa(_toplevelIRM);
+ if (isPseudoThrowInserted && _toplevelIRM.getOptimizerFlags().rept_aggressive) {
+ dce.removeExtraPseudoThrow();
+ }
}
}
@@ -1202,10 +1184,12 @@
}
// Optimize inlined region before splicing
- CompilationContext* topCC = regionManager.getCompilationContext();
- inlineCC.stageId = topCC->stageId;
- Inliner::runInlinerPipeline(inlineCC, inlinerPipelineName);
- topCC->stageId = inlineCC.stageId;
+ if (inlinerPipelineName!=NULL) {
+ CompilationContext* topCC = regionManager.getCompilationContext();
+ inlineCC.stageId = topCC->stageId;
+ Inliner::runInlinerPipeline(inlineCC, inlinerPipelineName);
+ topCC->stageId = inlineCC.stageId;
+ }
// Splice into flow graph and find next region.
if(!connectEarly) {
@@ -1213,6 +1197,46 @@
}
OptPass::computeDominatorsAndLoops(regionManager);
}
+}
+
+void Inliner::processInlinePragmas(IRManager& irm) {
+ // VMMagic package should be loaded & resolved at start up.
+ NamedType* inlinePragma = irm.getCompilationInterface().findClassUsingBootstrapClassloader(PRAGMA_INLINE_TYPE_NAME);
+ if (inlinePragma == NULL) {
+ if (Log::isEnabled()) {
+ Log::out()<<"@Inline is not resolved. Skipping @Inline check."<<std::endl;
+ }
+ return; //pragma inline is not resolved -> nothing to check
+ }
+
+ MemoryManager tmpMM("processInlinePragmas");
+ Inliner inliner(irm.getCompilationContext()->getCurrentSessionAction(), tmpMM, irm, false, false, NULL);
+ StlVector<MethodCallInst*> callsToInline(tmpMM);
+
+ //find all methods with @Inline
+ const Nodes& nodes = irm.getFlowGraph().getNodes();
+ for (Nodes::const_iterator it = nodes.begin(), end = nodes.end(); it!=end; ++it) {
+ Node* node = *it;
+ for (Inst* inst = (Inst*)node->getFirstInst(); inst!=NULL; inst = inst->getNextInst()) {
+ if (!inst->isMethodCall()) {
+ continue;
+ }
+ MethodCallInst* mci = inst->asMethodCallInst();
+ MethodDesc* md = mci->getMethodDesc();
+ if (md != NULL && md->hasAnnotation(inlinePragma)) {
+ callsToInline.push_back(mci);
+ if (Log::isEnabled()) {
+ Log::out()<<"found @Inline :";mci->print(Log::out()); Log::out()<<std::endl;
+ }
+ }
+ }
+ }
+
+ //now inline all all @Inline methods found
+ for(StlVector<MethodCallInst*>::const_iterator it = callsToInline.begin(), end = callsToInline.end(); it!=end; ++it) {
+ MethodCallInst* call = *it;
+ inliner.runInliner(call);
+ }
}
void InlinePass::_run(IRManager& irm) {
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/inliner.h Fri Feb 1 06:43:01 2008
@@ -60,21 +60,19 @@
class InlineNode : public TreeNode {
public:
InlineNode(IRManager& irm, Inst *callInst, Node *callNode, bool forced = false)
- : _irm(irm), _callInst(callInst), _callNode(callNode), _forceInline(forced) {}
+ : _irm(irm), _callInst(callInst), _callNode(callNode) {}
InlineNode* getChild() {return (InlineNode*) child;}
InlineNode* getSiblings() {return (InlineNode*) siblings;}
InlineNode* getParent() {return (InlineNode*) parent;}
IRManager& getIRManager() { return _irm; }
Inst* getCallInst() { return _callInst; }
Node* getCallNode() { return _callNode; }
- bool isForced() { return _forceInline; }
void print(::std::ostream& os);
void printTag(::std::ostream& os);
private:
IRManager& _irm;
Inst* _callInst;
Node* _callNode;
- bool _forceInline;
};
class InlineTree : public Tree {
@@ -125,6 +123,11 @@
void setConnectEarly(bool early) {connectEarly = early;}
+ /** Inlines all methods annotated with @Inline.
+ Does not run any pipeline for inlined methods
+ */
+ static void processInlinePragmas(IRManager& irm);
+
private:
class CallSite {
@@ -206,7 +209,6 @@
bool isBCmapRequired;
void* bc2HIRMapHandler;
TranslatorAction* translatorAction;
- NamedType* inlinePragma;
bool usePriorityQueue;
const char* inlinerPipelineName;
bool connectEarly;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/translator/java/JavaByteCodeTranslator.cpp Fri Feb 1 06:43:01 2008
@@ -2325,9 +2325,10 @@
assert(res);
return;
} else if (isVMHelperClass(kname) && !methodDesc->isNative()) {
- UNUSED bool res = genVMHelper(mname, numArgs, srcOpnds, returnType);
- assert(res);
- return;
+ bool res = genVMHelper(mname, numArgs, srcOpnds, returnType);
+ if (res) {
+ return;
+ }
}
Opnd *tauNullChecked = irBuilder.genTauSafe(); // always safe, is a static method call
Type* resType = returnType;
@@ -3714,6 +3715,15 @@
if (!strcmp(mname,"getFastTypeCheckDepth")) {
assert(numArgs == 1 && srcOpnds[0]->getType()->isUnmanagedPtr());
Opnd* res = irBuilder.genJitHelperCall(ClassGetFastCheckDepth, resType, numArgs, srcOpnds);
+ pushOpnd(res);
+ return true;
+ }
+
+ if (!strcmp(mname,"isVMMagicPackageSupported")) {
+ assert(numArgs == 0);
+ ObjectType* base = compilationInterface.findClassUsingBootstrapClassloader(VMHELPER_TYPE_NAME);
+ int ready = base!=NULL && !base->needsInitialization() ? 1 : 0;
+ Opnd* res = irBuilder.genLdConstant((int32)ready);
pushOpnd(res);
return true;
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/build/vmcore.exp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/build/vmcore.exp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/build/vmcore.exp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/build/vmcore.exp Fri Feb 1 06:43:01 2008
@@ -205,7 +205,7 @@
Java_java_lang_System_setErrUnsecure;
Java_java_lang_System_setInUnsecure;
Java_java_lang_System_setOutUnsecure;
- Java_java_lang_VMClassRegistry_getClass;
+ Java_java_lang_VMClassRegistry_getClassNative;
Java_java_lang_VMClassRegistry_getClassLoader0;
Java_java_lang_VMClassRegistry_getComponentType;
Java_java_lang_VMClassRegistry_getDeclaredClasses;
@@ -273,8 +273,6 @@
Java_java_util_concurrent_locks_LockSupport_unpark;
Java_org_apache_harmony_drlvm_thread_ThreadHelper_getThreadIdOffset;
Java_org_apache_harmony_drlvm_thread_ThreadHelper_getLockWordOffset;
- Java_org_apache_harmony_drlvm_VMHelperFastPath_getObjectVtableOffset;
- Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableClassOffset;
Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableIntfTableOffset;
Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableIntfTypeOffset;
Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableSuperclassesOffset;
@@ -283,6 +281,9 @@
Java_org_apache_harmony_drlvm_VMHelper_getPointerTypeSize;
Java_org_apache_harmony_drlvm_VMHelper_isCompressedRefsMode;
Java_org_apache_harmony_drlvm_VMHelper_isCompressedVTableMode;
+ Java_org_apache_harmony_drlvm_VMHelper_getObjectVtableOffset;
+ Java_org_apache_harmony_drlvm_VMHelper_getVtableClassOffset;
+ Java_org_apache_harmony_drlvm_VMHelper_getClassJLCHanldeOffset;
Java_org_apache_harmony_kernel_vm_VM_getClassLoader;
Java_org_apache_harmony_lang_management_ClassLoadingMXBeanImpl_getLoadedClassCountImpl;
Java_org_apache_harmony_lang_management_ClassLoadingMXBeanImpl_getTotalLoadedClassCountImpl;
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/include/Class.h Fri Feb 1 06:43:01 2008
@@ -1168,7 +1168,7 @@
unsigned get_number_of_virtual_method_entries() const {
return m_num_virtual_method_entries;
}
-
+
/** Gets the first subclass for Class Hierarchy Analysis.
* @return The first subclass.*/
Class* get_first_child() const { return m_cha_first_child; }
@@ -1230,6 +1230,13 @@
Class* dummy = NULL;
assert(sizeof(dummy->m_array_element_class) == sizeof(void*));
return (size_t)((char*)(&dummy->m_array_element_class) - (char*)dummy);
+ }
+
+ /** Gets an offset of <code>m_class_handle</code> in the class.
+ * @note It used by VMHelper class*/
+ static size_t get_offset_of_jlc_handle () {
+ Class* dummy=NULL;
+ return (size_t)((char*)(&dummy->m_class_handle) - (char*)dummy);
}
/** Gets the number of array dimensions.
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/java/lang/VMClassRegistry.java Fri Feb 1 06:43:01 2008
@@ -25,6 +25,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
+import org.apache.harmony.drlvm.VMHelper;
/**
@@ -103,7 +104,15 @@
* {@link Object#getClass() Object.getClass()} method.
* @api2vm
*/
- static native Class<? extends Object> getClass(Object obj);
+ static native Class<? extends Object> getClassNative(Object obj);
+
+ static Class<? extends Object> getClass(Object obj) {
+ if (VMHelper.isVMMagicPackageSupported()) {
+ return (Class<? extends Object>)VMHelper.getManagedClass(obj).toObjectReference().toObject();
+ }
+ return getClassNative(obj);
+ }
+
/**
* This method satisfies the requirements of the specification for the
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelper.java Fri Feb 1 06:43:01 2008
@@ -47,20 +47,19 @@
public static final long COMPRESSED_REFS_OBJ_BASE_OFFSET = getCompressedModeObjectBaseOffset();
- public static final int OBJ_VTABLE_OFFSET = 0;
+ public static final int OBJ_VTABLE_OFFSET = getObjectVtableOffset();
public static final int VTABLE_GCPRIVATE_OFFSET = 0;
+ public static final int VTABLE_CLASS_OFFSET = getVtableClassOffset();
+
public static final int OBJ_INFO_OFFSET = 4;
+ public static final int CLASS_JLC_HANDLE_OFFSET = getClassJLCHanldeOffset();
- // Force loading of magic classes.
- static {
- try {
- Class.forName(Inline.class.getName(), true, null);
- } catch (ClassNotFoundException e) {}
- }
+ // preload @Inline vmmagic class
+ static final Class pragmaInline = org.vmmagic.pragma.Inline.class;
//Slow path versions of helpers
@@ -92,6 +91,8 @@
//utility magics supported by JIT
+ public static boolean isVMMagicPackageSupported() {return false;}
+
public static Address getTlsBaseAddress() {fail(); return null;}
public static boolean isArray(Address classHandle) {VMHelper.fail(); return false;}
@@ -129,11 +130,29 @@
}
+ @Inline
+ public static Address getNativeClass(Object obj) {
+ Address nativeClass = getVTable(obj).loadAddress(Offset.fromIntZeroExtend(VTABLE_CLASS_OFFSET));
+ return nativeClass;
+ }
+
+ @Inline
+ public static Address getManagedClass(Object obj) {
+ //accessing to ManagedObject** m_class_handle field + 1 dereference in Class.h
+ Address moAddr = getNativeClass(obj).loadAddress(Offset.fromIntZeroExtend(CLASS_JLC_HANDLE_OFFSET)).loadAddress();
+ return moAddr;
+ }
+
+
+
// private area
private VMHelper() {}
+ /** @return vtable offset in managed object structure */
+ private static native int getObjectVtableOffset();
+
/** @return pointer-type size. 4 or 8 */
private static native int getPointerTypeSize();
@@ -148,6 +167,13 @@
/** @return object base offset if is in compressed-refs mode or -1*/
private static native long getCompressedModeObjectBaseOffset();
+
+ /** @return native Class* struct offset in vtable*/
+ private static native int getVtableClassOffset();
+
+ /** @return managed object field offset in vtable*/
+ private static native int getClassJLCHanldeOffset();
+
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/javasrc/org/apache/harmony/drlvm/VMHelperFastPath.java Fri Feb 1 06:43:01 2008
@@ -24,10 +24,8 @@
import org.vmmagic.unboxed.*;
import org.vmmagic.pragma.*;
-public class VMHelperFastPath {
+class VMHelperFastPath {
- private static final int OBJ_VTABLE_OFFSET = getObjectVtableOffset();
- private static final int VTABLE_CLASS_OFFSET = getVtableClassOffset();
private static final int VTABLE_SUPERCLASSES_OFFSET = getVtableSuperclassesOffset();
private static final int CLASS_INF_TYPE_0_OFFSET = getVtableIntfTypeOffset(0);
private static final int CLASS_INF_TABLE_0_OFFSET = getVtableIntfTableOffset(0);
@@ -38,25 +36,13 @@
private VMHelperFastPath() {}
- @Inline
- public static Address getVTableAddress(Object obj) {
- Address objAddr = ObjectReference.fromObject(obj).toAddress();
- if (VMHelper.COMPRESSED_VTABLE_MODE) {
- int vtableOffset = objAddr.loadInt(Offset.fromIntZeroExtend(OBJ_VTABLE_OFFSET));
- Address res = Address.fromLong(VMHelper.COMPRESSED_VTABLE_BASE_OFFSET + vtableOffset);
- return res;
- }
- return objAddr.loadAddress(Offset.fromIntZeroExtend(OBJ_VTABLE_OFFSET));
-
- }
-
//TODO: leave only one version
//TODO: refactor code to use getVtableIntfTableOffset method (+ avoid extra comparisons while refactoring)
@Inline
public static Address getInterfaceVTable3(Address intfType, Object obj) {
- Address vtableAddr = getVTableAddress(obj);
+ Address vtableAddr = VMHelper.getVTable(obj);
Address inf0Type = vtableAddr.loadAddress(Offset.fromIntZeroExtend(CLASS_INF_TYPE_0_OFFSET));
if (inf0Type.EQ(intfType)) {
@@ -78,7 +64,7 @@
@Inline
public static Address getInterfaceVTable2(Address intfType, Object obj) {
- Address vtableAddr = getVTableAddress(obj);
+ Address vtableAddr = VMHelper.getVTable(obj);
Address inf0Type = vtableAddr.loadAddress(Offset.fromIntZeroExtend(CLASS_INF_TYPE_0_OFFSET));
if (inf0Type.EQ(intfType)) {
@@ -96,7 +82,7 @@
@Inline
public static Address getInterfaceVTable1(Address intfType, Object obj) {
- Address vtableAddr = getVTableAddress(obj);
+ Address vtableAddr = VMHelper.getVTable(obj);
Address inf0Type = vtableAddr.loadAddress(Offset.fromIntZeroExtend(CLASS_INF_TYPE_0_OFFSET));
if (inf0Type.EQ(intfType)) {
@@ -113,7 +99,7 @@
return false;
}
if (VMHelper.isInterface(castType)) {
- Address vtableAddr = getVTableAddress(obj);
+ Address vtableAddr = VMHelper.getVTable(obj);
Address inf0Type = vtableAddr.loadAddress(Offset.fromIntZeroExtend(CLASS_INF_TYPE_0_OFFSET));
if (inf0Type.EQ(castType)) {
@@ -140,7 +126,7 @@
return;
}
if (VMHelper.isInterface(castType)) {
- Address vtableAddr = getVTableAddress(obj);
+ Address vtableAddr = VMHelper.getVTable(obj);
Address inf0Type = vtableAddr.loadAddress(Offset.fromIntZeroExtend(CLASS_INF_TYPE_0_OFFSET));
if (inf0Type.EQ(castType)) {
@@ -162,8 +148,8 @@
@Inline
public static boolean fastClassInstanceOf(Object obj, Address castType, int fastCheckDepth) {
- Address objVtableAddr = getVTableAddress(obj);
- Address objClassType = objVtableAddr.loadAddress(Offset.fromIntZeroExtend(VTABLE_CLASS_OFFSET));
+ Address objVtableAddr = VMHelper.getVTable(obj);
+ Address objClassType = objVtableAddr.loadAddress(Offset.fromIntZeroExtend(VMHelper.VTABLE_CLASS_OFFSET));
if (objClassType.EQ(castType)) {
return true;
@@ -178,9 +164,7 @@
}
- private static native int getObjectVtableOffset();
private static native int getVtableIntfTypeOffset(int n);
private static native int getVtableIntfTableOffset(int n);
- private static native int getVtableClassOffset();
private static native int getVtableSuperclassesOffset();
}
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.cpp Fri Feb 1 06:43:01 2008
@@ -130,7 +130,7 @@
* Method: getClass
* Signature: (Ljava/lang/Object;)Ljava/lang/Class;
*/
-JNIEXPORT jclass JNICALL Java_java_lang_VMClassRegistry_getClass
+JNIEXPORT jclass JNICALL Java_java_lang_VMClassRegistry_getClassNative
(JNIEnv *jenv, jclass, jobject jobj)
{
// use JNI API function
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.h?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/java_lang_VMClassRegistry.h Fri Feb 1 06:43:01 2008
@@ -45,10 +45,10 @@
jstring);
/*
- * Method: java.lang.VMClassRegistry.getClass(Ljava/lang/Object;)Ljava/lang/Class;
+ * Method: java.lang.VMClassRegistry.getClassNative(Ljava/lang/Object;)Ljava/lang/Class;
*/
JNIEXPORT jclass JNICALL
-Java_java_lang_VMClassRegistry_getClass(JNIEnv *, jclass,
+Java_java_lang_VMClassRegistry_getClassNative(JNIEnv *, jclass,
jobject);
/*
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.cpp Fri Feb 1 06:43:01 2008
@@ -59,3 +59,22 @@
return -1;
}
}
+
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getObjectVtableOffset(JNIEnv *e, jclass c)
+{
+ return object_get_vtable_offset();
+}
+
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getClassJLCHanldeOffset(JNIEnv *e, jclass c)
+{
+ return (jint)Class::get_offset_of_jlc_handle();
+}
+
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getVtableClassOffset(JNIEnv *e, jclass c)
+{
+ return static_cast<jint>(reinterpret_cast<jlong>(&((VTable*)0)->clss));
+}
+
+
+
+
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.h?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelper.h Fri Feb 1 06:43:01 2008
@@ -47,6 +47,17 @@
(JNIEnv *, jclass);
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getObjectVtableOffset
+ (JNIEnv *, jclass);
+
+
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getClassJLCHanldeOffset
+ (JNIEnv *, jclass);
+
+JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelper_getVtableClassOffset
+ (JNIEnv *, jclass);
+
+
#ifdef __cplusplus
}
#endif
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.cpp Fri Feb 1 06:43:01 2008
@@ -23,10 +23,6 @@
#include "open/vm.h"
#include <assert.h>
-JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getObjectVtableOffset(JNIEnv *e, jclass c)
-{
- return object_get_vtable_offset();
-}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableIntfTypeOffset(JNIEnv *e, jclass c, jint i)
{
@@ -57,10 +53,6 @@
#endif
}
-JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableClassOffset(JNIEnv *e, jclass c)
-{
- return static_cast<jint>(reinterpret_cast<jlong>(&((VTable*)0)->clss));
-}
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableSuperclassesOffset(JNIEnv *e, jclass c)
{
Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h?rev=617509&r1=617508&r2=617509&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/kernel_classes/native/org_apache_harmony_drlvm_VMHelperFastPath.h Fri Feb 1 06:43:01 2008
@@ -28,13 +28,6 @@
#endif
-/*
- * Class: org_apache_harmony_drlvm_VMHelperFastPath
- * Method: getObjectVtableOffset
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getObjectVtableOffset
- (JNIEnv *, jclass);
/*
* Class: org_apache_harmony_drlvm_VMHelperFastPath
@@ -51,14 +44,6 @@
*/
JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableIntfTableOffset
(JNIEnv *, jclass, jint);
-
-/*
- * Class: org_apache_harmony_drlvm_VMHelperFastPath
- * Method: getVtableClassOffset
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_apache_harmony_drlvm_VMHelperFastPath_getVtableClassOffset
- (JNIEnv *, jclass);
/*
* Class: org_apache_harmony_drlvm_VMHelperFastPath