Commit 59fab02e authored by whesse@chromium.org's avatar whesse@chromium.org

Implement constructor and destructor of 64-bit assembler

Review URL: http://codereview.chromium.org/113631

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2014 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 01bc6d10
......@@ -288,7 +288,7 @@ static void InitCoverageLog();
#endif
// spare_buffer_
static byte* spare_buffer_ = NULL;
byte* Assembler::spare_buffer_ = NULL;
Assembler::Assembler(void* buffer, int buffer_size) {
if (buffer == NULL) {
......@@ -368,7 +368,7 @@ void Assembler::GetCode(CodeDesc* desc) {
}
void Assembler::Align(int m) {
void Assembler::Align(intptr_t m) {
ASSERT(IsPowerOf2(m));
while ((pc_offset() & (m - 1)) != 0) {
nop();
......
......@@ -815,6 +815,8 @@ class Assembler : public Malloced {
int buffer_size_;
// True if the assembler owns the buffer, false if buffer is external.
bool own_buffer_;
// A previously allocated buffer of kMinimalBufferSize bytes, or NULL.
static byte* spare_buffer_;
// code generation
byte* pc_; // the program counter; moves forward
......
......@@ -77,13 +77,96 @@ void ArgumentsAccessStub::GenerateReadLength(MacroAssembler* a) {
UNIMPLEMENTED();
}
Assembler::Assembler(void* a, int b) {
UNIMPLEMENTED();
// -----------------------------------------------------------------------------
// Implementation of Assembler
byte* Assembler::spare_buffer_ = NULL;
Assembler::Assembler(void* buffer, int buffer_size) {
if (buffer == NULL) {
// do our own buffer management
if (buffer_size <= kMinimalBufferSize) {
buffer_size = kMinimalBufferSize;
if (spare_buffer_ != NULL) {
buffer = spare_buffer_;
spare_buffer_ = NULL;
}
}
if (buffer == NULL) {
buffer_ = NewArray<byte>(buffer_size);
} else {
buffer_ = static_cast<byte*>(buffer);
}
buffer_size_ = buffer_size;
own_buffer_ = true;
} else {
// use externally provided buffer instead
ASSERT(buffer_size > 0);
buffer_ = static_cast<byte*>(buffer);
buffer_size_ = buffer_size;
own_buffer_ = false;
}
// Clear the buffer in debug mode unless it was provided by the
// caller in which case we can't be sure it's okay to overwrite
// existing code in it; see CodePatcher::CodePatcher(...).
#ifdef DEBUG
if (own_buffer_) {
memset(buffer_, 0xCC, buffer_size); // int3
}
#endif
// setup buffer pointers
ASSERT(buffer_ != NULL);
pc_ = buffer_;
reloc_info_writer.Reposition(buffer_ + buffer_size, pc_);
last_pc_ = NULL;
current_statement_position_ = RelocInfo::kNoPosition;
current_position_ = RelocInfo::kNoPosition;
written_statement_position_ = current_statement_position_;
written_position_ = current_position_;
#ifdef GENERATED_CODE_COVERAGE
InitCoverageLog();
#endif
}
Assembler::~Assembler() {
if (own_buffer_) {
if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) {
spare_buffer_ = buffer_;
} else {
DeleteArray(buffer_);
}
}
}
void Assembler::GetCode(CodeDesc* desc) {
// finalize code
// (at this point overflow() may be true, but the gap ensures that
// we are still not overlapping instructions and relocation info)
ASSERT(pc_ <= reloc_info_writer.pos()); // no overlap
// setup desc
desc->buffer = buffer_;
desc->buffer_size = buffer_size_;
desc->instr_size = pc_offset();
desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos();
desc->origin = this;
Counters::reloc_info_size.Increment(desc->reloc_size);
}
void Assembler::Align(int m) {
ASSERT(IsPowerOf2(m));
while ((pc_offset() & (m - 1)) != 0) {
nop();
}
}
void Assembler::GetCode(CodeDesc* a) {
UNIMPLEMENTED();
}
void Assembler::RecordComment(char const* a) {
UNIMPLEMENTED();
......@@ -101,10 +184,6 @@ void Assembler::bind(Label* a) {
UNIMPLEMENTED();
}
Assembler::~Assembler() {
UNIMPLEMENTED();
}
void Assembler::nop() {
UNIMPLEMENTED();
......
......@@ -877,6 +877,8 @@ class Assembler : public Malloced {
int buffer_size_;
// True if the assembler owns the buffer, false if buffer is external.
bool own_buffer_;
// A previously allocated buffer of kMinimalBufferSize bytes, or NULL.
static byte* spare_buffer_;
// code generation
byte* pc_; // the program counter; moves forward
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment