Index: runtime/vm/simulator_mips.cc |
diff --git a/runtime/vm/simulator_mips.cc b/runtime/vm/simulator_mips.cc |
index f42b3fa88066541589a77e12bb5ed3bbdc25f1f3..f65b9ed2da108faf53c0fd04cd40da1c797fe1a8 100644 |
--- a/runtime/vm/simulator_mips.cc |
+++ b/runtime/vm/simulator_mips.cc |
@@ -23,9 +23,13 @@ |
namespace dart { |
-DEFINE_FLAG(uint64_t, trace_sim_after, ULLONG_MAX, |
+DEFINE_FLAG(uint64_t, |
+ trace_sim_after, |
+ ULLONG_MAX, |
"Trace simulator execution after instruction count reached."); |
-DEFINE_FLAG(uint64_t, stop_sim_at, ULLONG_MAX, |
+DEFINE_FLAG(uint64_t, |
+ stop_sim_at, |
+ ULLONG_MAX, |
"Instruction address or instruction count to stop simulator at."); |
@@ -95,7 +99,9 @@ class SimulatorDebugger { |
static TokenPosition GetApproximateTokenIndex(const Code& code, uword pc); |
- static void PrintDartFrame(uword pc, uword fp, uword sp, |
+ static void PrintDartFrame(uword pc, |
+ uword fp, |
+ uword sp, |
const Function& function, |
TokenPosition token_pos, |
bool is_optimized, |
@@ -118,8 +124,7 @@ SimulatorDebugger::SimulatorDebugger(Simulator* sim) { |
} |
-SimulatorDebugger::~SimulatorDebugger() { |
-} |
+SimulatorDebugger::~SimulatorDebugger() {} |
void SimulatorDebugger::Stop(Instr* instr, const char* message) { |
@@ -130,43 +135,23 @@ void SimulatorDebugger::Stop(Instr* instr, const char* message) { |
static Register LookupCpuRegisterByName(const char* name) { |
static const char* kNames[] = { |
- "r0", "r1", "r2", "r3", |
- "r4", "r5", "r6", "r7", |
- "r8", "r9", "r10", "r11", |
- "r12", "r13", "r14", "r15", |
- "r16", "r17", "r18", "r19", |
- "r20", "r21", "r22", "r23", |
- "r24", "r25", "r26", "r27", |
- "r28", "r29", "r30", "r31", |
- |
- "zr", "at", "v0", "v1", |
- "a0", "a1", "a2", "a3", |
- "t0", "t1", "t2", "t3", |
- "t4", "t5", "t6", "t7", |
- "s0", "s1", "s2", "s3", |
- "s4", "s5", "s6", "s7", |
- "t8", "t9", "k0", "k1", |
- "gp", "sp", "fp", "ra" |
- }; |
+ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", |
+ "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", |
+ "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", |
+ "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31", |
+ |
+ "zr", "at", "v0", "v1", "a0", "a1", "a2", "a3", |
+ "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", |
+ "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", |
+ "t8", "t9", "k0", "k1", "gp", "sp", "fp", "ra"}; |
static const Register kRegisters[] = { |
- R0, R1, R2, R3, |
- R4, R5, R6, R7, |
- R8, R9, R10, R11, |
- R12, R13, R14, R15, |
- R16, R17, R18, R19, |
- R20, R21, R22, R23, |
- R24, R25, R26, R27, |
- R28, R29, R30, R31, |
- |
- ZR, AT, V0, V1, |
- A0, A1, A2, A3, |
- T0, T1, T2, T3, |
- T4, T5, T6, T7, |
- S0, S1, S2, S3, |
- S4, S5, S6, S7, |
- T8, T9, K0, K1, |
- GP, SP, FP, RA |
- }; |
+ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, R10, |
+ R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, |
+ R22, R23, R24, R25, R26, R27, R28, R29, R30, R31, |
+ |
+ ZR, AT, V0, V1, A0, A1, A2, A3, T0, T1, T2, |
+ T3, T4, T5, T6, T7, S0, S1, S2, S3, S4, S5, |
+ S6, S7, T8, T9, K0, K1, GP, SP, FP, RA}; |
ASSERT(ARRAY_SIZE(kNames) == ARRAY_SIZE(kRegisters)); |
for (unsigned i = 0; i < ARRAY_SIZE(kNames); i++) { |
if (strcmp(kNames[i], name) == 0) { |
@@ -256,7 +241,7 @@ bool SimulatorDebugger::GetDValue(char* desc, double* value) { |
TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code, |
- uword pc) { |
+ uword pc) { |
TokenPosition token_pos = TokenPosition::kNoSource; |
uword pc_offset = pc - code.PayloadStart(); |
const PcDescriptors& descriptors = |
@@ -273,7 +258,9 @@ TokenPosition SimulatorDebugger::GetApproximateTokenIndex(const Code& code, |
} |
-void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp, |
+void SimulatorDebugger::PrintDartFrame(uword pc, |
+ uword fp, |
+ uword sp, |
const Function& function, |
TokenPosition token_pos, |
bool is_optimized, |
@@ -286,19 +273,15 @@ void SimulatorDebugger::PrintDartFrame(uword pc, uword fp, uword sp, |
if (token_pos.IsReal()) { |
script.GetTokenLocation(token_pos, &line, &column); |
} |
- OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd |
- ":%" Pd ")\n", |
- pc, fp, sp, |
- is_optimized ? (is_inlined ? "inlined " : "optimized ") : "", |
- func_name.ToCString(), |
- url.ToCString(), |
- line, column); |
+ OS::Print( |
+ "pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s%s (%s:%" Pd ":%" Pd ")\n", pc, |
+ fp, sp, is_optimized ? (is_inlined ? "inlined " : "optimized ") : "", |
+ func_name.ToCString(), url.ToCString(), line, column); |
} |
void SimulatorDebugger::PrintBacktrace() { |
- StackFrameIterator frames(sim_->get_register(FP), |
- sim_->get_register(SP), |
+ StackFrameIterator frames(sim_->get_register(FP), sim_->get_register(SP), |
sim_->get_pc(), |
StackFrameIterator::kDontValidateFrames); |
StackFrame* frame = frames.NextFrame(); |
@@ -323,25 +306,25 @@ void SimulatorDebugger::PrintBacktrace() { |
uword unoptimized_pc = it.pc(); |
it.Advance(); |
if (!it.Done()) { |
- PrintDartFrame(unoptimized_pc, frame->fp(), frame->sp(), |
- inlined_function, |
- GetApproximateTokenIndex(unoptimized_code, |
- unoptimized_pc), |
- true, true); |
+ PrintDartFrame( |
+ unoptimized_pc, frame->fp(), frame->sp(), inlined_function, |
+ GetApproximateTokenIndex(unoptimized_code, unoptimized_pc), |
+ true, true); |
} |
} |
// Print the optimized inlining frame below. |
} |
- PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), |
- function, |
+ PrintDartFrame(frame->pc(), frame->fp(), frame->sp(), function, |
GetApproximateTokenIndex(code, frame->pc()), |
code.is_optimized(), false); |
} else { |
OS::Print("pc=0x%" Px " fp=0x%" Px " sp=0x%" Px " %s frame\n", |
frame->pc(), frame->fp(), frame->sp(), |
- frame->IsEntryFrame() ? "entry" : |
- frame->IsExitFrame() ? "exit" : |
- frame->IsStubFrame() ? "stub" : "invalid"); |
+ frame->IsEntryFrame() |
+ ? "entry" |
+ : frame->IsExitFrame() |
+ ? "exit" |
+ : frame->IsStubFrame() ? "stub" : "invalid"); |
} |
frame = frames.NextFrame(); |
} |
@@ -436,24 +419,25 @@ void SimulatorDebugger::Debug() { |
"%" XSTR(ARG_SIZE) "s", |
cmd, arg1, arg2); |
if ((strcmp(cmd, "h") == 0) || (strcmp(cmd, "help") == 0)) { |
- OS::Print("c/cont -- continue execution\n" |
- "disasm -- disassemble instrs at current pc location\n" |
- " other variants are:\n" |
- " disasm <address>\n" |
- " disasm <address> <number_of_instructions>\n" |
- " by default 10 instrs are disassembled\n" |
- "del -- delete breakpoints\n" |
- "gdb -- transfer control to gdb\n" |
- "h/help -- print this help string\n" |
- "break <address> -- set break point at specified address\n" |
- "p/print <reg or icount or value or *addr> -- print integer\n" |
- "pf/printfloat <freg or *addr> -- print float value\n" |
- "po/printobject <*reg or *addr> -- print object\n" |
- "si/stepi -- single step an instruction\n" |
- "trace -- toggle execution tracing mode\n" |
- "bt -- print backtrace\n" |
- "unstop -- if current pc is a stop instr make it a nop\n" |
- "q/quit -- Quit the debugger and exit the program\n"); |
+ OS::Print( |
+ "c/cont -- continue execution\n" |
+ "disasm -- disassemble instrs at current pc location\n" |
+ " other variants are:\n" |
+ " disasm <address>\n" |
+ " disasm <address> <number_of_instructions>\n" |
+ " by default 10 instrs are disassembled\n" |
+ "del -- delete breakpoints\n" |
+ "gdb -- transfer control to gdb\n" |
+ "h/help -- print this help string\n" |
+ "break <address> -- set break point at specified address\n" |
+ "p/print <reg or icount or value or *addr> -- print integer\n" |
+ "pf/printfloat <freg or *addr> -- print float value\n" |
+ "po/printobject <*reg or *addr> -- print object\n" |
+ "si/stepi -- single step an instruction\n" |
+ "trace -- toggle execution tracing mode\n" |
+ "bt -- print backtrace\n" |
+ "unstop -- if current pc is a stop instr make it a nop\n" |
+ "q/quit -- Quit the debugger and exit the program\n"); |
} else if ((strcmp(cmd, "quit") == 0) || (strcmp(cmd, "q") == 0)) { |
OS::Print("Quitting\n"); |
OS::Exit(0); |
@@ -478,14 +462,13 @@ void SimulatorDebugger::Debug() { |
} else { |
OS::Print("print <reg or icount or value or *addr>\n"); |
} |
- } else if ((strcmp(cmd, "pf") == 0) || |
- (strcmp(cmd, "printfloat") == 0)) { |
+ } else if ((strcmp(cmd, "pf") == 0) || (strcmp(cmd, "printfloat") == 0)) { |
if (args == 2) { |
double dvalue; |
if (GetFValue(arg1, &dvalue)) { |
uint64_t long_value = bit_cast<uint64_t, double>(dvalue); |
- OS::Print("%s: %llu 0x%llx %.8g\n", |
- arg1, long_value, long_value, dvalue); |
+ OS::Print("%s: %llu 0x%llx %.8g\n", arg1, long_value, long_value, |
+ dvalue); |
} else { |
OS::Print("%s unrecognized\n", arg1); |
} |
@@ -498,8 +481,8 @@ void SimulatorDebugger::Debug() { |
double dvalue; |
if (GetDValue(arg1, &dvalue)) { |
uint64_t long_value = bit_cast<uint64_t, double>(dvalue); |
- OS::Print("%s: %llu 0x%llx %.8g\n", |
- arg1, long_value, long_value, dvalue); |
+ OS::Print("%s: %llu 0x%llx %.8g\n", arg1, long_value, long_value, |
+ dvalue); |
} else { |
OS::Print("%s unrecognized\n", arg1); |
} |
@@ -516,8 +499,8 @@ void SimulatorDebugger::Debug() { |
if (Isolate::Current()->heap()->Contains(value)) { |
OS::Print("%s: \n", arg1); |
#if defined(DEBUG) |
- const Object& obj = Object::Handle( |
- reinterpret_cast<RawObject*>(value)); |
+ const Object& obj = |
+ Object::Handle(reinterpret_cast<RawObject*>(value)); |
obj.Print(); |
#endif // defined(DEBUG) |
} else { |
@@ -640,9 +623,7 @@ char* SimulatorDebugger::ReadLine(const char* prompt) { |
return NULL; |
} |
intptr_t len = strlen(line_buf); |
- if (len > 1 && |
- line_buf[len - 2] == '\\' && |
- line_buf[len - 1] == '\n') { |
+ if (len > 1 && line_buf[len - 2] == '\\' && line_buf[len - 1] == '\n') { |
// When we read a line that ends with a "\" we remove the escape and |
// append the remainder. |
line_buf[len - 2] = '\n'; |
@@ -688,8 +669,8 @@ char* SimulatorDebugger::ReadLine(const char* prompt) { |
// Synchronization primitives support. |
Mutex* Simulator::exclusive_access_lock_ = NULL; |
-Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = |
- {{NULL, 0}}; |
+Simulator::AddressTag Simulator::exclusive_access_state_[kNumAddressTags] = { |
+ {NULL, 0}}; |
int Simulator::next_address_tag_ = 0; |
@@ -706,9 +687,9 @@ Simulator::Simulator() { |
// the size specified by the user and the buffer space needed for |
// handling stack overflow exceptions. To be safe in potential |
// stack underflows we also add some underflow buffer space. |
- stack_ = new char[(OSThread::GetSpecifiedStackSize() + |
- OSThread::kStackSizeBuffer + |
- kSimulatorStackUnderflowSize)]; |
+ stack_ = |
+ new char[(OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer + |
+ kSimulatorStackUnderflowSize)]; |
icount_ = 0; |
delay_slot_ = false; |
break_pc_ = NULL; |
@@ -803,10 +784,9 @@ class Redirection { |
Redirection* list_head = list_; |
do { |
next_ = list_head; |
- list_head = reinterpret_cast<Redirection*>( |
- AtomicOperations::CompareAndSwapWord( |
- reinterpret_cast<uword*>(&list_), |
- reinterpret_cast<uword>(next_), |
+ list_head = |
+ reinterpret_cast<Redirection*>(AtomicOperations::CompareAndSwapWord( |
+ reinterpret_cast<uword*>(&list_), reinterpret_cast<uword>(next_), |
reinterpret_cast<uword>(this))); |
} while (list_head != next_); |
} |
@@ -976,8 +956,8 @@ void Simulator::HandleIllegalAccess(uword addr, Instr* instr) { |
// it will be possible to disassemble the code and inspect registers. |
char buffer[128]; |
snprintf(buffer, sizeof(buffer), |
- "illegal memory access at 0x%" Px ", pc=0x%" Px "\n", |
- addr, fault_pc); |
+ "illegal memory access at 0x%" Px ", pc=0x%" Px "\n", addr, |
+ fault_pc); |
SimulatorDebugger dbg(this); |
dbg.Stop(instr, buffer); |
// The debugger will return control in non-interactive mode. |
@@ -989,8 +969,8 @@ void Simulator::UnalignedAccess(const char* msg, uword addr, Instr* instr) { |
// The debugger will not be able to single step past this instruction, but |
// it will be possible to disassemble the code and inspect registers. |
char buffer[128]; |
- snprintf(buffer, sizeof(buffer), |
- "pc=%p, unaligned %s at 0x%" Px "\n", instr, msg, addr); |
+ snprintf(buffer, sizeof(buffer), "pc=%p, unaligned %s at 0x%" Px "\n", instr, |
+ msg, addr); |
SimulatorDebugger dbg(this); |
dbg.Stop(instr, buffer); |
// The debugger will return control in non-interactive mode. |
@@ -1004,7 +984,7 @@ uword Simulator::StackTop() const { |
// To be safe in potential stack underflows we leave some buffer above and |
// set the stack top. |
return StackBase() + |
- (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer); |
+ (OSThread::GetSpecifiedStackSize() + OSThread::kStackSizeBuffer); |
} |
@@ -1212,8 +1192,10 @@ uint32_t Simulator::CompareExchangeUint32(uint32_t* address, |
typedef void (*SimulatorRuntimeCall)(NativeArguments arguments); |
// Calls to leaf Dart runtime functions are based on this interface. |
-typedef int32_t (*SimulatorLeafRuntimeCall)( |
- int32_t r0, int32_t r1, int32_t r2, int32_t r3); |
+typedef int32_t (*SimulatorLeafRuntimeCall)(int32_t r0, |
+ int32_t r1, |
+ int32_t r2, |
+ int32_t r3); |
// Calls to leaf float Dart runtime functions are based on this interface. |
typedef double (*SimulatorLeafFloatRuntimeCall)(double d0, double d1); |
@@ -1223,7 +1205,7 @@ typedef void (*SimulatorBootstrapNativeCall)(NativeArguments* arguments); |
typedef void (*SimulatorNativeCall)(NativeArguments* arguments, uword target); |
-void Simulator::DoBreak(Instr *instr) { |
+void Simulator::DoBreak(Instr* instr) { |
ASSERT(instr->OpcodeField() == SPECIAL); |
ASSERT(instr->FunctionField() == BREAK); |
if (instr->BreakCodeField() == Instr::kStopMessageCode) { |
@@ -1253,7 +1235,7 @@ void Simulator::DoBreak(Instr *instr) { |
} |
if (redirection->call_kind() == kRuntimeCall) { |
NativeArguments arguments; |
- ASSERT(sizeof(NativeArguments) == 4*kWordSize); |
+ ASSERT(sizeof(NativeArguments) == 4 * kWordSize); |
arguments.thread_ = reinterpret_cast<Thread*>(get_register(A0)); |
arguments.argc_tag_ = get_register(A1); |
arguments.argv_ = reinterpret_cast<RawObject**>(get_register(A2)); |
@@ -1271,7 +1253,7 @@ void Simulator::DoBreak(Instr *instr) { |
SimulatorLeafRuntimeCall target = |
reinterpret_cast<SimulatorLeafRuntimeCall>(external); |
a0 = target(a0, a1, a2, a3); |
- set_register(V0, a0); // Set returned result from function. |
+ set_register(V0, a0); // Set returned result from function. |
set_register(V1, icount_); // Zap second result register. |
} else if (redirection->call_kind() == kLeafFloatRuntimeCall) { |
ASSERT((0 <= redirection->argument_count()) && |
@@ -1424,7 +1406,7 @@ void Simulator::DecodeSpecial(Instr* instr) { |
ASSERT(instr->RsField() != instr->RdField()); |
ASSERT(!delay_slot_); |
// Format(instr, "jalr'hint 'rd, rs"); |
- set_register(instr->RdField(), pc_ + 2*Instr::kInstrSize); |
+ set_register(instr->RdField(), pc_ + 2 * Instr::kInstrSize); |
uword next_pc = get_register(instr->RsField()); |
ExecuteDelaySlot(); |
// Set return address to be the instruction after the delay slot. |
@@ -1547,8 +1529,7 @@ void Simulator::DecodeSpecial(Instr* instr) { |
} |
case SLL: { |
ASSERT(instr->RsField() == 0); |
- if ((instr->RdField() == R0) && |
- (instr->RtField() == R0) && |
+ if ((instr->RdField() == R0) && (instr->RtField() == R0) && |
(instr->SaField() == 0)) { |
// Format(instr, "nop"); |
// Nothing to be done for NOP. |
@@ -1745,14 +1726,14 @@ void Simulator::DecodeRegImm(Instr* instr) { |
case BGEZAL: { |
int32_t rs_val = get_register(instr->RsField()); |
// Return address is one after the delay slot. |
- set_register(RA, pc_ + (2*Instr::kInstrSize)); |
+ set_register(RA, pc_ + (2 * Instr::kInstrSize)); |
DoBranch(instr, rs_val >= 0, false); |
break; |
} |
case BLTZAL: { |
int32_t rs_val = get_register(instr->RsField()); |
// Return address is one after the delay slot. |
- set_register(RA, pc_ + (2*Instr::kInstrSize)); |
+ set_register(RA, pc_ + (2 * Instr::kInstrSize)); |
DoBranch(instr, rs_val < 0, false); |
break; |
} |
@@ -1858,7 +1839,7 @@ void Simulator::DecodeCop1(Instr* instr) { |
ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
ASSERT(instr->FdField() == F0); |
set_fcsr_bit(fcsr_cc, |
- (fs_val == ft_val) || isnan(fs_val) || isnan(ft_val)); |
+ (fs_val == ft_val) || isnan(fs_val) || isnan(ft_val)); |
break; |
} |
case COP1_C_OLT: { |
@@ -1871,7 +1852,7 @@ void Simulator::DecodeCop1(Instr* instr) { |
ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
ASSERT(instr->FdField() == F0); |
set_fcsr_bit(fcsr_cc, |
- (fs_val < ft_val) || isnan(fs_val) || isnan(ft_val)); |
+ (fs_val < ft_val) || isnan(fs_val) || isnan(ft_val)); |
break; |
} |
case COP1_C_OLE: { |
@@ -1884,7 +1865,7 @@ void Simulator::DecodeCop1(Instr* instr) { |
ASSERT(instr->FormatField() == FMT_D); // Only D supported. |
ASSERT(instr->FdField() == F0); |
set_fcsr_bit(fcsr_cc, |
- (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val)); |
+ (fs_val <= ft_val) || isnan(fs_val) || isnan(ft_val)); |
break; |
} |
case COP1_TRUNC_W: { |
@@ -2310,7 +2291,7 @@ void Simulator::InstructionDecode(Instr* instr) { |
} |
default: { |
OS::PrintErr("Undecoded instruction: 0x%x at %p\n", |
- instr->InstructionBits(), instr); |
+ instr->InstructionBits(), instr); |
UnimplementedInstruction(instr); |
break; |
} |
@@ -2531,10 +2512,10 @@ void Simulator::Longjmp(uword pc, |
set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
// Restore pool pointer. |
- int32_t code = *reinterpret_cast<int32_t*>( |
- fp + kPcMarkerSlotFromFp * kWordSize); |
- int32_t pp = *reinterpret_cast<int32_t*>( |
- code + Code::object_pool_offset() - kHeapObjectTag); |
+ int32_t code = |
+ *reinterpret_cast<int32_t*>(fp + kPcMarkerSlotFromFp * kWordSize); |
+ int32_t pp = *reinterpret_cast<int32_t*>(code + Code::object_pool_offset() - |
+ kHeapObjectTag); |
set_register(CODE_REG, code); |
set_register(PP, pp); |
buf->Longjmp(); |