[strongtalk] r201 committed - Allow profiling of VMSuite

28 views
Skip to first unread message

codesite...@google.com

unread,
Jan 5, 2010, 10:44:43 PM1/5/10
to strongta...@googlegroups.com
Revision: 201
Author: StephenLRees
Date: Tue Jan 5 19:42:06 2010
Log: Allow profiling of VMSuite
http://code.google.com/p/strongtalk/source/detail?r=201

Modified:
/branches/gcc-linux/StrongtalkSource/MacOSXFileDescriptor.dlt
/branches/gcc-linux/StrongtalkSource/MacOSXFilePath.dlt
/branches/gcc-linux/StrongtalkSource/Object.dlt
/branches/gcc-linux/StrongtalkSource/VM.dlt
/branches/gcc-linux/build/Dependencies
/branches/gcc-linux/build/incls/_node.cpp.incl
/branches/gcc-linux/build/includeDB.current
/branches/gcc-linux/tools/strongtalkrc-forInterpretedTests
/branches/gcc-linux/vm/compiler/node.cpp
/branches/gcc-linux/vm/deps/includeDB2
/branches/gcc-linux/vm/memory/allocation.cpp
/branches/gcc-linux/vm/memory/vmSymbols.hpp
/branches/gcc-linux/vm/prims/behavior_prims.cpp
/branches/gcc-linux/vm/prims/block_prims.cpp
/branches/gcc-linux/vm/prims/double_prims.cpp
/branches/gcc-linux/vm/prims/generatedPrimitives.cpp
/branches/gcc-linux/vm/prims/generatedPrimitives.hpp
/branches/gcc-linux/vm/prims/proxy_prims.cpp
/branches/gcc-linux/vm/prims/smi_prims.cpp
/branches/gcc-linux/vm/runtime/os.hpp
/branches/gcc-linux/vm/runtime/os_darwin.cpp
/branches/gcc-linux/vm/runtime/os_linux.cpp
/branches/gcc-linux/vm/runtime/os_nt.cpp

=======================================
--- /branches/gcc-linux/StrongtalkSource/MacOSXFileDescriptor.dlt Sun Aug
9 17:16:11 2009
+++ /branches/gcc-linux/StrongtalkSource/MacOSXFileDescriptor.dlt Tue Jan
5 19:42:06 2010
@@ -26,7 +26,7 @@

| statBuffer <StatBuffer>
status <ExternalProxy> |
- statBuffer := self statBufferClass new.
+ statBuffer := self StatBuffer new.
statBuffer allocate.
[ status := {{<libc ExternalProxy fstat>
name: self handle
@@ -41,6 +41,10 @@
! (Delta mirrorFor: #MacOSXFileDescriptor) methodsFor: 'private' !


+StatBuffer
+
+ ^MacOSXStatBuffer!
+
lseek: handle position: p <Int> whence: whence <Int>
"%todo: support large integer positions for extremely large files"
| padding |
@@ -51,9 +55,5 @@
fd: handle
offsetLow: p
offsetHigh: padding
- whence: whence }}!
-
-statBufferClass
-
- ^MacOSXStatBuffer! !
-
+ whence: whence }}! !
+
=======================================
--- /branches/gcc-linux/StrongtalkSource/MacOSXFilePath.dlt Thu Dec 31
10:59:55 2009
+++ /branches/gcc-linux/StrongtalkSource/MacOSXFilePath.dlt Tue Jan 5
19:42:06 2010
@@ -35,10 +35,6 @@
"%TODO delegate to Platform"
^MacOSXFileDescriptor!

-statBufferClass
-
- ^MacOSXStatBuffer!
-
statName: name buffer: statBuffer

