1// Copyright 2018 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_CODE_COMMENTS_H_
6#define V8_CODE_COMMENTS_H_
7
8#include <ostream>
9#include <string>
10#include <vector>
11
12#include "include/v8-internal.h"
13#include "src/base/macros.h"
14
15namespace v8 {
16namespace internal {
17
18class Assembler;
19
20// Code comments section layout:
21// byte count content
22// ------------------------------------------------------------------------
23// 4 size as uint32_t (only for sanity check)
24// [Inline array of CodeCommentEntry in increasing pc_offset order]
25// ┌ 4 pc_offset of entry as uint32_t
26// ├ 4 length of the comment including terminating '\0'
27// └ <variable length> characters of the comment including terminating '\0'
28
29struct CodeCommentEntry {
30 uint32_t pc_offset;
31 std::string comment;
32 uint32_t comment_length() const;
33 uint32_t size() const;
34};
35
36class CodeCommentsWriter {
37 public:
38 V8_EXPORT_PRIVATE void Add(uint32_t pc_offset, std::string comment);
39 void Emit(Assembler* assm);
40 size_t entry_count() const;
41 uint32_t section_size() const;
42
43 private:
44 uint32_t byte_count_ = 0;
45 std::vector<CodeCommentEntry> comments_;
46};
47
48class V8_EXPORT_PRIVATE CodeCommentsIterator {
49 public:
50 CodeCommentsIterator(Address code_comments_start,
51 uint32_t code_comments_size);
52 uint32_t size() const;
53 const char* GetComment() const;
54 uint32_t GetCommentSize() const;
55 uint32_t GetPCOffset() const;
56 void Next();
57 bool HasCurrent() const;
58
59 private:
60 Address code_comments_start_;
61 uint32_t code_comments_size_;
62 Address current_entry_;
63};
64
65void PrintCodeCommentsSection(std::ostream& out, Address code_comments_start,
66 uint32_t code_comments_size);
67
68} // namespace internal
69} // namespace v8
70
71#endif // V8_CODE_COMMENTS_H_
72