Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Unified Diff: src/source-position.h

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: addressed comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/source-position.h
diff --git a/src/source-position.h b/src/source-position.h
index 2d36e97521a9d0fe7673f1b32f8eb8ff71219ee7..abb485cf0d7450857fc54ae48a034469078297f4 100644
--- a/src/source-position.h
+++ b/src/source-position.h
@@ -9,77 +9,122 @@
#include "src/flags.h"
#include "src/globals.h"
+#include "src/handles.h"
#include "src/utils.h"
namespace v8 {
namespace internal {
-// This class encapsulates encoding and decoding of sources positions from
-// which hydrogen values originated.
-// When FLAG_track_hydrogen_positions is set this object encodes the
-// identifier of the inlining and absolute offset from the start of the
-// inlined function.
-// When the flag is not set we simply track absolute offset from the
-// script start.
-class SourcePosition {
+class SharedFunctionInfo;
+class Code;
+class CompilationInfo;
+class Script;
+
+struct SourcePositionInfo;
+
+class SourcePosition final {
public:
- static SourcePosition Unknown() {
- return SourcePosition::FromRaw(kNoPosition);
+ SourcePosition() = default;
vogelheim 2016/10/31 17:34:40 Wouldn't this leave value_ uninitialized? That doe
+
+ explicit SourcePosition(int script_offset, int inlining_id = kUnknown)
+ : value_(0) {
+ SetScriptOffset(script_offset);
+ SetInliningId(inlining_id);
}
- bool IsUnknown() const { return value_ == kNoPosition; }
+ static SourcePosition Unknown() { return SourcePosition(); }
+ bool IsUnknown() const { return !IsKnown(); }
+ bool IsKnown() const { return ScriptOffset() != kUnknown; }
- uint32_t position() const { return PositionField::decode(value_); }
- void set_position(uint32_t position) {
- if (FLAG_hydrogen_track_positions) {
- value_ = static_cast<uint32_t>(PositionField::update(value_, position));
- } else {
- value_ = position;
+ SourcePositionInfo Info(Handle<SharedFunctionInfo> script) const;
+ std::vector<SourcePositionInfo> Info(Handle<Code> code) const;
+ std::vector<SourcePositionInfo> Info(CompilationInfo* code) const;
+
+ void Print(std::ostream& out, Code* function) const;
+
+ int ScriptOffset() const { return ScriptOffsetField::decode(value_) - 1; }
+ int InliningId() const { return InliningIdField::decode(value_) - 1; }
+
+ void SetScriptOffset(int script_offset) {
vogelheim 2016/10/31 17:34:40 This claims to set the script offset, but for cert
+ if (script_offset == kNoSourcePosition ||
+ script_offset >= ScriptOffsetField::kMax)
+ script_offset = kUnknown;
+ if (script_offset != kUnknown) {
vogelheim 2016/10/31 17:34:40 Why not merge the ifs? if (script_offset != kUnkn
+ DCHECK(script_offset >= 0);
+ value_ = ScriptOffsetField::update(value_, script_offset + 1);
}
}
-
- uint32_t inlining_id() const { return InliningIdField::decode(value_); }
- void set_inlining_id(uint32_t inlining_id) {
- if (FLAG_hydrogen_track_positions) {
- value_ =
- static_cast<uint32_t>(InliningIdField::update(value_, inlining_id));
+ void SetInliningId(int inlining_id) {
+ if (inlining_id >= InliningIdField::kMax) inlining_id = kUnknown;
+ if (inlining_id != kUnknown) {
+ DCHECK(inlining_id >= 0);
+ value_ = InliningIdField::update(value_, inlining_id + 1);
}
}
- uint32_t raw() const { return value_; }
-
- private:
- static const uint32_t kNoPosition = static_cast<uint32_t>(kNoSourcePosition);
- typedef BitField<uint32_t, 0, 9> InliningIdField;
-
- // Offset from the start of the inlined function.
- typedef BitField<uint32_t, 9, 23> PositionField;
+ int EncodeScriptOffset() { return ScriptOffset() + 2; }
+ int EncodeInliningId() { return -(InliningId() + 2); }
vogelheim 2016/10/31 17:34:40 why?
+ void Decode(int enc) {
+ if (enc > 0) {
+ SetScriptOffset(enc - 2);
+ } else {
+ DCHECK(enc < 0);
+ SetInliningId(-enc - 2);
+ }
+ }
- friend class HPositionInfo;
- friend class Deoptimizer;
+ static const int kUnknown = -1;
+ STATIC_ASSERT(kUnknown == kNoSourcePosition);
- static SourcePosition FromRaw(uint32_t raw_position) {
+ uint64_t raw() const { return value_; }
+ static SourcePosition FromRaw(uint64_t raw) {
SourcePosition position;
- position.value_ = raw_position;
+ position.value_ = raw;
return position;
}
- // If FLAG_hydrogen_track_positions is set contains bitfields InliningIdField
- // and PositionField.
- // Otherwise contains absolute offset from the script start.
- uint32_t value_;
+ private:
+ void Print(std::ostream& out) const;
+ void Print(std::ostream& out, SharedFunctionInfo* function) const;
+
+ // ids are in the hight bits for better compression in SourcePositionTable
vogelheim 2016/10/31 17:34:40 hight -> high
+ typedef BitField64<int, 0, 31> ScriptOffsetField;
+ typedef BitField64<int, 31, 16> InliningIdField;
+ // leaving the highest bit untouched to allow for signed conversion
+ uint64_t value_;
};
-inline std::ostream& operator<<(std::ostream& os, const SourcePosition& p) {
- if (p.IsUnknown()) {
- return os << "<?>";
- } else if (FLAG_hydrogen_track_positions) {
- return os << "<" << p.inlining_id() << ":" << p.position() << ">";
- } else {
- return os << "<0:" << p.raw() << ">";
- }
+inline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) {
+ return lhs.raw() == rhs.raw();
}
+inline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) {
+ return !(lhs == rhs);
+}
+
+struct InliningPosition {
+ // these two ints correspond to the fields in SourcePosition
vogelheim 2016/10/31 17:34:40 "these two ints"? I'm only seeing one int and a So
+ SourcePosition position;
+
+ // references position in DeoptimizationInputData::literals()
+ int inlined_function_id;
+};
+
+struct SourcePositionInfo {
+ explicit SourcePositionInfo(SourcePosition position) : position(position) {}
+
+ SourcePosition position;
+ MaybeHandle<SharedFunctionInfo> function;
+ int line = -1;
+ int column = -1;
+};
+
+std::ostream& operator<<(std::ostream& out, const SourcePosition& pos);
+
+std::ostream& operator<<(std::ostream& out, const SourcePositionInfo& pos);
+std::ostream& operator<<(std::ostream& out,
+ const std::vector<SourcePositionInfo>& stack);
+
} // namespace internal
} // namespace v8
« no previous file with comments | « src/s390/assembler-s390.h ('k') | src/source-position.cc » ('j') | test/cctest/cctest.status » ('J')

Powered by Google App Engine
This is Rietveld 408576698