| 203 | #endif |
| 204 | |
| 205 | static void |
| 206 | elf_set_add(struct elf_set_head *list, Elf_Addr start, Elf_Addr stop, Elf_Addr base) |
| 207 | { |
| 208 | struct elf_set *set, *iter; |
| 209 | |
| 210 | set = malloc(sizeof(*set), M_LINKER, M_WAITOK); |
| 211 | set->es_start = start; |
| 212 | set->es_stop = stop; |
| 213 | set->es_base = base; |
| 214 | |
| 215 | TAILQ_FOREACH(iter, list, es_link) { |
| 216 | KASSERT((set->es_start < iter->es_start && set->es_stop < iter->es_stop) || |
| 217 | (set->es_start > iter->es_start && set->es_stop > iter->es_stop), |
| 218 | ("linker sets intersection: to insert: 0x%jx-0x%jx; inserted: 0x%jx-0x%jx", |
| 219 | (uintmax_t)set->es_start, (uintmax_t)set->es_stop, |
| 220 | (uintmax_t)iter->es_start, (uintmax_t)iter->es_stop)); |
| 221 | |
| 222 | if (iter->es_start > set->es_start) { |
| 223 | TAILQ_INSERT_BEFORE(iter, set, es_link); |
| 224 | break; |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | if (iter == NULL) |
| 229 | TAILQ_INSERT_TAIL(list, set, es_link); |
| 230 | } |
| 231 | |
| 232 | static int |
| 233 | elf_set_find(struct elf_set_head *list, Elf_Addr addr, Elf_Addr *start, Elf_Addr *base) |
no test coverage detected