1109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch// found in the LICENSE file.
4109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
5109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#ifndef V8_SOURCE_POSITION_H_
6109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#define V8_SOURCE_POSITION_H_
7109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
8109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include <ostream>
9109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
10109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/flags.h"
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/globals.h"
12c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/handles.h"
13109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/utils.h"
14109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
15109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace v8 {
16109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochnamespace internal {
17109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
18c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass Code;
19c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass CompilationInfo;
20c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass Script;
21c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass SharedFunctionInfo;
22c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstruct SourcePositionInfo;
23c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
24c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// SourcePosition stores
25c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - script_offset (31 bit non-negative int or kNoSourcePosition)
26c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// - inlining_id (16 bit non-negative int or kNotInlined).
27c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch//
28c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// A defined inlining_id refers to positions in
29c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// CompilationInfo::inlined_functions or
30c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// DeoptimizationInputData::InliningPositions, depending on the compilation
31c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch// stage.
32c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochclass SourcePosition final {
33109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch public:
34c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  explicit SourcePosition(int script_offset, int inlining_id = kNotInlined)
35c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      : value_(0) {
36c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SetScriptOffset(script_offset);
37c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SetInliningId(inlining_id);
38109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
39109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
40c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static SourcePosition Unknown() { return SourcePosition(kNoSourcePosition); }
41c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  bool IsKnown() const {
42c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    return ScriptOffset() != kNoSourcePosition || InliningId() != kNotInlined;
43109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
44c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  bool isInlined() const { return InliningId() != kNotInlined; }
45109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
46c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  std::vector<SourcePositionInfo> InliningStack(Handle<Code> code) const;
47c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  std::vector<SourcePositionInfo> InliningStack(CompilationInfo* code) const;
48109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
49c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void Print(std::ostream& out, Code* function) const;
50109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
51c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int ScriptOffset() const { return ScriptOffsetField::decode(value_) - 1; }
52c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int InliningId() const { return InliningIdField::decode(value_) - 1; }
53109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
54c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void SetScriptOffset(int script_offset) {
55c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DCHECK(script_offset <= ScriptOffsetField::kMax - 2);
56c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DCHECK(script_offset >= kNoSourcePosition);
57c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    value_ = ScriptOffsetField::update(value_, script_offset + 1);
58c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
59c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void SetInliningId(int inlining_id) {
60c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DCHECK(inlining_id <= InliningIdField::kMax - 2);
61c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DCHECK(inlining_id >= kNotInlined);
62c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    value_ = InliningIdField::update(value_, inlining_id + 1);
63c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  }
64109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
65c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static const int kNotInlined = -1;
66c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  STATIC_ASSERT(kNoSourcePosition == -1);
67109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
68c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int64_t raw() const { return static_cast<int64_t>(value_); }
69c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  static SourcePosition FromRaw(int64_t raw) {
70c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    SourcePosition position = Unknown();
71c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    DCHECK_GE(raw, 0);
72c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    position.value_ = static_cast<uint64_t>(raw);
73109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    return position;
74109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  }
75109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
76c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch private:
77c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  void Print(std::ostream& out, SharedFunctionInfo* function) const;
78c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SourcePositionInfo Info(Handle<SharedFunctionInfo> script) const;
79c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
80c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // InliningId is in the high bits for better compression in
81c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // SourcePositionTable.
82c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  typedef BitField64<int, 0, 31> ScriptOffsetField;
83c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  typedef BitField64<int, 31, 16> InliningIdField;
84c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // Leaving the highest bit untouched to allow for signed conversion.
85c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  uint64_t value_;
86109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch};
87109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
88c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) {
89c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return lhs.raw() == rhs.raw();
90c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch}
91c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
92c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochinline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) {
93c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  return !(lhs == rhs);
94109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}
95109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
96c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstruct InliningPosition {
97c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // position of the inlined call
98c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SourcePosition position = SourcePosition::Unknown();
99c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
100c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  // references position in DeoptimizationInputData::literals()
101c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int inlined_function_id;
102c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch};
103c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
104c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstruct SourcePositionInfo {
105c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  explicit SourcePositionInfo(SourcePosition pos, Handle<SharedFunctionInfo> f)
106c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      : position(pos), function(f) {}
107c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
108c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  SourcePosition position;
109c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  Handle<SharedFunctionInfo> function;
110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int line = -1;
111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  int column = -1;
112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch};
113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
114c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstd::ostream& operator<<(std::ostream& out, const SourcePosition& pos);
115c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
116c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstd::ostream& operator<<(std::ostream& out, const SourcePositionInfo& pos);
117c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdochstd::ostream& operator<<(std::ostream& out,
118c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                         const std::vector<SourcePositionInfo>& stack);
119c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch
120109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}  // namespace internal
121109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch}  // namespace v8
122109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch
123109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#endif  // V8_SOURCE_POSITION_H_
124