Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/elftoolchain/libelf/libelf_allocate.c
Show First 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
assert(e != NULL); | assert(e != NULL); | ||||
assert(e->e_kind == ELF_K_NONE); | assert(e->e_kind == ELF_K_NONE); | ||||
e->e_kind = kind; | e->e_kind = kind; | ||||
switch (kind) { | switch (kind) { | ||||
case ELF_K_ELF: | case ELF_K_ELF: | ||||
STAILQ_INIT(&e->e_u.e_elf.e_scn); | RB_INIT(&e->e_u.e_elf.e_scn); | ||||
break; | break; | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
#define FREE(P) do { \ | #define FREE(P) do { \ | ||||
if (P) \ | if (P) \ | ||||
Show All 18 Lines | case ELFCLASS32: | ||||
FREE(e->e_u.e_elf.e_phdr.e_phdr32); | FREE(e->e_u.e_elf.e_phdr.e_phdr32); | ||||
break; | break; | ||||
case ELFCLASS64: | case ELFCLASS64: | ||||
FREE(e->e_u.e_elf.e_ehdr.e_ehdr64); | FREE(e->e_u.e_elf.e_ehdr.e_ehdr64); | ||||
FREE(e->e_u.e_elf.e_phdr.e_phdr64); | FREE(e->e_u.e_elf.e_phdr.e_phdr64); | ||||
break; | break; | ||||
} | } | ||||
assert(STAILQ_EMPTY(&e->e_u.e_elf.e_scn)); | assert(RB_EMPTY(&e->e_u.e_elf.e_scn)); | ||||
if (e->e_flags & LIBELF_F_AR_HEADER) { | if (e->e_flags & LIBELF_F_AR_HEADER) { | ||||
arh = e->e_hdr.e_arhdr; | arh = e->e_hdr.e_arhdr; | ||||
FREE(arh->ar_name); | FREE(arh->ar_name); | ||||
FREE(arh->ar_rawname); | FREE(arh->ar_rawname); | ||||
free(arh); | free(arh); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | _libelf_allocate_scn(Elf *e, size_t ndx) | ||||
} | } | ||||
s->s_elf = e; | s->s_elf = e; | ||||
s->s_ndx = ndx; | s->s_ndx = ndx; | ||||
STAILQ_INIT(&s->s_data); | STAILQ_INIT(&s->s_data); | ||||
STAILQ_INIT(&s->s_rawdata); | STAILQ_INIT(&s->s_rawdata); | ||||
STAILQ_INSERT_TAIL(&e->e_u.e_elf.e_scn, s, s_next); | RB_INSERT(scntree, &e->e_u.e_elf.e_scn, s); | ||||
return (s); | return (s); | ||||
} | } | ||||
Elf_Scn * | Elf_Scn * | ||||
_libelf_release_scn(Elf_Scn *s) | _libelf_release_scn(Elf_Scn *s) | ||||
{ | { | ||||
Elf *e; | Elf *e; | ||||
Show All 11 Lines | STAILQ_FOREACH_SAFE(d, &s->s_rawdata, d_next, td) { | ||||
STAILQ_REMOVE(&s->s_rawdata, d, _Libelf_Data, d_next); | STAILQ_REMOVE(&s->s_rawdata, d, _Libelf_Data, d_next); | ||||
d = _libelf_release_data(d); | d = _libelf_release_data(d); | ||||
} | } | ||||
e = s->s_elf; | e = s->s_elf; | ||||
assert(e != NULL); | assert(e != NULL); | ||||
STAILQ_REMOVE(&e->e_u.e_elf.e_scn, s, _Elf_Scn, s_next); | RB_REMOVE(scntree, &e->e_u.e_elf.e_scn, s); | ||||
free(s); | free(s); | ||||
return (NULL); | return (NULL); | ||||
} | } |