bpftrace/SOURCES/bpftrace-0.9-clang_parser-p...

357 lines
12 KiB
Diff

From 5143209e8744d242431229972d9affa32ba3cc1a Mon Sep 17 00:00:00 2001
From: Matheus Marchini <mat@mmarchini.me>
Date: Fri, 12 Apr 2019 16:27:51 -0700
Subject: [PATCH 1/3] [clang_parser] pass BPFtrace as arg instead of StructMap
---
src/clang_parser.cpp | 6 +--
src/clang_parser.h | 3 +-
src/main.cpp | 2 +-
tests/clang_parser.cpp | 71 +++++++++++++++++++++++------------
tests/codegen/call_kstack.cpp | 4 +-
tests/codegen/call_ustack.cpp | 4 +-
tests/codegen/common.h | 2 +-
tests/codegen/general.cpp | 2 +-
tests/probe.cpp | 2 +-
tests/semantic_analyser.cpp | 2 +-
10 files changed, 61 insertions(+), 37 deletions(-)
diff --git a/src/clang_parser.cpp b/src/clang_parser.cpp
index b1db8ff..4bb8f87 100644
--- a/src/clang_parser.cpp
+++ b/src/clang_parser.cpp
@@ -172,7 +172,7 @@ static std::tuple<std::string, std::string> get_kernel_dirs(const struct utsname
return std::make_tuple(ksrc, kobj);
}
-void ClangParser::parse(ast::Program *program, StructMap &structs)
+void ClangParser::parse(ast::Program *program, BPFtrace &bpftrace)
{
auto input = program->c_definitions;
if (input.size() == 0)
@@ -259,7 +259,6 @@ void ClangParser::parse(ast::Program *program, StructMap &structs)
cursor,
[](CXCursor c, CXCursor parent, CXClientData client_data)
{
- auto &structs = *static_cast<StructMap*>(client_data);
if (clang_getCursorKind(parent) != CXCursor_StructDecl &&
clang_getCursorKind(parent) != CXCursor_UnionDecl)
@@ -267,6 +266,7 @@ void ClangParser::parse(ast::Program *program, StructMap &structs)
if (clang_getCursorKind(c) == CXCursor_FieldDecl)
{
+ auto &structs = static_cast<BPFtrace*>(client_data)->structs_;
auto struct_name = get_parent_struct_name(c);
auto ident = get_clang_string(clang_getCursorSpelling(c));
auto offset = clang_Cursor_getOffsetOfField(c) / 8;
@@ -290,7 +290,7 @@ void ClangParser::parse(ast::Program *program, StructMap &structs)
return CXChildVisit_Recurse;
},
- &structs);
+ &bpftrace);
clang_disposeTranslationUnit(translation_unit);
clang_disposeIndex(index);
diff --git a/src/clang_parser.h b/src/clang_parser.h
index d2ada5d..4289796 100644
--- a/src/clang_parser.h
+++ b/src/clang_parser.h
@@ -1,6 +1,7 @@
#pragma once
#include "struct.h"
+#include "bpftrace.h"
namespace bpftrace {
@@ -11,7 +12,7 @@ using StructMap = std::map<std::string, Struct>;
class ClangParser
{
public:
- void parse(ast::Program *program, StructMap &structs);
+ void parse(ast::Program *program, BPFtrace &bpftrace);
};
} // namespace bpftrace
diff --git a/src/main.cpp b/src/main.cpp
index ec3882d..f6659bf 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -272,7 +272,7 @@ int main(int argc, char *argv[])
}
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
err = semantics.analyse();
diff --git a/tests/clang_parser.cpp b/tests/clang_parser.cpp
index f12a5e4..0c1ca31 100644
--- a/tests/clang_parser.cpp
+++ b/tests/clang_parser.cpp
@@ -1,25 +1,28 @@
#include "gtest/gtest.h"
#include "clang_parser.h"
#include "driver.h"
+#include "bpftrace.h"
namespace bpftrace {
namespace test {
namespace clang_parser {
-void parse(const std::string &input, StructMap &structs)
+void parse(const std::string &input, BPFtrace &bpftrace)
{
auto extended_input = input + "kprobe:sys_read { 1 }";
Driver driver;
ASSERT_EQ(driver.parse_str(extended_input), 0);
ClangParser clang;
- clang.parse(driver.root_, structs);
+ clang.parse(driver.root_, bpftrace);
}
TEST(clang_parser, integers)
{
- StructMap structs;
- parse("struct Foo { int x; int y, z; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { int x; int y, z; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 1U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -45,8 +48,10 @@ TEST(clang_parser, integers)
TEST(clang_parser, c_union)
{
- StructMap structs;
- parse("union Foo { char c; short s; int i; long l; }", structs);
+ BPFtrace bpftrace;
+ parse("union Foo { char c; short s; int i; long l; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 1U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -77,8 +82,10 @@ TEST(clang_parser, c_union)
TEST(clang_parser, integer_ptr)
{
- StructMap structs;
- parse("struct Foo { int *x; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { int *x; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 1U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -96,8 +103,10 @@ TEST(clang_parser, integer_ptr)
TEST(clang_parser, string_ptr)
{
- StructMap structs;
- parse("struct Foo { char *str; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { char *str; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 1U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -115,8 +124,10 @@ TEST(clang_parser, string_ptr)
TEST(clang_parser, string_array)
{
- StructMap structs;
- parse("struct Foo { char str[32]; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { char str[32]; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 1U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -132,8 +143,10 @@ TEST(clang_parser, string_array)
TEST(clang_parser, nested_struct_named)
{
- StructMap structs;
- parse("struct Bar { int x; } struct Foo { struct Bar bar; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Bar { int x; } struct Foo { struct Bar bar; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 2U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -151,8 +164,10 @@ TEST(clang_parser, nested_struct_named)
TEST(clang_parser, nested_struct_ptr_named)
{
- StructMap structs;
- parse("struct Bar { int x; } struct Foo { struct Bar *bar; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Bar { int x; } struct Foo { struct Bar *bar; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 2U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -172,8 +187,10 @@ TEST(clang_parser, nested_struct_ptr_named)
TEST(clang_parser, nested_struct_anon)
{
- StructMap structs;
- parse("struct Foo { struct { int x; } bar; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { struct { int x; } bar; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.size(), 2U);
ASSERT_EQ(structs.count("Foo"), 1U);
@@ -190,8 +207,10 @@ TEST(clang_parser, nested_struct_anon)
TEST(clang_parser, nested_struct_indirect_fields)
{
- StructMap structs;
- parse("struct Foo { struct { int x; int y;}; int a; struct { int z; }; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { struct { int x; int y;}; int a; struct { int z; }; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs["Foo"].fields.size(), 4U);
EXPECT_EQ(structs["Foo"].fields["x"].offset, 0);
@@ -206,8 +225,10 @@ TEST(clang_parser, nested_struct_indirect_fields)
TEST(clang_parser, nested_struct_anon_union_struct)
{
- StructMap structs;
- parse("struct Foo { union { long long _xy; struct { int x; int y;}; }; int a; struct { int z; }; }", structs);
+ BPFtrace bpftrace;
+ parse("struct Foo { union { long long _xy; struct { int x; int y;}; }; int a; struct { int z; }; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs["Foo"].fields.size(), 5U);
EXPECT_EQ(structs["Foo"].fields["_xy"].offset, 0);
@@ -225,8 +246,10 @@ TEST(clang_parser, nested_struct_anon_union_struct)
TEST(clang_parser, builtin_headers)
{
// size_t is definied in stddef.h
- StructMap structs;
- parse("#include <stddef.h>\nstruct Foo { size_t x, y, z; }", structs);
+ BPFtrace bpftrace;
+ parse("#include <stddef.h>\nstruct Foo { size_t x, y, z; }", bpftrace);
+
+ StructMap &structs = bpftrace.structs_;
ASSERT_EQ(structs.count("Foo"), 1U);
diff --git a/tests/codegen/call_kstack.cpp b/tests/codegen/call_kstack.cpp
index a184af2..e64d498 100644
--- a/tests/codegen/call_kstack.cpp
+++ b/tests/codegen/call_kstack.cpp
@@ -68,7 +68,7 @@ TEST(codegen, call_kstack_mapids)
ASSERT_EQ(driver.parse_str("kprobe:f { @x = kstack(5); @y = kstack(6); @z = kstack(6) }"), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
@@ -96,7 +96,7 @@ TEST(codegen, call_kstack_modes_mapids)
ASSERT_EQ(driver.parse_str("kprobe:f { @x = kstack(perf); @y = kstack(bpftrace); @z = kstack() }"), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
diff --git a/tests/codegen/call_ustack.cpp b/tests/codegen/call_ustack.cpp
index 8e80558..1941d36 100644
--- a/tests/codegen/call_ustack.cpp
+++ b/tests/codegen/call_ustack.cpp
@@ -74,7 +74,7 @@ TEST(codegen, call_ustack_mapids)
ASSERT_EQ(driver.parse_str("kprobe:f { @x = ustack(5); @y = ustack(6); @z = ustack(6) }"), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
@@ -102,7 +102,7 @@ TEST(codegen, call_ustack_modes_mapids)
ASSERT_EQ(driver.parse_str("kprobe:f { @x = ustack(perf); @y = ustack(bpftrace); @z = ustack() }"), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
diff --git a/tests/codegen/common.h b/tests/codegen/common.h
index 32f8bc8..bdf733a 100644
--- a/tests/codegen/common.h
+++ b/tests/codegen/common.h
@@ -30,7 +30,7 @@ static void test(const std::string &input, const std::string expected_output)
ASSERT_EQ(driver.parse_str(input), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
diff --git a/tests/codegen/general.cpp b/tests/codegen/general.cpp
index e7e7439..e67ae10 100644
--- a/tests/codegen/general.cpp
+++ b/tests/codegen/general.cpp
@@ -45,7 +45,7 @@ TEST(codegen, printf_offsets)
// TODO (mmarchini): also test printf with a string argument
ASSERT_EQ(driver.parse_str("struct Foo { char c; int i; } kprobe:f { $foo = (Foo*)0; printf(\"%c %u\\n\", $foo->c, $foo->i) }"), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
ASSERT_EQ(semantics.create_maps(true), 0);
diff --git a/tests/probe.cpp b/tests/probe.cpp
index e030830..cb9b765 100644
--- a/tests/probe.cpp
+++ b/tests/probe.cpp
@@ -28,7 +28,7 @@ void gen_bytecode(const std::string &input, std::stringstream &out)
ASSERT_EQ(driver.parse_str(input), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
ast::SemanticAnalyser semantics(driver.root_, bpftrace);
ASSERT_EQ(semantics.analyse(), 0);
diff --git a/tests/semantic_analyser.cpp b/tests/semantic_analyser.cpp
index 2067ed9..4e2485b 100644
--- a/tests/semantic_analyser.cpp
+++ b/tests/semantic_analyser.cpp
@@ -16,7 +16,7 @@ void test(BPFtrace &bpftrace, Driver &driver, const std::string &input, int expe
ASSERT_EQ(driver.parse_str(input), 0);
ClangParser clang;
- clang.parse(driver.root_, bpftrace.structs_);
+ clang.parse(driver.root_, bpftrace);
std::stringstream out;
ast::SemanticAnalyser semantics(driver.root_, bpftrace, out);
--
2.20.1