From 4842ccfa09dbdd3912080320965f4e4310016012 Mon Sep 17 00:00:00 2001 From: Jiri Olsa Date: Wed, 24 Jul 2019 17:45:10 +0200 Subject: [PATCH] Add ClangParser::visit_children function Adding ClangParser::visit_children function to contains clang_visitChildren call, so it can be used from multiple places. --- src/clang_parser.cpp | 120 ++++++++++++++++++++++--------------------- src/clang_parser.h | 2 + 2 files changed, 64 insertions(+), 58 deletions(-) diff --git a/src/clang_parser.cpp b/src/clang_parser.cpp index 9c6af96a825..1369852f999 100644 --- a/src/clang_parser.cpp +++ b/src/clang_parser.cpp @@ -279,6 +279,67 @@ CXCursor ClangParser::ClangParserHandler::get_translation_unit_cursor() { return clang_getTranslationUnitCursor(translation_unit); } +bool ClangParser::visit_children(CXCursor &cursor, BPFtrace &bpftrace) +{ + int err = clang_visitChildren( + cursor, + [](CXCursor c, CXCursor parent, CXClientData client_data) + { + if (clang_getCursorKind(c) == CXCursor_MacroDefinition) + { + std::string macro_name; + std::string macro_value; + if (translateMacro(c, macro_name, macro_value)) + { + auto ¯os = static_cast(client_data)->macros_; + macros[macro_name] = macro_value; + } + return CXChildVisit_Recurse; + } + + if (clang_getCursorKind(parent) == CXCursor_EnumDecl) + { + auto &enums = static_cast(client_data)->enums_; + enums[get_clang_string(clang_getCursorSpelling(c))] = clang_getEnumConstantDeclValue(c); + return CXChildVisit_Recurse; + } + + if (clang_getCursorKind(parent) != CXCursor_StructDecl && + clang_getCursorKind(parent) != CXCursor_UnionDecl) + return CXChildVisit_Recurse; + + if (clang_getCursorKind(c) == CXCursor_FieldDecl) + { + auto &structs = static_cast(client_data)->structs_; + + auto named_parent = get_named_parent(c); + auto ptype = clang_getCanonicalType(clang_getCursorType(named_parent)); + auto ptypestr = get_clang_string(clang_getTypeSpelling(ptype)); + auto ptypesize = clang_Type_getSizeOf(ptype); + + auto ident = get_clang_string(clang_getCursorSpelling(c)); + auto offset = clang_Type_getOffsetOf(ptype, ident.c_str()) / 8; + auto type = clang_getCanonicalType(clang_getCursorType(c)); + + auto struct_name = get_clang_string(clang_getCursorSpelling(named_parent)); + if (struct_name == "") + struct_name = ptypestr; + remove_struct_union_prefix(struct_name); + + structs[struct_name].fields[ident].offset = offset; + structs[struct_name].fields[ident].type = get_sized_type(type); + structs[struct_name].size = ptypesize; + } + + return CXChildVisit_Recurse; + }, + &bpftrace); + + // clang_visitChildren returns a non-zero value if the traversal + // was terminated by the visitor returning CXChildVisit_Break. + return err == 0; +} + bool ClangParser::parse(ast::Program *program, BPFtrace &bpftrace, std::vector extra_flags) { auto input = program->c_definitions; @@ -366,64 +427,7 @@ bool ClangParser::parse(ast::Program *program, BPFtrace &bpftrace, std::vector(client_data)->macros_; - macros[macro_name] = macro_value; - } - return CXChildVisit_Recurse; - } - - if (clang_getCursorKind(parent) == CXCursor_EnumDecl) - { - auto &enums = static_cast(client_data)->enums_; - enums[get_clang_string(clang_getCursorSpelling(c))] = clang_getEnumConstantDeclValue(c); - return CXChildVisit_Recurse; - } - - if (clang_getCursorKind(parent) != CXCursor_StructDecl && - clang_getCursorKind(parent) != CXCursor_UnionDecl) - return CXChildVisit_Recurse; - - if (clang_getCursorKind(c) == CXCursor_FieldDecl) - { - auto &structs = static_cast(client_data)->structs_; - - auto named_parent = get_named_parent(c); - auto ptype = clang_getCanonicalType(clang_getCursorType(named_parent)); - auto ptypestr = get_clang_string(clang_getTypeSpelling(ptype)); - auto ptypesize = clang_Type_getSizeOf(ptype); - - auto ident = get_clang_string(clang_getCursorSpelling(c)); - auto offset = clang_Type_getOffsetOf(ptype, ident.c_str()) / 8; - auto type = clang_getCanonicalType(clang_getCursorType(c)); - - auto struct_name = get_clang_string(clang_getCursorSpelling(named_parent)); - if (struct_name == "") - struct_name = ptypestr; - remove_struct_union_prefix(struct_name); - - structs[struct_name].fields[ident].offset = offset; - structs[struct_name].fields[ident].type = get_sized_type(type); - structs[struct_name].size = ptypesize; - } - - return CXChildVisit_Recurse; - }, - &bpftrace); - - // clang_visitChildren returns a non-zero value if the traversal - // was terminated by the visitor returning CXChildVisit_Break. - return err == 0; + return visit_children(cursor, bpftrace); } } // namespace bpftrace diff --git a/src/clang_parser.h b/src/clang_parser.h index c7471cdd886..4a40029cd40 100644 --- a/src/clang_parser.h +++ b/src/clang_parser.h @@ -14,6 +14,8 @@ class ClangParser public: bool parse(ast::Program *program, BPFtrace &bpftrace, std::vector extra_flags = {}); private: + bool visit_children(CXCursor &cursor, BPFtrace &bpftrace); + class ClangParserHandler { public: