namespace GL {
namespace SL {
+/** Compares two types for equality. Struct types are compared recursively. */
+class TypeComparer: private NodeVisitor
+{
+private:
+ Node *first;
+ Node *second;
+ unsigned first_tag;
+ bool r_result;
+
+ static unsigned next_tag;
+
+public:
+ TypeComparer();
+
+ bool apply(TypeDeclaration &t1, TypeDeclaration &t2) { compare(t1, t2); return r_result; }
+
+private:
+ void compare(Node &, Node &);
+ template<typename T>
+ T *multi_visit(T &);
+ virtual void visit(Literal &);
+ virtual void visit(VariableReference &);
+ virtual void visit(BasicTypeDeclaration &);
+ virtual void visit(ImageTypeDeclaration &);
+ virtual void visit(StructDeclaration &);
+ virtual void visit(VariableDeclaration &);
+};
+
/** Determines the number of interface locations required by a variable. */
class LocationCounter: private NodeVisitor
{
virtual void visit(VariableDeclaration &);
};
+/** Determines the size and alignment of a variable or a type, in bytes. */
+class MemoryRequirementsCalculator: private NodeVisitor
+{
+public:
+ struct Result
+ {
+ unsigned size;
+ unsigned alignment;
+ unsigned stride;
+
+ Result(unsigned s, unsigned a): size(s), alignment(a), stride(s+a-1-(s+a-1)%a) { }
+ };
+private:
+ unsigned r_size;
+ unsigned r_alignment;
+ int r_offset;
+
+public:
+ Result apply(VariableDeclaration &v) { v.visit(*this); return Result(r_size, r_alignment); }
+ Result apply(TypeDeclaration &t) { t.visit(*this); return Result(r_size, r_alignment); }
+
+private:
+ virtual void visit(BasicTypeDeclaration &);
+ virtual void visit(StructDeclaration &);
+ virtual void visit(VariableDeclaration &);
+};
+
+/** Collects dependencies of a function. This includes global variables,
+interface blocks, other functions and types. */
+class DependencyCollector: private TraversingVisitor
+{
+private:
+ std::set<Node *> dependencies;
+ std::set<Node *> locals;
+ std::set<FunctionDeclaration *> visited_functions;
+
+public:
+ std::set<Node *> apply(FunctionDeclaration &);
+
+private:
+ virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(VariableDeclaration &);
+ virtual void visit(FunctionDeclaration &);
+};
+
} // namespace SL
} // namespace GL
} // namespace Msp