Skip to content

Commit

Permalink
Runtime compressed refs work
Browse files Browse the repository at this point in the history
Signed-off-by: Graham Chapman <[email protected]>
  • Loading branch information
gacholio committed Jun 10, 2019
1 parent daa8b14 commit da8977f
Show file tree
Hide file tree
Showing 4 changed files with 164 additions and 81 deletions.
4 changes: 4 additions & 0 deletions gc/base/EnvironmentBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,10 @@ class MM_EnvironmentBase : public MM_BaseVirtual
return getExtensions()->getObjectAlignmentInBytes();
}

/**
* Return back true if object references are compressed
* @return true, if object references are compressed
*/
MMINLINE bool compressObjectReferences() {
#if defined(OMR_GC_COMPRESSED_POINTERS)
#if defined(OMR_GC_FULL_POINTERS)
Expand Down
4 changes: 4 additions & 0 deletions gc/base/GCExtensionsBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -826,6 +826,10 @@ class MM_GCExtensionsBase : public MM_BaseVirtual {
*/
MMINLINE OMR::GC::Forge* getForge() { return &_forge; }

/**
* Return back true if object references are compressed
* @return true, if object references are compressed
*/
MMINLINE bool compressObjectReferences() {
#if defined(OMR_GC_COMPRESSED_POINTERS)
#if defined(OMR_GC_FULL_POINTERS)
Expand Down
233 changes: 156 additions & 77 deletions gc/base/ObjectModelBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ class GC_ObjectModelBase : public MM_BaseVirtual
* Member data and types
*/
private:
#if defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS)
bool _compressObjectReferences;
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS) */
GC_ObjectModelDelegate _delegate; /**< instance of object model delegate class */

protected:
Expand Down Expand Up @@ -122,6 +125,24 @@ class GC_ObjectModelBase : public MM_BaseVirtual
}

public:
/**
* Return back true if object references are compressed
* @return true, if object references are compressed
*/
MMINLINE bool
compressObjectReferences()
{
#if defined(OMR_GC_COMPRESSED_POINTERS)
#if defined(OMR_GC_FULL_POINTERS)
return _compressObjectReferences;
#else /* OMR_GC_FULL_POINTERS */
return true;
#endif /* OMR_GC_FULL_POINTERS */
#else /* OMR_GC_COMPRESSED_POINTERS */
return false;
#endif /* OMR_GC_COMPRESSED_POINTERS */
}

/**
* Initialize the receiver, a new instance of GC_ObjectModel
*
Expand Down Expand Up @@ -323,6 +344,9 @@ class GC_ObjectModelBase : public MM_BaseVirtual
MMINLINE void
setObjectAlignment(OMR_VM *omrVM)
{
#if defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS)
_compressObjectReferences = OMRVM_COMPRESS_OBJECT_REFERENCES(omrVM);
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) && defined(OMR_GC_FULL_POINTERS) */
_objectAlignmentInBytes = OMR_MAX((uintptr_t)1 << omrVM->_compressedPointersShift, OMR_MINIMUM_OBJECT_ALIGNMENT);
_objectAlignmentShift = OMR_MAX(omrVM->_compressedPointersShift, OMR_MINIMUM_OBJECT_ALIGNMENT_SHIFT);

Expand Down Expand Up @@ -472,26 +496,39 @@ class GC_ObjectModelBase : public MM_BaseVirtual
Assert_MM_true(0 == (~(fomrobject_t)OMR_OBJECT_METADATA_FLAGS_MASK & bitsToSet));
#endif /* defined(OBJECT_MODEL_MODRON_ASSERTIONS) */

volatile fomrobject_t* flagsPtr = getObjectHeaderSlotAddress(objectPtr);
fomrobject_t clear = (fomrobject_t)(bitsToClear << getObjectHeaderSlotFlagsShift());
fomrobject_t set = (fomrobject_t)(bitsToSet << getObjectHeaderSlotFlagsShift());
fomrobject_t oldFlags;
fomrobject_t newFlags;

do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~clear) | set;

if (newFlags == oldFlags) {
result = false;
break;
}
if (compressObjectReferences()) {
volatile uint32_t* flagsPtr = (uint32_t*)getObjectHeaderSlotAddress(objectPtr);
uint32_t clear = (uint32_t)(bitsToClear << getObjectHeaderSlotFlagsShift());
uint32_t set = (uint32_t)(bitsToSet << getObjectHeaderSlotFlagsShift());
uint32_t oldFlags;
uint32_t newFlags;

do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~clear) | set;

