t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, btf_kflag(t));
 }
 
+static int btf_commit_type(struct btf *btf, int data_sz)
+{
+       int err;
+
+       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
+       if (err)
+               return err;
+
+       btf->hdr->type_len += data_sz;
+       btf->hdr->str_off += data_sz;
+       btf->nr_types++;
+       return btf->nr_types;
+}
+
 /*
  * Append new BTF_KIND_INT type with:
  *   - *name* - non-empty, non-NULL type name;
 int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding)
 {
        struct btf_type *t;
-       int sz, err, name_off;
+       int sz, name_off;
 
        /* non-empty name */
        if (!name || !name[0])
        /* set INT info, we don't allow setting legacy bit offset/size */
        *(__u32 *)(t + 1) = (encoding << 24) | (byte_sz * 8);
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /* it's completely legal to append BTF types with type IDs pointing forward to
 static int btf_add_ref_kind(struct btf *btf, int kind, const char *name, int ref_type_id)
 {
        struct btf_type *t;
-       int sz, name_off = 0, err;
+       int sz, name_off = 0;
 
        if (validate_type_id(ref_type_id))
                return -EINVAL;
        t->info = btf_type_info(kind, 0, 0);
        t->type = ref_type_id;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
 {
        struct btf_type *t;
        struct btf_array *a;
-       int sz, err;
+       int sz;
 
        if (validate_type_id(index_type_id) || validate_type_id(elem_type_id))
                return -EINVAL;
        a->index_type = index_type_id;
        a->nelems = nr_elems;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /* generic STRUCT/UNION append function */
 static int btf_add_composite(struct btf *btf, int kind, const char *name, __u32 bytes_sz)
 {
        struct btf_type *t;
-       int sz, err, name_off = 0;
+       int sz, name_off = 0;
 
        if (btf_ensure_modifiable(btf))
                return -ENOMEM;
        t->info = btf_type_info(kind, 0, 0);
        t->size = bytes_sz;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
        return btf_add_composite(btf, BTF_KIND_UNION, name, byte_sz);
 }
 
+static struct btf_type *btf_last_type(struct btf *btf)
+{
+       return btf_type_by_id(btf, btf__get_nr_types(btf));
+}
+
 /*
  * Append new field for the current STRUCT/UNION type with:
  *   - *name* - name of the field, can be NULL or empty for anonymous field;
        /* last type should be union/struct */
        if (btf->nr_types == 0)
                return -EINVAL;
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        if (!btf_is_composite(t))
                return -EINVAL;
 
        m->offset = bit_offset | (bit_size << 24);
 
        /* btf_add_type_mem can invalidate t pointer */
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        /* update parent type's vlen and kflag */
        t->info = btf_type_info(btf_kind(t), btf_vlen(t) + 1, is_bitfield || btf_kflag(t));
 
 int btf__add_enum(struct btf *btf, const char *name, __u32 byte_sz)
 {
        struct btf_type *t;
-       int sz, err, name_off = 0;
+       int sz, name_off = 0;
 
        /* byte_sz must be power of 2 */
        if (!byte_sz || (byte_sz & (byte_sz - 1)) || byte_sz > 8)
        t->info = btf_type_info(BTF_KIND_ENUM, 0, 0);
        t->size = byte_sz;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
        /* last type should be BTF_KIND_ENUM */
        if (btf->nr_types == 0)
                return -EINVAL;
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        if (!btf_is_enum(t))
                return -EINVAL;
 
        v->val = value;
 
        /* update parent type's vlen */
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        btf_type_inc_vlen(t);
 
        btf->hdr->type_len += sz;
 int btf__add_func_proto(struct btf *btf, int ret_type_id)
 {
        struct btf_type *t;
-       int sz, err;
+       int sz;
 
        if (validate_type_id(ret_type_id))
                return -EINVAL;
        t->info = btf_type_info(BTF_KIND_FUNC_PROTO, 0, 0);
        t->type = ret_type_id;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
        /* last type should be BTF_KIND_FUNC_PROTO */
        if (btf->nr_types == 0)
                return -EINVAL;
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        if (!btf_is_func_proto(t))
                return -EINVAL;
 
        p->type = type_id;
 
        /* update parent type's vlen */
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        btf_type_inc_vlen(t);
 
        btf->hdr->type_len += sz;
 {
        struct btf_type *t;
        struct btf_var *v;
-       int sz, err, name_off;
+       int sz, name_off;
 
        /* non-empty name */
        if (!name || !name[0])
        v = btf_var(t);
        v->linkage = linkage;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
 int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz)
 {
        struct btf_type *t;
-       int sz, err, name_off;
+       int sz, name_off;
 
        /* non-empty name */
        if (!name || !name[0])
        t->info = btf_type_info(BTF_KIND_DATASEC, 0, 0);
        t->size = byte_sz;
 
-       err = btf_add_type_idx_entry(btf, btf->hdr->type_len);
-       if (err)
-               return err;
-
-       btf->hdr->type_len += sz;
-       btf->hdr->str_off += sz;
-       btf->nr_types++;
-       return btf->nr_types;
+       return btf_commit_type(btf, sz);
 }
 
 /*
        /* last type should be BTF_KIND_DATASEC */
        if (btf->nr_types == 0)
                return -EINVAL;
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        if (!btf_is_datasec(t))
                return -EINVAL;
 
        v->size = byte_sz;
 
        /* update parent type's vlen */
-       t = btf_type_by_id(btf, btf->nr_types);
+       t = btf_last_type(btf);
        btf_type_inc_vlen(t);
 
        btf->hdr->type_len += sz;