summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile.am1
-rw-r--r--src/nodes/parmdeclnode.h14
-rw-r--r--src/parsers/generic.cpp4
-rw-r--r--src/parsers/parm_decl.cpp54
4 files changed, 73 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 547a4aa..d57f088 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -22,6 +22,7 @@ SRC = nodes/base/cstnode.h \
parsers/identifier_node.cpp \
parsers/integer_cst.cpp \
parsers/integer_type.cpp \
+ parsers/parm_decl.cpp \
parsers/parserincludes.h \
parsers/pointer_type.cpp \
parsers/result_decl.cpp \
diff --git a/src/nodes/parmdeclnode.h b/src/nodes/parmdeclnode.h
index 37107dc..98b986c 100644
--- a/src/nodes/parmdeclnode.h
+++ b/src/nodes/parmdeclnode.h
@@ -20,10 +20,24 @@
#ifndef NODES_PARMDECLNODE_H
#define NODES_PARMDECLNODE_H
+#include "nodes/integercstnode.h"
+
#include "nodes/base/declnode.h"
+#include "nodes/base/typenode.h"
struct ParmDeclNode : public DeclNode
{
+ ParmDeclNode() :
+ DeclNode(),
+ declType(nullptr),
+ parmSize(nullptr),
+ isRegister(false)
+ {
+ }
+
+ TypeNode *declType;
+ IntegerCstNode *parmSize;
+ bool isRegister;
};
#endif // NODES_PARMDECLNODE_H
diff --git a/src/parsers/generic.cpp b/src/parsers/generic.cpp
index 9b8f1f7..bc4eb17 100644
--- a/src/parsers/generic.cpp
+++ b/src/parsers/generic.cpp
@@ -22,6 +22,7 @@
#include "nodes/functiondeclnode.h"
#include "nodes/functiontypenode.h"
#include "nodes/integertypenode.h"
+#include "nodes/parmdeclnode.h"
#include "nodes/pointertypenode.h"
#include "nodes/voidtypenode.h"
#include "nodes/typedeclnode.h"
@@ -31,6 +32,7 @@
#include "parsers/parserincludes.h"
parserDefine(FunctionDecl);
+parserDefine(ParmDecl);
parserDefine(ResultDecl);
parserDefine(TypeDecl);
@@ -83,6 +85,7 @@ Node *createParseNode(Node *parent,
switch (TREE_CODE(gccNode))
{
createNodeType(FUNCTION_DECL, FunctionDeclNode);
+ createNodeType(PARM_DECL, ParmDeclNode);
createNodeType(RESULT_DECL, ResultDeclNode);
createNodeType(TYPE_DECL, TypeDeclNode);
createNodeType(FUNCTION_TYPE, FunctionTypeNode);
@@ -120,6 +123,7 @@ Node *createParseNode(Node *parent,
switch (TREE_CODE(node->gccNode))
{
parseNodeType(FUNCTION_DECL, FunctionDecl);
+ parseNodeType(PARM_DECL, ParmDecl);
parseNodeType(RESULT_DECL, ResultDecl);
parseNodeType(TYPE_DECL, TypeDecl);
parseNodeType(FUNCTION_TYPE, FunctionType);
diff --git a/src/parsers/parm_decl.cpp b/src/parsers/parm_decl.cpp
new file mode 100644
index 0000000..4fcbba5
--- /dev/null
+++ b/src/parsers/parm_decl.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2015 Andrei Karas
+ *
+ * This file is part of AstDumper.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "parsers/parserincludes.h"
+
+parserDefine(ParmDecl);
+
+#include "parsers/base/decl.h"
+
+#include "nodes/parmdeclnode.h"
+
+namespace Generic
+{
+
+void parseParmDeclNode(ParmDeclNode *node)
+{
+ fillType(node);
+ fillLocation(node);
+ fillDeclLabel(node);
+ setPrintField(node, DECL_REGISTER, isRegister);
+
+ Log::log(node);
+
+ fillDeclAutoGenerated(node);
+ fillDeclAttributes(node);
+
+ node->declType = static_cast<TypeNode*>(createParseNode(
+ node,
+ DECL_ARG_TYPE(node->gccNode),
+ "decl type"));
+ node->parmSize = static_cast<IntegerCstNode*>(createParseNode(
+ node,
+ DECL_SIZE(node->gccNode),
+ INTEGER_CST,
+ "parm size"));
+}
+
+}