if (newFlags == oldFlags) {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
} else {
volatile uintptr_t* flagsPtr = (uintptr_t*)getObjectHeaderSlotAddress(objectPtr);
uintptr_t clear = (uintptr_t)(bitsToClear << getObjectHeaderSlotFlagsShift());
uintptr_t set = (uintptr_t)(bitsToSet << getObjectHeaderSlotFlagsShift());
uintptr_t oldFlags;
uintptr_t newFlags;

do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~clear) | set;

if (newFlags == oldFlags) {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, oldFlags, newFlags));
}
#if defined(OMR_GC_COMPRESSED_POINTERS)
while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
#else /* defined(OMR_GC_COMPRESSED_POINTERS) */
while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, (uintptr_t)oldFlags, (uintptr_t)newFlags));
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) */

return result;
}
Expand Down Expand Up @@ -573,27 +610,41 @@ class GC_ObjectModelBase : public MM_BaseVirtual
Assert_MM_true(0 == (~(fomrobject_t)OMR_OBJECT_METADATA_FLAGS_MASK & toState));
#endif /* defined(OBJECT_MODEL_MODRON_ASSERTIONS) */

volatile fomrobject_t* flagsPtr = getObjectHeaderSlotAddress(objectPtr);
fomrobject_t from = (fomrobject_t)(fromState << getObjectHeaderSlotFlagsShift());
fomrobject_t to = (fomrobject_t)(toState << getObjectHeaderSlotFlagsShift());
fomrobject_t rememberedMask = (fomrobject_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
fomrobject_t oldFlags;
fomrobject_t newFlags;

do {
oldFlags = *flagsPtr;
if ((oldFlags & rememberedMask) == from) {
newFlags = (oldFlags & ~rememberedMask) | to;
} else {
result = false;
break;
}
if (compressObjectReferences()) {
volatile uint32_t* flagsPtr = (uint32_t*)getObjectHeaderSlotAddress(objectPtr);
uint32_t from = (uint32_t)(fromState << getObjectHeaderSlotFlagsShift());
uint32_t to = (uint32_t)(toState << getObjectHeaderSlotFlagsShift());
uint32_t rememberedMask = (uint32_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uint32_t oldFlags;
uint32_t newFlags;

do {
oldFlags = *flagsPtr;
if ((oldFlags & rememberedMask) == from) {
newFlags = (oldFlags & ~rememberedMask) | to;
} else {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
} else {
volatile uintptr_t* flagsPtr = (uintptr_t*)getObjectHeaderSlotAddress(objectPtr);
uintptr_t from = (uintptr_t)(fromState << getObjectHeaderSlotFlagsShift());
uintptr_t to = (uintptr_t)(toState << getObjectHeaderSlotFlagsShift());
uintptr_t rememberedMask = (uintptr_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uintptr_t oldFlags;
uintptr_t newFlags;

do {
oldFlags = *flagsPtr;
if ((oldFlags & rememberedMask) == from) {
newFlags = (oldFlags & ~rememberedMask) | to;
} else {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, oldFlags, newFlags));
}
#if defined(OMR_GC_COMPRESSED_POINTERS)
while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
#else /* defined(OMR_GC_COMPRESSED_POINTERS) */
while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, (uintptr_t)oldFlags, (uintptr_t)newFlags));
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) */

return result;
}
Expand All @@ -618,29 +669,45 @@ class GC_ObjectModelBase : public MM_BaseVirtual
Assert_MM_true(0 == (~(fomrobject_t)OMR_OBJECT_METADATA_FLAGS_MASK & toState));
#endif /* defined(OBJECT_MODEL_MODRON_ASSERTIONS) */

volatile fomrobject_t* flagsPtr = getObjectHeaderSlotAddress(objectPtr);
fomrobject_t to = (fomrobject_t)(toState << getObjectHeaderSlotFlagsShift());
fomrobject_t rememberedMask = (fomrobject_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
fomrobject_t oldFlags;
fomrobject_t newFlags;

do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~rememberedMask) | to;
if (compressObjectReferences()) {
volatile uint32_t* flagsPtr = (uint32_t*)getObjectHeaderSlotAddress(objectPtr);
uint32_t to = (uint32_t)(toState << getObjectHeaderSlotFlagsShift());
uint32_t rememberedMask = (uint32_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uint32_t oldFlags;
uint32_t newFlags;

if (newFlags == oldFlags) {
result = false;
break;
}
do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~rememberedMask) | to;

if (newFlags == oldFlags) {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
/* check to verify that this thread and no other thread atomically set flags -> toState */
result = result && (0 == (oldFlags & rememberedMask));
} else {
volatile uintptr_t* flagsPtr = (uintptr_t*)getObjectHeaderSlotAddress(objectPtr);
uintptr_t to = (uintptr_t)(toState << getObjectHeaderSlotFlagsShift());
uintptr_t rememberedMask = (uintptr_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uintptr_t oldFlags;
uintptr_t newFlags;

do {
oldFlags = *flagsPtr;
newFlags = (oldFlags & ~rememberedMask) | to;

if (newFlags == oldFlags) {
result = false;
break;
}
} while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, (uintptr_t)oldFlags, (uintptr_t)newFlags));
/* check to verify that this thread and no other thread atomically set flags -> toState */
result = result && (0 == (oldFlags & rememberedMask));
}
#if defined(OMR_GC_COMPRESSED_POINTERS)
while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
#else /* defined(OMR_GC_COMPRESSED_POINTERS) */
while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, (uintptr_t)oldFlags, (uintptr_t)newFlags));
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) */

