struct RecordInfo* createRecordInfo(const tree type_decl, const tree record_type) { struct RecordInfo* ri = (struct RecordInfo*) xcalloc(1, sizeof(struct RecordInfo)); ri->name = xstrdup(type_as_string(record_type, 0)); ri->fileName = xstrdup(DECL_SOURCE_FILE(type_decl)); ri->line = DECL_SOURCE_LINE(type_decl); ri->size = TREE_INT_CST_LOW(TYPE_SIZE(record_type)); ri->align = TYPE_ALIGN(record_type); ri->isInstance = CLASSTYPE_TEMPLATE_INSTANTIATION(record_type); ri->firstField = SIZE_MAX; ri->estMinSize = SIZE_MAX; size_t fieldCapacity = 4; ri->fields = (struct FieldInfo**)xmalloc(fieldCapacity * sizeof(struct FieldInfo*)); // Fields/variables/constants/functions are chained via TYPE_FIELDS of record for (tree field = TYPE_FIELDS(record_type); field; field = TREE_CHAIN(field)) { // We're intersted in fields only if (TREE_CODE(field) != FIELD_DECL) continue; struct FieldInfo* fi = createFieldInfo(field); ri->fieldCount++; // Allocate more storage for fields if needed if (ri->fieldCount > fieldCapacity) { fieldCapacity *= 2; ri->fields = (struct FieldInfo**)xrealloc(ri->fields, fieldCapacity * sizeof(struct FieldInfo*)); } ri->fields[ri->fieldCount - 1] = fi; // Mark record as containing bit-fields if (fi->isBitField) ri->hasBitFields = true; // Field is base/vptr if (fi->isSpecial) { // If we encounter special field somewhere after regular fields // it means class has virtual base. if (ri->firstField != SIZE_MAX) ri->hasVirtualBase = true; } else if (ri->firstField == SIZE_MAX) ri->firstField = ri->fieldCount - 1; } return ri; }
tree lambda_function (tree lambda) { tree type; if (TREE_CODE (lambda) == LAMBDA_EXPR) type = LAMBDA_EXPR_CLOSURE (lambda); else type = lambda; gcc_assert (LAMBDA_TYPE_P (type)); /* Don't let debug_tree cause instantiation. */ if (CLASSTYPE_TEMPLATE_INSTANTIATION (type) && !COMPLETE_OR_OPEN_TYPE_P (type)) return NULL_TREE; lambda = lookup_member (type, ansi_opname (CALL_EXPR), /*protect=*/0, /*want_type=*/false, tf_warning_or_error); if (lambda) lambda = STRIP_TEMPLATE (get_first_fn (lambda)); return lambda; }