Files
sdk/runtime/vm/disassembler.cc
T
dgrove@google.com 4c0f559d23 Initial checkin.
git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@15 260f80e4-7a28-3924-810f-c04153c831b5
2011-10-05 05:20:07 +00:00

86 lines
3.1 KiB
C++

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
#include "vm/disassembler.h"
#include "vm/assembler.h"
#include "vm/globals.h"
#include "vm/os.h"
namespace dart {
void DisassembleToStdout::ConsumeInstruction(char* hex_buffer,
intptr_t hex_size,
char* human_buffer,
intptr_t human_size,
uword pc) {
static const int kHexColumnWidth = 18;
uint8_t* pc_ptr = reinterpret_cast<uint8_t*>(pc);
OS::Print("%p %s", pc_ptr, hex_buffer);
int hex_length = strlen(hex_buffer);
if (hex_length < kHexColumnWidth) {
for (int i = kHexColumnWidth - hex_length; i > 0; i--) {
OS::Print(" ");
}
}
OS::Print("%s", human_buffer);
OS::Print("\n");
}
void Disassembler::Disassemble(uword start,
uword end,
DisassemblyFormatter* formatter) {
ASSERT(formatter != NULL);
char hex_buffer[kHexadecimalBufferSize]; // Instruction in hexadecimal form.
char human_buffer[kUserReadableBufferSize]; // Human-readable instruction.
uword pc = start;
while (pc < end) {
int instruction_length = DecodeInstruction(hex_buffer,
sizeof(hex_buffer),
human_buffer,
sizeof(human_buffer),
pc);
formatter->ConsumeInstruction(hex_buffer,
sizeof(hex_buffer),
human_buffer,
sizeof(human_buffer),
pc);
pc += instruction_length;
}
}
void Disassembler::DisassembleMemoryRegionRange(
const MemoryRegion& instructions,
uword from,
uword to,
DisassemblyFormatter *formatter) {
ASSERT(formatter != NULL);
char hex_buffer[kHexadecimalBufferSize]; // Instruction in hexadecimal form.
char human_buffer[kUserReadableBufferSize]; // Human-readable instruction.
uword start = instructions.start();
uword end = instructions.end();
ASSERT((from >= start) && (to <= end) && (from <= to));
uword pc = start;
uword stop = Utils::Minimum(end, to);
while (pc < stop) {
int instruction_length = DecodeInstruction(hex_buffer,
sizeof(hex_buffer),
human_buffer,
sizeof(human_buffer),
pc);
if (pc >= from) {
formatter->ConsumeInstruction(hex_buffer,
sizeof(hex_buffer),
human_buffer,
sizeof(human_buffer),
pc);
}
pc += instruction_length;
}
}
} // namespace dart