1b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Copyright 2010 the V8 project authors. All rights reserved. 2b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// modification, are permitted provided that the following conditions are 4b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// met: 5b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// 6b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// * Redistributions of source code must retain the above copyright 7b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// * Redistributions in binary form must reproduce the above 9b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// copyright notice, this list of conditions and the following 10b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// with the distribution. 12b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// contributors may be used to endorse or promote products derived 14b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// from this software without specific prior written permission. 15b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// 16b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 28b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#ifndef V8_GDB_JIT_H_ 29b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define V8_GDB_JIT_H_ 30b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 31257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h" 32257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 33b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// 34b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Basic implementation of GDB JIT Interface client. 35b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// GBD JIT Interface is supported in GDB 7.0 and above. 36b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// Currently on x64 and ia32 architectures and Linux OS are supported. 37b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch// 38b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 39b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#ifdef ENABLE_GDB_JIT_INTERFACE 40b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "v8.h" 41b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#include "factory.h" 42b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 43b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochnamespace v8 { 44b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochnamespace internal { 45b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass CompilationInfo; 473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 48b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define CODE_TAGS_LIST(V) \ 49b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(LOAD_IC) \ 50b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(KEYED_LOAD_IC) \ 51b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(STORE_IC) \ 52b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(KEYED_STORE_IC) \ 53b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_IC) \ 54b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_INITIALIZE) \ 55b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_PRE_MONOMORPHIC) \ 56b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_NORMAL) \ 57b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_MEGAMORPHIC) \ 58b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(CALL_MISS) \ 59b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(STUB) \ 60b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(BUILTIN) \ 61b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(SCRIPT) \ 621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(EVAL) \ 631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(FUNCTION) 64b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 65b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass GDBJITLineInfo : public Malloced { 66b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 67b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch GDBJITLineInfo() 68b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : pc_info_(10) { } 69b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 70b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void SetPosition(intptr_t pc, int pos, bool is_statement) { 71b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch AddPCInfo(PCInfo(pc, pos, is_statement)); 72b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 73b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 74b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch struct PCInfo { 75b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch PCInfo(intptr_t pc, int pos, bool is_statement) 76b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : pc_(pc), pos_(pos), is_statement_(is_statement) { } 77b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 78b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch intptr_t pc_; 79b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int pos_; 80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch bool is_statement_; 81b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch }; 82b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 83b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch List<PCInfo>* pc_info() { 84b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return &pc_info_; 85b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 86b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 87b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private: 88b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch void AddPCInfo(const PCInfo& pc_info) { 89b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch pc_info_.Add(pc_info); 90b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 91b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 92b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch List<PCInfo> pc_info_; 93b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 94b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 95b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 96b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochclass GDBJITInterface: public AllStatic { 97b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 98b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch enum CodeTag { 99b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define V(x) x, 100b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch CODE_TAGS_LIST(V) 101b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef V 102b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch TAG_COUNT 103b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch }; 104b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 105b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static const char* Tag2String(CodeTag tag) { 106b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch switch (tag) { 107b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define V(x) case x: return #x; 108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch CODE_TAGS_LIST(V) 109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#undef V 110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch default: 111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return NULL; 112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 113b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 114b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 115b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void AddCode(const char* name, 116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Code* code, 1171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CodeTag tag, 1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Script* script, 1193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CompilationInfo* info); 120b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void AddCode(Handle<String> name, 122b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<Script> script, 1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<Code> code, 1243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CompilationInfo* info); 125b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 126b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void AddCode(CodeTag tag, String* name, Code* code); 127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 128b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void AddCode(CodeTag tag, const char* name, Code* code); 129b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void AddCode(CodeTag tag, Code* code); 131b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 132b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void RemoveCode(Code* code); 133b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 134b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch static void RegisterDetailedLineInfo(Code* code, GDBJITLineInfo* line_info); 135b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 136b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 137b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define GDBJIT(action) GDBJITInterface::action 138b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 139b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch} } // namespace v8::internal 140b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#else 141b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#define GDBJIT(action) ((void) 0) 142b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif 143b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 144b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch#endif 145