X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=libctf%2Fctf-create.c;h=b319476c168b34c66364414776ac5a5dcc45291b;hb=fe4c3d430b39d4a8760702c4ecc9e4c1803cb077;hp=bc0ad802dd2b944eabd25c0e224828378675817f;hpb=9943fa3a7320158e209a0339a4022a8165e9d5a6;p=deliverable%2Fbinutils-gdb.git diff --git a/libctf/ctf-create.c b/libctf/ctf-create.c index bc0ad802dd..b319476c16 100644 --- a/libctf/ctf-create.c +++ b/libctf/ctf-create.c @@ -24,6 +24,10 @@ #include #include +#ifndef EOVERFLOW +#define EOVERFLOW ERANGE +#endif + #ifndef roundup #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y)) #endif @@ -126,6 +130,7 @@ ctf_create (int *errp) fp->ctf_dtoldid = 0; fp->ctf_snapshots = 1; fp->ctf_snapshot_lu = 0; + fp->ctf_flags |= LCTF_DIRTY; ctf_set_ctl_hashes (fp); ctf_setmodel (fp, CTF_MODEL_NATIVE); @@ -515,8 +520,9 @@ ctf_serialize (ctf_file_t *fp) } (void) ctf_setmodel (nfp, ctf_getmodel (fp)); - (void) ctf_import (nfp, fp->ctf_parent); + nfp->ctf_parent = fp->ctf_parent; + nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed; nfp->ctf_refcnt = fp->ctf_refcnt; nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY; if (nfp->ctf_dynbase == NULL) @@ -533,12 +539,20 @@ ctf_serialize (ctf_file_t *fp) nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len; nfp->ctf_link_inputs = fp->ctf_link_inputs; nfp->ctf_link_outputs = fp->ctf_link_outputs; + nfp->ctf_errs_warnings = fp->ctf_errs_warnings; nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset; nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab; - nfp->ctf_link_cu_mapping = fp->ctf_link_cu_mapping; + nfp->ctf_link_in_cu_mapping = fp->ctf_link_in_cu_mapping; + nfp->ctf_link_out_cu_mapping = fp->ctf_link_out_cu_mapping; nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping; nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer; nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg; + nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter; + nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg; + nfp->ctf_link_flags = fp->ctf_link_flags; + nfp->ctf_dedup_atoms = fp->ctf_dedup_atoms; + nfp->ctf_dedup_atoms_alloc = fp->ctf_dedup_atoms_alloc; + memcpy (&nfp->ctf_dedup, &fp->ctf_dedup, sizeof (fp->ctf_dedup)); nfp->ctf_snapshot_lu = fp->ctf_snapshots; @@ -555,17 +569,23 @@ ctf_serialize (ctf_file_t *fp) fp->ctf_str_atoms = NULL; fp->ctf_prov_strtab = NULL; memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t)); + memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t)); fp->ctf_add_processing = NULL; fp->ctf_ptrtab = NULL; fp->ctf_link_inputs = NULL; fp->ctf_link_outputs = NULL; fp->ctf_syn_ext_strtab = NULL; - fp->ctf_link_cu_mapping = NULL; + fp->ctf_link_in_cu_mapping = NULL; + fp->ctf_link_out_cu_mapping = NULL; fp->ctf_link_type_mapping = NULL; + fp->ctf_dedup_atoms = NULL; + fp->ctf_dedup_atoms_alloc = NULL; + fp->ctf_parent_unreffed = 1; fp->ctf_dvhash = NULL; memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t)); memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups)); + memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup)); fp->ctf_structs.ctn_writable = NULL; fp->ctf_unions.ctn_writable = NULL; fp->ctf_enums.ctn_writable = NULL; @@ -601,16 +621,19 @@ int ctf_dtd_insert (ctf_file_t *fp, ctf_dtdef_t *dtd, int flag, int kind) { const char *name; - if (ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd) < 0) + if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type, + dtd) < 0) return -1; if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL) { if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable, - (char *) name, (void *) dtd->dtd_type) < 0) + (char *) name, (void *) (uintptr_t) + dtd->dtd_type) < 0) { - ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type); + ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) + dtd->dtd_type); return -1; } } @@ -626,7 +649,7 @@ ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd) int name_kind = kind; const char *name; - ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type); + ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type); switch (kind) { @@ -666,7 +689,8 @@ ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd) ctf_dtdef_t * ctf_dtd_lookup (const ctf_file_t *fp, ctf_id_t type) { - return (ctf_dtdef_t *) ctf_dynhash_lookup (fp->ctf_dthash, (void *) type); + return (ctf_dtdef_t *) + ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type); } ctf_dtdef_t * @@ -778,7 +802,7 @@ ctf_rollback (ctf_file_t *fp, ctf_snapshot_id_t id) ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name); } - ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type); + ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type); ctf_dtd_delete (fp, dtd); } @@ -868,7 +892,7 @@ clp2 (size_t x) return (x + 1); } -static ctf_id_t +ctf_id_t ctf_add_encoded (ctf_file_t *fp, uint32_t flag, const char *name, const ctf_encoding_t *ep, uint32_t kind) { @@ -889,7 +913,7 @@ ctf_add_encoded (ctf_file_t *fp, uint32_t flag, return type; } -static ctf_id_t +ctf_id_t ctf_add_reftype (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind) { ctf_dtdef_t *dtd; @@ -943,6 +967,7 @@ ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, const ctf_encoding_t *ep) { ctf_dtdef_t *dtd; + ctf_id_t resolved_ref = ref; ctf_id_t type; int kind; const ctf_type_t *tp; @@ -960,7 +985,13 @@ ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL)) return CTF_ERR; /* errno is set for us. */ - kind = ctf_type_kind_unsliced (tmp, ref); + /* Make sure we ultimately point to an integral type. We also allow slices to + point to the unimplemented type, for now, because the compiler can emit + such slices, though they're not very much use. */ + + resolved_ref = ctf_type_resolve_unsliced (tmp, ref); + kind = ctf_type_kind_unsliced (tmp, resolved_ref); + if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM) && (ref != 0)) @@ -1233,7 +1264,7 @@ ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name, ctf_dtdef_t *dtd; ctf_id_t type = 0; - if (kind != CTF_K_STRUCT && kind != CTF_K_UNION && kind != CTF_K_ENUM) + if (!ctf_forwardable_kind (kind)) return (ctf_set_errno (fp, ECTF_NOTSUE)); /* If the type is already defined or exists as a forward tag, just @@ -1371,6 +1402,9 @@ ctf_add_member_offset (ctf_file_t *fp, ctf_id_t souid, const char *name, if (dtd == NULL) return (ctf_set_errno (fp, ECTF_BADID)); + if (name != NULL && name[0] == '\0') + name = NULL; + kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info); root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info); vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info); @@ -1599,6 +1633,11 @@ membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset, ctf_bundle_t *ctb = arg; ctf_membinfo_t ctm; + /* Don't check nameless members (e.g. anonymous structs/unions) against each + other. */ + if (name[0] == 0) + return 0; + if (ctf_member_info (ctb->ctb_file, ctb->ctb_type, name, &ctm) < 0) { ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,