^{{<libc ExternalProxy stat>
=======================================
--- /branches/gcc-linux/StrongtalkSource/Object.dlt Sun Dec 13 16:47:01 2009
+++ /branches/gcc-linux/StrongtalkSource/Object.dlt Tue Jan 5 19:42:06 2010
@@ -59,31 +59,6 @@

"%remove when inlining working:"
^{{self primitiveNew2IfFail: [ :err <Symbol> |]}}
-"
- ^guaranteed <Instance> (super new)
-"!
-
-oldnew ^<Instance>
- "Create and return an initialized instance of this class."
-
- "%remove when inlining working:"
- ^{{self primitiveNewIfFail: [ :err <Symbol> |
- VM scavengeGarbage.
- {{self primitiveNewIfFail: [:err <Symbol> |
- Transcript show: err; cr.
- VM isGCPending
- ifTrue: [VM waitForGC.
- {{self primitiveNewIfFail: [:err <Symbol> |
- VM expand: (VMMirror on: self) instanceSize.
- VM deferredGC.
- {{self primitiveNewIfFail: [:err <Symbol> |
- self error: err]}}]}}]
- ifFalse: [VM expand: (VMMirror on: self) instanceSize.
- VM deferredGC.
- {{self primitiveNewIfFail: [:err <Symbol> |
- self error: err]}}].
- ]}}
- ]}}
"
^guaranteed <Instance> (super new)
"! !
=======================================
--- /branches/gcc-linux/StrongtalkSource/VM.dlt Sun Dec 13 16:47:01 2009
+++ /branches/gcc-linux/StrongtalkSource/VM.dlt Tue Jan 5 19:42:06 2010
@@ -1,5 +1,5 @@
Delta define: #VM as: (
-(Class subclassOf: 'Object' instanceVariables: '')
classVariables: 'GCProcess GCSemaphore ScavengeCount AllocFailureCount') !
+(Class subclassOf: 'Object' instanceVariables: '')
classVariables: 'GCProcess GCSemaphore ScavengeCount AllocFailureCount
Expansions LastCollection') !

(Delta mirrorFor: #VM) revision: '$Revision: 1.5 $'!

@@ -306,6 +306,10 @@
ifFalse: [self collectAndAllocate: allocateBlock
ifExpand: expansionBlock]]!

+canCollect
+
+ ^self canScavenge!
+
canScavenge

^{{primitiveCanScavenge}}!
@@ -330,7 +334,7 @@

collectIfPossible

- self canScavenge
+ self canCollect
ifTrue: [self collectGarbage]!

expand
=======================================
--- /branches/gcc-linux/build/Dependencies Thu Dec 31 11:09:51 2009
+++ /branches/gcc-linux/build/Dependencies Tue Jan 5 19:42:06 2010
@@ -666,7 +666,7 @@
$(VM_PATH)nmethodScopes.cpp $(VM_PATH)_nmethodScopes.cpp.incl
$(VM_PATH)_precompiled $(VM_PATH)compiledPIC.hpp $(VM_PATH)methodKlass.hpp
$(VM_PATH)vmOperations.hpp $(VM_PATH)recompile.hpp
$(VM_PATH)scopeDescRecorder.hpp

node.obj node.i: \
- $(VM_PATH)node.cpp $(VM_PATH)_node.cpp.incl $(VM_PATH)_precompiled
$(VM_PATH)defUse.hpp $(VM_PATH)basicBlock.hpp $(VM_PATH)prim_def.hpp
$(VM_PATH)behavior_prims.hpp $(VM_PATH)expr.hpp $(VM_PATH)loopOpt.hpp
$(VM_PATH)compileTimeClosure.hpp $(VM_PATH)scopeDescRecorder.hpp
$(VM_PATH)preg.hpp $(VM_PATH)bitVector.hpp $(VM_PATH)registerMask.hpp
$(VM_PATH)scope.hpp $(VM_PATH)node.hpp $(VM_PATH)node.inline.hpp
$(VM_PATH)locations.hpp $(VM_PATH)pregMapping.hpp $(VM_PATH)processOop.hpp
$(VM_PATH)vmOperations.hpp $(VM_PATH)recompile.hpp $(VM_PATH)pcDesc.hpp
$(VM_PATH)rscope.hpp $(VM_PATH)smi_prims.hpp $(VM_PATH)split.hpp
+ $(VM_PATH)node.cpp $(VM_PATH)_node.cpp.incl $(VM_PATH)_precompiled
$(VM_PATH)defUse.hpp $(VM_PATH)basicBlock.hpp $(VM_PATH)prim_def.hpp
$(VM_PATH)behavior_prims.hpp $(VM_PATH)expr.hpp
$(VM_PATH)generatedPrimitives.hpp $(VM_PATH)loopOpt.hpp
$(VM_PATH)compileTimeClosure.hpp $(VM_PATH)scopeDescRecorder.hpp
$(VM_PATH)preg.hpp $(VM_PATH)bitVector.hpp $(VM_PATH)registerMask.hpp
$(VM_PATH)scope.hpp $(VM_PATH)node.hpp $(VM_PATH)node.inline.hpp
$(VM_PATH)locations.hpp $(VM_PATH)pregMapping.hpp $(VM_PATH)processOop.hpp
$(VM_PATH)vmOperations.hpp $(VM_PATH)recompile.hpp $(VM_PATH)pcDesc.hpp
$(VM_PATH)rscope.hpp $(VM_PATH)smi_prims.hpp $(VM_PATH)split.hpp

nodeBuilder.obj nodeBuilder.i: \
$(VM_PATH)nodeBuilder.cpp $(VM_PATH)_nodeBuilder.cpp.incl
$(VM_PATH)_precompiled $(VM_PATH)expr.hpp $(VM_PATH)loopOpt.hpp
$(VM_PATH)defUse.hpp $(VM_PATH)basicBlock.hpp
$(VM_PATH)compileTimeClosure.hpp $(VM_PATH)scopeDescRecorder.hpp
$(VM_PATH)preg.hpp $(VM_PATH)bitVector.hpp $(VM_PATH)registerMask.hpp
$(VM_PATH)scope.hpp $(VM_PATH)node.hpp $(VM_PATH)primInliner.hpp
$(VM_PATH)proxyOop.hpp
=======================================
--- /branches/gcc-linux/build/incls/_node.cpp.incl Thu Dec 31 11:02:48 2009
+++ /branches/gcc-linux/build/incls/_node.cpp.incl Tue Jan 5 19:42:06 2010
@@ -3,6 +3,7 @@
# include "prim_def.hpp"
# include "behavior_prims.hpp"
# include "expr.hpp"
+# include "generatedPrimitives.hpp"
# include "loopOpt.hpp"
# include "compileTimeClosure.hpp"
# include "scopeDescRecorder.hpp"
=======================================
--- /branches/gcc-linux/build/includeDB.current Thu Dec 31 11:09:51 2009
+++ /branches/gcc-linux/build/includeDB.current Tue Jan 5 19:42:06 2010
@@ -2015,6 +2015,7 @@
node.cpp codeBuffer.hpp
node.cpp compiler.hpp
node.cpp expr.hpp
+node.cpp generatedPrimitives.hpp
node.cpp key.hpp
node.cpp loopOpt.hpp
node.cpp markOop.hpp
=======================================
--- /branches/gcc-linux/tools/strongtalkrc-forInterpretedTests Sun Aug 9
17:16:11 2009
+++ /branches/gcc-linux/tools/strongtalkrc-forInterpretedTests Tue Jan 5
19:42:06 2010
@@ -1,3 +1,4 @@
++BreakAtWarning
+UseRecompilation
-UseInliningDatabase
+EnableTasks
@@ -35,3 +36,4 @@
JumpTableSize=16384
#JumpTableSize=32768
#JumpTableSize=65536
+ThreadStackSize=1024
=======================================
--- /branches/gcc-linux/vm/compiler/node.cpp Sun Jun 7 11:33:29 2009
+++ /branches/gcc-linux/vm/compiler/node.cpp Tue Jan 5 19:42:06 2010
@@ -928,7 +928,9 @@
// should test arg types to make sure prim won't fail
// for now, treat cloning etc. special
if (_pdesc->can_be_constant_folded()) return true; // not safe!
- if (_pdesc->fn() == fntype(&behaviorPrimitives::allocate) ||
+ //%TODO these references get replaced with generated versions
+ // so these tests will fail - fix this
+ if (_pdesc->fn() == fntype(&behaviorPrimitives::allocate) ||
_pdesc->fn() == fntype(&primitiveNew0) ||
_pdesc->fn() == fntype(&primitiveNew1) ||
_pdesc->fn() == fntype(&primitiveNew2) ||
@@ -2078,11 +2080,11 @@
oop c2 = ((ConstPReg*)_oper)->constant;
oop result;
switch (_op) {
- case tAddArithOp : result = smiOopPrimitives_add(c1, c2); break;
- case tSubArithOp : result = smiOopPrimitives_subtract(c1, c2);
break;
- case tMulArithOp : result = smiOopPrimitives_multiply(c1, c2);
break;
- case tDivArithOp : result = smiOopPrimitives_div(c1, c2); break;
- case tModArithOp : result = smiOopPrimitives_mod(c1, c2); break;
+ case tAddArithOp : result =
GeneratedPrimitives::smiOopPrimitives_add(c1, c2); break;
+ case tSubArithOp : result =
GeneratedPrimitives::smiOopPrimitives_subtract(c1, c2); break;
+ case tMulArithOp : result =
GeneratedPrimitives::smiOopPrimitives_multiply(c1, c2); break;
+ case tDivArithOp : result =
GeneratedPrimitives::smiOopPrimitives_div(c1, c2); break;
+ case tModArithOp : result =
GeneratedPrimitives::smiOopPrimitives_mod(c1, c2); break;
case tAndArithOp : result = smiOopPrimitives::bitAnd(c1, c2); break;
case tOrArithOp : result = smiOopPrimitives::bitOr(c1, c2); break;
case tXOrArithOp : result = smiOopPrimitives::bitXor(c1, c2); break;
=======================================
--- /branches/gcc-linux/vm/deps/includeDB2 Tue Dec 18 15:49:54 2007
+++ /branches/gcc-linux/vm/deps/includeDB2 Tue Jan 5 19:42:06 2010
@@ -434,6 +434,7 @@
node.cpp codeBuffer.hpp
node.cpp compiler.hpp
node.cpp expr.hpp
+node.cpp generatedPrimitives.hpp
node.cpp key.hpp
node.cpp loopOpt.hpp
node.cpp markOop.hpp
=======================================
--- /branches/gcc-linux/vm/memory/allocation.cpp Sun Jun 7 11:33:29 2009
+++ /branches/gcc-linux/vm/memory/allocation.cpp Tue Jan 5 19:42:06 2010
@@ -278,10 +278,95 @@
warning("scavenge in a NoGCVerifier secured function");
}
}
+
+static bool canUseMalloc = true;
+extern "C" void safefree(void* p) {
+ if (!ThreadCritical::initialized()) {
+ free(p);
+ return;
+ }
+
+ {
+ ThreadCritical tc;
+ //__asm {
+ // push ecx;
+ // push eax;
+ // mov ecx, 0;
+ // spinLoop: ;
+ // mfence;
+ // mov eax, 1;
+ // lock cmpxchg canUseMalloc, ecx;
+ // jne spinLoop;
+ // sfence;
+ // pop eax;
+ // pop ecx;
+ //}
+ free(p);
+
+ //canUseMalloc = true;
+ //__asm sfence;
+ }
+}
+
+extern "C" void* safemalloc(int size) {
+ if (!ThreadCritical::initialized()) {
+ return malloc(size);
+ }
+ {
+ ThreadCritical tc;
+ //__asm {
+ // push ecx;
+ // push eax;
+ // mov ecx, 0;
+ // spinLoop: ;
+ // mfence;
+ // mov eax, 1;
+ // lock cmpxchg canUseMalloc, ecx;
+ // jne spinLoop;
+ // sfence;
+ // pop eax;
+ // pop ecx;
+ //}
+
+ void* p = malloc(size);
+
+ //canUseMalloc = true;
+ //__asm sfence;
+ return p;
+ }
+}
+
+extern "C" void* safecalloc(int size, char filler) {
+ if (!ThreadCritical::initialized()) {
+ return calloc(size, filler);
+ }
+ {
+ ThreadCritical tc;
+ //__asm {
+ // push ecx;
+ // push eax;
+ // mov ecx, 0;
+ // spinLoop: ;
+ // mfence;
+ // mov eax, 1;
+ // lock cmpxchg canUseMalloc, ecx;
+ // jne spinLoop;
+ // sfence;
+ // pop eax;
+ // pop ecx;
+ //}
+
+ void* p = calloc(size, filler);
+
+ //canUseMalloc = true;
+ //__asm sfence;
+ return p;
+ }
+}

char* AllocatePageAligned(int size, char* name) {
int page_size = Universe::page_size();
- char* block = (char*)align(malloc(size + page_size), page_size);
+ char* block = (char*)align(safemalloc(size + page_size), page_size);
if (PrintHeapAllocation)
lprintf("Malloc (page-aligned) %s: %d = %#lx\n", name, size, block);
return block;
@@ -290,11 +375,11 @@
char* AllocateHeap(int size, char* name) {
if (PrintHeapAllocation)
lprintf("Heap %7d %s\n", size, name);
- return (char*) malloc(size);
+ return (char*) safemalloc(size);
}

void FreeHeap(void* p) {
- free(p);
+ safefree(p);
}

// The global operator new should never be called since it will usually
indicate
=======================================
--- /branches/gcc-linux/vm/memory/vmSymbols.hpp Sun Sep 13 14:52:44 2009
+++ /branches/gcc-linux/vm/memory/vmSymbols.hpp Tue Jan 5 19:42:06 2010
@@ -155,6 +155,7 @@

template(failed_allocation, "FailedAllocation")
\

template(invalid_klass, "InvalidKlass")
\

template(illegal_state, "IllegalState")
\
+
template(primitive_trap, "PrimitiveTrap")
\
\
/* for compiler's type prediction */ \
template(error, "error") \
=======================================
--- /branches/gcc-linux/vm/prims/behavior_prims.cpp Sat Oct 17 08:33:31 2009
+++ /branches/gcc-linux/vm/prims/behavior_prims.cpp Tue Jan 5 19:42:06 2010
@@ -412,14 +412,14 @@
// empty functions, we'll patch them later
static void trap() { assert(false, "This primitive should be patched"); };

-extern "C" oop primitiveInlineAllocations(oop receiver, oop count) {
trap(); return NULL; };
-extern "C" oop primitiveNew0(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew1(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew2(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew3(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew4(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew5(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew6(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew7(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew8(oop receiver, oop tenured) { trap(); return
NULL; };
-extern "C" oop primitiveNew9(oop receiver, oop tenured) { trap(); return
NULL; };
+extern "C" oop primitiveInlineAllocations(oop receiver, oop count) {
trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew0(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew1(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew2(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew3(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew4(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew5(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew6(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew7(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew8(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop primitiveNew9(oop receiver, oop tenured) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
=======================================
--- /branches/gcc-linux/vm/prims/block_prims.cpp Sun Aug 9 17:16:11 2009
+++ /branches/gcc-linux/vm/prims/block_prims.cpp Tue Jan 5 19:42:06 2010
@@ -169,33 +169,33 @@
// empty functions, we'll patch them later
static void trap() { assert(false, "This primitive should be patched"); };

-extern "C" oop primitiveValue0(oop blk) { trap(); return NULL; }
-extern "C" oop primitiveValue1(oop blk, oop arg1) { trap(); return NULL; }
-extern "C" oop primitiveValue2(oop blk, oop arg1, oop arg2) { trap();
return NULL; }
-extern "C" oop primitiveValue3(oop blk, oop arg1, oop arg2, oop arg3) {
trap(); return NULL; }
-extern "C" oop primitiveValue4(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4) { trap(); return NULL; }
-extern "C" oop primitiveValue5(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5) { trap(); return NULL; }
+extern "C" oop primitiveValue0(oop blk) { trap(); return
markSymbol(vmSymbols::primitive_trap()); }
+extern "C" oop primitiveValue1(oop blk, oop arg1) { trap(); return
markSymbol(vmSymbols::primitive_trap()); }
+extern "C" oop primitiveValue2(oop blk, oop arg1, oop arg2) { trap();
return markSymbol(vmSymbols::primitive_trap()); }
+extern "C" oop primitiveValue3(oop blk, oop arg1, oop arg2, oop arg3) {
trap(); return markSymbol(vmSymbols::primitive_trap()); }
+extern "C" oop primitiveValue4(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4) { trap(); return markSymbol(vmSymbols::primitive_trap()); }
+extern "C" oop primitiveValue5(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5) { trap(); return markSymbol(vmSymbols::primitive_trap()); }
extern "C" oop primitiveValue6(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5,
- oop arg6) { trap(); return NULL; }
+ oop arg6) { trap(); return
markSymbol(vmSymbols::primitive_trap()); }
extern "C" oop primitiveValue7(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5,
- oop arg6, oop arg7) { trap(); return NULL; }
+ oop arg6, oop arg7) { trap(); return
markSymbol(vmSymbols::primitive_trap()); }
extern "C" oop primitiveValue8(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5,
- oop arg6, oop arg7, oop arg8) { trap();
return NULL; }
+ oop arg6, oop arg7, oop arg8) { trap();
return markSymbol(vmSymbols::primitive_trap()); }
extern "C" oop primitiveValue9(oop blk, oop arg1, oop arg2, oop arg3, oop
arg4, oop arg5,
- oop arg6, oop arg7, oop arg8, oop arg9) {
trap(); return NULL; }
-
-extern "C" blockClosureOop allocateBlock0() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock1() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock2() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock3() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock4() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock5() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock6() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock7() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock8() { trap(); return NULL; };
-extern "C" blockClosureOop allocateBlock9() { trap(); return NULL; };
-
-extern "C" contextOop allocateContext(smiOop nofVars) { trap(); return
NULL; };
-extern "C" contextOop allocateContext0() { trap(); return NULL; };
-extern "C" contextOop allocateContext1() { trap(); return NULL; };
-extern "C" contextOop allocateContext2() { trap(); return NULL; };
+ oop arg6, oop arg7, oop arg8, oop arg9) {
trap(); return markSymbol(vmSymbols::primitive_trap()); }
+
+extern "C" blockClosureOop allocateBlock0() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock1() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock2() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock3() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock4() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock5() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock6() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock7() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock8() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" blockClosureOop allocateBlock9() { trap(); return
blockClosureOop(markSymbol(vmSymbols::primitive_trap())); };
+
+extern "C" contextOop allocateContext(smiOop nofVars) { trap(); return
contextOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" contextOop allocateContext0() { trap(); return
contextOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" contextOop allocateContext1() { trap(); return
contextOop(markSymbol(vmSymbols::primitive_trap())); };
+extern "C" contextOop allocateContext2() { trap(); return
contextOop(markSymbol(vmSymbols::primitive_trap())); };
=======================================
--- /branches/gcc-linux/vm/prims/double_prims.cpp Mon Nov 12 14:26:32 2007
+++ /branches/gcc-linux/vm/prims/double_prims.cpp Tue Jan 5 19:42:06 2010
@@ -392,8 +392,8 @@

static void trap() { assert(false, "This primitive should be patched"); };

-extern "C" oop PRIM_API double_subtract(oop receiver, oop argument) {
trap(); return NULL; };
-extern "C" oop PRIM_API double_divide(oop receiver, oop argument) {
trap(); return NULL; };
-extern "C" oop PRIM_API double_add(oop receiver, oop argument) { trap();
return NULL; };
-extern "C" oop PRIM_API double_multiply(oop receiver, oop argument) {
trap(); return NULL; };
-extern "C" oop PRIM_API double_from_smi(oop receiver) { trap(); return
NULL; };
+extern "C" oop PRIM_API double_subtract(oop receiver, oop argument) {
trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API double_divide(oop receiver, oop argument) {
trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API double_add(oop receiver, oop argument) { trap();
return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API double_multiply(oop receiver, oop argument) {
trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API double_from_smi(oop receiver) { trap(); return
markSymbol(vmSymbols::primitive_trap()); };
=======================================
--- /branches/gcc-linux/vm/prims/generatedPrimitives.cpp Thu Dec 31
11:09:51 2009
+++ /branches/gcc-linux/vm/prims/generatedPrimitives.cpp Tue Jan 5
19:42:06 2010
@@ -297,6 +297,32 @@

}

+typedef oop (__stdcall *smiOp)(oop,oop);
+oop GeneratedPrimitives::invoke(char* op, oop receiver, oop argument) {
+ assert(_is_initialized, "Generated primitives have not been
initialized");
+ return ((smiOp) op)(argument, receiver);
+}
+oop GeneratedPrimitives::smiOopPrimitives_add(oop receiver, oop argument) {
+ return invoke(_smiOopPrimitives_add, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_subtract(oop receiver, oop
argument) {
+ return invoke(_smiOopPrimitives_subtract, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_multiply(oop receiver, oop
argument) {
+ return invoke(_smiOopPrimitives_multiply, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_mod(oop receiver, oop argument) {
+ return invoke(_smiOopPrimitives_mod, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_div(oop receiver, oop argument) {
+ return invoke(_smiOopPrimitives_div, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_quo(oop receiver, oop argument) {
+ return invoke(_smiOopPrimitives_quo, receiver, argument);
+}
+oop GeneratedPrimitives::smiOopPrimitives_remainder(oop receiver, oop
argument) {
+ return invoke(_smiOopPrimitives_remainder, receiver, argument);
+}
void generatedPrimitives_init_before_interpreter() {
GeneratedPrimitives::init();
}
=======================================
--- /branches/gcc-linux/vm/prims/generatedPrimitives.hpp Sun Jun 7
15:02:00 2009
+++ /branches/gcc-linux/vm/prims/generatedPrimitives.hpp Tue Jan 5
19:42:06 2010
@@ -117,6 +117,7 @@
// helpers for generation and patch
static char* patch(char* name, char* entry_point);
static char* patch(char* name, char* entry_point, int argument);
+ static oop invoke(char* op, oop receiver, oop argument);
friend class PrimitivesGenerator;

public:
@@ -131,6 +132,15 @@

// Support for profiling
static bool contains(char* pc) { return (_code <= pc) && (pc
< &_code[_code_size]); }
+
+ // Support for compiler constant folding
+ static oop smiOopPrimitives_add(oop receiver, oop argument);
+ static oop smiOopPrimitives_subtract(oop receiver, oop argument);
+ static oop smiOopPrimitives_multiply(oop receiver, oop argument);
+ static oop smiOopPrimitives_mod(oop receiver, oop argument);
+ static oop smiOopPrimitives_div(oop receiver, oop argument);
+ static oop smiOopPrimitives_quo(oop receiver, oop argument);
+ static oop smiOopPrimitives_remainder(oop receiver, oop argument);

static void patch_primitiveValue();
static void init(); // must be called in system initialization phase
=======================================
--- /branches/gcc-linux/vm/prims/proxy_prims.cpp Sun Sep 13 14:52:44 2009
+++ /branches/gcc-linux/vm/prims/proxy_prims.cpp Tue Jan 5 19:42:06 2010
@@ -100,11 +100,14 @@
return proxyOop(receiver)->is_allOnes() ? trueObj : falseObj;
}

+extern "C" void safefree(void*);
+extern "C" void* safemalloc(int);
+extern "C" void* safecalloc(int, char);
PRIM_DECL_2(proxyOopPrimitives::malloc, oop receiver, oop size) {
PROLOGUE_2("malloc", receiver, size);
ASSERT_RECEIVER;
if (!size->is_smi()) return
markSymbol(vmSymbols::first_argument_has_wrong_type());
- proxyOop(receiver)->set_pointer(::malloc(smiOop(size)->value()));
+ proxyOop(receiver)->set_pointer(safemalloc(smiOop(size)->value()));
return receiver;
}

@@ -112,14 +115,13 @@
PROLOGUE_2("calloc", receiver, size);
ASSERT_RECEIVER;
if (!size->is_smi()) return
markSymbol(vmSymbols::first_argument_has_wrong_type());
- proxyOop(receiver)->set_pointer(::calloc(smiOop(size)->value(), 1));
+ proxyOop(receiver)->set_pointer(safecalloc(smiOop(size)->value(), 1));
return receiver;
}
-
PRIM_DECL_1(proxyOopPrimitives::free, oop receiver) {
PROLOGUE_1("free", receiver);
ASSERT_RECEIVER;
- ::free(proxyOop(receiver)->get_pointer());
+ safefree(proxyOop(receiver)->get_pointer());
proxyOop(receiver)->null_pointer();
return receiver;
}
=======================================
--- /branches/gcc-linux/vm/prims/smi_prims.cpp Mon Nov 12 14:26:32 2007
+++ /branches/gcc-linux/vm/prims/smi_prims.cpp Tue Jan 5 19:42:06 2010
@@ -162,10 +162,10 @@

static void trap() { assert(false, "This primitive should be patched"); };

-extern "C" oop PRIM_API smiOopPrimitives_add(oop receiver, oop argument)
{ trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_subtract(oop receiver, oop
argument) { trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_multiply(oop receiver, oop
argument) { trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_mod(oop receiver, oop argument)
{ trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_div(oop receiver, oop argument)
{ trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_quo(oop receiver, oop argument)
{ trap(); return NULL; };
-extern "C" oop PRIM_API smiOopPrimitives_remainder(oop receiver, oop
argument) { trap(); return NULL; };
+extern "C" oop PRIM_API smiOopPrimitives_add(oop receiver, oop argument)
{ trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_subtract(oop receiver, oop
argument) { trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_multiply(oop receiver, oop
argument) { trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_mod(oop receiver, oop argument)
{ trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_div(oop receiver, oop argument)
{ trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_quo(oop receiver, oop argument)
{ trap(); return markSymbol(vmSymbols::primitive_trap()); };
+extern "C" oop PRIM_API smiOopPrimitives_remainder(oop receiver, oop
argument) { trap(); return markSymbol(vmSymbols::primitive_trap()); };
=======================================
--- /branches/gcc-linux/vm/runtime/os.hpp Tue Dec 29 18:48:47 2009
+++ /branches/gcc-linux/vm/runtime/os.hpp Tue Jan 5 19:42:06 2010
@@ -122,11 +122,13 @@
// interrupts
class ThreadCritical {
private:
+ static bool _initialized;
friend void os_init();
friend void os_exit();
static void intialize();
static void release();
public:
+ static bool initialized() { return _initialized; }
ThreadCritical();
~ThreadCritical();
};
=======================================
--- /branches/gcc-linux/vm/runtime/os_darwin.cpp Thu Dec 31 11:09:51 2009
+++ /branches/gcc-linux/vm/runtime/os_darwin.cpp Tue Jan 5 19:42:06 2010
@@ -228,7 +228,13 @@
} thread_args_t;

void* mainWrapper(void* args) {
- thread_args_t* wrapperArgs = (thread_args_t*) args;
+ char* stackptr;
+ asm("movl %%esp, %0;" : "=a"(stackptr));
+
+ int (*threadMain)(void*) = ((thread_args_t*) args)->main;
+ void* parameter = ((thread_args_t*) args)->parameter;
+ int stackHeadroom = 2 * os::vm_page_size();
+ ((thread_args_t*) args)->stackLimit = stackptr - STACK_SIZE +
stackHeadroom;
int* result = (int*) malloc(sizeof(int));
*result = wrapperArgs->main(wrapperArgs->parameter);
free(args);
@@ -626,7 +632,11 @@

pthread_mutex_t ThreadSection;

-void ThreadCritical::intialize() { pthread_mutex_init(&ThreadSection,
NULL); }
+bool ThreadCritical::_initialized = false;
+void ThreadCritical::intialize() {
+ pthread_mutex_init(&ThreadSection, NULL);
+ _initialized = true;
+}
void ThreadCritical::release() {
pthread_mutex_destroy(&ThreadSection); }

ThreadCritical::ThreadCritical() {
=======================================
--- /branches/gcc-linux/vm/runtime/os_linux.cpp Thu Dec 31 11:09:51 2009
+++ /branches/gcc-linux/vm/runtime/os_linux.cpp Tue Jan 5 19:42:06 2010
@@ -587,7 +587,11 @@

pthread_mutex_t ThreadSection;

-void ThreadCritical::intialize() { pthread_mutex_init(&ThreadSection,
NULL); }
+bool ThreadCritical::_initialized = false;
+void ThreadCritical::intialize() {
+ pthread_mutex_init(&ThreadSection, NULL);
+ _initialized = true;
+}
void ThreadCritical::release() {
pthread_mutex_destroy(&ThreadSection); }

ThreadCritical::ThreadCritical() {
=======================================
--- /branches/gcc-linux/vm/runtime/os_nt.cpp Thu Dec 31 11:09:51 2009
+++ /branches/gcc-linux/vm/runtime/os_nt.cpp Tue Jan 5 19:42:06 2010
@@ -97,7 +97,8 @@
int WINAPI startThread(void* params) {
char* spptr;
__asm mov spptr, esp;
- ((thread_start*) params)->stackLimit = spptr - STACK_SIZE +
os::vm_page_size();
+ int stackHeadroom = 2 * os::vm_page_size();
+ ((thread_start*) params)->stackLimit = spptr - STACK_SIZE +
stackHeadroom;

int (*main)(void*) = ((thread_start*) params)->main;
void* parameter = ((thread_start*) params)->parameter;
@@ -545,7 +546,11 @@

CRITICAL_SECTION ThreadSection;

-void ThreadCritical::intialize() {
InitializeCriticalSection(&ThreadSection); }
+bool ThreadCritical::_initialized = false;
+void ThreadCritical::intialize() {
+ InitializeCriticalSection(&ThreadSection);
+ _initialized = true;
+}
void ThreadCritical::release() {
DeleteCriticalSection(&ThreadSection); }

ThreadCritical::ThreadCritical() {

Reply all
Reply to author
Forward
0 new messages