// Copyright (c) 2012, 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. #ifndef VM_DEBUGINFO_H_ #define VM_DEBUGINFO_H_ #include "platform/assert.h" #include "platform/utils.h" #include "vm/globals.h" namespace dart { // DebugInfo is used to generate minimal debug information containing code, // symbols, and line numbers for generated code in the dart VM. This information // can be used in two ways: // - for debugging using a debugger // - for generating information to be read by pprof to analyze Dart programs. class DebugInfo { public: // A basic ByteBuffer which is growable and uses malloc/free. class ByteBuffer { public: ByteBuffer() : size_(0), capacity_(0), data_(NULL) { } ~ByteBuffer() { free(data_); size_ = 0; capacity_ = 0; data_ = NULL; } uint8_t at(int index) const { ASSERT(0 <= index); ASSERT(index < size_); ASSERT(size_ <= capacity_); return data_[index]; } uint8_t* data() const { return data_; } void set_data(uint8_t* value) { data_ = value; } int size() const { return size_; } // Append an element. void Add(const uint8_t value) { Resize(size() + 1); data_[size() - 1] = value; } private: void Resize(int new_size) { if (new_size > capacity_) { int new_capacity = Utils::RoundUpToPowerOfTwo(new_size); uint8_t* new_data = reinterpret_cast(realloc(data_, new_capacity)); ASSERT(new_data != NULL); data_ = new_data; capacity_ = new_capacity; } size_ = new_size; } int size_; int capacity_; uint8_t* data_; // Disallow assignment DISALLOW_COPY_AND_ASSIGN(ByteBuffer); }; ~DebugInfo(); // Add the code starting at pc. void AddCode(uword pc, intptr_t size); // Add symbol information for a region (includes the start and end symbol), // does not add the actual code. void AddCodeRegion(const char* name, uword pc, intptr_t size); // Write out all the debug information info the memory region. bool WriteToMemory(ByteBuffer* region); // Create a new debug information generator. static DebugInfo* NewGenerator(); // Register this generated section with debuggger using the JIT interface. static void RegisterSection(const char* name, uword entry_point, intptr_t size); // Unregister all generated section from debuggger. static void UnregisterAllSections(); private: void* handle_; DebugInfo(); DISALLOW_COPY_AND_ASSIGN(DebugInfo); }; } // namespace dart #endif // VM_DEBUGINFO_H_