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