X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=2ef4aa7d9b77c5f853968da6e4e9dbc310c9abec;hb=7434b80c452eb8f7ac8200a6f693a9eb668421f0;hp=695c2e260a7c65ec4ced67b5c9b15c7c537c5d16;hpb=5945ad9b63bbc55c3ed21f0c023d17f73aaac370;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 695c2e26..2ef4aa7d 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -15,23 +15,29 @@ class ProgramCompiler private: struct Visitor: ProgramSyntax::TraversingVisitor { + typedef void ResultType; + ProgramSyntax::Stage *stage; Visitor(); virtual void apply(ProgramSyntax::Stage &); + void get_result() const { } }; struct Formatter: Visitor { + typedef std::string ResultType; + std::string formatted; unsigned indent; bool parameter_list; - bool else_if; + unsigned else_if; std::string block_interface; Formatter(); + const std::string &get_result() const { return formatted; } virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); @@ -39,6 +45,7 @@ private: virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::Layout &); @@ -57,6 +64,9 @@ private: ProgramSyntax::StructDeclaration *type; bool anonymous; std::string block_interface; + bool record_target; + ProgramSyntax::VariableDeclaration *assignment_target; + bool self_referencing; VariableResolver(); @@ -65,6 +75,7 @@ private: virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); @@ -100,31 +111,49 @@ private: struct UnusedVariableLocator: Visitor { + struct AssignmentList + { + std::vector nodes; + bool conditional; + bool self_referencing; + }; + + typedef std::set ResultType; + typedef std::map BlockAssignmentMap; + std::set unused_nodes; std::map aggregates; ProgramSyntax::Node *aggregate; - std::map assignments; - bool assignment; - bool record_target; - ProgramSyntax::VariableDeclaration *assignment_target; - bool indeterminate_target; - bool self_referencing; + std::vector assignments; + ProgramSyntax::Assignment *assignment; + bool assignment_target; UnusedVariableLocator(); + virtual void apply(ProgramSyntax::Stage &); + const ResultType &get_result() const { return unused_nodes; } virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); virtual void visit(ProgramSyntax::BinaryExpression &); + virtual void visit(ProgramSyntax::Assignment &); + void record_assignment(ProgramSyntax::VariableDeclaration &, ProgramSyntax::Node &, bool); virtual void visit(ProgramSyntax::ExpressionStatement &); virtual void visit(ProgramSyntax::StructDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); virtual void visit(ProgramSyntax::InterfaceBlock &); + virtual void visit(ProgramSyntax::FunctionDeclaration &); + void merge_down_assignments(); + virtual void visit(ProgramSyntax::Conditional &); + virtual void visit(ProgramSyntax::Iteration &); }; struct NodeRemover: Visitor { std::set to_remove; + NodeRemover() { } + NodeRemover(const std::set &); + virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; @@ -148,8 +177,9 @@ private: bool optimize(ProgramSyntax::Stage &); static void inject_block(ProgramSyntax::Block &, const ProgramSyntax::Block &); template - static void apply(ProgramSyntax::Stage &); - std::string create_source(ProgramSyntax::Stage &); + static typename T::ResultType apply(ProgramSyntax::Stage &); + template + static typename T::ResultType apply(ProgramSyntax::Stage &, const A &); }; } // namespace GL