/* check to verify that this thread and no other thread atomically set flags -> toState */
return result ? (0 == (oldFlags & rememberedMask)) : false;
return result;
}

/**
Expand All @@ -663,25 +730,37 @@ class GC_ObjectModelBase : public MM_BaseVirtual
Assert_MM_true(0 == (~(fomrobject_t)OMR_OBJECT_METADATA_FLAGS_MASK & toState));
#endif /* defined(OBJECT_MODEL_MODRON_ASSERTIONS) */

volatile fomrobject_t* flagsPtr = getObjectHeaderSlotAddress(objectPtr);
fomrobject_t to = (fomrobject_t)(toState << getObjectHeaderSlotFlagsShift());
fomrobject_t rememberedMask = (fomrobject_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
fomrobject_t oldFlags;
fomrobject_t newFlags;

do {
oldFlags = *flagsPtr;
if (0 != (oldFlags & rememberedMask)) {
result = false;
break;
}
newFlags = (oldFlags & ~rememberedMask) | to;
if (compressObjectReferences()) {
volatile uint32_t* flagsPtr = (uint32_t*)getObjectHeaderSlotAddress(objectPtr);
uint32_t to = (uint32_t)(toState << getObjectHeaderSlotFlagsShift());
uint32_t rememberedMask = (uint32_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uint32_t oldFlags;
uint32_t newFlags;

do {
oldFlags = *flagsPtr;
if (0 != (oldFlags & rememberedMask)) {
result = false;
break;
}
newFlags = (oldFlags & ~rememberedMask) | to;
} while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
} else {
volatile uintptr_t* flagsPtr = (uintptr_t*)getObjectHeaderSlotAddress(objectPtr);
uintptr_t to = (uintptr_t)(toState << getObjectHeaderSlotFlagsShift());
uintptr_t rememberedMask = (uintptr_t)(OMR_OBJECT_METADATA_REMEMBERED_BITS << getObjectHeaderSlotFlagsShift());
uintptr_t oldFlags;
uintptr_t newFlags;

do {
oldFlags = *flagsPtr;
if (0 != (oldFlags & rememberedMask)) {
result = false;
break;
}
newFlags = (oldFlags & ~rememberedMask) | to;
} while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, oldFlags, newFlags));
}
#if defined(OMR_GC_COMPRESSED_POINTERS)
while (oldFlags != MM_AtomicOperations::lockCompareExchangeU32(flagsPtr, oldFlags, newFlags));
#else /* defined(OMR_GC_COMPRESSED_POINTERS) */
while (oldFlags != MM_AtomicOperations::lockCompareExchange(flagsPtr, (uintptr_t)oldFlags, (uintptr_t)newFlags));
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) */

return result;
}
Expand Down
4 changes: 0 additions & 4 deletions gc/structs/ForwardedHeader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,6 @@
#include "HeapLinkedFreeHeader.hpp"


#if defined(OMR_GC_COMPRESSED_POINTERS) != defined(OMR_GC_COMPRESSED_POINTERS)
#error "MutableHeaderFields requires sizeof(fomrobject_t) == sizeof(j9objectclass_t)"
#endif /* defined(OMR_GC_COMPRESSED_POINTERS) != defined(OMR_GC_COMPRESSED_POINTERS) */

/* Source object header bits */
#define OMR_FORWARDED_TAG 4
/* If 'being copied hint' is set, it hints that destination might still be being copied (although it might have just completed).
Expand Down

0 comments on commit da8977f

Please sign in to comment.