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