| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/object.h" | 5 #include "vm/object.h" |
| 6 | 6 |
| 7 #include "include/dart_api.h" | 7 #include "include/dart_api.h" |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/assembler.h" | 9 #include "vm/assembler.h" |
| 10 #include "vm/bigint_operations.h" | 10 #include "vm/bigint_operations.h" |
| 11 #include "vm/bootstrap.h" | 11 #include "vm/bootstrap.h" |
| 12 #include "vm/class_finalizer.h" | 12 #include "vm/class_finalizer.h" |
| 13 #include "vm/code_generator.h" | 13 #include "vm/code_generator.h" |
| 14 #include "vm/code_observers.h" |
| 14 #include "vm/code_patcher.h" | 15 #include "vm/code_patcher.h" |
| 15 #include "vm/compiler.h" | 16 #include "vm/compiler.h" |
| 16 #include "vm/compiler_stats.h" | 17 #include "vm/compiler_stats.h" |
| 17 #include "vm/dart.h" | 18 #include "vm/dart.h" |
| 18 #include "vm/dart_api_state.h" | 19 #include "vm/dart_api_state.h" |
| 19 #include "vm/dart_entry.h" | 20 #include "vm/dart_entry.h" |
| 20 #include "vm/datastream.h" | 21 #include "vm/datastream.h" |
| 21 #include "vm/debuginfo.h" | |
| 22 #include "vm/deopt_instructions.h" | 22 #include "vm/deopt_instructions.h" |
| 23 #include "vm/double_conversion.h" | 23 #include "vm/double_conversion.h" |
| 24 #include "vm/exceptions.h" | 24 #include "vm/exceptions.h" |
| 25 #include "vm/growable_array.h" | 25 #include "vm/growable_array.h" |
| 26 #include "vm/heap.h" | 26 #include "vm/heap.h" |
| 27 #include "vm/object_store.h" | 27 #include "vm/object_store.h" |
| 28 #include "vm/parser.h" | 28 #include "vm/parser.h" |
| 29 #include "vm/runtime_entry.h" | 29 #include "vm/runtime_entry.h" |
| 30 #include "vm/scopes.h" | 30 #include "vm/scopes.h" |
| 31 #include "vm/stack_frame.h" | 31 #include "vm/stack_frame.h" |
| 32 #include "vm/symbols.h" | 32 #include "vm/symbols.h" |
| 33 #include "vm/timer.h" | 33 #include "vm/timer.h" |
| 34 #include "vm/unicode.h" | 34 #include "vm/unicode.h" |
| 35 | 35 |
| 36 namespace dart { | 36 namespace dart { |
| 37 | 37 |
| 38 DEFINE_FLAG(bool, generate_gdb_symbols, false, | |
| 39 "Generate symbols of generated dart functions for debugging with GDB"); | |
| 40 DEFINE_FLAG(bool, show_internal_names, false, | 38 DEFINE_FLAG(bool, show_internal_names, false, |
| 41 "Show names of internal classes (e.g. \"OneByteString\") in error messages " | 39 "Show names of internal classes (e.g. \"OneByteString\") in error messages " |
| 42 "instead of showing the corresponding interface names (e.g. \"String\")"); | 40 "instead of showing the corresponding interface names (e.g. \"String\")"); |
| 43 DEFINE_FLAG(bool, trace_disabling_optimized_code, false, | 41 DEFINE_FLAG(bool, trace_disabling_optimized_code, false, |
| 44 "Trace disabling optimized code."); | 42 "Trace disabling optimized code."); |
| 45 DECLARE_FLAG(bool, trace_compiler); | 43 DECLARE_FLAG(bool, trace_compiler); |
| 46 DECLARE_FLAG(bool, eliminate_type_checks); | 44 DECLARE_FLAG(bool, eliminate_type_checks); |
| 47 DECLARE_FLAG(bool, enable_type_checks); | 45 DECLARE_FLAG(bool, enable_type_checks); |
| 48 | 46 |
| 49 static const char* kGetterPrefix = "get:"; | 47 static const char* kGetterPrefix = "get:"; |
| (...skipping 7075 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7125 | 7123 |
| 7126 // Allocate the Instructions object. | 7124 // Allocate the Instructions object. |
| 7127 Instructions& instrs = | 7125 Instructions& instrs = |
| 7128 Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); | 7126 Instructions::ZoneHandle(Instructions::New(assembler->CodeSize())); |
| 7129 | 7127 |
| 7130 // Copy the instructions into the instruction area and apply all fixups. | 7128 // Copy the instructions into the instruction area and apply all fixups. |
| 7131 // Embedded pointers are still in handles at this point. | 7129 // Embedded pointers are still in handles at this point. |
| 7132 MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), | 7130 MemoryRegion region(reinterpret_cast<void*>(instrs.EntryPoint()), |
| 7133 instrs.size()); | 7131 instrs.size()); |
| 7134 assembler->FinalizeInstructions(region); | 7132 assembler->FinalizeInstructions(region); |
| 7135 Dart_FileWriterFunction perf_events_writer = Dart::perf_events_writer(); | 7133 |
| 7136 if (perf_events_writer != NULL) { | 7134 CodeObservers::NotifyAll(name, |
| 7137 const char* format = "%"Px" %"Px" %s%s\n"; | 7135 instrs.EntryPoint(), |
| 7138 uword addr = instrs.EntryPoint(); | 7136 assembler->prologue_offset(), |
| 7139 uword size = instrs.size(); | 7137 instrs.size(), |
| 7140 const char* marker = optimized ? "*" : ""; | 7138 optimized); |
| 7141 intptr_t len = OS::SNPrint(NULL, 0, format, addr, size, marker, name); | |
| 7142 char* buffer = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | |
| 7143 OS::SNPrint(buffer, len + 1, format, addr, size, marker, name); | |
| 7144 (*perf_events_writer)(buffer, len); | |
| 7145 } | |
| 7146 DebugInfo* pprof_symbol_generator = Dart::pprof_symbol_generator(); | |
| 7147 if (pprof_symbol_generator != NULL) { | |
| 7148 ASSERT(strlen(name) != 0); | |
| 7149 pprof_symbol_generator->AddCode(instrs.EntryPoint(), instrs.size()); | |
| 7150 pprof_symbol_generator->AddCodeRegion(name, | |
| 7151 instrs.EntryPoint(), | |
| 7152 instrs.size()); | |
| 7153 } | |
| 7154 if (FLAG_generate_gdb_symbols) { | |
| 7155 ASSERT(strlen(name) != 0); | |
| 7156 intptr_t prolog_offset = assembler->prolog_offset(); | |
| 7157 if (prolog_offset > 0) { | |
| 7158 // In order to ensure that gdb sees the first instruction of a function | |
| 7159 // as the prolog sequence we register two symbols for the cases when | |
| 7160 // the prolog sequence is not the first instruction: | |
| 7161 // <name>_entry is used for code preceding the prolog sequence. | |
| 7162 // <name> for rest of the code (first instruction is prolog sequence). | |
| 7163 const char* kFormat = "%s_%s"; | |
| 7164 intptr_t len = OS::SNPrint(NULL, 0, kFormat, name, "entry"); | |
| 7165 char* pname = Isolate::Current()->current_zone()->Alloc<char>(len + 1); | |
| 7166 OS::SNPrint(pname, (len + 1), kFormat, name, "entry"); | |
| 7167 DebugInfo::RegisterSection(pname, instrs.EntryPoint(), prolog_offset); | |
| 7168 DebugInfo::RegisterSection(name, | |
| 7169 (instrs.EntryPoint() + prolog_offset), | |
| 7170 (instrs.size() - prolog_offset)); | |
| 7171 } else { | |
| 7172 DebugInfo::RegisterSection(name, instrs.EntryPoint(), instrs.size()); | |
| 7173 } | |
| 7174 } | |
| 7175 | 7139 |
| 7176 const ZoneGrowableArray<int>& pointer_offsets = | 7140 const ZoneGrowableArray<int>& pointer_offsets = |
| 7177 assembler->GetPointerOffsets(); | 7141 assembler->GetPointerOffsets(); |
| 7178 | 7142 |
| 7179 // Allocate the code object. | 7143 // Allocate the code object. |
| 7180 Code& code = Code::ZoneHandle(Code::New(pointer_offsets.length())); | 7144 Code& code = Code::ZoneHandle(Code::New(pointer_offsets.length())); |
| 7181 { | 7145 { |
| 7182 NoGCScope no_gc; | 7146 NoGCScope no_gc; |
| 7183 | 7147 |
| 7184 // Set pointer offsets list in Code object and resolve all handles in | 7148 // Set pointer offsets list in Code object and resolve all handles in |
| (...skipping 11 matching lines...) Expand all Loading... |
| 7196 code.set_instructions(instrs.raw()); | 7160 code.set_instructions(instrs.raw()); |
| 7197 } | 7161 } |
| 7198 return code.raw(); | 7162 return code.raw(); |
| 7199 } | 7163 } |
| 7200 | 7164 |
| 7201 | 7165 |
| 7202 RawCode* Code::FinalizeCode(const Function& function, | 7166 RawCode* Code::FinalizeCode(const Function& function, |
| 7203 Assembler* assembler, | 7167 Assembler* assembler, |
| 7204 bool optimized) { | 7168 bool optimized) { |
| 7205 // Calling ToFullyQualifiedCString is very expensive, try to avoid it. | 7169 // Calling ToFullyQualifiedCString is very expensive, try to avoid it. |
| 7206 if (FLAG_generate_gdb_symbols || | 7170 if (CodeObservers::AreActive()) { |
| 7207 Dart::perf_events_writer() != NULL || | |
| 7208 Dart::pprof_symbol_generator() != NULL) { | |
| 7209 return FinalizeCode(function.ToFullyQualifiedCString(), | 7171 return FinalizeCode(function.ToFullyQualifiedCString(), |
| 7210 assembler, | 7172 assembler, |
| 7211 optimized); | 7173 optimized); |
| 7212 } else { | 7174 } else { |
| 7213 return FinalizeCode("", assembler); | 7175 return FinalizeCode("", assembler); |
| 7214 } | 7176 } |
| 7215 } | 7177 } |
| 7216 | 7178 |
| 7217 | 7179 |
| 7218 // Check if object matches find condition. | 7180 // Check if object matches find condition. |
| (...skipping 4977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12196 } | 12158 } |
| 12197 return result.raw(); | 12159 return result.raw(); |
| 12198 } | 12160 } |
| 12199 | 12161 |
| 12200 | 12162 |
| 12201 const char* WeakProperty::ToCString() const { | 12163 const char* WeakProperty::ToCString() const { |
| 12202 return "_WeakProperty"; | 12164 return "_WeakProperty"; |
| 12203 } | 12165 } |
| 12204 | 12166 |
| 12205 } // namespace dart | 12167 } // namespace dart |
| OLD | NEW |