Commit e73f69c9 authored by Brendan Gregg's avatar Brendan Gregg Committed by GitHub

Merge pull request #361 from iovisor/struct_semicolon

struct definitions that end with semicolons
parents 5e1350bb 5982c742
......@@ -111,7 +111,7 @@ pid|tid|cgroup|uid|gid|nsecs|cpu|comm|stack|ustack|arg[0-9]|retval|func|probe|cu
struct|union { BEGIN(STRUCT); buffer = std::string(yytext); open_brackets = 0; }
<STRUCT>"{" { BEGIN(STRUCT); buffer += std::string(yytext); open_brackets++; }
<STRUCT>"}" { buffer += std::string(yytext);
<STRUCT>"}"|"};" { buffer += std::string(yytext);
if (open_brackets == 1)
{
BEGIN(INITIAL); return Parser::make_STRUCT(buffer, loc);
......
......@@ -72,6 +72,7 @@
#include "codegen/struct_save.cpp"
#include "codegen/struct_save_nested.cpp"
#include "codegen/struct_save_string.cpp"
#include "codegen/struct_semicolon.cpp"
#include "codegen/struct_short.cpp"
#include "codegen/struct_string_array.cpp"
#include "codegen/struct_string_ptr.cpp"
......
#include "common.h"
namespace bpftrace {
namespace test {
namespace codegen {
TEST(codegen, struct_semicolon)
{
auto expected = R"EXPECTED(%printf_t = type { i64, i64 }
; Function Attrs: nounwind
declare i64 @llvm.bpf.pseudo(i64, i64) #0
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #1
define i64 @"kprobe:f"(i8*) local_unnamed_addr section "s_kprobe:f_1" {
entry:
%printf_args = alloca %printf_t, align 8
%1 = bitcast %printf_t* %printf_args to i8*
call void @llvm.lifetime.start.p0i8(i64 -1, i8* nonnull %1)
%2 = getelementptr inbounds %printf_t, %printf_t* %printf_args, i64 0, i32 0
store i64 0, i64* %2, align 8
%pseudo = tail call i64 @llvm.bpf.pseudo(i64 1, i64 1)
%get_stackid = tail call i64 inttoptr (i64 27 to i64 (i8*, i8*, i64)*)(i8* %0, i64 %pseudo, i64 256)
%get_pid_tgid = tail call i64 inttoptr (i64 14 to i64 ()*)()
%3 = shl i64 %get_pid_tgid, 32
%4 = or i64 %3, %get_stackid
%5 = getelementptr inbounds %printf_t, %printf_t* %printf_args, i64 0, i32 1
store i64 %4, i64* %5, align 8
%pseudo1 = tail call i64 @llvm.bpf.pseudo(i64 1, i64 2)
%get_cpu_id = tail call i64 inttoptr (i64 8 to i64 ()*)()
%perf_event_output = call i64 inttoptr (i64 25 to i64 (i8*, i8*, i64, i8*, i64)*)(i8* %0, i64 %pseudo1, i64 %get_cpu_id, %printf_t* nonnull %printf_args, i64 16)
call void @llvm.lifetime.end.p0i8(i64 -1, i8* nonnull %1)
ret i64 0
}
; Function Attrs: argmemonly nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1
attributes #0 = { nounwind }
attributes #1 = { argmemonly nounwind }
)EXPECTED";
test("struct Foo { int x, y; char *str; };"
"k:f"
"{"
" printf(\"%s\\n\", ustack);"
"}",
expected);
test("struct Foo { int x, y; char *str; }"
"k:f"
"{"
" printf(\"%s\\n\", ustack);"
"}",
expected);
}
} // namespace codegen
} // namespace test
} // namespace bpftrace
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment