| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/disassembler.h" | 5 #include "vm/disassembler.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/deopt_instructions.h" | 8 #include "vm/deopt_instructions.h" |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/il_printer.h" | 10 #include "vm/il_printer.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 jsarr_.AddValue(p); | 98 jsarr_.AddValue(p); |
| 99 jsarr_.AddValueNull(); | 99 jsarr_.AddValueNull(); |
| 100 free(p); | 100 free(p); |
| 101 } | 101 } |
| 102 | 102 |
| 103 | 103 |
| 104 void Disassembler::Disassemble(uword start, | 104 void Disassembler::Disassemble(uword start, |
| 105 uword end, | 105 uword end, |
| 106 DisassemblyFormatter* formatter, | 106 DisassemblyFormatter* formatter, |
| 107 const Code& code) { | 107 const Code& code) { |
| 108 NoSafepointScope no_safepoint; |
| 108 const Code::Comments& comments = | 109 const Code::Comments& comments = |
| 109 code.IsNull() ? Code::Comments::New(0) : code.comments(); | 110 code.IsNull() ? Code::Comments::New(0) : code.comments(); |
| 110 ASSERT(formatter != NULL); | 111 ASSERT(formatter != NULL); |
| 111 char hex_buffer[kHexadecimalBufferSize]; // Instruction in hexadecimal form. | 112 char hex_buffer[kHexadecimalBufferSize]; // Instruction in hexadecimal form. |
| 112 char human_buffer[kUserReadableBufferSize]; // Human-readable instruction. | 113 char human_buffer[kUserReadableBufferSize]; // Human-readable instruction. |
| 113 uword pc = start; | 114 uword pc = start; |
| 114 intptr_t comment_finger = 0; | 115 intptr_t comment_finger = 0; |
| 115 GrowableArray<Function*> inlined_functions; | 116 GrowableArray<Function*> inlined_functions; |
| 116 while (pc < end) { | 117 while (pc < end) { |
| 117 const intptr_t offset = pc - start; | 118 const intptr_t offset = pc - start; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 sizeof(human_buffer), | 159 sizeof(human_buffer), |
| 159 object, | 160 object, |
| 160 pc); | 161 pc); |
| 161 pc += instruction_length; | 162 pc += instruction_length; |
| 162 } | 163 } |
| 163 } | 164 } |
| 164 | 165 |
| 165 | 166 |
| 166 void Disassembler::DisassembleCodeHelper( | 167 void Disassembler::DisassembleCodeHelper( |
| 167 const char* function_fullname, const Code& code, bool optimized) { | 168 const char* function_fullname, const Code& code, bool optimized) { |
| 169 LocalVarDescriptors& var_descriptors = LocalVarDescriptors::Handle(); |
| 170 if (FLAG_print_variable_descriptors) { |
| 171 // This flag is not on by default, and for debugging purposes only. |
| 172 // Since this may allocate, do it outside the NoSafepointScope. |
| 173 var_descriptors = code.GetLocalVarDescriptors(); |
| 174 } |
| 175 NoSafepointScope no_safepoint; |
| 168 THR_Print("Code for %sfunction '%s' {\n", | 176 THR_Print("Code for %sfunction '%s' {\n", |
| 169 optimized ? "optimized " : "", | 177 optimized ? "optimized " : "", |
| 170 function_fullname); | 178 function_fullname); |
| 171 code.Disassemble(); | 179 code.Disassemble(); |
| 172 THR_Print("}\n"); | 180 THR_Print("}\n"); |
| 173 | 181 |
| 174 #if defined(TARGET_ARCH_IA32) | 182 #if defined(TARGET_ARCH_IA32) |
| 175 THR_Print("Pointer offsets for function: {\n"); | 183 THR_Print("Pointer offsets for function: {\n"); |
| 176 // Pointer offsets are stored in descending order. | 184 // Pointer offsets are stored in descending order. |
| 177 Object& obj = Object::Handle(); | 185 Object& obj = Object::Handle(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 for (intptr_t i = 0; i < stackmap_table.Length(); ++i) { | 233 for (intptr_t i = 0; i < stackmap_table.Length(); ++i) { |
| 226 map ^= stackmap_table.At(i); | 234 map ^= stackmap_table.At(i); |
| 227 THR_Print("%s\n", map.ToCString()); | 235 THR_Print("%s\n", map.ToCString()); |
| 228 } | 236 } |
| 229 } | 237 } |
| 230 THR_Print("}\n"); | 238 THR_Print("}\n"); |
| 231 | 239 |
| 232 if (FLAG_print_variable_descriptors) { | 240 if (FLAG_print_variable_descriptors) { |
| 233 THR_Print("Variable Descriptors for function '%s' {\n", | 241 THR_Print("Variable Descriptors for function '%s' {\n", |
| 234 function_fullname); | 242 function_fullname); |
| 235 const LocalVarDescriptors& var_descriptors = | |
| 236 LocalVarDescriptors::Handle(code.GetLocalVarDescriptors()); | |
| 237 intptr_t var_desc_length = | 243 intptr_t var_desc_length = |
| 238 var_descriptors.IsNull() ? 0 : var_descriptors.Length(); | 244 var_descriptors.IsNull() ? 0 : var_descriptors.Length(); |
| 239 String& var_name = String::Handle(); | 245 String& var_name = String::Handle(); |
| 240 for (intptr_t i = 0; i < var_desc_length; i++) { | 246 for (intptr_t i = 0; i < var_desc_length; i++) { |
| 241 var_name = var_descriptors.GetName(i); | 247 var_name = var_descriptors.GetName(i); |
| 242 RawLocalVarDescriptors::VarInfo var_info; | 248 RawLocalVarDescriptors::VarInfo var_info; |
| 243 var_descriptors.GetInfo(i, &var_info); | 249 var_descriptors.GetInfo(i, &var_info); |
| 244 const int8_t kind = var_info.kind(); | 250 const int8_t kind = var_info.kind(); |
| 245 if (kind == RawLocalVarDescriptors::kSavedCurrentContext) { | 251 if (kind == RawLocalVarDescriptors::kSavedCurrentContext) { |
| 246 THR_Print(" saved current CTX reg offset %d\n", var_info.index()); | 252 THR_Print(" saved current CTX reg offset %d\n", var_info.index()); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 276 Code& code = Code::Handle(); | 282 Code& code = Code::Handle(); |
| 277 for (intptr_t i = 0; i < table.Length(); | 283 for (intptr_t i = 0; i < table.Length(); |
| 278 i += Code::kSCallTableEntryLength) { | 284 i += Code::kSCallTableEntryLength) { |
| 279 offset ^= table.At(i + Code::kSCallTableOffsetEntry); | 285 offset ^= table.At(i + Code::kSCallTableOffsetEntry); |
| 280 function ^= table.At(i + Code::kSCallTableFunctionEntry); | 286 function ^= table.At(i + Code::kSCallTableFunctionEntry); |
| 281 code ^= table.At(i + Code::kSCallTableCodeEntry); | 287 code ^= table.At(i + Code::kSCallTableCodeEntry); |
| 282 if (function.IsNull()) { | 288 if (function.IsNull()) { |
| 283 Class& cls = Class::Handle(); | 289 Class& cls = Class::Handle(); |
| 284 cls ^= code.owner(); | 290 cls ^= code.owner(); |
| 285 if (cls.IsNull()) { | 291 if (cls.IsNull()) { |
| 286 const String& code_name = String::Handle(code.Name()); | |
| 287 THR_Print(" 0x%" Px ": %s, %p\n", | 292 THR_Print(" 0x%" Px ": %s, %p\n", |
| 288 start + offset.Value(), | 293 start + offset.Value(), |
| 289 code_name.ToCString(), | 294 code.Name(), |
| 290 code.raw()); | 295 code.raw()); |
| 291 } else { | 296 } else { |
| 292 THR_Print(" 0x%" Px ": allocation stub for %s, %p\n", | 297 THR_Print(" 0x%" Px ": allocation stub for %s, %p\n", |
| 293 start + offset.Value(), | 298 start + offset.Value(), |
| 294 cls.ToCString(), | 299 cls.ToCString(), |
| 295 code.raw()); | 300 code.raw()); |
| 296 } | 301 } |
| 297 } else { | 302 } else { |
| 298 THR_Print(" 0x%" Px ": %s, %p\n", | 303 THR_Print(" 0x%" Px ": %s, %p\n", |
| 299 start + offset.Value(), | 304 start + offset.Value(), |
| (...skipping 20 matching lines...) Expand all Loading... |
| 320 const Function& function, bool optimized) { | 325 const Function& function, bool optimized) { |
| 321 const char* function_fullname = function.ToFullyQualifiedCString(); | 326 const char* function_fullname = function.ToFullyQualifiedCString(); |
| 322 const Code& code = Code::Handle(function.unoptimized_code()); | 327 const Code& code = Code::Handle(function.unoptimized_code()); |
| 323 DisassembleCodeHelper(function_fullname, code, optimized); | 328 DisassembleCodeHelper(function_fullname, code, optimized); |
| 324 } | 329 } |
| 325 | 330 |
| 326 | 331 |
| 327 #endif // !PRODUCT | 332 #endif // !PRODUCT |
| 328 | 333 |
| 329 } // namespace dart | 334 } // namespace dart |
| OLD | NEW |