diff options
-rw-r--r-- | src/command.h | 3 | ||||
-rw-r--r-- | src/logger.cpp | 12 | ||||
-rw-r--r-- | src/logger.h | 3 | ||||
-rw-r--r-- | src/nodes/base/node.h | 8 | ||||
-rw-r--r-- | src/parsers/generic.cpp | 15 | ||||
-rw-r--r-- | src/parsers/generic.h | 2 | ||||
-rw-r--r-- | src/plugin.cpp | 6 |
7 files changed, 47 insertions, 2 deletions
diff --git a/src/command.h b/src/command.h index e5cb62b..2b1cf7a 100644 --- a/src/command.h +++ b/src/command.h @@ -24,7 +24,8 @@ enum Command : int { Parse = 0, Dump, - SmallDump + SmallDump, + MemoryUsage }; extern Command command; diff --git a/src/logger.cpp b/src/logger.cpp index 5cd65b6..ef712dd 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -66,6 +66,18 @@ void logRaw(const Node *const node, va_end(ap); } +void error(const char *const text, + ...) +{ + va_list ap; + va_start(ap, text); + + vfprintf(stderr, text, ap); + fprintf(stderr, "\n"); + + va_end(ap); +} + void logInt(const Node *const node, const char *const text, const int val) diff --git a/src/logger.h b/src/logger.h index fa365f6..cc72512 100644 --- a/src/logger.h +++ b/src/logger.h @@ -34,6 +34,9 @@ namespace Log const char *const text, ...); + void error(const char *const text, + ...); + void logInt(const Node *const node, const char *const text, const int val); diff --git a/src/nodes/base/node.h b/src/nodes/base/node.h index 34688ef..d6b42ad 100644 --- a/src/nodes/base/node.h +++ b/src/nodes/base/node.h @@ -24,6 +24,8 @@ #include <string> +extern int allocations; + struct Node { Node() : @@ -40,6 +42,12 @@ struct Node indent(0), noLabel(false) { + allocations ++; + } + + ~Node() + { + allocations --; } std::string getIndent() const diff --git a/src/parsers/generic.cpp b/src/parsers/generic.cpp index ed00197..5f53843 100644 --- a/src/parsers/generic.cpp +++ b/src/parsers/generic.cpp @@ -19,12 +19,16 @@ #include "parsers/generic.h" +#include "command.h" + #include "includes/nodeincludes.h" #include "includes/parserincludes.h" #include "includes/parserdefines.inc" #include "localconsts.h" +int allocations = 0; + namespace Generic { @@ -100,6 +104,8 @@ Node *createParseNode(Node *parent, node->nodeType.c_str(), tag.c_str()); } + if (!parent) + delete node; return nullptr; } @@ -123,6 +129,15 @@ Node *parseNodes(tree gccNode) return createParseNode(nullptr, gccNode, FUNCTION_DECL); } +void cleanAllNodes(Node *node) +{ + if (command == Command::MemoryUsage) + Log::error("Allocations before cleanup: %d", allocations); + cleanNodes(node); + if (command == Command::MemoryUsage) + Log::error("Allocations after cleanup: %d", allocations); +} + void cleanNodes(Node *node) { FOR_EACH (std::vector<Node*>::iterator, it, node->childs) diff --git a/src/parsers/generic.h b/src/parsers/generic.h index 71ead21..32aadc2 100644 --- a/src/parsers/generic.h +++ b/src/parsers/generic.h @@ -34,6 +34,8 @@ namespace Generic void cleanNodes(Node *node); + void cleanAllNodes(Node *node); + void fillType(Node *node); void fillLocation(Node *node); diff --git a/src/plugin.cpp b/src/plugin.cpp index 952c0c9..19ed8b0 100644 --- a/src/plugin.cpp +++ b/src/plugin.cpp @@ -39,7 +39,7 @@ static void pre_generic(void *gcc_data, void *user_data A_UNUSED) { Node *node = Generic::parseNodes((tree)gcc_data); - Generic::cleanNodes(node); + Generic::cleanAllNodes(node); } int plugin_init (struct plugin_name_args *plugin_info, @@ -65,6 +65,10 @@ int plugin_init (struct plugin_name_args *plugin_info, { command = Command::SmallDump; } + else if (cmd == "memoryusage") + { + command = Command::MemoryUsage; + } else { error("Plugin %s. Unknown command: %s", |