9 bool is_scalar(const BasicTypeDeclaration &type)
11 return (type.kind==BasicTypeDeclaration::INT || type.kind==BasicTypeDeclaration::FLOAT);
14 bool is_vector_or_matrix(const BasicTypeDeclaration &type)
16 return (type.kind==BasicTypeDeclaration::VECTOR || type.kind==BasicTypeDeclaration::MATRIX);
19 BasicTypeDeclaration *get_element_type(BasicTypeDeclaration &type)
21 if(is_vector_or_matrix(type) || type.kind==BasicTypeDeclaration::ARRAY)
23 BasicTypeDeclaration *basic_base = dynamic_cast<BasicTypeDeclaration *>(type.base_type);
24 return (basic_base ? get_element_type(*basic_base) : 0);
30 bool can_convert(const BasicTypeDeclaration &from, const BasicTypeDeclaration &to)
32 if(from.kind==BasicTypeDeclaration::INT && to.kind==BasicTypeDeclaration::FLOAT)
33 return from.size<=to.size;
34 else if(from.kind!=to.kind)
36 else if(is_vector_or_matrix(from) && from.size==to.size)
38 BasicTypeDeclaration *from_base = dynamic_cast<BasicTypeDeclaration *>(from.base_type);
39 BasicTypeDeclaration *to_base = dynamic_cast<BasicTypeDeclaration *>(to.base_type);
40 return (from_base && to_base && can_convert(*from_base, *to_base));
47 unsigned TypeComparer::next_tag = 1;
49 TypeComparer::TypeComparer():
56 void TypeComparer::compare(Node &node1, Node &node2)
68 T *TypeComparer::multi_visit(T &node)
70 static unsigned tag = next_tag++;
80 else if(!first || tag!=first_tag)
84 T *f = static_cast<T *>(first);
92 void TypeComparer::visit(Literal &literal)
94 if(Literal *lit1 = multi_visit(literal))
96 if(!lit1->type || !literal.type)
100 compare(*lit1->type, *literal.type);
102 r_result = (literal.value.check_type<int>() && lit1->value.value<int>()==literal.value.value<int>());
107 void TypeComparer::visit(VariableReference &var)
109 if(VariableReference *var1 = multi_visit(var))
111 if(!var1->declaration || !var.declaration)
113 else if(!var1->declaration->constant || !var.declaration->constant)
115 else if(!var1->declaration->init_expression || !var.declaration->init_expression)
118 compare(*var1->declaration->init_expression, *var.declaration->init_expression);
122 void TypeComparer::visit(BasicTypeDeclaration &basic)
124 if(BasicTypeDeclaration *basic1 = multi_visit(basic))
126 if(basic1->kind!=basic.kind || basic1->size!=basic.size)
128 else if(basic1->base_type && basic.base_type)
129 compare(*basic1->base_type, *basic.base_type);
131 r_result = (!basic1->base_type && !basic.base_type);
135 void TypeComparer::visit(ImageTypeDeclaration &image)
137 if(ImageTypeDeclaration *image1 = multi_visit(image))
139 if(image1->dimensions!=image.dimensions || image1->array!=image.array)
141 else if(image1->sampled!=image.sampled || image1->shadow!=image.shadow)
143 else if(image1->base_type && image.base_type)
144 compare(*image1->base_type, *image.base_type);
146 r_result = (!image1->base_type && !image.base_type);
150 void TypeComparer::visit(StructDeclaration &strct)
152 if(StructDeclaration *strct1 = multi_visit(strct))
154 if(strct1->members.body.size()!=strct.members.body.size())
159 NodeList<Statement>::const_iterator i = strct1->members.body.begin();
160 NodeList<Statement>::const_iterator j = strct.members.body.begin();
161 for(; (r_result && i!=strct1->members.body.end()); ++i, ++j)
167 void TypeComparer::visit(VariableDeclaration &var)
169 if(VariableDeclaration *var1 = multi_visit(var))
171 if(var1->name!=var.name || var1->array!=var.array)
173 else if(!var1->type_declaration || !var.type_declaration)
180 if(var1->array_size && var.array_size)
181 compare(*var1->array_size, *var.array_size);
183 if(r_result && var1->type_declaration!=var.type_declaration)
184 compare(*var1->type_declaration, *var.type_declaration);
185 // TODO Compare layout qualifiers for interface block members
191 LocationCounter::LocationCounter():
195 void LocationCounter::visit(BasicTypeDeclaration &basic)
197 r_count = basic.kind==BasicTypeDeclaration::MATRIX ? basic.size>>16 : 1;
200 void LocationCounter::visit(ImageTypeDeclaration &)
205 void LocationCounter::visit(StructDeclaration &strct)
208 for(NodeList<Statement>::const_iterator i=strct.members.body.begin(); i!=strct.members.body.end(); ++i)
217 void LocationCounter::visit(VariableDeclaration &var)
220 if(var.type_declaration)
221 var.type_declaration->visit(*this);
223 if(const Literal *literal = dynamic_cast<const Literal *>(var.array_size.get()))
224 if(literal->value.check_type<int>())
225 r_count *= literal->value.value<int>();
229 void MemoryRequirementsCalculator::visit(BasicTypeDeclaration &basic)
231 if(basic.kind==BasicTypeDeclaration::BOOL)
236 else if(basic.kind==BasicTypeDeclaration::INT || basic.kind==BasicTypeDeclaration::FLOAT)
238 r_size = basic.size/8;
239 r_alignment = r_size;
241 else if(basic.kind==BasicTypeDeclaration::VECTOR || basic.kind==BasicTypeDeclaration::MATRIX)
243 basic.base_type->visit(*this);
244 unsigned n_elem = basic.size&0xFFFF;
246 if(basic.kind==BasicTypeDeclaration::VECTOR)
247 r_alignment *= (n_elem==3 ? 4 : n_elem);
249 else if(basic.kind==BasicTypeDeclaration::ARRAY)
250 basic.base_type->visit(*this);
253 void MemoryRequirementsCalculator::visit(StructDeclaration &strct)
256 unsigned max_align = 1;
257 for(NodeList<Statement>::iterator i=strct.members.body.begin(); i!=strct.members.body.end(); ++i)
265 total += r_alignment-1;
266 total -= total%r_alignment;
268 max_align = max(max_align, r_alignment);
271 r_alignment = max_align;
274 void MemoryRequirementsCalculator::visit(VariableDeclaration &var)
278 const vector<Layout::Qualifier> qualifiers = var.layout->qualifiers;
279 for(vector<Layout::Qualifier>::const_iterator i=qualifiers.begin(); (r_offset<0 && i!=qualifiers.end()); ++i)
280 if(i->name=="offset")
284 if(var.type_declaration)
285 var.type_declaration->visit(*this);
287 if(const Literal *literal = dynamic_cast<const Literal *>(var.array_size.get()))
288 if(literal->value.check_type<int>())
289 r_size += r_alignment*(literal->value.value<int>()-1);
293 set<Node *> DependencyCollector::apply(FunctionDeclaration &func)
299 void DependencyCollector::visit(VariableReference &var)
301 if(var.declaration && !locals.count(var.declaration))
303 dependencies.insert(var.declaration);
304 var.declaration->visit(*this);
308 void DependencyCollector::visit(InterfaceBlockReference &iface)
310 if(iface.declaration)
312 dependencies.insert(iface.declaration);
313 iface.declaration->visit(*this);
317 void DependencyCollector::visit(FunctionCall &call)
321 dependencies.insert(call.declaration);
322 call.declaration->visit(*this);
324 TraversingVisitor::visit(call);
327 void DependencyCollector::visit(VariableDeclaration &var)
330 if(var.type_declaration)
332 dependencies.insert(var.type_declaration);
333 var.type_declaration->visit(*this);
336 TraversingVisitor::visit(var);
339 void DependencyCollector::visit(FunctionDeclaration &func)
341 if(!visited_functions.count(&func))
343 visited_functions.insert(&func);
344 TraversingVisitor::visit(func);