- type_t *type = expression->type;
- if (type == NULL) {
- /* beware: if expression is a variable reference, return the
- alignment of the variable. */
- const expression_t *tp_expression = expression->tp_expression;
- const entity_t *entity = expression_is_variable(tp_expression);
- if (entity != NULL) {
- /* TODO: get the alignment of this variable. */
- (void) entity;
+ ir_entity *irentity = NULL;
+
+ const expression_t *tp_expression = expression->tp_expression;
+ if (tp_expression != NULL) {
+ entity_t *entity = get_expression_entity(tp_expression);
+ if (entity != NULL && is_declaration(entity)) {
+ switch (entity->declaration.kind) {
+ case DECLARATION_KIND_UNKNOWN:
+ panic("unknown entity reference found");
+ case DECLARATION_KIND_COMPOUND_MEMBER:
+ irentity = entity->compound_member.entity;
+ break;
+ case DECLARATION_KIND_GLOBAL_VARIABLE:
+ case DECLARATION_KIND_LOCAL_VARIABLE_ENTITY:
+ irentity = entity->variable.v.entity;
+ break;
+ case DECLARATION_KIND_PARAMETER_ENTITY:
+ irentity = entity->parameter.v.entity;
+ break;
+ case DECLARATION_KIND_FUNCTION:
+ case DECLARATION_KIND_INNER_FUNCTION:
+ irentity = entity->function.entity;
+ break;
+ case DECLARATION_KIND_PARAMETER:
+ case DECLARATION_KIND_LOCAL_VARIABLE:
+ case DECLARATION_KIND_VARIABLE_LENGTH_ARRAY:
+ break;
+ }