blob: 0af45c662b459ae7ef464cb73fd19dad16fc12d3 [file] [log] [blame]
// Copyright 2011 Google Inc. All Rights Reserved.
#ifndef ART_SRC_IMAGE_H_
#define ART_SRC_IMAGE_H_
#include <cstddef>
#include <stdint.h>
#include "mem_map.h"
#include "object.h"
#include "os.h"
#include "scoped_ptr.h"
namespace art {
// Write a Space built during compilation for use during execution.
class ImageWriter {
public:
ImageWriter() : image_top_(0), image_base_(NULL) {};
bool Write(Space* space, const char* filename, byte* image_base);
~ImageWriter() {};
private:
bool Init(Space* space);
// we use the lock word to store the offset of the object in the image
void SetImageOffset(Object* object, size_t offset) {
DCHECK(object != NULL);
DCHECK(object->monitor_ == NULL); // should be no lock
DCHECK_NE(0U, offset);
object->monitor_ = reinterpret_cast<Monitor*>(offset);
}
size_t GetImageOffset(const Object* object) {
DCHECK(object != NULL);
size_t offset = reinterpret_cast<size_t>(object->monitor_);
DCHECK_NE(0U, offset);
return offset;
}
Object* GetImageAddress(const Object* object) {
if (object == NULL) {
return NULL;
}
return reinterpret_cast<Object*>(image_base_ + GetImageOffset(object));
}
void CalculateNewObjectOffsets();
static void CalculateNewObjectOffsetsCallback(Object *obj, void *arg);
void CopyAndFixupObjects();
static void CopyAndFixupObjectsCallback(Object *obj, void *arg);
void FixupObject(Object* orig, Object* copy);
void FixupObjectArray(ObjectArray<Object>* orig, ObjectArray<Object>* copy);
void FixupInstanceFields(Object* orig, Object* copy);
// memory mapped for generating the image
scoped_ptr<MemMap> image_;
// Offset to the free space in image_
size_t image_top_;
// Target base address for the output image
byte* image_base_;
};
} // namespace art
#endif // ART_SRC_IMAGE_H_