}
else if(basic.kind==BasicTypeDeclaration::ARRAY)
basic.base_type->visit(*this);
+
+ if(basic.extended_alignment)
+ r_alignment = (r_alignment+15)&~15U;
}
void MemoryRequirementsCalculator::visit(StructDeclaration &strct)
r_alignment = 1;
r_offset = -1;
s->visit(*this);
- if(r_offset)
+ if(r_offset>=0)
total = r_offset;
total += r_alignment-1;
total -= total%r_alignment;
}
r_size = total;
r_alignment = max_align;
+ if(strct.extended_alignment)
+ r_alignment = (r_alignment+15)&~15U;
r_size += r_alignment-1;
r_size -= r_size%r_alignment;
}
void MemoryRequirementsCalculator::visit(VariableDeclaration &var)
{
- if(var.layout)
- {
- auto i = find_member(var.layout->qualifiers, string("offset"), &Layout::Qualifier::name);
- if(i!=var.layout->qualifiers.end())
- r_offset = i->value;
- }
+ r_offset = get_layout_value(var.layout.get(), "offset");
if(var.type_declaration)
var.type_declaration->visit(*this);