aboutsummaryrefslogtreecommitdiff
path: root/deps/v8/src/code-comments.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/code-comments.cc')
-rw-r--r--deps/v8/src/code-comments.cc102
1 files changed, 102 insertions, 0 deletions
diff --git a/deps/v8/src/code-comments.cc b/deps/v8/src/code-comments.cc
new file mode 100644
index 0000000000..6e64eb7fa1
--- /dev/null
+++ b/deps/v8/src/code-comments.cc
@@ -0,0 +1,102 @@
+// Copyright 2018 the V8 project authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <cstring>
+#include <iomanip>
+
+#include "src/assembler-inl.h"
+#include "src/code-comments.h"
+
+namespace v8 {
+namespace internal {
+
+namespace {
+static constexpr uint8_t kOffsetToFirstCommentEntry = kUInt32Size;
+static constexpr uint8_t kOffsetToPCOffset = 0;
+static constexpr uint8_t kOffsetToCommentSize = kOffsetToPCOffset + kUInt32Size;
+static constexpr uint8_t kOffsetToCommentString =
+ kOffsetToCommentSize + kUInt32Size;
+} // namespace
+
+uint32_t CodeCommentEntry::comment_length() const {
+ return static_cast<uint32_t>(comment.size() + 1);
+}
+
+uint32_t CodeCommentEntry::size() const {
+ return kOffsetToCommentString + comment_length();
+}
+
+CodeCommentsIterator::CodeCommentsIterator(Address code_comments_start)
+ : code_comments_start_(code_comments_start),
+ current_entry_(code_comments_start + kOffsetToFirstCommentEntry) {}
+
+uint32_t CodeCommentsIterator::size() const {
+ return code_comments_start_ != kNullAddress
+ ? *reinterpret_cast<uint32_t*>(code_comments_start_)
+ : 0;
+}
+
+const char* CodeCommentsIterator::GetComment() const {
+ const char* comment_string =
+ reinterpret_cast<const char*>(current_entry_ + kOffsetToCommentString);
+ CHECK_EQ(GetCommentSize(), strlen(comment_string) + 1);
+ return comment_string;
+}
+
+uint32_t CodeCommentsIterator::GetCommentSize() const {
+ return *reinterpret_cast<uint32_t*>(current_entry_ + kOffsetToCommentSize);
+}
+
+uint32_t CodeCommentsIterator::GetPCOffset() const {
+ return *reinterpret_cast<uint32_t*>(current_entry_ + kOffsetToPCOffset);
+}
+
+void CodeCommentsIterator::Next() {
+ current_entry_ += kOffsetToCommentString + GetCommentSize();
+}
+
+bool CodeCommentsIterator::HasCurrent() const {
+ return current_entry_ < code_comments_start_ + size();
+}
+
+void CodeCommentsWriter::Emit(Assembler* assm) {
+ assm->dd(section_size());
+ for (auto i = comments_.begin(); i != comments_.end(); ++i) {
+ assm->dd(i->pc_offset);
+ assm->dd(i->comment_length());
+ for (char c : i->comment) {
+ EnsureSpace ensure_space(assm);
+ assm->db(c);
+ }
+ assm->db('\0');
+ }
+}
+
+void CodeCommentsWriter::Add(uint32_t pc_offset, std::string comment) {
+ CodeCommentEntry entry = {pc_offset, std::move(comment)};
+ byte_count_ += entry.size();
+ comments_.push_back(std::move(entry));
+}
+
+size_t CodeCommentsWriter::entry_count() const { return comments_.size(); }
+uint32_t CodeCommentsWriter::section_size() const {
+ return kOffsetToFirstCommentEntry + static_cast<uint32_t>(byte_count_);
+}
+
+void PrintCodeCommentsSection(std::ostream& out, Address code_comments_start) {
+ CodeCommentsIterator it(code_comments_start);
+ out << "CodeComments (size = " << it.size() << ")\n";
+ if (it.HasCurrent()) {
+ out << std::setw(6) << "pc" << std::setw(6) << "len"
+ << " comment\n";
+ }
+ for (; it.HasCurrent(); it.Next()) {
+ out << std::hex << std::setw(6) << it.GetPCOffset() << std::dec
+ << std::setw(6) << it.GetCommentSize() << " (" << it.GetComment()
+ << ")\n";
+ }
+}
+
+} // namespace internal
+} // namespace v8