Revert r253678, r253661:
Fix a segfault in ctfmerge(1) due to a bug in GCC. The change was correct and the bug real, but upstream didn't adopt it and we want to remain in sync. When/if upstream does something about it we can bring their version. The bug in question was fixed in GCC 4.9 which is now the default in FreeBSD's ports. Our native gcc-4.2, which is still in use in some Tier-2 platforms also has a workaround so no end-user should be harmed by the revert.
This commit is contained in:
parent
4786190d2f
commit
69718b786d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=309490
@ -52,8 +52,6 @@ static char *curfile;
|
|||||||
#define CTF_BUF_CHUNK_SIZE (64 * 1024)
|
#define CTF_BUF_CHUNK_SIZE (64 * 1024)
|
||||||
#define RES_BUF_CHUNK_SIZE (64 * 1024)
|
#define RES_BUF_CHUNK_SIZE (64 * 1024)
|
||||||
|
|
||||||
static int ntypes = 0; /* The number of types. */
|
|
||||||
|
|
||||||
struct ctf_buf {
|
struct ctf_buf {
|
||||||
strtab_t ctb_strtab; /* string table */
|
strtab_t ctb_strtab; /* string table */
|
||||||
caddr_t ctb_base; /* pointer to base of buffer */
|
caddr_t ctb_base; /* pointer to base of buffer */
|
||||||
@ -1145,10 +1143,6 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
|
|||||||
(*mpp)->ml_type = tdarr[ctm->ctm_type];
|
(*mpp)->ml_type = tdarr[ctm->ctm_type];
|
||||||
(*mpp)->ml_offset = ctm->ctm_offset;
|
(*mpp)->ml_offset = ctm->ctm_offset;
|
||||||
(*mpp)->ml_size = 0;
|
(*mpp)->ml_size = 0;
|
||||||
if (ctm->ctm_type > ntypes) {
|
|
||||||
parseterminate("Invalid member type ctm_type=%d",
|
|
||||||
ctm->ctm_type);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0, mpp = &tdp->t_members; i < vlen;
|
for (i = 0, mpp = &tdp->t_members; i < vlen;
|
||||||
@ -1165,10 +1159,6 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
|
|||||||
(*mpp)->ml_offset =
|
(*mpp)->ml_offset =
|
||||||
(int)CTF_LMEM_OFFSET(ctlm);
|
(int)CTF_LMEM_OFFSET(ctlm);
|
||||||
(*mpp)->ml_size = 0;
|
(*mpp)->ml_size = 0;
|
||||||
if (ctlm->ctlm_type > ntypes) {
|
|
||||||
parseterminate("Invalid lmember type ctlm_type=%d",
|
|
||||||
ctlm->ctlm_type);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1282,10 +1272,9 @@ ctf_parse(ctf_header_t *h, caddr_t buf, symit_data_t *si, char *label)
|
|||||||
{
|
{
|
||||||
tdata_t *td = tdata_new();
|
tdata_t *td = tdata_new();
|
||||||
tdesc_t **tdarr;
|
tdesc_t **tdarr;
|
||||||
|
int ntypes = count_types(h, buf);
|
||||||
int idx, i;
|
int idx, i;
|
||||||
|
|
||||||
ntypes = count_types(h, buf);
|
|
||||||
|
|
||||||
/* shudder */
|
/* shudder */
|
||||||
tdarr = xcalloc(sizeof (tdesc_t *) * (ntypes + 1));
|
tdarr = xcalloc(sizeof (tdesc_t *) * (ntypes + 1));
|
||||||
tdarr[0] = NULL;
|
tdarr[0] = NULL;
|
||||||
|
@ -159,7 +159,7 @@ typedef struct ardef {
|
|||||||
/* Auxiliary structure for structure/union tdesc_t */
|
/* Auxiliary structure for structure/union tdesc_t */
|
||||||
typedef struct mlist {
|
typedef struct mlist {
|
||||||
int ml_offset; /* Offset from start of structure (in bits) */
|
int ml_offset; /* Offset from start of structure (in bits) */
|
||||||
uint_t ml_size; /* Member size (in bits) */
|
int ml_size; /* Member size (in bits) */
|
||||||
char *ml_name; /* Member name */
|
char *ml_name; /* Member name */
|
||||||
struct tdesc *ml_type; /* Member type */
|
struct tdesc *ml_type; /* Member type */
|
||||||
struct mlist *ml_next; /* Next member */
|
struct mlist *ml_next; /* Next member */
|
||||||
|
@ -727,13 +727,6 @@ die_array_create(dwarf_t *dw, Dwarf_Die arr, Dwarf_Off off, tdesc_t *tdp)
|
|||||||
tdesc_t *dimtdp;
|
tdesc_t *dimtdp;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
/* Check for bogus gcc DW_AT_byte_size attribute */
|
|
||||||
if (uval == (unsigned)-1) {
|
|
||||||
printf("dwarf.c:%s() working around bogus -1 DW_AT_byte_size\n",
|
|
||||||
__func__);
|
|
||||||
uval = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tdp->t_size = uval;
|
tdp->t_size = uval;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -826,12 +819,6 @@ die_enum_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
|
|||||||
tdp->t_type = ENUM;
|
tdp->t_type = ENUM;
|
||||||
|
|
||||||
(void) die_unsigned(dw, die, DW_AT_byte_size, &uval, DW_ATTR_REQ);
|
(void) die_unsigned(dw, die, DW_AT_byte_size, &uval, DW_ATTR_REQ);
|
||||||
/* Check for bogus gcc DW_AT_byte_size attribute */
|
|
||||||
if (uval == (unsigned)-1) {
|
|
||||||
printf("dwarf.c:%s() working around bogus -1 DW_AT_byte_size\n",
|
|
||||||
__func__);
|
|
||||||
uval = 0;
|
|
||||||
}
|
|
||||||
tdp->t_size = uval;
|
tdp->t_size = uval;
|
||||||
|
|
||||||
if ((mem = die_child(dw, die)) != NULL) {
|
if ((mem = die_child(dw, die)) != NULL) {
|
||||||
@ -945,7 +932,7 @@ static void
|
|||||||
die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
|
die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
|
||||||
int type, const char *typename)
|
int type, const char *typename)
|
||||||
{
|
{
|
||||||
Dwarf_Unsigned sz, bitsz, bitoff, maxsz=0;
|
Dwarf_Unsigned sz, bitsz, bitoff;
|
||||||
#if BYTE_ORDER == _LITTLE_ENDIAN
|
#if BYTE_ORDER == _LITTLE_ENDIAN
|
||||||
Dwarf_Unsigned bysz;
|
Dwarf_Unsigned bysz;
|
||||||
#endif
|
#endif
|
||||||
@ -1004,8 +991,6 @@ die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
|
|||||||
ml->ml_name = NULL;
|
ml->ml_name = NULL;
|
||||||
|
|
||||||
ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type);
|
ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type);
|
||||||
debug(3, "die_sou_create(): ml_type = %p t_id = %d\n",
|
|
||||||
ml->ml_type, ml->ml_type->t_id);
|
|
||||||
|
|
||||||
if (die_mem_offset(dw, mem, DW_AT_data_member_location,
|
if (die_mem_offset(dw, mem, DW_AT_data_member_location,
|
||||||
&mloff, 0)) {
|
&mloff, 0)) {
|
||||||
@ -1051,24 +1036,8 @@ die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
|
|||||||
|
|
||||||
*mlastp = ml;
|
*mlastp = ml;
|
||||||
mlastp = &ml->ml_next;
|
mlastp = &ml->ml_next;
|
||||||
|
|
||||||
/* Find the size of the largest member to work around a gcc
|
|
||||||
* bug. See GCC Bugzilla 35998.
|
|
||||||
*/
|
|
||||||
if (maxsz < ml->ml_size)
|
|
||||||
maxsz = ml->ml_size;
|
|
||||||
|
|
||||||
} while ((mem = die_sibling(dw, mem)) != NULL);
|
} while ((mem = die_sibling(dw, mem)) != NULL);
|
||||||
|
|
||||||
/* See if we got a bogus DW_AT_byte_size. GCC will sometimes
|
|
||||||
* emit this.
|
|
||||||
*/
|
|
||||||
if (sz == (unsigned)-1) {
|
|
||||||
printf("dwarf.c:%s() working around bogus -1 DW_AT_byte_size\n",
|
|
||||||
__func__);
|
|
||||||
tdp->t_size = maxsz / 8; /* maxsz is in bits, t_size is bytes */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GCC will attempt to eliminate unused types, thus decreasing the
|
* GCC will attempt to eliminate unused types, thus decreasing the
|
||||||
* size of the emitted dwarf. That is, if you declare a foo_t in your
|
* size of the emitted dwarf. That is, if you declare a foo_t in your
|
||||||
@ -1170,7 +1139,7 @@ die_sou_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ml->ml_size != 0 && mt->t_type == INTRINSIC &&
|
if (ml->ml_size != 0 && mt->t_type == INTRINSIC &&
|
||||||
mt->t_intr->intr_nbits != (int)ml->ml_size) {
|
mt->t_intr->intr_nbits != ml->ml_size) {
|
||||||
/*
|
/*
|
||||||
* This member is a bitfield, and needs to reference
|
* This member is a bitfield, and needs to reference
|
||||||
* an intrinsic type with the same width. If the
|
* an intrinsic type with the same width. If the
|
||||||
@ -1486,13 +1455,6 @@ die_base_create(dwarf_t *dw, Dwarf_Die base, Dwarf_Off off, tdesc_t *tdp)
|
|||||||
*/
|
*/
|
||||||
(void) die_unsigned(dw, base, DW_AT_byte_size, &sz, DW_ATTR_REQ);
|
(void) die_unsigned(dw, base, DW_AT_byte_size, &sz, DW_ATTR_REQ);
|
||||||
|
|
||||||
/* Check for bogus gcc DW_AT_byte_size attribute */
|
|
||||||
if (sz == (unsigned)-1) {
|
|
||||||
printf("dwarf.c:%s() working around bogus -1 DW_AT_byte_size\n",
|
|
||||||
__func__);
|
|
||||||
sz = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdp->t_name == NULL)
|
if (tdp->t_name == NULL)
|
||||||
terminate("die %llu: base type without name\n", off);
|
terminate("die %llu: base type without name\n", off);
|
||||||
|
|
||||||
|
@ -952,7 +952,7 @@ soudef(char *cp, stabtype_t type, tdesc_t **rtdp)
|
|||||||
|
|
||||||
itdp = find_intrinsic(tdp);
|
itdp = find_intrinsic(tdp);
|
||||||
if (itdp->t_type == INTRINSIC) {
|
if (itdp->t_type == INTRINSIC) {
|
||||||
if ((int)mlp->ml_size != itdp->t_intr->intr_nbits) {
|
if (mlp->ml_size != itdp->t_intr->intr_nbits) {
|
||||||
parse_debug(4, cp, "making %d bit intrinsic "
|
parse_debug(4, cp, "making %d bit intrinsic "
|
||||||
"from %s", mlp->ml_size, tdesc_name(itdp));
|
"from %s", mlp->ml_size, tdesc_name(itdp));
|
||||||
mlp->ml_type = bitintrinsic(itdp, mlp->ml_size);
|
mlp->ml_type = bitintrinsic(itdp, mlp->ml_size);
|
||||||
@ -1173,7 +1173,7 @@ resolve_typed_bitfields_cb(void *arg, void *private __unused)
|
|||||||
while (tdp) {
|
while (tdp) {
|
||||||
switch (tdp->t_type) {
|
switch (tdp->t_type) {
|
||||||
case INTRINSIC:
|
case INTRINSIC:
|
||||||
if ((int)ml->ml_size != tdp->t_intr->intr_nbits) {
|
if (ml->ml_size != tdp->t_intr->intr_nbits) {
|
||||||
debug(3, "making %d bit intrinsic from %s",
|
debug(3, "making %d bit intrinsic from %s",
|
||||||
ml->ml_size, tdesc_name(tdp));
|
ml->ml_size, tdesc_name(tdp));
|
||||||
ml->ml_type = bitintrinsic(tdp, ml->ml_size);
|
ml->ml_type = bitintrinsic(tdp, ml->ml_size);
|
||||||
|
Loading…
Reference in New Issue
Block a user