Revision: 2881 Author: eliot Date: 2014-03-13 17:45:37 -0700 (Thu, 13 Mar 2014) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.641
Spur: Revise interface between GC and machine-code for Spur's ephemerons. We can't mark and free in a single pass with ephemerons because a machine-code method reachable only from the stack could refer to something referred to from an ephemeron. So all machine code must be marked before freeing.
Modified Paths: -------------- branches/Cog/nscogsrc/vm/cogit.c branches/Cog/nscogsrc/vm/cogit.h branches/Cog/nscogsrc/vm/cogmethod.h branches/Cog/nscogsrc/vm/cointerp.c branches/Cog/nscogsrc/vm/cointerp.h branches/Cog/nscogsrc/vm/gcc3x-cointerp.c branches/Cog/nscogsrc/vm/interp.h branches/Cog/nscogsrc/vm/vmCallback.h branches/Cog/nsspursrc/vm/cogit.c branches/Cog/nsspursrc/vm/cogit.h branches/Cog/nsspursrc/vm/cogmethod.h branches/Cog/nsspursrc/vm/cointerp.c branches/Cog/nsspursrc/vm/cointerp.h branches/Cog/nsspursrc/vm/gcc3x-cointerp.c branches/Cog/nsspursrc/vm/interp.h branches/Cog/nsspursrc/vm/vmCallback.h branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c branches/Cog/nsspurstacksrc/vm/interp.c branches/Cog/nsspurstacksrc/vm/interp.h branches/Cog/nsspurstacksrc/vm/vmCallback.h branches/Cog/platforms/Mac OS/vm/sqMacMemory.c branches/Cog/spursrc/vm/cogit.c branches/Cog/spursrc/vm/cogit.h branches/Cog/spursrc/vm/cogmethod.h branches/Cog/spursrc/vm/cointerp.c branches/Cog/spursrc/vm/cointerp.h branches/Cog/spursrc/vm/gcc3x-cointerp.c branches/Cog/spursrc/vm/interp.h branches/Cog/spursrc/vm/vmCallback.h branches/Cog/spurstacksrc/vm/gcc3x-interp.c branches/Cog/spurstacksrc/vm/interp.c branches/Cog/spurstacksrc/vm/interp.h branches/Cog/spurstacksrc/vm/vmCallback.h branches/Cog/src/vm/cogit.c branches/Cog/src/vm/cogit.h branches/Cog/src/vm/cogmethod.h branches/Cog/src/vm/cointerp.c branches/Cog/src/vm/cointerp.h branches/Cog/src/vm/cointerpmt.c branches/Cog/src/vm/cointerpmt.h branches/Cog/src/vm/gcc3x-cointerp.c branches/Cog/src/vm/gcc3x-cointerpmt.c branches/Cog/src/vm/interp.h branches/Cog/src/vm/vmCallback.h branches/Cog/stacksrc/vm/gcc3x-interp.c branches/Cog/stacksrc/vm/interp.c branches/Cog/stacksrc/vm/interp.h branches/Cog/stacksrc/vm/vmCallback.h
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/vm/cogit.c =================================================================== --- branches/Cog/nscogsrc/vm/cogit.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/cogit.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - StackToRegisterMappingCogit VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + StackToRegisterMappingCogit VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -571,6 +571,7 @@ static void freeMethod(CogMethod *cogMethod); static void freeOlderMethodsForCompaction(void); static void freePICsWithFreedTargets(void); +void freeUnmarkedMachineCode(void); static sqInt genActiveContextTrampoline(void); static sqInt genAddSmallIntegerTagsTo(sqInt aRegister); static sqInt genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment); @@ -916,11 +917,13 @@ static void markAndTraceLiteralIfYoung(sqInt literal); static void markAndTraceLiteral(sqInt literal); static void markAndTraceMachineCodeForNewSpaceGC(void); +void markAndTraceMachineCodeOfMarkedMethods(void); static void markAndTraceObjectReferencesInGeneratedRuntime(void); void markAndTraceObjectsOrFreeMachineCode(sqInt inFullGC); static sqInt markAndTraceOrFreeCogMethodfirstVisit(CogMethod *cogMethod, sqInt firstVisit); static void markAndTraceOrFreeMachineCodeForFullGC(void); static sqInt markLiteralsAndUnlinkIfUnmarkedSendpcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); +static sqInt markLiteralspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); void markMethodAndReferents(CogBlockMethod *aCogMethod); static sqInt markYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); static void marshallImplicitReceiverSendArguments(sqInt numArgs); @@ -10320,6 +10323,31 @@ }
+/* Free machine-code methods whose compiled methods are unmarked + and open PICs whose selectors are not marked. */ + +void +freeUnmarkedMachineCode(void) +{ + CogMethod *cogMethod; + + cogMethod = ((CogMethod *) methodZoneBase); + while (cogMethod < (limitZony())) { + if ((((cogMethod->cmType)) == CMMethod) + && (!(isMarked((cogMethod->methodObject))))) { + freeMethod(cogMethod); + } + if ((((cogMethod->cmType)) == CMOpenPIC) + && ((!(isImmediate((cogMethod->selector)))) + && (!(isMarked((cogMethod->selector)))))) { + freeMethod(cogMethod); + } + cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); + } + unlinkSendsToFree(); +} + + /* Short-circuit the interpreter call if a frame is already married. */
static sqInt @@ -17655,6 +17683,59 @@ }
+/* Mark objects in machine-code of marked methods (or open PICs with marked + selectors). + */ + +void +markAndTraceMachineCodeOfMarkedMethods(void) +{ + CogMethod *cogMethod; + + if (leakCheckFullGC()) { + assert(allMachineCodeObjectReferencesValid()); + } + codeModified = 0; + markAndTraceObjectReferencesInGeneratedRuntime(); + cogMethod = ((CogMethod *) methodZoneBase); + while (cogMethod < (limitZony())) { + if ((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) { + /* begin markAndTraceLiteralsIn: */ + assert(((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) + || ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector)))))); + markAndTraceLiteral((cogMethod->selector)); + mapForperformUntilarg(cogMethod, markLiteralspcmethod, ((sqInt)cogMethod)); + } + if ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector))))) { + /* begin markAndTraceLiteralsIn: */ + assert(((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) + || ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector)))))); + markAndTraceLiteral((cogMethod->selector)); + mapForperformUntilarg(cogMethod, markLiteralspcmethod, ((sqInt)cogMethod)); + } + cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); + } + if (leakCheckFullGC()) { + assert(allMachineCodeObjectReferencesValid()); + } + if (codeModified) { + + /* After updating oops in inline caches we need to flush the icache. */ + + flushICacheFromto(processor, methodZoneBase, ((sqInt)(limitZony()))); + } +} + + /* Mark and trace any object references in the generated run-time. */
static void @@ -17882,6 +17963,74 @@ return 0; }
+ +/* Mark and trace literals. + Additionally in Newspeak, void push implicits that have unmarked classes. */ + +static sqInt +markLiteralspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod) +{ + sqInt cacheTag; + sqInt cacheTag1; + sqInt class; + sqInt classpc; + sqInt entryPoint; + sqInt entryPoint1; + sqInt literal; + sqInt mixin; + sqInt mixinpc; + sqInt tagCouldBeObj; + sqInt tagCouldBeObj1; + + if (annotation == IsObjectReference) { + literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc)); + markAndTraceLiteral(literal); + } + if ((annotation == IsSendCall) + || (annotation == IsNSSendCall)) { + /* begin offsetCacheTagAndCouldBeObjectAt:annotation:into: */ + cacheTag1 = inlineCacheTagAt(backEnd, ((sqInt)mcpc)); + + /* in-line cache tags are the selectors of sends if sends are unlinked, + the selectors of super sends (entry offset = cmNoCheckEntryOffset) + or in-line cache tags (classes, class indices, immediate bit patterns, etc). + Note that selectors can be immediate so there is no guarantee that they + are markable/remappable objects. */ + + entryPoint1 = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc)); + tagCouldBeObj1 = (inlineCacheTagsMayBeObjects()) + || ((entryPoint1 < methodZoneBase) + || ((entryPoint1 & entryPointMask) == cmNoCheckEntryOffset)); + if (tagCouldBeObj1) { + markAndTraceLiteral(cacheTag1); + } + if (entryPoint1 == ceImplicitReceiverTrampoline) { + classpc = (((sqInt)mcpc)) + (jumpShortByteSize(backEnd)); + mixinpc = ((((sqInt)mcpc)) + (jumpShortByteSize(backEnd))) + BytesPerOop; + class = unalignedLongAt(backEnd, classpc); + if (class != 0) { + assert(addressCouldBeObj(class)); + if (cacheTagIsMarked(class)) { + if (((mixin = unalignedLongAt(backEnd, mixinpc))) != 0) { + markAndTraceLiteral(mixin); + } + } + else { + unalignedLongAtput(backEnd, classpc, 0); + unalignedLongAtput(backEnd, mixinpc, 0); + codeModified = 1; + } + } + else { + assert((unalignedLongAt(backEnd, mixinpc)) == 0); + } + } + + + } + return 0; +} + void markMethodAndReferents(CogBlockMethod *aCogMethod) {
Modified: branches/Cog/nscogsrc/vm/cogit.h =================================================================== --- branches/Cog/nscogsrc/vm/cogit.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/cogit.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
@@ -34,6 +34,7 @@ void enterCogCodePopReceiverArg0Regs(void); void enterCogCodePopReceiverArg1Arg0Regs(void); CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); +void freeUnmarkedMachineCode(void); sqInt genQuickReturnConst(void); sqInt genQuickReturnInstVar(void); sqInt genQuickReturnSelf(void); @@ -43,6 +44,7 @@ sqInt isSendReturnPC(sqInt retpc); void linkSendAtintooffsetreceiver(sqInt callSiteReturnAddress, CogMethod *sendingMethod, CogMethod *targetMethod, sqInt theEntryOffset, sqInt receiver); void mapObjectReferencesInMachineCode(sqInt gcMode); +void markAndTraceMachineCodeOfMarkedMethods(void); void markAndTraceObjectsOrFreeMachineCode(sqInt inFullGC); void markMethodAndReferents(CogBlockMethod *aCogMethod); usqInt maxCogMethodAddress(void);
Modified: branches/Cog/nscogsrc/vm/cogmethod.h =================================================================== --- branches/Cog/nscogsrc/vm/cogmethod.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/cogmethod.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
typedef struct {
Modified: branches/Cog/nscogsrc/vm/cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/cointerp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1150,7 +1150,7 @@ static void rewriteMethodCacheEntryForExternalPrimitiveToFunction(void (*localPrimAddress)(void)); static sqInt roomToPushNArgs(sqInt n); static void runLeakCheckerForFullGC(sqInt fullGCFlag); -static usqInt safeObjectAfter(sqInt oop); +static sqInt safeObjectAfter(sqInt oop); static sqInt safePrintStringOf(sqInt oop); usqInt scavengeThresholdAddress(void); EXPORT(sqInt) sendInvokeCallbackContext(VMCallbackContext *vmCallbackContext); @@ -2037,7 +2037,7 @@ /* 574 */ (void (*)(void))0, /* 575 */ (void (*)(void))0, 0 }; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.641"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -4831,7 +4831,6 @@ GIV(framePointer) = localFP; ceEnterCogCodePopReceiverReg(); - null; goto l307; } localIP = pointerForOop(longAt(localFP + FoxIFSavedIP)); @@ -4849,7 +4848,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- null; + /* return self */ l307: /* end baseFrameReturn */; goto l304; } @@ -23936,15 +23935,17 @@ sqInt header1; sqInt header2; sqInt header3; + sqInt header4; usqInt lastWord; sqInt newFreeChunk; sqInt newOop; - usqInt next; + sqInt next; sqInt oop; sqInt realHeader; sqInt sz; sqInt sz1; sqInt sz2; + sqInt sz3; sqInt target; usqInt w;
@@ -23955,7 +23956,21 @@ /* begin objectAfterWhileForwarding: */ header2 = longAt(oop); if ((header2 & MarkBit) == 0) { - next = ((sqInt) (objectAfter(oop))); + /* begin objectAfter: */ + if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) { + error("no objects after the end of memory"); + } + if (((longAt(oop)) & TypeMask) == HeaderTypeFree) { + sz2 = (longAt(oop)) & AllButTypeMask; + } + else { + /* begin sizeBitsOf: */ + header3 = longAt(oop); + sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass + ? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask + : header3 & SizeMask); + } + next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]); goto l1; } fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1; @@ -23970,7 +23985,7 @@ else { sz1 = realHeader & SizeMask; } - next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]))); + next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]); l1: /* end objectAfterWhileForwarding: */; if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
@@ -24024,18 +24039,18 @@ } /* begin safeObjectAfter: */ if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) { - sz2 = (longAt(newFreeChunk)) & AllButTypeMask; + sz3 = (longAt(newFreeChunk)) & AllButTypeMask; } else { /* begin sizeBitsOf: */ - header3 = longAt(newFreeChunk); - sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass + header4 = longAt(newFreeChunk); + sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass ? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask - : header3 & SizeMask); + : header4 & SizeMask); } - next = ((newFreeChunk + sz2) >= GIV(freeStart) + next = ((newFreeChunk + sz3) >= GIV(freeStart) ? GIV(freeStart) - : (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask])); + : (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask])); assert((next == GIV(freeStart)) || (next == (oopFromChunk(GIV(compEnd))))); if (next == GIV(freeStart)) { @@ -50437,7 +50452,7 @@ given object or free chunk in memory. Return freeStart when enumeration is complete. This is for assertion checking only. */
-static usqInt +static sqInt safeObjectAfter(sqInt oop) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt header;
Modified: branches/Cog/nscogsrc/vm/cointerp.h =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/cointerp.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1153,7 +1153,7 @@ static void rewriteMethodCacheEntryForExternalPrimitiveToFunction(void (*localPrimAddress)(void)); static sqInt roomToPushNArgs(sqInt n); static void runLeakCheckerForFullGC(sqInt fullGCFlag); -static usqInt safeObjectAfter(sqInt oop); +static sqInt safeObjectAfter(sqInt oop); static sqInt safePrintStringOf(sqInt oop); usqInt scavengeThresholdAddress(void); EXPORT(sqInt) sendInvokeCallbackContext(VMCallbackContext *vmCallbackContext); @@ -2040,7 +2040,7 @@ /* 574 */ (void (*)(void))0, /* 575 */ (void (*)(void))0, 0 }; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.641"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -4840,7 +4840,6 @@ GIV(framePointer) = localFP; ceEnterCogCodePopReceiverReg(); - null; goto l307; } localIP = pointerForOop(longAt(localFP + FoxIFSavedIP)); @@ -4858,7 +4857,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- null; + /* return self */ l307: /* end baseFrameReturn */; goto l304; } @@ -23945,15 +23944,17 @@ sqInt header1; sqInt header2; sqInt header3; + sqInt header4; usqInt lastWord; sqInt newFreeChunk; sqInt newOop; - usqInt next; + sqInt next; sqInt oop; sqInt realHeader; sqInt sz; sqInt sz1; sqInt sz2; + sqInt sz3; sqInt target; usqInt w;
@@ -23964,7 +23965,21 @@ /* begin objectAfterWhileForwarding: */ header2 = longAt(oop); if ((header2 & MarkBit) == 0) { - next = ((sqInt) (objectAfter(oop))); + /* begin objectAfter: */ + if (!(asserta(oopisLessThan(oop, GIV(freeStart))))) { + error("no objects after the end of memory"); + } + if (((longAt(oop)) & TypeMask) == HeaderTypeFree) { + sz2 = (longAt(oop)) & AllButTypeMask; + } + else { + /* begin sizeBitsOf: */ + header3 = longAt(oop); + sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass + ? (longAt(oop - (BytesPerWord * 2))) & LongSizeMask + : header3 & SizeMask); + } + next = (oop + sz2) + (headerTypeBytes[(longAt(oop + sz2)) & TypeMask]); goto l1; } fwdBlock1 = (header2 & AllButMarkBitAndTypeMask) << 1; @@ -23979,7 +23994,7 @@ else { sz1 = realHeader & SizeMask; } - next = ((sqInt) ((oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]))); + next = (oop + sz1) + (headerTypeBytes[(longAt(oop + sz1)) & TypeMask]); l1: /* end objectAfterWhileForwarding: */; if (!(((longAt(oop)) & TypeMask) == HeaderTypeFree)) {
@@ -24033,18 +24048,18 @@ } /* begin safeObjectAfter: */ if (((longAt(newFreeChunk)) & TypeMask) == HeaderTypeFree) { - sz2 = (longAt(newFreeChunk)) & AllButTypeMask; + sz3 = (longAt(newFreeChunk)) & AllButTypeMask; } else { /* begin sizeBitsOf: */ - header3 = longAt(newFreeChunk); - sz2 = ((header3 & TypeMask) == HeaderTypeSizeAndClass + header4 = longAt(newFreeChunk); + sz3 = ((header4 & TypeMask) == HeaderTypeSizeAndClass ? (longAt(newFreeChunk - (BytesPerWord * 2))) & LongSizeMask - : header3 & SizeMask); + : header4 & SizeMask); } - next = ((newFreeChunk + sz2) >= GIV(freeStart) + next = ((newFreeChunk + sz3) >= GIV(freeStart) ? GIV(freeStart) - : (newFreeChunk + sz2) + (headerTypeBytes[(longAt(newFreeChunk + sz2)) & TypeMask])); + : (newFreeChunk + sz3) + (headerTypeBytes[(longAt(newFreeChunk + sz3)) & TypeMask])); assert((next == GIV(freeStart)) || (next == (oopFromChunk(GIV(compEnd))))); if (next == GIV(freeStart)) { @@ -50446,7 +50461,7 @@ given object or free chunk in memory. Return freeStart when enumeration is complete. This is for assertion checking only. */
-static usqInt +static sqInt safeObjectAfter(sqInt oop) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt header;
Modified: branches/Cog/nscogsrc/vm/interp.h =================================================================== --- branches/Cog/nscogsrc/vm/interp.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/interp.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/nscogsrc/vm/vmCallback.h =================================================================== --- branches/Cog/nscogsrc/vm/vmCallback.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nscogsrc/vm/vmCallback.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
#define VM_CALLBACK_INC 1
Modified: branches/Cog/nsspursrc/vm/cogit.c =================================================================== --- branches/Cog/nsspursrc/vm/cogit.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/cogit.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - StackToRegisterMappingCogit VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + StackToRegisterMappingCogit VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -402,7 +402,6 @@ static sqInt checkValidObjectReferencesInClosedPIC(CogMethod *cPIC); static sqInt checkValidObjectReference(sqInt anOop); static void clearCogCompiledCode(void); -static sqInt closedPICRefersToUnmarkedObject(CogMethod *cPIC); static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod); char * codeEntryFor(char *address); char * codeEntryNameFor(char *address); @@ -563,6 +562,7 @@ static void freeMethod(CogMethod *cogMethod); static void freeOlderMethodsForCompaction(void); static void freePICsWithFreedTargets(void); +void freeUnmarkedMachineCode(void); static sqInt genActiveContextTrampoline(void); static sqInt genAddSmallIntegerTagsTo(sqInt aRegister); static sqInt genAlignCStackSavingRegistersnumArgswordAlignment(AbstractInstruction * self_in_genAlignCStackSavingRegistersnumArgswordAlignment, sqInt saveRegs, sqInt numArgs, sqInt alignment); @@ -915,16 +915,11 @@ static void mapObjectReferencesInMachineCodeForFullGC(void); static void mapObjectReferencesInMachineCodeForYoungGC(void); void mapObjectReferencesInMachineCode(sqInt gcMode); -static void markAndTraceLiteralIfYoung(sqInt literal); static void markAndTraceLiteral(sqInt literal); -static void markAndTraceMachineCodeForNewSpaceGC(void); +void markAndTraceMachineCodeOfMarkedMethods(void); static void markAndTraceObjectReferencesInGeneratedRuntime(void); -void markAndTraceObjectsOrFreeMachineCode(sqInt inFullGC); -static sqInt markAndTraceOrFreeCogMethodfirstVisit(CogMethod *cogMethod, sqInt firstVisit); -static void markAndTraceOrFreeMachineCodeForFullGC(void); -static sqInt markLiteralsAndUnlinkIfUnmarkedSendpcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); +static sqInt markLiteralspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); void markMethodAndReferents(CogBlockMethod *aCogMethod); -static sqInt markYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod); static void marshallImplicitReceiverSendArguments(sqInt numArgs); static void marshallSendArguments(sqInt numArgs); usqInt maxCogMethodAddress(void); @@ -3280,61 +3275,6 @@ manageFromto(baseAddress, limitAddress); }
- -/* Answer if the ClosedPIC refers to any unmarked objects or freed/freeable - target methods, - applying markAndTraceOrFreeCogMethod:firstVisit: to those targets to - determine if freed/freeable. - */ - -static sqInt -closedPICRefersToUnmarkedObject(CogMethod *cPIC) -{ - sqInt entryPoint; - sqInt i; - sqInt object; - sqInt offsetToLiteral; - sqInt pc; - CogMethod *targetMethod; - - if (!(isMarked((cPIC->selector)))) { - return 1; - } - - /* First jump is unconditional; subsequent ones are conditional */ - - pc = (((sqInt)cPIC)) + firstCPICCaseOffset; - offsetToLiteral = jumpLongByteSize(backEnd); - for (i = 1; i <= ((cPIC->cPICNumCases)); i += 1) { - object = literalBeforeFollowingAddress(backEnd, (pc - offsetToLiteral) - (loadLiteralByteSize(backEnd))); - if ((couldBeObject(object)) - && (!(isMarked(object)))) { - return 1; - } - object = literalBeforeFollowingAddress(backEnd, pc - offsetToLiteral); - if ((couldBeObject(object)) - && (!(isMarked(object)))) { - return 1; - } - - /* Find target from jump. Ignore jumps to the interpret and MNU calls within this PIC */ - - entryPoint = jumpLongTargetBeforeFollowingAddress(backEnd, pc); - if (((((usqInt)entryPoint)) < (((usqInt)cPIC))) - || ((((usqInt)entryPoint)) > (((usqInt)((((usqInt)cPIC)) + ((cPIC->blockSize))))))) { - targetMethod = ((CogMethod *) (entryPoint - cmNoCheckEntryOffset)); - assert((((targetMethod->cmType)) == CMMethod) - || (((targetMethod->cmType)) == CMFree)); - if (markAndTraceOrFreeCogMethodfirstVisit(targetMethod, (((usqInt)targetMethod)) > (((usqInt)pc)))) { - return 1; - } - } - offsetToLiteral = jumpLongConditionalByteSize(backEnd); - pc += cPICCaseSize; - } - return 0; -} - static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod) { @@ -10404,6 +10344,31 @@ }
+/* Free machine-code methods whose compiled methods are unmarked + and open PICs whose selectors are not marked. */ + +void +freeUnmarkedMachineCode(void) +{ + CogMethod *cogMethod; + + cogMethod = ((CogMethod *) methodZoneBase); + while (cogMethod < (limitZony())) { + if ((((cogMethod->cmType)) == CMMethod) + && (!(isMarked((cogMethod->methodObject))))) { + freeMethod(cogMethod); + } + if ((((cogMethod->cmType)) == CMOpenPIC) + && ((!(isImmediate((cogMethod->selector)))) + && (!(isMarked((cogMethod->selector)))))) { + freeMethod(cogMethod); + } + cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); + } + unlinkSendsToFree(); +} + + /* Short-circuit the interpreter call if a frame is already married. */
static sqInt @@ -18608,16 +18573,6 @@ }
static void -markAndTraceLiteralIfYoung(sqInt literal) -{ - if ((couldBeObject(literal)) - && (isYoungObject(literal))) { - assert(addressCouldBeObj(literal)); - markAndTrace(literal); - } -} - -static void markAndTraceLiteral(sqInt literal) { if (couldBeObject(literal)) { @@ -18627,50 +18582,48 @@ }
-/* Free any methods that refer to unmarked objects, unlinking sends to freed - methods. +/* Mark objects in machine-code of marked methods (or open PICs with marked + selectors). */
-static void -markAndTraceMachineCodeForNewSpaceGC(void) +void +markAndTraceMachineCodeOfMarkedMethods(void) { CogMethod *cogMethod; - usqInt pointer;
- if (leakCheckNewSpaceGC()) { + if (leakCheckFullGC()) { assert(allMachineCodeObjectReferencesValid()); } codeModified = 0; - pointer = youngReferrers(); - while (pointer < limitAddress) { - cogMethod = ((CogMethod *) (longAt(pointer))); - if ((cogMethod->cmRefersToYoung)) { - assert((cogMethodDoesntLookKosher(cogMethod)) == 0); - assert((((cogMethod->cmType)) == CMMethod) - || (((cogMethod->cmType)) == CMOpenPIC)); - if (isYoung((cogMethod->selector))) { - markAndTrace((cogMethod->selector)); - } - if (((cogMethod->cmType)) == CMMethod) { - if (isYoung((cogMethod->methodObject))) { - markAndTrace((cogMethod->methodObject)); - } - /* begin markYoungObjectsIn: */ - assert((((cogMethod->cmType)) == CMMethod) - || (((cogMethod->cmType)) == CMOpenPIC)); - if (isYoung((cogMethod->selector))) { - markAndTrace((cogMethod->selector)); - } - if ((((cogMethod->cmType)) == CMMethod) - && (isYoung((cogMethod->methodObject)))) { - markAndTrace((cogMethod->methodObject)); - } - mapForperformUntilarg(cogMethod, markYoungObjectspcmethod, ((sqInt)cogMethod)); - } + markAndTraceObjectReferencesInGeneratedRuntime(); + cogMethod = ((CogMethod *) methodZoneBase); + while (cogMethod < (limitZony())) { + if ((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) { + /* begin markAndTraceLiteralsIn: */ + assert(((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) + || ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector)))))); + markAndTraceLiteral((cogMethod->selector)); + mapForperformUntilarg(cogMethod, markLiteralspcmethod, ((sqInt)cogMethod)); } - pointer += BytesPerWord; + if ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector))))) { + /* begin markAndTraceLiteralsIn: */ + assert(((((cogMethod->cmType)) == CMMethod) + && (isMarked((cogMethod->methodObject)))) + || ((((cogMethod->cmType)) == CMOpenPIC) + && ((isImmediate((cogMethod->selector))) + || (isMarked((cogMethod->selector)))))); + markAndTraceLiteral((cogMethod->selector)); + mapForperformUntilarg(cogMethod, markLiteralspcmethod, ((sqInt)cogMethod)); + } + cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); } - if (leakCheckIncrementalGC()) { + if (leakCheckFullGC()) { assert(allMachineCodeObjectReferencesValid()); } if (codeModified) { @@ -18698,114 +18651,15 @@ } }
-void -markAndTraceObjectsOrFreeMachineCode(sqInt inFullGC) -{ - if (inFullGC) { - markAndTraceOrFreeMachineCodeForFullGC(); - } - else { - markAndTraceMachineCodeForNewSpaceGC(); - } -}
+/* Mark and trace literals. + Additionally in Newspeak, void push implicits that have unmarked classes. */
-/* Mark and trace objects in the argument and free if it is appropriate. - Answer if the method has been freed. firstVisit is a hint used to avoid - scanning methods we've already seen. False positives are fine. - For a CMMethod this - frees if the bytecode method isnt marked, - marks and traces object literals and selectors, - unlinks sends to targets that should be freed. - For a CMClosedPIC this - frees if it refers to anything that should be freed or isn't marked. - For a CMOpenPIC this - frees if the selector isn't marked. */ -/* this recurses at most one level down */ - static sqInt -markAndTraceOrFreeCogMethodfirstVisit(CogMethod *cogMethod, sqInt firstVisit) +markLiteralspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod) { - if (((cogMethod->cmType)) == CMFree) { - return 1; - } - assert((cogMethodDoesntLookKosher(cogMethod)) == 0); - if (((cogMethod->cmType)) == CMMethod) { - if (!(isMarked((cogMethod->methodObject)))) { - freeMethod(cogMethod); - return 1; - } - if (firstVisit) { - /* begin markLiteralsAndUnlinkUnmarkedSendsIn: */ - assert(((cogMethod->cmType)) == CMMethod); - assert(isMarked((cogMethod->methodObject))); - markAndTraceLiteral((cogMethod->selector)); - mapForperformUntilarg(cogMethod, markLiteralsAndUnlinkIfUnmarkedSendpcmethod, ((sqInt)cogMethod)); - } - return 0; - } - if (((cogMethod->cmType)) == CMClosedPIC) { - if (!(closedPICRefersToUnmarkedObject(cogMethod))) { - return 0; - } - freeMethod(cogMethod); - return 1; - } - if (((cogMethod->cmType)) == CMOpenPIC) { - if (isMarked((cogMethod->selector))) { - return 0; - } - freeMethod(cogMethod); - return 1; - } - assert((((cogMethod->cmType)) == CMMethod) - || ((((cogMethod->cmType)) == CMClosedPIC) - || (((cogMethod->cmType)) == CMOpenPIC))); - return 0; -} - - -/* Free any methods that refer to unmarked objects, unlinking sends to freed - methods. - */ - -static void -markAndTraceOrFreeMachineCodeForFullGC(void) -{ - CogMethod *cogMethod; - - if (leakCheckFullGC()) { - assert(allMachineCodeObjectReferencesValid()); - } - codeModified = 0; - markAndTraceObjectReferencesInGeneratedRuntime(); - cogMethod = ((CogMethod *) methodZoneBase); - while (cogMethod < (limitZony())) { - markAndTraceOrFreeCogMethodfirstVisit(cogMethod, 1); - cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); - } - if (leakCheckFullGC()) { - assert(allMachineCodeObjectReferencesValid()); - } - if (codeModified) { - - /* After updating oops in inline caches we need to flush the icache. */ - - flushICacheFromto(processor, methodZoneBase, ((sqInt)(limitZony()))); - } -} - - -/* Mark and trace literals. Unlink sends that have unmarked cache tags or - targets. - */ - -static sqInt -markLiteralsAndUnlinkIfUnmarkedSendpcmethod(sqInt annotation, char *mcpc, sqInt cogMethod) -{ sqInt cacheTag; sqInt cacheTag1; - sqInt cacheTagMarked; sqInt class; sqInt classpc; sqInt entryPoint; @@ -18813,13 +18667,8 @@ sqInt literal; sqInt mixin; sqInt mixinpc; - sqInt sendTable; - sqInt *sendTable1; sqInt tagCouldBeObj; sqInt tagCouldBeObj1; - sqInt targetMethod; - CogMethod *targetMethod1; - sqInt unlinkedRoutine;
if (annotation == IsObjectReference) { literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc)); @@ -18840,65 +18689,26 @@ tagCouldBeObj1 = (inlineCacheTagsMayBeObjects()) || ((entryPoint1 < methodZoneBase) || ((entryPoint1 & entryPointMask) == cmNoCheckEntryOffset)); - cacheTagMarked = tagCouldBeObj1 - && (cacheTagIsMarked(cacheTag1)); - if (entryPoint1 > methodZoneBase) { + if (tagCouldBeObj1) { + markAndTraceLiteral(cacheTag1); + } + if (entryPoint1 == ceImplicitReceiverTrampoline) { + classpc = (((sqInt)mcpc)) + (jumpShortByteSize(backEnd)); + mixinpc = ((((sqInt)mcpc)) + (jumpShortByteSize(backEnd))) + BytesPerOop; + class = unalignedLongAt(backEnd, classpc); + if (class != 0) { + assert(addressCouldBeObj(class)); + if (((mixin = unalignedLongAt(backEnd, mixinpc))) != 0) { + markAndTraceLiteral(mixin); + }
- /* It's a linked send. */ - - /* begin targetMethodAndSendTableFor:annotation:into: */ - if ((entryPoint1 & entryPointMask) == checkedEntryAlignment) { - assert(annotation == IsSendCall); - targetMethod1 = ((CogMethod *) (entryPoint1 - cmEntryOffset)); - sendTable1 = sendTrampolines; } else { - if ((entryPoint1 & entryPointMask) == dynSuperEntryAlignment) { - assert(annotation == IsNSSendCall); - targetMethod1 = ((CogMethod *) (entryPoint1 - cmDynSuperEntryOffset)); - sendTable1 = dynamicSuperSendTrampolines; - } - else { - assert(annotation == IsSendCall); - targetMethod1 = ((CogMethod *) (entryPoint1 - cmNoCheckEntryOffset)); - sendTable1 = superSendTrampolines; - } + assert((unalignedLongAt(backEnd, mixinpc)) == 0); } - - if ((!cacheTagMarked) - || (markAndTraceOrFreeCogMethodfirstVisit(targetMethod1, (((usqInt)targetMethod1)) > (((usqInt)mcpc))))) { - - /* Either the cacheTag is unmarked (e.g. new class) or the target - has been freed (because it is unmarked), so unlink the send. */ - - unlinkedRoutine = sendTable1[((((targetMethod1->cmNumArgs)) < (NumSendTrampolines - 1)) ? ((targetMethod1->cmNumArgs)) : (NumSendTrampolines - 1))]; - rewriteInlineCacheAttagtarget(backEnd, ((sqInt)mcpc), (targetMethod1->selector), unlinkedRoutine); - codeModified = 1; - markAndTraceLiteral((targetMethod1->selector)); - } - } - else { - markAndTraceLiteral(cacheTag1); - if (entryPoint1 == ceImplicitReceiverTrampoline) { - markAndTraceLiteral(cacheTag1); - classpc = (((sqInt)mcpc)) + (jumpShortByteSize(backEnd)); - mixinpc = ((((sqInt)mcpc)) + (jumpShortByteSize(backEnd))) + BytesPerOop; - class = unalignedLongAt(backEnd, classpc); - if (class != 0) { - assert(addressCouldBeObj(class)); - if (((mixin = unalignedLongAt(backEnd, mixinpc))) != 0) { - markAndTraceLiteral(mixin); - }
- } - else { - assert((unalignedLongAt(backEnd, mixinpc)) == 0); - } - }
- } - } return 0; } @@ -18918,57 +18728,6 @@ }
-/* Mark and trace young literals. */ - -static sqInt -markYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod) -{ - sqInt cacheTag; - sqInt cacheTag1; - sqInt class; - sqInt entryPoint; - sqInt entryPoint1; - sqInt literal; - sqInt mixin; - sqInt tagCouldBeObj; - sqInt tagCouldBeObj1; - - if (annotation == IsObjectReference) { - literal = literalBeforeFollowingAddress(backEnd, ((sqInt)mcpc)); - markAndTraceLiteralIfYoung(literal); - } - if ((annotation == IsSendCall) - || (annotation == IsNSSendCall)) { - /* begin offsetCacheTagAndCouldBeObjectAt:annotation:into: */ - cacheTag1 = inlineCacheTagAt(backEnd, ((sqInt)mcpc)); - - /* in-line cache tags are the selectors of sends if sends are unlinked, - the selectors of super sends (entry offset = cmNoCheckEntryOffset) - or in-line cache tags (classes, class indices, immediate bit patterns, etc). - Note that selectors can be immediate so there is no guarantee that they - are markable/remappable objects. */ - - entryPoint1 = callTargetFromReturnAddress(backEnd, ((sqInt)mcpc)); - tagCouldBeObj1 = (inlineCacheTagsMayBeObjects()) - || ((entryPoint1 < methodZoneBase) - || ((entryPoint1 & entryPointMask) == cmNoCheckEntryOffset)); - if (tagCouldBeObj1) { - markAndTraceLiteralIfYoung(cacheTag1); - } - if (entryPoint1 == ceImplicitReceiverTrampoline) { - if (((class = unalignedLongAt(backEnd, (((sqInt)mcpc)) + (jumpShortByteSize(backEnd))))) != 0) { - markAndTraceLiteralIfYoung(class); - mixin = unalignedLongAt(backEnd, ((((sqInt)mcpc)) + (jumpShortByteSize(backEnd))) + BytesPerOop); - markAndTraceLiteralIfYoung(mixin); - } - } - - - } - return 0; -} - - /* Spill everything on the simulated stack that needs spilling (that below arguments). Marshall arguments to stack and/or registers depending on arg count. If the args don't fit in registers push receiver and args (spill
Modified: branches/Cog/nsspursrc/vm/cogit.h =================================================================== --- branches/Cog/nsspursrc/vm/cogit.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/cogit.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
@@ -35,6 +35,7 @@ CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); void followForwardedLiteralsIn(CogMethod *cogMethod); void followForwardedMethods(void); +void freeUnmarkedMachineCode(void); sqInt genQuickReturnConst(void); sqInt genQuickReturnInstVar(void); sqInt genQuickReturnSelf(void); @@ -44,7 +45,7 @@ sqInt isSendReturnPC(sqInt retpc); void linkSendAtintooffsetreceiver(sqInt callSiteReturnAddress, CogMethod *sendingMethod, CogMethod *targetMethod, sqInt theEntryOffset, sqInt receiver); void mapObjectReferencesInMachineCode(sqInt gcMode); -void markAndTraceObjectsOrFreeMachineCode(sqInt inFullGC); +void markAndTraceMachineCodeOfMarkedMethods(void); void markMethodAndReferents(CogBlockMethod *aCogMethod); usqInt maxCogMethodAddress(void); sqInt mcPCForstartBcpcin(sqInt bcpc, sqInt startbcpc, CogBlockMethod *cogMethod);
Modified: branches/Cog/nsspursrc/vm/cogmethod.h =================================================================== --- branches/Cog/nsspursrc/vm/cogmethod.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/cogmethod.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGenerator VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
typedef struct {
Modified: branches/Cog/nsspursrc/vm/cointerp.c =================================================================== --- branches/Cog/nsspursrc/vm/cointerp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/cointerp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2196,7 +2196,7 @@ /* 575 */ (void (*)(void))0, 0 }; usqInt heapBase; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.641"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -6551,7 +6551,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr1 + (BaseHeaderSize)) + (byte3 << 2))); } - null; goto l5; } if (opType == 3) { @@ -6561,7 +6560,6 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2)); longAtPointerput((localSP -= BytesPerOop), object); - null; goto l5; } if (opType == 4) { @@ -6589,7 +6587,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((litVar1 + (BaseHeaderSize)) + (ValueIndex << 2)));
- null; goto l5; } top = longAtPointer(localSP); @@ -36190,8 +36187,6 @@ markAndTrace(oop1); } } - /* begin markAndTraceOrFreeMachineCode: */ - markAndTraceObjectsOrFreeMachineCode(1); assert(validObjStacks()); markWeaklingsAndMarkAndFireEphemerons(); assert(validObjStacks()); @@ -36289,6 +36284,7 @@ numTracedWeaklings = 0; while(1) { markAndTraceUntracedReachableStackPages(); + markAndTraceMachineCodeOfMarkedMethods(); /* begin objStack:from:do: */ assert(isValidObjStack(GIV(weaklingStack))); size = longAt((GIV(weaklingStack) + (BaseHeaderSize)) + (ObjStackTopx << 2)); @@ -36322,7 +36318,9 @@ numTracedWeaklings = size; if (((GIV(unscannedEphemerons).top)) == ((GIV(unscannedEphemerons).start))) { markAndTraceUntracedReachableStackPages(); + markAndTraceMachineCodeOfMarkedMethods(); freeUntracedStackPages(); + freeUnmarkedMachineCode(); return; } if (!(markInactiveEphemerons())) {
Modified: branches/Cog/nsspursrc/vm/cointerp.h =================================================================== --- branches/Cog/nsspursrc/vm/cointerp.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/cointerp.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2199,7 +2199,7 @@ /* 575 */ (void (*)(void))0, 0 }; usqInt heapBase; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.641"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -6560,7 +6560,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr1 + (BaseHeaderSize)) + (byte3 << 2))); } - null; goto l5; } if (opType == 3) { @@ -6570,7 +6569,6 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2)); longAtPointerput((localSP -= BytesPerOop), object); - null; goto l5; } if (opType == 4) { @@ -6598,7 +6596,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((litVar1 + (BaseHeaderSize)) + (ValueIndex << 2)));
- null; goto l5; } top = longAtPointer(localSP); @@ -36199,8 +36196,6 @@ markAndTrace(oop1); } } - /* begin markAndTraceOrFreeMachineCode: */ - markAndTraceObjectsOrFreeMachineCode(1); assert(validObjStacks()); markWeaklingsAndMarkAndFireEphemerons(); assert(validObjStacks()); @@ -36298,6 +36293,7 @@ numTracedWeaklings = 0; while(1) { markAndTraceUntracedReachableStackPages(); + markAndTraceMachineCodeOfMarkedMethods(); /* begin objStack:from:do: */ assert(isValidObjStack(GIV(weaklingStack))); size = longAt((GIV(weaklingStack) + (BaseHeaderSize)) + (ObjStackTopx << 2)); @@ -36331,7 +36327,9 @@ numTracedWeaklings = size; if (((GIV(unscannedEphemerons).top)) == ((GIV(unscannedEphemerons).start))) { markAndTraceUntracedReachableStackPages(); + markAndTraceMachineCodeOfMarkedMethods(); freeUntracedStackPages(); + freeUnmarkedMachineCode(); return; } if (!(markInactiveEphemerons())) {
Modified: branches/Cog/nsspursrc/vm/interp.h =================================================================== --- branches/Cog/nsspursrc/vm/interp.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/interp.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/nsspursrc/vm/vmCallback.h =================================================================== --- branches/Cog/nsspursrc/vm/vmCallback.h 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspursrc/vm/vmCallback.h 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */
#define VM_CALLBACK_INC 1
Modified: branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c =================================================================== --- branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - StackInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + StackInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1986,7 +1986,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreter_VMMaker.oscog-eem.641"; volatile int sendTrace; sqInt suppressHeartbeatFlag;
@@ -31252,7 +31252,6 @@ markAndTrace(oop1); } } - /* begin markAndTraceOrFreeMachineCode: */ assert(validObjStacks()); markWeaklingsAndMarkAndFireEphemerons(); assert(validObjStacks()); @@ -31350,6 +31349,7 @@ numTracedWeaklings = 0; while(1) { markAndTraceUntracedReachableStackPages(); + /* begin markAndTraceMachineCodeOfMarkedMethods */ /* begin objStack:from:do: */ assert(isValidObjStack(GIV(weaklingStack))); size = longAt((GIV(weaklingStack) + (BaseHeaderSize)) + (ObjStackTopx << 2)); @@ -31383,7 +31383,9 @@ numTracedWeaklings = size; if (((GIV(unscannedEphemerons).top)) == ((GIV(unscannedEphemerons).start))) { markAndTraceUntracedReachableStackPages(); + /* begin markAndTraceMachineCodeOfMarkedMethods */ freeUntracedStackPages(); + /* begin freeUnmarkedMachineCode */ return; } if (!(markInactiveEphemerons())) {
Modified: branches/Cog/nsspurstacksrc/vm/interp.c =================================================================== --- branches/Cog/nsspurstacksrc/vm/interp.c 2014-03-13 22:38:52 UTC (rev 2880) +++ branches/Cog/nsspurstacksrc/vm/interp.c 2014-03-14 00:45:37 UTC (rev 2881) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 from - StackInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 + StackInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.640 uuid: b52d099d-350b-40ce-8ef3-0bbf96ca7539 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.641 uuid: c0305b66-db2d-45aa-8d25-267732aa1784 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1983,7 +1983,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreter_VMMaker.oscog-eem.640"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreter_VMMaker.oscog-eem.641"; volatile int sendTrace;
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org