X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fprogramcompiler.h;h=5bb7147496b3190f730db4a878395f81fe2fb519;hb=51c775a5df70fe5a538c3e4bcccd3ab857ba5b59;hp=46c37930d6d4e948299f6ef43b637746dc3e4256;hpb=a48aaa402e2aacab780805f529cde4ded7ae3f59;p=libs%2Fgl.git diff --git a/source/programcompiler.h b/source/programcompiler.h index 46c37930..5bb71474 100644 --- a/source/programcompiler.h +++ b/source/programcompiler.h @@ -40,6 +40,7 @@ private: virtual void apply(ProgramSyntax::Stage &); const std::string &get_result() const { return formatted; } + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); @@ -60,6 +61,7 @@ private: virtual void visit(ProgramSyntax::Conditional &); virtual void visit(ProgramSyntax::Iteration &); virtual void visit(ProgramSyntax::Return &); + virtual void visit(ProgramSyntax::Jump &); }; template @@ -70,6 +72,7 @@ private: std::list nodes; const ResultType &get_result() const { return nodes; } + using Visitor::visit; virtual void visit(T &n) { nodes.push_back(&n); } }; @@ -82,6 +85,7 @@ private: DeclarationCombiner(); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::FunctionDeclaration &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -100,6 +104,7 @@ private: VariableResolver(); virtual void apply(ProgramSyntax::Stage &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::MemberAccess &); @@ -114,6 +119,7 @@ private: { std::map > functions; + using Visitor::visit; virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::FunctionDeclaration &); }; @@ -127,6 +133,7 @@ private: void flatten_block(ProgramSyntax::Block &); void apply_and_increment(ProgramSyntax::Block &, std::list >::iterator &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); }; @@ -141,6 +148,7 @@ private: static std::string get_out_prefix(ProgramSyntax::StageType); virtual void apply(ProgramSyntax::Stage &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); std::string change_prefix(const std::string &, const std::string &) const; bool generate_interface(ProgramSyntax::VariableDeclaration &, const std::string &, const std::string &); @@ -152,6 +160,7 @@ private: struct VariableRenamer: Visitor { + using Visitor::visit; virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; @@ -171,6 +180,7 @@ private: DeclarationReorderer(); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::InterfaceLayout &) { kind = LAYOUT; } virtual void visit(ProgramSyntax::StructDeclaration &) { kind = STRUCT; } @@ -190,6 +200,7 @@ private: InlineableFunctionLocator(); const ResultType &get_result() const { return inlineable; } + using Visitor::visit; virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::FunctionDeclaration &); }; @@ -204,6 +215,7 @@ private: FunctionInliner(const std::set &); void visit_and_inline(RefPtr &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::UnaryExpression &); virtual void visit(ProgramSyntax::BinaryExpression &); @@ -222,6 +234,7 @@ private: ExpressionEvaluator(); ExpressionEvaluator(const ValueMap &); + using ProgramSyntax::NodeVisitor::visit; virtual void visit(ProgramSyntax::Literal &); virtual void visit(ProgramSyntax::ParenthesizedExpression &); virtual void visit(ProgramSyntax::VariableReference &); @@ -236,6 +249,7 @@ private: ConstantConditionEliminator(); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::Assignment &); virtual void visit(ProgramSyntax::VariableDeclaration &); @@ -245,38 +259,44 @@ private: struct UnusedVariableLocator: Visitor { - struct AssignmentList + struct VariableInfo { - std::vector nodes; - bool conditional; - bool self_referencing; + bool local; + std::vector assignments; + bool conditionally_assigned; + bool referenced; + + VariableInfo(); }; typedef std::set ResultType; - typedef std::map BlockAssignmentMap; + typedef std::map BlockVariableMap; std::set unused_nodes; std::map aggregates; ProgramSyntax::Node *aggregate; - std::vector assignments; + std::vector variables; ProgramSyntax::Assignment *assignment; bool assignment_target; + bool global_scope; UnusedVariableLocator(); virtual void apply(ProgramSyntax::Stage &); const ResultType &get_result() const { return unused_nodes; } + using Visitor::visit; 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); + void clear_assignments(VariableInfo &, 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(); + void merge_down_variables(); virtual void visit(ProgramSyntax::Conditional &); virtual void visit(ProgramSyntax::Iteration &); }; @@ -289,6 +309,7 @@ private: std::set used_definitions; const ResultType &get_result() const { return unused_nodes; } + using Visitor::visit; virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::FunctionDeclaration &); }; @@ -300,6 +321,7 @@ private: NodeRemover() { } NodeRemover(const std::set &); + using Visitor::visit; virtual void visit(ProgramSyntax::Block &); virtual void visit(ProgramSyntax::VariableDeclaration &); }; @@ -314,6 +336,7 @@ private: LegacyConverter(const Version &); bool check_version(const Version &); + using Visitor::visit; virtual void visit(ProgramSyntax::VariableReference &); virtual void visit(ProgramSyntax::FunctionCall &); virtual void visit(ProgramSyntax::VariableDeclaration &);