Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
B
bcc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
bcc
Commits
13ebe8e8
Commit
13ebe8e8
authored
Nov 29, 2016
by
Teng Qin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Implement StatusTuple class instead of using std::tuple
parent
f5dce2c7
Changes
13
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
248 additions
and
247 deletions
+248
-247
examples/cpp/CPUDistribution.cc
examples/cpp/CPUDistribution.cc
+6
-6
examples/cpp/HelloWorld.cc
examples/cpp/HelloWorld.cc
+6
-6
examples/cpp/RandomRead.cc
examples/cpp/RandomRead.cc
+6
-6
examples/cpp/RecordMySQLQuery.cc
examples/cpp/RecordMySQLQuery.cc
+6
-6
examples/cpp/TCPSendStack.cc
examples/cpp/TCPSendStack.cc
+6
-6
src/cc/BPF.cc
src/cc/BPF.cc
+58
-56
src/cc/BPFTable.cc
src/cc/BPFTable.cc
+15
-15
src/cc/bcc_exception.h
src/cc/bcc_exception.h
+24
-24
src/cc/frontends/b/codegen_llvm.cc
src/cc/frontends/b/codegen_llvm.cc
+45
-45
src/cc/frontends/b/loader.cc
src/cc/frontends/b/loader.cc
+5
-6
src/cc/frontends/b/node.h
src/cc/frontends/b/node.h
+5
-5
src/cc/frontends/b/printer.cc
src/cc/frontends/b/printer.cc
+29
-29
src/cc/frontends/b/type_check.cc
src/cc/frontends/b/type_check.cc
+37
-37
No files found.
examples/cpp/CPUDistribution.cc
View file @
13ebe8e8
...
...
@@ -61,15 +61,15 @@ int task_switch_event(struct pt_regs *ctx, struct task_struct *prev) {
int
main
(
int
argc
,
char
**
argv
)
{
ebpf
::
BPF
bpf
;
auto
init_res
=
bpf
.
init
(
BPF_PROGRAM
);
if
(
std
::
get
<
0
>
(
init_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
init_res
)
<<
std
::
endl
;
if
(
init_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
init_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
auto
attach_res
=
bpf
.
attach_kprobe
(
"finish_task_switch"
,
"task_switch_event"
);
if
(
std
::
get
<
0
>
(
attach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
attach_res
)
<<
std
::
endl
;
if
(
attach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
attach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
@@ -88,8 +88,8 @@ int main(int argc, char** argv) {
}
auto
detach_res
=
bpf
.
detach_kprobe
(
"finish_task_switch"
);
if
(
std
::
get
<
0
>
(
detach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
detach_res
)
<<
std
::
endl
;
if
(
detach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
detach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
examples/cpp/HelloWorld.cc
View file @
13ebe8e8
...
...
@@ -20,8 +20,8 @@ int on_sys_clone(void *ctx) {
int
main
()
{
ebpf
::
BPF
bpf
;
auto
init_res
=
bpf
.
init
(
BPF_PROGRAM
);
if
(
std
::
get
<
0
>
(
init_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
init_res
)
<<
std
::
endl
;
if
(
init_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
init_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
@@ -29,8 +29,8 @@ int main() {
std
::
string
line
;
auto
attach_res
=
bpf
.
attach_kprobe
(
"sys_clone"
,
"on_sys_clone"
);
if
(
std
::
get
<
0
>
(
attach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
attach_res
)
<<
std
::
endl
;
if
(
attach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
attach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
@@ -39,8 +39,8 @@ int main() {
std
::
cout
<<
line
<<
std
::
endl
;
// Detach the probe if we got at least one line.
auto
detach_res
=
bpf
.
detach_kprobe
(
"sys_clone"
);
if
(
std
::
get
<
0
>
(
detach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
detach_res
)
<<
std
::
endl
;
if
(
detach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
detach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
break
;
...
...
examples/cpp/RandomRead.cc
View file @
13ebe8e8
...
...
@@ -70,21 +70,21 @@ void signal_handler(int s) {
int
main
(
int
argc
,
char
**
argv
)
{
bpf
=
new
ebpf
::
BPF
();
auto
init_res
=
bpf
->
init
(
BPF_PROGRAM
);
if
(
std
::
get
<
0
>
(
init_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
init_res
)
<<
std
::
endl
;
if
(
init_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
init_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
auto
attach_res
=
bpf
->
attach_tracepoint
(
"random:urandom_read"
,
"on_urandom_read"
);
if
(
std
::
get
<
0
>
(
attach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
attach_res
)
<<
std
::
endl
;
if
(
attach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
attach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
auto
open_res
=
bpf
->
open_perf_buffer
(
"events"
,
&
handle_output
);
if
(
std
::
get
<
0
>
(
open_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
open_res
)
<<
std
::
endl
;
if
(
open_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
open_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
examples/cpp/RecordMySQLQuery.cc
View file @
13ebe8e8
...
...
@@ -63,15 +63,15 @@ int main(int argc, char** argv) {
ebpf
::
BPF
bpf
;
auto
init_res
=
bpf
.
init
(
BPF_PROGRAM
);
if
(
std
::
get
<
0
>
(
init_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
init_res
)
<<
std
::
endl
;
if
(
init_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
init_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
auto
attach_res
=
bpf
.
attach_uprobe
(
mysql_path
,
ALLOC_QUERY_FUNC
,
"probe_mysql_query"
);
if
(
std
::
get
<
0
>
(
attach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
attach_res
)
<<
std
::
endl
;
if
(
attach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
attach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
@@ -94,8 +94,8 @@ int main(int argc, char** argv) {
}
auto
detach_res
=
bpf
.
detach_uprobe
(
mysql_path
,
ALLOC_QUERY_FUNC
);
if
(
std
::
get
<
0
>
(
detach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
detach_res
)
<<
std
::
endl
;
if
(
detach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
detach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
examples/cpp/TCPSendStack.cc
View file @
13ebe8e8
...
...
@@ -58,14 +58,14 @@ struct stack_key_t {
int
main
(
int
argc
,
char
**
argv
)
{
ebpf
::
BPF
bpf
;
auto
init_res
=
bpf
.
init
(
BPF_PROGRAM
);
if
(
std
::
get
<
0
>
(
init_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
init_res
)
<<
std
::
endl
;
if
(
init_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
init_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
auto
attach_res
=
bpf
.
attach_kprobe
(
"tcp_sendmsg"
,
"on_tcp_send"
);
if
(
std
::
get
<
0
>
(
attach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
attach_res
)
<<
std
::
endl
;
if
(
attach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
attach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
@@ -105,8 +105,8 @@ int main(int argc, char** argv) {
}
auto
detach_res
=
bpf
.
detach_kprobe
(
"tcp_sendmsg"
);
if
(
std
::
get
<
0
>
(
detach_res
)
!=
0
)
{
std
::
cerr
<<
std
::
get
<
1
>
(
detach_res
)
<<
std
::
endl
;
if
(
detach_res
.
code
(
)
!=
0
)
{
std
::
cerr
<<
detach_res
.
msg
(
)
<<
std
::
endl
;
return
1
;
}
...
...
src/cc/BPF.cc
View file @
13ebe8e8
This diff is collapsed.
Click to expand it.
src/cc/BPFTable.cc
View file @
13ebe8e8
...
...
@@ -68,36 +68,36 @@ std::vector<std::string> BPFStackTable::get_stack_symbol(int stack_id,
StatusTuple
BPFPerfBuffer
::
open_on_cpu
(
perf_reader_raw_cb
cb
,
int
cpu
,
void
*
cb_cookie
)
{
if
(
cpu_readers_
.
find
(
cpu
)
!=
cpu_readers_
.
end
())
return
mkstatus
(
-
1
,
"Perf buffer already open on CPU %d"
,
cpu
);
return
StatusTuple
(
-
1
,
"Perf buffer already open on CPU %d"
,
cpu
);
auto
reader
=
static_cast
<
perf_reader
*>
(
bpf_open_perf_buffer
(
cb
,
cb_cookie
,
-
1
,
cpu
));
if
(
reader
==
nullptr
)
return
mkstatus
(
-
1
,
"Unable to construct perf reader"
);
return
StatusTuple
(
-
1
,
"Unable to construct perf reader"
);
int
reader_fd
=
perf_reader_fd
(
reader
);
if
(
!
update
(
&
cpu
,
&
reader_fd
))
{
perf_reader_free
(
static_cast
<
void
*>
(
reader
));
return
mkstatus
(
-
1
,
"Unable to open perf buffer on CPU %d: %s"
,
cpu
,
return
StatusTuple
(
-
1
,
"Unable to open perf buffer on CPU %d: %s"
,
cpu
,
strerror
(
errno
));
}
cpu_readers_
[
cpu
]
=
static_cast
<
perf_reader
*>
(
reader
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
BPFPerfBuffer
::
open
(
perf_reader_raw_cb
cb
,
void
*
cb_cookie
)
{
for
(
int
i
=
0
;
i
<
sysconf
(
_SC_NPROCESSORS_ONLN
);
i
++
)
TRY2
(
open_on_cpu
(
cb
,
i
,
cb_cookie
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
BPFPerfBuffer
::
close_on_cpu
(
int
cpu
)
{
auto
it
=
cpu_readers_
.
find
(
cpu
);
if
(
it
==
cpu_readers_
.
end
())
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
perf_reader_free
(
static_cast
<
void
*>
(
it
->
second
));
if
(
!
remove
(
const_cast
<
int
*>
(
&
(
it
->
first
))))
return
mkstatus
(
-
1
,
"Unable to close perf buffer on CPU %d"
,
it
->
first
);
return
StatusTuple
(
-
1
,
"Unable to close perf buffer on CPU %d"
,
it
->
first
);
cpu_readers_
.
erase
(
it
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
BPFPerfBuffer
::
close
()
{
...
...
@@ -105,15 +105,15 @@ StatusTuple BPFPerfBuffer::close() {
bool
has_error
=
false
;
for
(
int
i
=
0
;
i
<
sysconf
(
_SC_NPROCESSORS_ONLN
);
i
++
)
{
auto
res
=
close_on_cpu
(
i
);
if
(
std
::
get
<
0
>
(
res
)
!=
0
)
{
if
(
res
.
code
(
)
!=
0
)
{
errors
+=
"Failed to close CPU"
+
std
::
to_string
(
i
)
+
" perf buffer: "
;
errors
+=
std
::
get
<
1
>
(
res
)
+
"
\n
"
;
errors
+=
res
.
msg
(
)
+
"
\n
"
;
has_error
=
true
;
}
}
if
(
has_error
)
return
mkstatus
(
-
1
,
errors
);
return
mkstatus
(
0
);
return
StatusTuple
(
-
1
,
errors
);
return
StatusTuple
(
0
);
}
void
BPFPerfBuffer
::
poll
(
int
timeout
)
{
...
...
@@ -126,9 +126,9 @@ void BPFPerfBuffer::poll(int timeout) {
BPFPerfBuffer
::~
BPFPerfBuffer
()
{
auto
res
=
close
();
if
(
std
::
get
<
0
>
(
res
)
!=
0
)
if
(
res
.
code
(
)
!=
0
)
std
::
cerr
<<
"Failed to close all perf buffer on destruction: "
<<
std
::
get
<
1
>
(
res
)
<<
std
::
endl
;
<<
res
.
msg
(
)
<<
std
::
endl
;
}
}
// namespace ebpf
src/cc/bcc_exception.h
View file @
13ebe8e8
...
...
@@ -18,38 +18,38 @@
#include <cstdio>
#include <string>
#include <tuple>
#undef NDEBUG
namespace
ebpf
{
typedef
std
::
tuple
<
int
,
std
::
string
>
StatusTuple
;
class
StatusTuple
{
public:
StatusTuple
(
int
ret
)
:
ret_
(
ret
)
{}
template
<
typename
...
Args
>
StatusTuple
mkstatus
(
int
ret
,
const
char
*
fmt
,
Args
...
args
)
{
char
buf
[
1024
];
StatusTuple
(
int
ret
,
const
char
*
msg
)
:
ret_
(
ret
),
msg_
(
msg
)
{}
StatusTuple
(
int
ret
,
const
std
::
string
&
msg
)
:
ret_
(
ret
),
msg_
(
msg
)
{}
template
<
typename
...
Args
>
StatusTuple
(
int
ret
,
const
char
*
fmt
,
Args
...
args
)
:
ret_
(
ret
)
{
char
buf
[
2048
];
snprintf
(
buf
,
sizeof
(
buf
),
fmt
,
args
...);
return
std
::
make_tuple
(
ret
,
std
::
string
(
buf
)
);
}
msg_
=
std
::
string
(
buf
);
}
static
inline
StatusTuple
mkstatus
(
int
ret
,
const
char
*
msg
)
{
return
std
::
make_tuple
(
ret
,
std
::
string
(
msg
));
}
int
code
()
{
return
ret_
;
}
static
inline
StatusTuple
mkstatus
(
int
ret
,
const
std
::
string
&
msg
)
{
return
std
::
make_tuple
(
ret
,
msg
);
}
std
::
string
msg
()
{
return
msg_
;
}
static
inline
StatusTuple
mkstatus
(
int
ret
)
{
return
std
::
make_tuple
(
ret
,
std
::
string
());
}
private:
int
ret_
;
std
::
string
msg_
;
};
#define TRY2(CMD) \
do { \
StatusTuple __stp = (CMD); \
if (
std::get<0>(__stp) != 0) {
\
if (
__stp.code() != 0) {
\
return __stp; \
} \
} while (0)
...
...
src/cc/frontends/b/codegen_llvm.cc
View file @
13ebe8e8
This diff is collapsed.
Click to expand it.
src/cc/frontends/b/loader.cc
View file @
13ebe8e8
...
...
@@ -20,7 +20,6 @@
#include "loader.h"
#include "table_desc.h"
using
std
::
get
;
using
std
::
string
;
using
std
::
unique_ptr
;
using
std
::
vector
;
...
...
@@ -57,8 +56,8 @@ int BLoader::parse(llvm::Module *mod, const string &filename, const string &prot
ebpf
::
cc
::
TypeCheck
type_check
(
parser_
->
scopes_
.
get
(),
proto_parser_
->
scopes_
.
get
());
auto
ret
=
type_check
.
visit
(
parser_
->
root_node_
);
if
(
get
<
0
>
(
ret
)
!=
0
||
get
<
1
>
(
ret
).
size
())
{
fprintf
(
stderr
,
"Type error @line=%d: %s
\n
"
,
get
<
0
>
(
ret
),
get
<
1
>
(
ret
).
c_str
());
if
(
ret
.
code
()
!=
0
||
ret
.
msg
(
).
size
())
{
fprintf
(
stderr
,
"Type error @line=%d: %s
\n
"
,
ret
.
code
(),
ret
.
msg
(
).
c_str
());
return
-
1
;
}
...
...
@@ -66,9 +65,9 @@ int BLoader::parse(llvm::Module *mod, const string &filename, const string &prot
codegen_
=
ebpf
::
make_unique
<
ebpf
::
cc
::
CodegenLLVM
>
(
mod
,
parser_
->
scopes_
.
get
(),
proto_parser_
->
scopes_
.
get
());
ret
=
codegen_
->
visit
(
parser_
->
root_node_
,
**
tables
);
if
(
get
<
0
>
(
ret
)
!=
0
||
get
<
1
>
(
ret
).
size
())
{
fprintf
(
stderr
,
"Codegen error @line=%d: %s
\n
"
,
get
<
0
>
(
ret
),
get
<
1
>
(
ret
).
c_str
());
return
get
<
0
>
(
ret
);
if
(
ret
.
code
()
!=
0
||
ret
.
msg
(
).
size
())
{
fprintf
(
stderr
,
"Codegen error @line=%d: %s
\n
"
,
ret
.
code
(),
ret
.
msg
(
).
c_str
());
return
ret
.
code
(
);
}
return
0
;
...
...
src/cc/frontends/b/node.h
View file @
13ebe8e8
...
...
@@ -114,20 +114,20 @@ class Node {
};
template
<
typename
...
Args
>
std
::
tuple
<
int
,
std
::
string
>
mkstatus_
(
Node
*
n
,
const
char
*
fmt
,
Args
...
args
)
{
char
buf
[
1024
];
StatusTuple
mkstatus_
(
Node
*
n
,
const
char
*
fmt
,
Args
...
args
)
{
char
buf
[
2048
];
snprintf
(
buf
,
sizeof
(
buf
),
fmt
,
args
...);
string
out_msg
(
buf
);
if
(
n
->
line_
>
0
)
out_msg
+=
"
\n
"
+
n
->
text_
;
return
std
::
make_t
uple
(
n
->
line_
?
n
->
line_
:
-
1
,
out_msg
);
return
StatusT
uple
(
n
->
line_
?
n
->
line_
:
-
1
,
out_msg
);
}
static
inline
std
::
tuple
<
int
,
std
::
string
>
mkstatus_
(
Node
*
n
,
const
char
*
msg
)
{
static
inline
StatusTuple
mkstatus_
(
Node
*
n
,
const
char
*
msg
)
{
string
out_msg
(
msg
);
if
(
n
->
line_
>
0
)
out_msg
+=
"
\n
"
+
n
->
text_
;
return
std
::
make_t
uple
(
n
->
line_
?
n
->
line_
:
-
1
,
out_msg
);
return
StatusT
uple
(
n
->
line_
?
n
->
line_
:
-
1
,
out_msg
);
}
class
StmtNode
:
public
Node
{
...
...
src/cc/frontends/b/printer.cc
View file @
13ebe8e8
...
...
@@ -38,7 +38,7 @@ StatusTuple Printer::visit_block_stmt_node(BlockStmtNode* n) {
--
indent_
;
}
fprintf
(
out_
,
"%*s}"
,
indent_
,
""
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_if_stmt_node
(
IfStmtNode
*
n
)
{
...
...
@@ -50,7 +50,7 @@ StatusTuple Printer::visit_if_stmt_node(IfStmtNode* n) {
fprintf
(
out_
,
" else "
);
TRY2
(
n
->
false_block_
->
accept
(
this
));
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_onvalid_stmt_node
(
OnValidStmtNode
*
n
)
{
...
...
@@ -62,7 +62,7 @@ StatusTuple Printer::visit_onvalid_stmt_node(OnValidStmtNode* n) {
fprintf
(
out_
,
" else "
);
TRY2
(
n
->
else_block_
->
accept
(
this
));
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_switch_stmt_node
(
SwitchStmtNode
*
n
)
{
...
...
@@ -70,7 +70,7 @@ StatusTuple Printer::visit_switch_stmt_node(SwitchStmtNode* n) {
TRY2
(
n
->
cond_
->
accept
(
this
));
fprintf
(
out_
,
") "
);
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_case_stmt_node
(
CaseStmtNode
*
n
)
{
...
...
@@ -81,7 +81,7 @@ StatusTuple Printer::visit_case_stmt_node(CaseStmtNode* n) {
fprintf
(
out_
,
"default"
);
}
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_ident_expr_node
(
IdentExprNode
*
n
)
{
...
...
@@ -92,37 +92,37 @@ StatusTuple Printer::visit_ident_expr_node(IdentExprNode* n) {
if
(
n
->
sub_name_
.
size
())
{
fprintf
(
out_
,
".%s"
,
n
->
sub_name_
.
c_str
());
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_assign_expr_node
(
AssignExprNode
*
n
)
{
TRY2
(
n
->
lhs_
->
accept
(
this
));
fprintf
(
out_
,
" = "
);
TRY2
(
n
->
rhs_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_packet_expr_node
(
PacketExprNode
*
n
)
{
fprintf
(
out_
,
"$"
);
TRY2
(
n
->
id_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_integer_expr_node
(
IntegerExprNode
*
n
)
{
fprintf
(
out_
,
"%s:%zu"
,
n
->
val_
.
c_str
(),
n
->
bits_
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_string_expr_node
(
StringExprNode
*
n
)
{
fprintf
(
out_
,
"%s"
,
n
->
val_
.
c_str
());
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_binop_expr_node
(
BinopExprNode
*
n
)
{
TRY2
(
n
->
lhs_
->
accept
(
this
));
fprintf
(
out_
,
"%d"
,
n
->
op_
);
TRY2
(
n
->
rhs_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_unop_expr_node
(
UnopExprNode
*
n
)
{
...
...
@@ -135,25 +135,25 @@ StatusTuple Printer::visit_unop_expr_node(UnopExprNode* n) {
}
fprintf
(
out_
,
"%s"
,
s
);
TRY2
(
n
->
expr_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_bitop_expr_node
(
BitopExprNode
*
n
)
{
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_return_expr_node
(
ReturnExprNode
*
n
)
{
fprintf
(
out_
,
"return "
);
TRY2
(
n
->
expr_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_goto_expr_node
(
GotoExprNode
*
n
)
{
const
char
*
s
=
n
->
is_continue_
?
"continue "
:
"goto "
;
fprintf
(
out_
,
"%s"
,
s
);
TRY2
(
n
->
id_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_method_call_expr_node
(
MethodCallExprNode
*
n
)
{
...
...
@@ -177,19 +177,19 @@ StatusTuple Printer::visit_method_call_expr_node(MethodCallExprNode* n) {
--
indent_
;
fprintf
(
out_
,
"%*s}"
,
indent_
,
""
);
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_table_index_expr_node
(
TableIndexExprNode
*
n
)
{
fprintf
(
out_
,
"%s["
,
n
->
id_
->
c_str
());
TRY2
(
n
->
index_
->
accept
(
this
));
fprintf
(
out_
,
"]"
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_expr_stmt_node
(
ExprStmtNode
*
n
)
{
TRY2
(
n
->
expr_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_struct_variable_decl_stmt_node
(
StructVariableDeclStmtNode
*
n
)
{
...
...
@@ -207,7 +207,7 @@ StatusTuple Printer::visit_struct_variable_decl_stmt_node(StructVariableDeclStmt
}
fprintf
(
out_
,
"}"
);
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_integer_variable_decl_stmt_node
(
IntegerVariableDeclStmtNode
*
n
)
{
...
...
@@ -218,7 +218,7 @@ StatusTuple Printer::visit_integer_variable_decl_stmt_node(IntegerVariableDeclSt
fprintf
(
out_
,
"; "
);
TRY2
(
n
->
init_
[
0
]
->
accept
(
this
));
}
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_struct_decl_stmt_node
(
StructDeclStmtNode
*
n
)
{
...
...
@@ -233,12 +233,12 @@ StatusTuple Printer::visit_struct_decl_stmt_node(StructDeclStmtNode* n) {
}
--
indent_
;
fprintf
(
out_
,
"%*s}"
,
indent_
,
""
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_state_decl_stmt_node
(
StateDeclStmtNode
*
n
)
{
if
(
!
n
->
id_
)
{
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
fprintf
(
out_
,
"state "
);
TRY2
(
n
->
id_
->
accept
(
this
));
...
...
@@ -249,11 +249,11 @@ StatusTuple Printer::visit_state_decl_stmt_node(StateDeclStmtNode* n) {
// TRY2(n->id2_->accept(this));
//}
//TRY2(n->block_->accept(this));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_parser_state_stmt_node
(
ParserStateStmtNode
*
n
)
{
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_match_decl_stmt_node
(
MatchDeclStmtNode
*
n
)
{
...
...
@@ -268,7 +268,7 @@ StatusTuple Printer::visit_match_decl_stmt_node(MatchDeclStmtNode* n) {
}
fprintf
(
out_
,
") "
);
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_miss_decl_stmt_node
(
MissDeclStmtNode
*
n
)
{
...
...
@@ -283,7 +283,7 @@ StatusTuple Printer::visit_miss_decl_stmt_node(MissDeclStmtNode* n) {
}
fprintf
(
out_
,
") "
);
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_failure_decl_stmt_node
(
FailureDeclStmtNode
*
n
)
{
...
...
@@ -298,7 +298,7 @@ StatusTuple Printer::visit_failure_decl_stmt_node(FailureDeclStmtNode* n) {
}
fprintf
(
out_
,
") "
);
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_table_decl_stmt_node
(
TableDeclStmtNode
*
n
)
{
...
...
@@ -313,7 +313,7 @@ StatusTuple Printer::visit_table_decl_stmt_node(TableDeclStmtNode* n) {
fprintf
(
out_
,
"> "
);
TRY2
(
n
->
id_
->
accept
(
this
));
fprintf
(
out_
,
"(%zu)"
,
n
->
size_
);
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
StatusTuple
Printer
::
visit_func_decl_stmt_node
(
FuncDeclStmtNode
*
n
)
{
...
...
@@ -328,7 +328,7 @@ StatusTuple Printer::visit_func_decl_stmt_node(FuncDeclStmtNode *n) {
}
fprintf
(
out_
,
") "
);
TRY2
(
n
->
block_
->
accept
(
this
));
return
mkstatus
(
0
);
return
StatusTuple
(
0
);
}
}
// namespace cc
...
...
src/cc/frontends/b/type_check.cc
View file @
13ebe8e8
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment