blob: 82a695e226d0bbadc9470965884de409b210bde8 [file] [log] [blame]
//===---- ObjectModel.cpp - Implementation of the ObjectModel class ------===//
//
// The VMKit project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "vmkit/System.h"
#include "vmkit/VirtualMachine.h"
#include "MMTkObject.h"
#include "debug.h"
namespace mmtk {
extern "C" word_t Java_org_j3_mmtk_ObjectModel_getArrayBaseOffset__ (MMTkObject* OM) {
return sizeof(MMTkObject) + sizeof(ssize_t);
}
extern "C" word_t Java_org_j3_mmtk_ObjectModel_GC_1HEADER_1OFFSET__ (MMTkObject* OM) {
return 0;
}
extern "C" word_t Java_org_j3_mmtk_ObjectModel_readAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
return obj->header();
}
extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableBitsWord__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2 (
MMTkObject* OM, gc* obj, word_t val) {
llvm_gcroot(obj, 0);
obj->header() = val;
}
extern "C" gcHeader* Java_org_j3_mmtk_ObjectModel_objectStartRef__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
llvm_gcroot(obj, 0);
return obj ? obj->toHeader() : 0;
}
extern "C" gcHeader* Java_org_j3_mmtk_ObjectModel_refToAddress__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
llvm_gcroot(obj, 0);
return obj ? obj->toHeader() : 0;
}
extern "C" uint8_t Java_org_j3_mmtk_ObjectModel_readAvailableByte__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
llvm_gcroot(obj, 0);
return *vmkit::System::GetLastBytePtr(reinterpret_cast<word_t>(&(obj->header())));
}
extern "C" void Java_org_j3_mmtk_ObjectModel_writeAvailableByte__Lorg_vmmagic_unboxed_ObjectReference_2B (MMTkObject* OM, gc* obj, uint8_t val) {
llvm_gcroot(obj, 0);
*vmkit::System::GetLastBytePtr(reinterpret_cast<word_t>(&(obj->header()))) = val;
}
extern "C" gc* Java_org_j3_mmtk_ObjectModel_getObjectFromStartAddress__Lorg_vmmagic_unboxed_Address_2 (MMTkObject* OM, gcHeader* obj) {
return obj ? obj->toReference() : 0;
}
extern "C" word_t Java_org_j3_mmtk_ObjectModel_prepareAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2 (MMTkObject* OM, gc* obj) {
llvm_gcroot(obj, 0);
return obj->header();
}
extern "C" uint8_t
Java_org_j3_mmtk_ObjectModel_attemptAvailableBits__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Word_2Lorg_vmmagic_unboxed_Word_2(
MMTkObject* OM, gc* obj, word_t oldValue, word_t newValue) {
llvm_gcroot(obj, 0);
word_t val = __sync_val_compare_and_swap(&(obj->header()), oldValue, newValue);
return (val == oldValue);
}
extern "C" void Java_org_j3_bindings_Bindings_setType__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2(
gc* obj, void* type) ALWAYS_INLINE;
extern "C" void Java_org_j3_bindings_Bindings_setType__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2(
gc* obj, void* type) {
llvm_gcroot(obj, 0);
vmkit::Thread::get()->MyVM->setType(obj, type);
}
extern "C" int Java_org_j3_bindings_Bindings_hiddenHeaderSize__() ALWAYS_INLINE;
extern "C" int Java_org_j3_bindings_Bindings_hiddenHeaderSize__() {
return gcHeader::hiddenHeaderSize();
}
extern "C" void Java_org_j3_bindings_Bindings_memcpy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(
void* res, void* src, int size) ALWAYS_INLINE;
extern "C" void Java_org_j3_bindings_Bindings_memcpy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(
void* res, void* src, int size) {
memcpy(res, src, size);
}
extern "C" void Java_org_j3_bindings_Bindings_memcpy__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_Address_2I(
void* res, void* src, int size) ALWAYS_INLINE;
extern "C" void Java_org_j3_bindings_Bindings_memcpy__Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_Address_2I(
void* res, void* src, int size) {
memcpy(res, src, size);
}
extern "C" word_t JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(
gc* obj, void* type, int size, int allocator);
extern "C" word_t Java_org_j3_mmtk_ObjectModel_copy__Lorg_vmmagic_unboxed_ObjectReference_2I (
MMTkObject* OM, gc* src, int allocator) ALWAYS_INLINE;
extern "C" word_t Java_org_j3_mmtk_ObjectModel_copy__Lorg_vmmagic_unboxed_ObjectReference_2I (
MMTkObject* OM, gc* src, int allocator) {
gc* res = NULL;
llvm_gcroot(res, 0);
llvm_gcroot(src, 0);
size_t size = vmkit::Thread::get()->MyVM->getObjectSize(src);
size = llvm::RoundUpToAlignment(size, sizeof(void*));
res = (gc*)JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(
src, vmkit::Thread::get()->MyVM->getType(src), size, allocator);
assert((res->header() & ~vmkit::GCBitMask) == (src->header() & ~vmkit::GCBitMask));
return (word_t)res;
}
extern "C" void Java_org_j3_mmtk_ObjectModel_copyTo__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2 (
MMTkObject* OM, word_t from, word_t to, word_t region) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_getReferenceWhenCopiedTo__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2 (
MMTkObject* OM, word_t from, word_t to) { UNIMPLEMENTED(); }
extern "C" word_t Java_org_j3_mmtk_ObjectModel_getObjectEndAddress__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, gc* object) {
llvm_gcroot(object, 0);
size_t size = vmkit::Thread::get()->MyVM->getObjectSize(object);
size = llvm::RoundUpToAlignment(size, sizeof(void*));
return reinterpret_cast<word_t>(object) + size;
}
extern "C" void Java_org_j3_mmtk_ObjectModel_getSizeWhenCopied__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_getAlignWhenCopied__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_getAlignOffsetWhenCopied__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_getCurrentSize__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_getNextObject__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
class FakeByteArray : public MMTkObject {
public:
void* operator new(size_t size, int length) {
return new char[size + length];
}
FakeByteArray(const char* name) {
length = strlen(name);
for (uint32 i = 0; i < length; i++) {
elements[i] = name[i];
}
}
private:
size_t length;
uint8_t elements[1];
};
extern "C" FakeByteArray* Java_org_j3_mmtk_ObjectModel_getTypeDescriptor__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, gc* src) {
llvm_gcroot(src, 0);
const char* name = vmkit::Thread::get()->MyVM->getObjectTypeName(src);
// This code is only used for debugging on a fatal error. It is fine to
// allocate in the C++ heap.
return new (strlen(name)) FakeByteArray(name);
}
extern "C" void Java_org_j3_mmtk_ObjectModel_getArrayLength__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_isArray__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_isPrimitiveArray__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_isAcyclic__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
extern "C" void Java_org_j3_mmtk_ObjectModel_dumpObject__Lorg_vmmagic_unboxed_ObjectReference_2 (
MMTkObject* OM, word_t object) { UNIMPLEMENTED(); }
}