summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-06-07 19:32:46 +0300
committerAndrei Karas <akaras@inbox.ru>2015-06-07 19:32:46 +0300
commit03b8a1e6cf21dbcd3f6f03311cf02b91f3630c26 (patch)
treecb23fbbb4f716b6653091cdc14023a6c2f49b913
parentdb6bbfe7d662460e5357f9d8fdbdd142cae3d8e1 (diff)
downloadparanucker-03b8a1e6cf21dbcd3f6f03311cf02b91f3630c26.tar.gz
paranucker-03b8a1e6cf21dbcd3f6f03311cf02b91f3630c26.tar.bz2
paranucker-03b8a1e6cf21dbcd3f6f03311cf02b91f3630c26.tar.xz
paranucker-03b8a1e6cf21dbcd3f6f03311cf02b91f3630c26.zip
Add memoryusage plugin command. It show only number of allocated nodes.
-rw-r--r--src/command.h3
-rw-r--r--src/logger.cpp12
-rw-r--r--src/logger.h3
-rw-r--r--src/nodes/base/node.h8
-rw-r--r--src/parsers/generic.cpp15
-rw-r--r--src/parsers/generic.h2
-rw-r--r--src/plugin.cpp6
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",