forked from carbon-language/carbon-lang
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdump.cpp
160 lines (131 loc) · 5.29 KB
/
dump.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// This library contains functions to assist dumping objects to stderr during
// interactive debugging. Functions named `Dump` are intended for direct use by
// developers, and should use overload resolution to determine which will be
// invoked. The debugger should do namespace resolution automatically. For
// example:
//
// - lldb: `expr Dump(context, id)`
// - gdb: `call Dump(context, id)`
//
// The `DumpNoNewline` functions are helpers that exclude a trailing newline.
// They're intended to be composed by `Dump` function implementations.
#ifndef NDEBUG
#include "toolchain/lex/dump.h"
#include "common/check.h"
#include "common/ostream.h"
#include "toolchain/check/context.h"
#include "toolchain/lex/tokenized_buffer.h"
#include "toolchain/parse/dump.h"
#include "toolchain/parse/tree.h"
#include "toolchain/sem_ir/dump.h"
#include "toolchain/sem_ir/file.h"
namespace Carbon::Check {
static auto DumpNoNewline(const Context& context, SemIR::LocId loc_id) -> void {
if (!loc_id.is_valid()) {
llvm::errs() << "LocId(invalid)";
return;
}
if (loc_id.is_node_id()) {
auto token = context.parse_tree().node_token(loc_id.node_id());
auto line = context.tokens().GetLineNumber(token);
auto col = context.tokens().GetColumnNumber(token);
const char* implicit = loc_id.is_implicit() ? " implicit" : "";
llvm::errs() << "LocId(";
llvm::errs().write_escaped(context.sem_ir().filename());
llvm::errs() << ":" << line << ":" << col << implicit << ")";
} else {
CARBON_CHECK(loc_id.is_import_ir_inst_id());
auto import_ir_id = context.sem_ir()
.import_ir_insts()
.Get(loc_id.import_ir_inst_id())
.ir_id;
const auto* import_file =
context.sem_ir().import_irs().Get(import_ir_id).sem_ir;
llvm::errs() << "LocId(import from \"";
llvm::errs().write_escaped(import_file->filename());
llvm::errs() << "\")";
}
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, Lex::TokenIndex token)
-> void {
Parse::Dump(context.parse_tree(), token);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, Parse::NodeId node_id)
-> void {
Parse::Dump(context.parse_tree(), node_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::ClassId class_id) -> void {
SemIR::Dump(context.sem_ir(), class_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::ConstantId const_id) -> void {
SemIR::Dump(context.sem_ir(), const_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::EntityNameId entity_name_id) -> void {
SemIR::Dump(context.sem_ir(), entity_name_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::FacetTypeId facet_type_id) -> void {
SemIR::Dump(context.sem_ir(), facet_type_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::FunctionId function_id) -> void {
SemIR::Dump(context.sem_ir(), function_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::GenericId generic_id) -> void {
SemIR::Dump(context.sem_ir(), generic_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::ImplId impl_id)
-> void {
SemIR::Dump(context.sem_ir(), impl_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::InstBlockId inst_block_id) -> void {
SemIR::Dump(context.sem_ir(), inst_block_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::InstId inst_id)
-> void {
SemIR::Dump(context.sem_ir(), inst_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::InterfaceId interface_id) -> void {
SemIR::Dump(context.sem_ir(), interface_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::LocId loc_id)
-> void {
DumpNoNewline(context, loc_id);
llvm::errs() << '\n';
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::NameId name_id)
-> void {
SemIR::Dump(context.sem_ir(), name_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::NameScopeId name_scope_id) -> void {
SemIR::Dump(context.sem_ir(), name_scope_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::SpecificId specific_id) -> void {
SemIR::Dump(context.sem_ir(), specific_id);
}
LLVM_DUMP_METHOD static auto Dump(
const Context& context, SemIR::StructTypeFieldsId struct_type_fields_id)
-> void {
SemIR::Dump(context.sem_ir(), struct_type_fields_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context,
SemIR::TypeBlockId type_block_id) -> void {
SemIR::Dump(context.sem_ir(), type_block_id);
}
LLVM_DUMP_METHOD static auto Dump(const Context& context, SemIR::TypeId type_id)
-> void {
SemIR::Dump(context.sem_ir(), type_id);
}
} // namespace Carbon::Check
#endif // NDEBUG