1 /*
2  * Copyright (C) 2009 Dan Carpenter.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, see http://www.gnu.org/copyleft/gpl.txt
16  */
17 
18 #include "parse.h"
19 #include "smatch.h"
20 #include "smatch_extra.h"
21 #include "smatch_slist.h"
22 
23 ALLOCATOR(data_info, "smatch extra data");
24 ALLOCATOR(data_range, "data range");
25 __DO_ALLOCATOR(struct data_range, sizeof(struct data_range), __alignof__(struct data_range),
26 			 "permanent ranges", perm_data_range);
27 __DECLARE_ALLOCATOR(struct ptr_list, rl_ptrlist);
28 
29 static bool is_err_ptr(sval_t sval)
30 {
31 	if (option_project != PROJ_KERNEL)
32 		return false;
33 	if (!type_is_ptr(sval.type))
34 		return false;
35 	if (sval.uvalue < -4095ULL)
36 		return false;
37 	return true;
38 }
39 
40 static char *get_err_pointer_str(struct data_range *drange)
41 {
42 	static char buf[20];
43 
44 	/*
45 	 * The kernel has error pointers where you do essentially:
46 	 *
47 	 * return (void *)(unsigned long)-12;
48 	 *
49 	 * But what I want here is to print -12 instead of the unsigned version
50 	 * of that.
51 	 *
52 	 */
53 	if (!is_err_ptr(drange->min))
54 		return NULL;
55 
56 	if (drange->min.value == drange->max.value)
57 		snprintf(buf, sizeof(buf), "(%lld)", drange->min.value);
58 	else
59 		snprintf(buf, sizeof(buf), "(%lld)-(%lld)", drange->min.value, drange->max.value);
60 	return buf;
61 }
62 
63 char *show_rl(struct range_list *list)
64 {
65 	struct data_range *prev_drange = NULL;
66 	struct data_range *tmp;
67 	char full[255];
68 	char *p = full;
69 	char *prev = full;
70 	char *err_ptr;
71 	int remain;
72 	int i = 0;
73 
74 	full[0] = '\0';
75 
76 	FOR_EACH_PTR(list, tmp) {
77 		remain = full + sizeof(full) - p;
78 		if (remain < 48) {
79 			snprintf(prev, full + sizeof(full) - prev, ",%s-%s",
80 				 sval_to_str(prev_drange->min),
81 				 sval_to_str(sval_type_max(prev_drange->min.type)));
82 			break;
83 		}
84 		prev_drange = tmp;
85 		prev = p;
86 
87 		err_ptr = get_err_pointer_str(tmp);
88 		if (err_ptr) {
89 			p += snprintf(p, remain, "%s%s", i++ ? "," : "", err_ptr);
90 		} else if (sval_cmp(tmp->min, tmp->max) == 0) {
91 			p += snprintf(p, remain, "%s%s", i++ ? "," : "",
92 				      sval_to_str(tmp->min));
93 		} else {
94 			p += snprintf(p, remain, "%s%s-%s", i++ ? "," : "",
95 				      sval_to_str(tmp->min),
96 				      sval_to_str(tmp->max));
97 		}
98 	} END_FOR_EACH_PTR(tmp);
99 
100 	return alloc_sname(full);
101 }
102 
103 void free_all_rl(void)
104 {
105 	clear_rl_ptrlist_alloc();
106 }
107 
108 static int sval_too_big(struct symbol *type, sval_t sval)
109 {
110 	if (type_bits(type) >= 32 &&
111 	    type_bits(sval.type) <= type_bits(type))
112 		return 0;
113 	if (sval.uvalue <= ((1ULL << type_bits(type)) - 1))
114 		return 0;
115 	if (type_signed(sval.type)) {
116 		if (type_unsigned(type)) {
117 			unsigned long long neg = ~sval.uvalue;
118 			if (neg <= sval_type_max(type).uvalue)
119 				return 0;
120 		}
121 		if (sval.value < sval_type_min(type).value)
122 			return 1;
123 		if (sval.value > sval_type_max(type).value)
124 			return 1;
125 		return 0;
126 	}
127 	if (sval.uvalue > sval_type_max(type).uvalue)
128 		return 1;
129 	return 0;
130 }
131 
132 static int truncates_nicely(struct symbol *type, sval_t min, sval_t max)
133 {
134 	unsigned long long mask;
135 	int bits = type_bits(type);
136 
137 	if (bits >= type_bits(min.type))
138 		return 0;
139 
140 	mask = -1ULL << bits;
141 	return (min.uvalue & mask) == (max.uvalue & mask);
142 }
143 
144 static void add_range_t(struct symbol *type, struct range_list **rl, sval_t min, sval_t max)
145 {
146 	/* If we're just adding a number, cast it and add it */
147 	if (sval_cmp(min, max) == 0) {
148 		add_range(rl, sval_cast(type, min), sval_cast(type, max));
149 		return;
150 	}
151 
152 	/* If the range is within the type range then add it */
153 	if (sval_fits(type, min) && sval_fits(type, max)) {
154 		add_range(rl, sval_cast(type, min), sval_cast(type, max));
155 		return;
156 	}
157 
158 	if (truncates_nicely(type, min, max)) {
159 		add_range(rl, sval_cast(type, min), sval_cast(type, max));
160 		return;
161 	}
162 
163 	/*
164 	 * If the range we are adding has more bits than the range type then
165 	 * add the whole range type.  Eg:
166 	 * 0x8000000000000000 - 0xf000000000000000 -> cast to int
167 	 *
168 	 */
169 	if (sval_too_big(type, min) || sval_too_big(type, max)) {
170 		add_range(rl, sval_type_min(type), sval_type_max(type));
171 		return;
172 	}
173 
174 	/* Cast negative values to high positive values */
175 	if (sval_is_negative(min) && type_unsigned(type)) {
176 		if (sval_is_positive(max)) {
177 			if (sval_too_high(type, max)) {
178 				add_range(rl, sval_type_min(type), sval_type_max(type));
179 				return;
180 			}
181 			add_range(rl, sval_type_val(type, 0), sval_cast(type, max));
182 			max = sval_type_max(type);
183 		} else {
184 			max = sval_cast(type, max);
185 		}
186 		min = sval_cast(type, min);
187 		add_range(rl, min, max);
188 	}
189 
190 	/* Cast high positive numbers to negative */
191 	if (sval_unsigned(max) && sval_is_negative(sval_cast(type, max))) {
192 		if (!sval_is_negative(sval_cast(type, min))) {
193 			add_range(rl, sval_cast(type, min), sval_type_max(type));
194 			min = sval_type_min(type);
195 		} else {
196 			min = sval_cast(type, min);
197 		}
198 		max = sval_cast(type, max);
199 		add_range(rl, min, max);
200 	}
201 
202 	add_range(rl, sval_cast(type, min), sval_cast(type, max));
203 	return;
204 }
205 
206 static int str_to_comparison_arg_helper(const char *str,
207 		struct expression *call, int *comparison,
208 		struct expression **arg, const char **endp)
209 {
210 	int param;
211 	const char *c = str;
212 
213 	if (*c != '[')
214 		return 0;
215 	c++;
216 
217 	if (*c == '<') {
218 		c++;
219 		if (*c == '=') {
220 			*comparison = SPECIAL_LTE;
221 			c++;
222 		} else {
223 			*comparison = '<';
224 		}
225 	} else if (*c == '=') {
226 		c++;
227 		c++;
228 		*comparison = SPECIAL_EQUAL;
229 	} else if (*c == '>') {
230 		c++;
231 		if (*c == '=') {
232 			*comparison = SPECIAL_GTE;
233 			c++;
234 		} else {
235 			*comparison = '>';
236 		}
237 	} else if (*c == '!') {
238 		c++;
239 		c++;
240 		*comparison = SPECIAL_NOTEQUAL;
241 	} else if (*c == '$') {
242 		*comparison = SPECIAL_EQUAL;
243 	} else {
244 		return 0;
245 	}
246 
247 	if (*c != '$')
248 		return 0;
249 	c++;
250 
251 	param = strtoll(c, (char **)&c, 10);
252 	if (*c == ',' || *c == ']')
253 		c++; /* skip the ']' character */
254 	if (endp)
255 		*endp = (char *)c;
256 
257 	if (!call)
258 		return 0;
259 	*arg = get_argument_from_call_expr(call->args, param);
260 	if (!*arg)
261 		return 0;
262 	if (*c == '-' && *(c + 1) == '>') {
263 		char buf[256];
264 		int n;
265 
266 		n = snprintf(buf, sizeof(buf), "$%s", c);
267 		if (n >= sizeof(buf))
268 			return 0;
269 		if (buf[n - 1] == ']')
270 			buf[n - 1] = '\0';
271 		*arg = gen_expression_from_key(*arg, buf);
272 		while (*c && *c != ']')
273 			c++;
274 	}
275 	return 1;
276 }
277 
278 int str_to_comparison_arg(const char *str, struct expression *call, int *comparison, struct expression **arg)
279 {
280 	while (1) {
281 		if (!*str)
282 			return 0;
283 		if (*str == '[')
284 			break;
285 		str++;
286 	}
287 	return str_to_comparison_arg_helper(str, call, comparison, arg, NULL);
288 }
289 
290 static int get_val_from_key(int use_max, struct symbol *type, const char *c, struct expression *call, const char **endp, sval_t *sval)
291 {
292 	struct expression *arg;
293 	int comparison;
294 	sval_t ret, tmp;
295 
296 	if (use_max)
297 		ret = sval_type_max(type);
298 	else
299 		ret = sval_type_min(type);
300 
301 	if (!str_to_comparison_arg_helper(c, call, &comparison, &arg, endp)) {
302 		*sval = ret;
303 		return 0;
304 	}
305 
306 	if (use_max && get_implied_max(arg, &tmp)) {
307 		ret = tmp;
308 		if (comparison == '<') {
309 			tmp.value = 1;
310 			ret = sval_binop(ret, '-', tmp);
311 		}
312 	}
313 	if (!use_max && get_implied_min(arg, &tmp)) {
314 		ret = tmp;
315 		if (comparison == '>') {
316 			tmp.value = 1;
317 			ret = sval_binop(ret, '+', tmp);
318 		}
319 	}
320 
321 	*sval = ret;
322 	return 1;
323 }
324 
325 static sval_t add_one(sval_t sval)
326 {
327 	sval.value++;
328 	return sval;
329 }
330 
331 static sval_t sub_one(sval_t sval)
332 {
333 	sval.value--;
334 	return sval;
335 }
336 
337 void filter_by_comparison(struct range_list **rl, int comparison, struct range_list *right)
338 {
339 	struct range_list *left_orig = *rl;
340 	struct range_list *right_orig = right;
341 	struct range_list *ret_rl = *rl;
342 	struct symbol *cast_type;
343 	sval_t min, max;
344 
345 	cast_type = rl_type(left_orig);
346 	if (sval_type_max(rl_type(left_orig)).uvalue < sval_type_max(rl_type(right_orig)).uvalue)
347 		cast_type = rl_type(right_orig);
348 	if (sval_type_max(cast_type).uvalue < INT_MAX)
349 		cast_type = &int_ctype;
350 
351 	min = sval_type_min(cast_type);
352 	max = sval_type_max(cast_type);
353 	left_orig = cast_rl(cast_type, left_orig);
354 	right_orig = cast_rl(cast_type, right_orig);
355 
356 	switch (comparison) {
357 	case '<':
358 	case SPECIAL_UNSIGNED_LT:
359 		ret_rl = remove_range(left_orig, rl_max(right_orig), max);
360 		break;
361 	case SPECIAL_LTE:
362 	case SPECIAL_UNSIGNED_LTE:
363 		if (!sval_is_max(rl_max(right_orig)))
364 			ret_rl = remove_range(left_orig, add_one(rl_max(right_orig)), max);
365 		break;
366 	case SPECIAL_EQUAL:
367 		ret_rl = rl_intersection(left_orig, right_orig);
368 		break;
369 	case SPECIAL_GTE:
370 	case SPECIAL_UNSIGNED_GTE:
371 		if (!sval_is_min(rl_min(right_orig)))
372 			ret_rl = remove_range(left_orig, min, sub_one(rl_min(right_orig)));
373 		break;
374 	case '>':
375 	case SPECIAL_UNSIGNED_GT:
376 		ret_rl = remove_range(left_orig, min, rl_min(right_orig));
377 		break;
378 	case SPECIAL_NOTEQUAL:
379 		if (sval_cmp(rl_min(right_orig), rl_max(right_orig)) == 0)
380 			ret_rl = remove_range(left_orig, rl_min(right_orig), rl_min(right_orig));
381 		break;
382 	default:
383 		sm_perror("unhandled comparison %s", show_special(comparison));
384 		return;
385 	}
386 
387 	*rl = cast_rl(rl_type(*rl), ret_rl);
388 }
389 
390 static struct range_list *filter_by_comparison_call(const char *c, struct expression *call, const char **endp, struct range_list *start_rl)
391 {
392 	struct symbol *type;
393 	struct expression *arg;
394 	struct range_list *casted_start, *right_orig;
395 	int comparison;
396 
397 	if (!str_to_comparison_arg_helper(c, call, &comparison, &arg, endp))
398 		return start_rl;
399 
400 	if (!get_implied_rl(arg, &right_orig))
401 		return start_rl;
402 
403 	type = &int_ctype;
404 	if (type_positive_bits(rl_type(start_rl)) > type_positive_bits(type))
405 		type = rl_type(start_rl);
406 	if (type_positive_bits(rl_type(right_orig)) > type_positive_bits(type))
407 		type = rl_type(right_orig);
408 
409 	casted_start = cast_rl(type, start_rl);
410 	right_orig = cast_rl(type, right_orig);
411 
412 	filter_by_comparison(&casted_start, comparison, right_orig);
413 	return cast_rl(rl_type(start_rl), casted_start);
414 }
415 
416 static sval_t parse_val(int use_max, struct expression *call, struct symbol *type, const char *c, const char **endp)
417 {
418 	const char *start = c;
419 	sval_t ret;
420 
421 	if (!strncmp(start, "max", 3)) {
422 		ret = sval_type_max(type);
423 		c += 3;
424 	} else if (!strncmp(start, "u64max", 6)) {
425 		ret = sval_type_val(type, ULLONG_MAX);
426 		c += 6;
427 	} else if (!strncmp(start, "s64max", 6)) {
428 		ret = sval_type_val(type, LLONG_MAX);
429 		c += 6;
430 	} else if (!strncmp(start, "u32max", 6)) {
431 		ret = sval_type_val(type, UINT_MAX);
432 		c += 6;
433 	} else if (!strncmp(start, "s32max", 6)) {
434 		ret = sval_type_val(type, INT_MAX);
435 		c += 6;
436 	} else if (!strncmp(start, "u16max", 6)) {
437 		ret = sval_type_val(type, USHRT_MAX);
438 		c += 6;
439 	} else if (!strncmp(start, "s16max", 6)) {
440 		ret = sval_type_val(type, SHRT_MAX);
441 		c += 6;
442 	} else if (!strncmp(start, "min", 3)) {
443 		ret = sval_type_min(type);
444 		c += 3;
445 	} else if (!strncmp(start, "s64min", 6)) {
446 		ret = sval_type_val(type, LLONG_MIN);
447 		c += 6;
448 	} else if (!strncmp(start, "s32min", 6)) {
449 		ret = sval_type_val(type, INT_MIN);
450 		c += 6;
451 	} else if (!strncmp(start, "s16min", 6)) {
452 		ret = sval_type_val(type, SHRT_MIN);
453 		c += 6;
454 	} else if (!strncmp(start, "long_min", 8)) {
455 		ret = sval_type_val(type, LONG_MIN);
456 		c += 8;
457 	} else if (!strncmp(start, "long_max", 8)) {
458 		ret = sval_type_val(type, LONG_MAX);
459 		c += 8;
460 	} else if (!strncmp(start, "ulong_max", 9)) {
461 		ret = sval_type_val(type, ULONG_MAX);
462 		c += 9;
463 	} else if (!strncmp(start, "ptr_max", 7)) {
464 		ret = sval_type_val(type, valid_ptr_max);
465 		c += 7;
466 	} else if (start[0] == '[') {
467 		/* this parses [==p0] comparisons */
468 		get_val_from_key(1, type, start, call, &c, &ret);
469 	} else if (type_positive_bits(type) == 64) {
470 		ret = sval_type_val(type, strtoull(start, (char **)&c, 0));
471 	} else {
472 		ret = sval_type_val(type, strtoll(start, (char **)&c, 0));
473 	}
474 	*endp = c;
475 	return ret;
476 }
477 
478 static const char *jump_to_call_math(const char *value)
479 {
480 	const char *c = value;
481 
482 	while (*c && *c != '[')
483 		c++;
484 
485 	if (!*c)
486 		return NULL;
487 	c++;
488 	if (*c == '<' || *c == '=' || *c == '>' || *c == '!')
489 		return NULL;
490 
491 	return c;
492 }
493 
494 static void str_to_rl_helper(struct expression *call, struct symbol *type, const char *str, const char **endp, struct range_list **rl)
495 {
496 	struct range_list *rl_tmp = NULL;
497 	sval_t prev_min, min, max;
498 	const char *c;
499 
500 	prev_min = sval_type_min(type);
501 	min = sval_type_min(type);
502 	max = sval_type_max(type);
503 	c = str;
504 	while (*c != '\0' && *c != '[') {
505 		if (*c == '+') {
506 			if (sval_cmp(min, sval_type_min(type)) != 0)
507 				min = max;
508 			max = sval_type_max(type);
509 			add_range_t(type, &rl_tmp, min, max);
510 			break;
511 		}
512 		if (*c == '(')
513 			c++;
514 		min = parse_val(0, call, type, c, &c);
515 		if (!sval_fits(type, min))
516 			min = sval_type_min(type);
517 		max = min;
518 		if (*c == ')')
519 			c++;
520 		if (*c == '\0' || *c == '[') {
521 			add_range_t(type, &rl_tmp, min, min);
522 			break;
523 		}
524 		if (*c == ',') {
525 			add_range_t(type, &rl_tmp, min, min);
526 			c++;
527 			continue;
528 		}
529 		if (*c == '+') {
530 			min = prev_min;
531 			max = sval_type_max(type);
532 			add_range_t(type, &rl_tmp, min, max);
533 			c++;
534 			if (*c == '[' || *c == '\0')
535 				break;
536 		}
537 		if (*c != '-') {
538 			sm_msg("debug XXX: trouble parsing %s c = %s", str, c);
539 			break;
540 		}
541 		c++;
542 		if (*c == '(')
543 			c++;
544 		max = parse_val(1, call, type, c, &c);
545 		if (!sval_fits(type, max))
546 			max = sval_type_max(type);
547 		if (*c == '+') {
548 			max = sval_type_max(type);
549 			add_range_t(type, &rl_tmp, min, max);
550 			c++;
551 			if (*c == '[' || *c == '\0')
552 				break;
553 		}
554 		prev_min = max;
555 		add_range_t(type, &rl_tmp, min, max);
556 		if (*c == ')')
557 			c++;
558 		if (*c == ',')
559 			c++;
560 	}
561 
562 	*rl = rl_tmp;
563 	*endp = c;
564 }
565 
566 static void str_to_dinfo(struct expression *call, struct symbol *type, const char *value, struct data_info *dinfo)
567 {
568 	struct range_list *math_rl;
569 	const char *call_math;
570 	const char *c;
571 	struct range_list *rl = NULL;
572 
573 	if (!type)
574 		type = &llong_ctype;
575 
576 	if (strcmp(value, "empty") == 0)
577 		return;
578 
579 	if (strncmp(value, "[==$", 4) == 0) {
580 		struct expression *arg;
581 		int comparison;
582 
583 		if (!str_to_comparison_arg(value, call, &comparison, &arg))
584 			return;
585 		if (!get_implied_rl(arg, &rl))
586 			return;
587 		goto cast;
588 	}
589 
590 	str_to_rl_helper(call, type, value, &c, &rl);
591 	if (*c == '\0')
592 		goto cast;
593 
594 	call_math = jump_to_call_math(value);
595 	if (call_math && parse_call_math_rl(call, call_math, &math_rl)) {
596 		rl = rl_intersection(rl, math_rl);
597 		goto cast;
598 	}
599 
600 	/*
601 	 * For now if we already tried to handle the call math and couldn't
602 	 * figure it out then bail.
603 	 */
604 	if (jump_to_call_math(c) == c + 1)
605 		goto cast;
606 
607 	rl = filter_by_comparison_call(c, call, &c, rl);
608 
609 cast:
610 	rl = cast_rl(type, rl);
611 	dinfo->value_ranges = rl;
612 }
613 
614 static int rl_is_sane(struct range_list *rl)
615 {
616 	struct data_range *tmp;
617 	struct symbol *type;
618 
619 	type = rl_type(rl);
620 	FOR_EACH_PTR(rl, tmp) {
621 		if (!sval_fits(type, tmp->min))
622 			return 0;
623 		if (!sval_fits(type, tmp->max))
624 			return 0;
625 		if (sval_cmp(tmp->min, tmp->max) > 0)
626 			return 0;
627 	} END_FOR_EACH_PTR(tmp);
628 
629 	return 1;
630 }
631 
632 void str_to_rl(struct symbol *type, char *value, struct range_list **rl)
633 {
634 	struct data_info dinfo = {};
635 
636 	str_to_dinfo(NULL, type, value, &dinfo);
637 	if (!rl_is_sane(dinfo.value_ranges))
638 		dinfo.value_ranges = alloc_whole_rl(type);
639 	*rl = dinfo.value_ranges;
640 }
641 
642 void call_results_to_rl(struct expression *expr, struct symbol *type, const char *value, struct range_list **rl)
643 {
644 	struct data_info dinfo = {};
645 
646 	str_to_dinfo(strip_expr(expr), type, value, &dinfo);
647 	*rl = dinfo.value_ranges;
648 }
649 
650 int is_whole_rl(struct range_list *rl)
651 {
652 	struct data_range *drange;
653 
654 	if (ptr_list_empty(rl))
655 		return 0;
656 	drange = first_ptr_list((struct ptr_list *)rl);
657 	if (sval_is_min(drange->min) && sval_is_max(drange->max))
658 		return 1;
659 	return 0;
660 }
661 
662 int is_unknown_ptr(struct range_list *rl)
663 {
664 	struct data_range *drange;
665 	int cnt = 0;
666 
667 	if (is_whole_rl(rl))
668 		return 1;
669 
670 	FOR_EACH_PTR(rl, drange) {
671 		if (++cnt >= 3)
672 			return 0;
673 		if (sval_cmp(drange->min, valid_ptr_min_sval) == 0 &&
674 		    sval_cmp(drange->max, valid_ptr_max_sval) == 0)
675 			return 1;
676 	} END_FOR_EACH_PTR(drange);
677 
678 	return 0;
679 }
680 
681 int is_whole_rl_non_zero(struct range_list *rl)
682 {
683 	struct data_range *drange;
684 
685 	if (ptr_list_empty(rl))
686 		return 0;
687 	drange = first_ptr_list((struct ptr_list *)rl);
688 	if (sval_unsigned(drange->min) &&
689 	    drange->min.value == 1 &&
690 	    sval_is_max(drange->max))
691 		return 1;
692 	if (!sval_is_min(drange->min) || drange->max.value != -1)
693 		return 0;
694 	drange = last_ptr_list((struct ptr_list *)rl);
695 	if (drange->min.value != 1 || !sval_is_max(drange->max))
696 		return 0;
697 	return 1;
698 }
699 
700 sval_t rl_min(struct range_list *rl)
701 {
702 	struct data_range *drange;
703 	sval_t ret;
704 
705 	ret.type = &llong_ctype;
706 	ret.value = LLONG_MIN;
707 	if (ptr_list_empty(rl))
708 		return ret;
709 	drange = first_ptr_list((struct ptr_list *)rl);
710 	return drange->min;
711 }
712 
713 sval_t rl_max(struct range_list *rl)
714 {
715 	struct data_range *drange;
716 	sval_t ret;
717 
718 	ret.type = &llong_ctype;
719 	ret.value = LLONG_MAX;
720 	if (ptr_list_empty(rl))
721 		return ret;
722 	drange = last_ptr_list((struct ptr_list *)rl);
723 	return drange->max;
724 }
725 
726 int rl_to_sval(struct range_list *rl, sval_t *sval)
727 {
728 	sval_t min, max;
729 
730 	if (!rl)
731 		return 0;
732 
733 	min = rl_min(rl);
734 	max = rl_max(rl);
735 	if (sval_cmp(min, max) != 0)
736 		return 0;
737 	*sval = min;
738 	return 1;
739 }
740 
741 struct symbol *rl_type(struct range_list *rl)
742 {
743 	if (!rl)
744 		return NULL;
745 	return rl_min(rl).type;
746 }
747 
748 static struct data_range *alloc_range_helper_sval(sval_t min, sval_t max, int perm)
749 {
750 	struct data_range *ret;
751 
752 	if (perm)
753 		ret = __alloc_perm_data_range(0);
754 	else
755 		ret = __alloc_data_range(0);
756 	ret->min = min;
757 	ret->max = max;
758 	return ret;
759 }
760 
761 struct data_range *alloc_range(sval_t min, sval_t max)
762 {
763 	return alloc_range_helper_sval(min, max, 0);
764 }
765 
766 struct data_range *alloc_range_perm(sval_t min, sval_t max)
767 {
768 	return alloc_range_helper_sval(min, max, 1);
769 }
770 
771 struct range_list *alloc_rl(sval_t min, sval_t max)
772 {
773 	struct range_list *rl = NULL;
774 
775 	if (sval_cmp(min, max) > 0)
776 		return alloc_whole_rl(min.type);
777 
778 	add_range(&rl, min, max);
779 	return rl;
780 }
781 
782 struct range_list *alloc_whole_rl(struct symbol *type)
783 {
784 	if (!type || type_positive_bits(type) < 0)
785 		type = &llong_ctype;
786 	if (type->type == SYM_ARRAY)
787 		type = &ptr_ctype;
788 
789 	return alloc_rl(sval_type_min(type), sval_type_max(type));
790 }
791 
792 static bool collapse_pointer_rl(struct range_list **rl, sval_t min, sval_t max)
793 {
794 	struct range_list *new_rl = NULL;
795 	struct data_range *tmp;
796 	static bool recurse;
797 	bool ret = false;
798 	int cnt = 0;
799 
800 	/*
801 	 * With the mtag work, then we end up getting huge lists of mtags.
802 	 * That seems cool, but the problem is that we can only store about
803 	 * 8-10 mtags in the DB before we truncate the list.  Also the mtags
804 	 * aren't really used at all so it's a waste of resources for now...
805 	 * In the future, we maybe will revisit this code.
806 	 *
807 	 */
808 
809 	if (recurse)
810 		return false;
811 	recurse = true;
812 	if (!type_is_ptr(min.type))
813 		goto out;
814 
815 	if (ptr_list_size((struct ptr_list *)*rl) < 8)
816 		goto out;
817 	FOR_EACH_PTR(*rl, tmp) {
818 		if (!is_err_ptr(tmp->min))
819 			cnt++;
820 	} END_FOR_EACH_PTR(tmp);
821 	if (cnt < 8)
822 		goto out;
823 
824 	FOR_EACH_PTR(*rl, tmp) {
825 		if (sval_cmp(tmp->min, valid_ptr_min_sval) >= 0 &&
826 		    sval_cmp(tmp->max, valid_ptr_max_sval) <= 0)
827 			add_range(&new_rl, valid_ptr_min_sval, valid_ptr_max_sval);
828 		else
829 			add_range(&new_rl, tmp->min, tmp->max);
830 	} END_FOR_EACH_PTR(tmp);
831 
832 	add_range(&new_rl, min, max);
833 
834 	*rl = new_rl;
835 	ret = true;
836 out:
837 	recurse = false;
838 	return ret;
839 }
840 
841 extern int rl_ptrlist_hack;
842 void add_range(struct range_list **list, sval_t min, sval_t max)
843 {
844 	struct data_range *tmp;
845 	struct data_range *new = NULL;
846 	int check_next = 0;
847 
848 	/*
849 	 * There is at least on valid reason why the types might be confusing
850 	 * and that's when you have a void pointer and on some paths you treat
851 	 * it as a u8 pointer and on other paths you treat it as a u16 pointer.
852 	 * This case is hard to deal with.
853 	 *
854 	 * There are other cases where we probably should be more specific about
855 	 * the types than we are.  For example, we end up merging a lot of ulong
856 	 * with pointers and I have not figured out why we do that.
857 	 *
858 	 * But this hack works for both cases, I think.  We cast it to pointers
859 	 * or we use the bigger size.
860 	 *
861 	 */
862 	if (*list && rl_type(*list) != min.type) {
863 		if (rl_type(*list)->type == SYM_PTR) {
864 			min = sval_cast(rl_type(*list), min);
865 			max = sval_cast(rl_type(*list), max);
866 		} else if (min.type->type == SYM_PTR) {
867 			*list = cast_rl(min.type, *list);
868 		} else if (type_bits(rl_type(*list)) >= type_bits(min.type)) {
869 			min = sval_cast(rl_type(*list), min);
870 			max = sval_cast(rl_type(*list), max);
871 		} else {
872 			*list = cast_rl(min.type, *list);
873 		}
874 	}
875 
876 	if (sval_cmp(min, max) > 0) {
877 		min = sval_type_min(min.type);
878 		max = sval_type_max(min.type);
879 	}
880 
881 	if (collapse_pointer_rl(list, min, max))
882 		return;
883 
884 	/*
885 	 * FIXME:  This has a problem merging a range_list like: min-0,3-max
886 	 * with a range like 1-2.  You end up with min-2,3-max instead of
887 	 * just min-max.
888 	 */
889 	FOR_EACH_PTR(*list, tmp) {
890 		if (check_next) {
891 			/* Sometimes we overlap with more than one range
892 			   so we have to delete or modify the next range. */
893 			if (!sval_is_max(max) && max.value + 1 == tmp->min.value) {
894 				/* join 2 ranges here */
895 				new->max = tmp->max;
896 				DELETE_CURRENT_PTR(tmp);
897 				return;
898 			}
899 
900 			/* Doesn't overlap with the next one. */
901 			if (sval_cmp(max, tmp->min) < 0)
902 				return;
903 
904 			if (sval_cmp(max, tmp->max) <= 0) {
905 				/* Partially overlaps the next one. */
906 				new->max = tmp->max;
907 				DELETE_CURRENT_PTR(tmp);
908 				return;
909 			} else {
910 				/* Completely overlaps the next one. */
911 				DELETE_CURRENT_PTR(tmp);
912 				/* there could be more ranges to delete */
913 				continue;
914 			}
915 		}
916 		if (!sval_is_max(max) && max.value + 1 == tmp->min.value) {
917 			/* join 2 ranges into a big range */
918 			new = alloc_range(min, tmp->max);
919 			REPLACE_CURRENT_PTR(tmp, new);
920 			return;
921 		}
922 		if (sval_cmp(max, tmp->min) < 0) { /* new range entirely below */
923 			new = alloc_range(min, max);
924 			INSERT_CURRENT(new, tmp);
925 			return;
926 		}
927 		if (sval_cmp(min, tmp->min) < 0) { /* new range partially below */
928 			if (sval_cmp(max, tmp->max) < 0)
929 				max = tmp->max;
930 			else
931 				check_next = 1;
932 			new = alloc_range(min, max);
933 			REPLACE_CURRENT_PTR(tmp, new);
934 			if (!check_next)
935 				return;
936 			continue;
937 		}
938 		if (sval_cmp(max, tmp->max) <= 0) /* new range already included */
939 			return;
940 		if (sval_cmp(min, tmp->max) <= 0) { /* new range partially above */
941 			min = tmp->min;
942 			new = alloc_range(min, max);
943 			REPLACE_CURRENT_PTR(tmp, new);
944 			check_next = 1;
945 			continue;
946 		}
947 		if (!sval_is_min(min) && min.value - 1 == tmp->max.value) {
948 			/* join 2 ranges into a big range */
949 			new = alloc_range(tmp->min, max);
950 			REPLACE_CURRENT_PTR(tmp, new);
951 			check_next = 1;
952 			continue;
953 		}
954 		/* the new range is entirely above the existing ranges */
955 	} END_FOR_EACH_PTR(tmp);
956 	if (check_next)
957 		return;
958 	new = alloc_range(min, max);
959 
960 	rl_ptrlist_hack = 1;
961 	add_ptr_list(list, new);
962 	rl_ptrlist_hack = 0;
963 }
964 
965 struct range_list *clone_rl(struct range_list *list)
966 {
967 	struct data_range *tmp;
968 	struct range_list *ret = NULL;
969 
970 	FOR_EACH_PTR(list, tmp) {
971 		add_ptr_list(&ret, tmp);
972 	} END_FOR_EACH_PTR(tmp);
973 	return ret;
974 }
975 
976 struct range_list *clone_rl_permanent(struct range_list *list)
977 {
978 	struct data_range *tmp;
979 	struct data_range *new;
980 	struct range_list *ret = NULL;
981 
982 	FOR_EACH_PTR(list, tmp) {
983 		new = alloc_range_perm(tmp->min, tmp->max);
984 		add_ptr_list(&ret, new);
985 	} END_FOR_EACH_PTR(tmp);
986 	return ret;
987 }
988 
989 struct range_list *rl_union(struct range_list *one, struct range_list *two)
990 {
991 	struct data_range *tmp;
992 	struct range_list *ret = NULL;
993 
994 	FOR_EACH_PTR(one, tmp) {
995 		add_range(&ret, tmp->min, tmp->max);
996 	} END_FOR_EACH_PTR(tmp);
997 	FOR_EACH_PTR(two, tmp) {
998 		add_range(&ret, tmp->min, tmp->max);
999 	} END_FOR_EACH_PTR(tmp);
1000 	return ret;
1001 }
1002 
1003 struct range_list *remove_range(struct range_list *list, sval_t min, sval_t max)
1004 {
1005 	struct data_range *tmp;
1006 	struct range_list *ret = NULL;
1007 
1008 	if (!list)
1009 		return NULL;
1010 
1011 	min = sval_cast(rl_type(list), min);
1012 	max = sval_cast(rl_type(list), max);
1013 	if (sval_cmp(min, max) > 0) {
1014 		sval_t tmp = min;
1015 		min = max;
1016 		max = tmp;
1017 	}
1018 
1019 	FOR_EACH_PTR(list, tmp) {
1020 		if (sval_cmp(tmp->max, min) < 0) {
1021 			add_range(&ret, tmp->min, tmp->max);
1022 			continue;
1023 		}
1024 		if (sval_cmp(tmp->min, max) > 0) {
1025 			add_range(&ret, tmp->min, tmp->max);
1026 			continue;
1027 		}
1028 		if (sval_cmp(tmp->min, min) >= 0 && sval_cmp(tmp->max, max) <= 0)
1029 			continue;
1030 		if (sval_cmp(tmp->min, min) >= 0) {
1031 			max.value++;
1032 			add_range(&ret, max, tmp->max);
1033 		} else if (sval_cmp(tmp->max, max) <= 0) {
1034 			min.value--;
1035 			add_range(&ret, tmp->min, min);
1036 		} else {
1037 			min.value--;
1038 			max.value++;
1039 			add_range(&ret, tmp->min, min);
1040 			add_range(&ret, max, tmp->max);
1041 		}
1042 	} END_FOR_EACH_PTR(tmp);
1043 	return ret;
1044 }
1045 
1046 int ranges_equiv(struct data_range *one, struct data_range *two)
1047 {
1048 	if (!one && !two)
1049 		return 1;
1050 	if (!one || !two)
1051 		return 0;
1052 	if (sval_cmp(one->min, two->min) != 0)
1053 		return 0;
1054 	if (sval_cmp(one->max, two->max) != 0)
1055 		return 0;
1056 	return 1;
1057 }
1058 
1059 int rl_equiv(struct range_list *one, struct range_list *two)
1060 {
1061 	struct data_range *one_range;
1062 	struct data_range *two_range;
1063 
1064 	if (one == two)
1065 		return 1;
1066 
1067 	PREPARE_PTR_LIST(one, one_range);
1068 	PREPARE_PTR_LIST(two, two_range);
1069 	for (;;) {
1070 		if (!one_range && !two_range)
1071 			return 1;
1072 		if (!ranges_equiv(one_range, two_range))
1073 			return 0;
1074 		NEXT_PTR_LIST(one_range);
1075 		NEXT_PTR_LIST(two_range);
1076 	}
1077 	FINISH_PTR_LIST(two_range);
1078 	FINISH_PTR_LIST(one_range);
1079 
1080 	return 1;
1081 }
1082 
1083 int true_comparison_range(struct data_range *left, int comparison, struct data_range *right)
1084 {
1085 	switch (comparison) {
1086 	case '<':
1087 	case SPECIAL_UNSIGNED_LT:
1088 		if (sval_cmp(left->min, right->max) < 0)
1089 			return 1;
1090 		return 0;
1091 	case SPECIAL_UNSIGNED_LTE:
1092 	case SPECIAL_LTE:
1093 		if (sval_cmp(left->min, right->max) <= 0)
1094 			return 1;
1095 		return 0;
1096 	case SPECIAL_EQUAL:
1097 		if (sval_cmp(left->max, right->min) < 0)
1098 			return 0;
1099 		if (sval_cmp(left->min, right->max) > 0)
1100 			return 0;
1101 		return 1;
1102 	case SPECIAL_UNSIGNED_GTE:
1103 	case SPECIAL_GTE:
1104 		if (sval_cmp(left->max, right->min) >= 0)
1105 			return 1;
1106 		return 0;
1107 	case '>':
1108 	case SPECIAL_UNSIGNED_GT:
1109 		if (sval_cmp(left->max, right->min) > 0)
1110 			return 1;
1111 		return 0;
1112 	case SPECIAL_NOTEQUAL:
1113 		if (sval_cmp(left->min, left->max) != 0)
1114 			return 1;
1115 		if (sval_cmp(right->min, right->max) != 0)
1116 			return 1;
1117 		if (sval_cmp(left->min, right->min) != 0)
1118 			return 1;
1119 		return 0;
1120 	default:
1121 		sm_perror("unhandled comparison %d", comparison);
1122 		return 0;
1123 	}
1124 	return 0;
1125 }
1126 
1127 int true_comparison_range_LR(int comparison, struct data_range *var, struct data_range *val, int left)
1128 {
1129 	if (left)
1130 		return true_comparison_range(var, comparison, val);
1131 	else
1132 		return true_comparison_range(val, comparison, var);
1133 }
1134 
1135 static int false_comparison_range_sval(struct data_range *left, int comparison, struct data_range *right)
1136 {
1137 	switch (comparison) {
1138 	case '<':
1139 	case SPECIAL_UNSIGNED_LT:
1140 		if (sval_cmp(left->max, right->min) >= 0)
1141 			return 1;
1142 		return 0;
1143 	case SPECIAL_UNSIGNED_LTE:
1144 	case SPECIAL_LTE:
1145 		if (sval_cmp(left->max, right->min) > 0)
1146 			return 1;
1147 		return 0;
1148 	case SPECIAL_EQUAL:
1149 		if (sval_cmp(left->min, left->max) != 0)
1150 			return 1;
1151 		if (sval_cmp(right->min, right->max) != 0)
1152 			return 1;
1153 		if (sval_cmp(left->min, right->min) != 0)
1154 			return 1;
1155 		return 0;
1156 	case SPECIAL_UNSIGNED_GTE:
1157 	case SPECIAL_GTE:
1158 		if (sval_cmp(left->min, right->max) < 0)
1159 			return 1;
1160 		return 0;
1161 	case '>':
1162 	case SPECIAL_UNSIGNED_GT:
1163 		if (sval_cmp(left->min, right->max) <= 0)
1164 			return 1;
1165 		return 0;
1166 	case SPECIAL_NOTEQUAL:
1167 		if (sval_cmp(left->max, right->min) < 0)
1168 			return 0;
1169 		if (sval_cmp(left->min, right->max) > 0)
1170 			return 0;
1171 		return 1;
1172 	default:
1173 		sm_perror("unhandled comparison %d", comparison);
1174 		return 0;
1175 	}
1176 	return 0;
1177 }
1178 
1179 int false_comparison_range_LR(int comparison, struct data_range *var, struct data_range *val, int left)
1180 {
1181 	if (left)
1182 		return false_comparison_range_sval(var, comparison, val);
1183 	else
1184 		return false_comparison_range_sval(val, comparison, var);
1185 }
1186 
1187 int possibly_true(struct expression *left, int comparison, struct expression *right)
1188 {
1189 	struct range_list *rl_left, *rl_right;
1190 	struct data_range *tmp_left, *tmp_right;
1191 	struct symbol *type;
1192 
1193 	if (!get_implied_rl(left, &rl_left))
1194 		return 1;
1195 	if (!get_implied_rl(right, &rl_right))
1196 		return 1;
1197 
1198 	type = rl_type(rl_left);
1199 	if (type_positive_bits(type) < type_positive_bits(rl_type(rl_right)))
1200 		type = rl_type(rl_right);
1201 	if (type_positive_bits(type) < 31)
1202 		type = &int_ctype;
1203 
1204 	rl_left = cast_rl(type, rl_left);
1205 	rl_right = cast_rl(type, rl_right);
1206 
1207 	FOR_EACH_PTR(rl_left, tmp_left) {
1208 		FOR_EACH_PTR(rl_right, tmp_right) {
1209 			if (true_comparison_range(tmp_left, comparison, tmp_right))
1210 				return 1;
1211 		} END_FOR_EACH_PTR(tmp_right);
1212 	} END_FOR_EACH_PTR(tmp_left);
1213 	return 0;
1214 }
1215 
1216 int possibly_false(struct expression *left, int comparison, struct expression *right)
1217 {
1218 	struct range_list *rl_left, *rl_right;
1219 	struct data_range *tmp_left, *tmp_right;
1220 	struct symbol *type;
1221 
1222 	if (!get_implied_rl(left, &rl_left))
1223 		return 1;
1224 	if (!get_implied_rl(right, &rl_right))
1225 		return 1;
1226 
1227 	type = rl_type(rl_left);
1228 	if (type_positive_bits(type) < type_positive_bits(rl_type(rl_right)))
1229 		type = rl_type(rl_right);
1230 	if (type_positive_bits(type) < 31)
1231 		type = &int_ctype;
1232 
1233 	rl_left = cast_rl(type, rl_left);
1234 	rl_right = cast_rl(type, rl_right);
1235 
1236 	FOR_EACH_PTR(rl_left, tmp_left) {
1237 		FOR_EACH_PTR(rl_right, tmp_right) {
1238 			if (false_comparison_range_sval(tmp_left, comparison, tmp_right))
1239 				return 1;
1240 		} END_FOR_EACH_PTR(tmp_right);
1241 	} END_FOR_EACH_PTR(tmp_left);
1242 	return 0;
1243 }
1244 
1245 int possibly_true_rl(struct range_list *left_ranges, int comparison, struct range_list *right_ranges)
1246 {
1247 	struct data_range *left_tmp, *right_tmp;
1248 	struct symbol *type;
1249 
1250 	if (!left_ranges || !right_ranges)
1251 		return 1;
1252 
1253 	type = rl_type(left_ranges);
1254 	if (type_positive_bits(type) < type_positive_bits(rl_type(right_ranges)))
1255 		type = rl_type(right_ranges);
1256 	if (type_positive_bits(type) < 31)
1257 		type = &int_ctype;
1258 
1259 	left_ranges = cast_rl(type, left_ranges);
1260 	right_ranges = cast_rl(type, right_ranges);
1261 
1262 	FOR_EACH_PTR(left_ranges, left_tmp) {
1263 		FOR_EACH_PTR(right_ranges, right_tmp) {
1264 			if (true_comparison_range(left_tmp, comparison, right_tmp))
1265 				return 1;
1266 		} END_FOR_EACH_PTR(right_tmp);
1267 	} END_FOR_EACH_PTR(left_tmp);
1268 	return 0;
1269 }
1270 
1271 int possibly_false_rl(struct range_list *left_ranges, int comparison, struct range_list *right_ranges)
1272 {
1273 	struct data_range *left_tmp, *right_tmp;
1274 	struct symbol *type;
1275 
1276 	if (!left_ranges || !right_ranges)
1277 		return 1;
1278 
1279 	type = rl_type(left_ranges);
1280 	if (type_positive_bits(type) < type_positive_bits(rl_type(right_ranges)))
1281 		type = rl_type(right_ranges);
1282 	if (type_positive_bits(type) < 31)
1283 		type = &int_ctype;
1284 
1285 	left_ranges = cast_rl(type, left_ranges);
1286 	right_ranges = cast_rl(type, right_ranges);
1287 
1288 	FOR_EACH_PTR(left_ranges, left_tmp) {
1289 		FOR_EACH_PTR(right_ranges, right_tmp) {
1290 			if (false_comparison_range_sval(left_tmp, comparison, right_tmp))
1291 				return 1;
1292 		} END_FOR_EACH_PTR(right_tmp);
1293 	} END_FOR_EACH_PTR(left_tmp);
1294 	return 0;
1295 }
1296 
1297 /* FIXME: the _rl here stands for right left so really it should be _lr */
1298 int possibly_true_rl_LR(int comparison, struct range_list *a, struct range_list *b, int left)
1299 {
1300 	if (left)
1301 		return possibly_true_rl(a, comparison, b);
1302 	else
1303 		return possibly_true_rl(b, comparison, a);
1304 }
1305 
1306 int possibly_false_rl_LR(int comparison, struct range_list *a, struct range_list *b, int left)
1307 {
1308 	if (left)
1309 		return possibly_false_rl(a, comparison, b);
1310 	else
1311 		return possibly_false_rl(b, comparison, a);
1312 }
1313 
1314 int rl_has_sval(struct range_list *rl, sval_t sval)
1315 {
1316 	struct data_range *tmp;
1317 
1318 	FOR_EACH_PTR(rl, tmp) {
1319 		if (sval_cmp(tmp->min, sval) <= 0 &&
1320 		    sval_cmp(tmp->max, sval) >= 0)
1321 			return 1;
1322 	} END_FOR_EACH_PTR(tmp);
1323 	return 0;
1324 }
1325 
1326 void tack_on(struct range_list **list, struct data_range *drange)
1327 {
1328 	add_ptr_list(list, drange);
1329 }
1330 
1331 void push_rl(struct range_list_stack **rl_stack, struct range_list *rl)
1332 {
1333 	add_ptr_list(rl_stack, rl);
1334 }
1335 
1336 struct range_list *pop_rl(struct range_list_stack **rl_stack)
1337 {
1338 	struct range_list *rl;
1339 
1340 	rl = last_ptr_list((struct ptr_list *)*rl_stack);
1341 	delete_ptr_list_last((struct ptr_list **)rl_stack);
1342 	return rl;
1343 }
1344 
1345 struct range_list *top_rl(struct range_list_stack *rl_stack)
1346 {
1347 	struct range_list *rl;
1348 
1349 	rl = last_ptr_list((struct ptr_list *)rl_stack);
1350 	return rl;
1351 }
1352 
1353 void filter_top_rl(struct range_list_stack **rl_stack, struct range_list *filter)
1354 {
1355 	struct range_list *rl;
1356 
1357 	rl = pop_rl(rl_stack);
1358 	rl = rl_filter(rl, filter);
1359 	push_rl(rl_stack, rl);
1360 }
1361 
1362 struct range_list *rl_truncate_cast(struct symbol *type, struct range_list *rl)
1363 {
1364 	struct data_range *tmp;
1365 	struct range_list *ret = NULL;
1366 	sval_t min, max;
1367 
1368 	if (!rl)
1369 		return NULL;
1370 
1371 	if (!type || type == rl_type(rl))
1372 		return rl;
1373 
1374 	FOR_EACH_PTR(rl, tmp) {
1375 		min = tmp->min;
1376 		max = tmp->max;
1377 		if (type_bits(type) < type_bits(rl_type(rl))) {
1378 			min.uvalue = tmp->min.uvalue & ((1ULL << type_bits(type)) - 1);
1379 			max.uvalue = tmp->max.uvalue & ((1ULL << type_bits(type)) - 1);
1380 		}
1381 		if (sval_cmp(min, max) > 0) {
1382 			min = sval_cast(type, min);
1383 			max = sval_cast(type, max);
1384 		}
1385 		add_range_t(type, &ret, min, max);
1386 	} END_FOR_EACH_PTR(tmp);
1387 
1388 	return ret;
1389 }
1390 
1391 int rl_fits_in_type(struct range_list *rl, struct symbol *type)
1392 {
1393 	if (type_bits(rl_type(rl)) <= type_bits(type))
1394 		return 1;
1395 	if (sval_cmp(rl_max(rl), sval_type_max(type)) > 0)
1396 		return 0;
1397 	if (sval_is_negative(rl_min(rl)) &&
1398 	    sval_cmp(rl_min(rl), sval_type_min(type)) < 0)
1399 		return 0;
1400 	return 1;
1401 }
1402 
1403 static int rl_type_consistent(struct range_list *rl)
1404 {
1405 	struct data_range *tmp;
1406 	struct symbol *type;
1407 
1408 	type = rl_type(rl);
1409 	FOR_EACH_PTR(rl, tmp) {
1410 		if (type != tmp->min.type || type != tmp->max.type)
1411 			return 0;
1412 	} END_FOR_EACH_PTR(tmp);
1413 	return 1;
1414 }
1415 
1416 static struct range_list *cast_to_bool(struct range_list *rl)
1417 {
1418 	struct data_range *tmp;
1419 	struct range_list *ret = NULL;
1420 	int has_one = 0;
1421 	int has_zero = 0;
1422 	sval_t min = { .type = &bool_ctype };
1423 	sval_t max = { .type = &bool_ctype };
1424 
1425 	FOR_EACH_PTR(rl, tmp) {
1426 		if (tmp->min.value || tmp->max.value)
1427 			has_one = 1;
1428 		if (sval_is_negative(tmp->min) &&
1429 		    sval_is_negative(tmp->max))
1430 			continue;
1431 		if (tmp->min.value == 0 ||
1432 		    tmp->max.value == 0)
1433 			has_zero = 1;
1434 		if (sval_is_negative(tmp->min) &&
1435 		    tmp->max.value > 0)
1436 			has_zero = 1;
1437 	} END_FOR_EACH_PTR(tmp);
1438 
1439 	if (!has_zero)
1440 		min.value = 1;
1441 	if (has_one)
1442 		max.value = 1;
1443 
1444 	add_range(&ret, min, max);
1445 	return ret;
1446 }
1447 
1448 struct range_list *cast_rl(struct symbol *type, struct range_list *rl)
1449 {
1450 	struct data_range *tmp;
1451 	struct range_list *ret = NULL;
1452 
1453 	if (!rl)
1454 		return NULL;
1455 
1456 	if (!type)
1457 		return rl;
1458 	if (!rl_is_sane(rl))
1459 		return alloc_whole_rl(type);
1460 	if (type == rl_type(rl) && rl_type_consistent(rl))
1461 		return rl;
1462 
1463 	if (type == &bool_ctype)
1464 		return cast_to_bool(rl);
1465 
1466 	FOR_EACH_PTR(rl, tmp) {
1467 		add_range_t(type, &ret, tmp->min, tmp->max);
1468 	} END_FOR_EACH_PTR(tmp);
1469 
1470 	if (!ret)
1471 		return alloc_whole_rl(type);
1472 
1473 	return ret;
1474 }
1475 
1476 struct range_list *rl_filter(struct range_list *rl, struct range_list *filter)
1477 {
1478 	struct data_range *tmp;
1479 
1480 	FOR_EACH_PTR(filter, tmp) {
1481 		rl = remove_range(rl, tmp->min, tmp->max);
1482 	} END_FOR_EACH_PTR(tmp);
1483 
1484 	return rl;
1485 }
1486 
1487 struct range_list *do_intersection(struct range_list *one_rl, struct range_list *two_rl)
1488 {
1489 	struct data_range *one, *two;
1490 	struct range_list *ret = NULL;
1491 
1492 
1493 	PREPARE_PTR_LIST(one_rl, one);
1494 	PREPARE_PTR_LIST(two_rl, two);
1495 
1496 	while (true) {
1497 		if (!one || !two)
1498 			break;
1499 		if (sval_cmp(one->max, two->min) < 0) {
1500 			NEXT_PTR_LIST(one);
1501 			continue;
1502 		}
1503 		if (sval_cmp(one->min, two->min) < 0 && sval_cmp(one->max, two->max) <= 0) {
1504 			add_range(&ret, two->min, one->max);
1505 			NEXT_PTR_LIST(one);
1506 			continue;
1507 		}
1508 		if (sval_cmp(one->min, two->min) >= 0 && sval_cmp(one->max, two->max) <= 0) {
1509 			add_range(&ret, one->min, one->max);
1510 			NEXT_PTR_LIST(one);
1511 			continue;
1512 		}
1513 		if (sval_cmp(one->min, two->min) < 0 && sval_cmp(one->max, two->max) > 0) {
1514 			add_range(&ret, two->min, two->max);
1515 			NEXT_PTR_LIST(two);
1516 			continue;
1517 		}
1518 		if (sval_cmp(one->min, two->max) <= 0 && sval_cmp(one->max, two->max) > 0) {
1519 			add_range(&ret, one->min, two->max);
1520 			NEXT_PTR_LIST(two);
1521 			continue;
1522 		}
1523 		if (sval_cmp(one->min, two->max) <= 0) {
1524 			sm_fatal("error calculating intersection of '%s' and '%s'", show_rl(one_rl), show_rl(two_rl));
1525 			return NULL;
1526 		}
1527 		NEXT_PTR_LIST(two);
1528 	}
1529 
1530 	FINISH_PTR_LIST(two);
1531 	FINISH_PTR_LIST(one);
1532 
1533 	return ret;
1534 }
1535 
1536 struct range_list *rl_intersection(struct range_list *one, struct range_list *two)
1537 {
1538 	struct range_list *ret;
1539 	struct symbol *ret_type;
1540 	struct symbol *small_type;
1541 	struct symbol *large_type;
1542 
1543 	if (!one || !two)
1544 		return NULL;
1545 
1546 	ret_type = rl_type(one);
1547 	small_type = rl_type(one);
1548 	large_type = rl_type(two);
1549 
1550 	if (type_bits(rl_type(two)) < type_bits(small_type)) {
1551 		small_type = rl_type(two);
1552 		large_type = rl_type(one);
1553 	}
1554 
1555 	one = cast_rl(large_type, one);
1556 	two = cast_rl(large_type, two);
1557 
1558 	ret = do_intersection(one, two);
1559 	return cast_rl(ret_type, ret);
1560 }
1561 
1562 static struct range_list *handle_mod_rl(struct range_list *left, struct range_list *right)
1563 {
1564 	sval_t zero;
1565 	sval_t max;
1566 
1567 	max = rl_max(right);
1568 	if (sval_is_max(max))
1569 		return left;
1570 	if (max.value == 0)
1571 		return NULL;
1572 	max.value--;
1573 	if (sval_is_negative(max))
1574 		return NULL;
1575 	if (sval_cmp(rl_max(left), max) < 0)
1576 		return left;
1577 	zero = max;
1578 	zero.value = 0;
1579 	return alloc_rl(zero, max);
1580 }
1581 
1582 static struct range_list *get_neg_rl(struct range_list *rl)
1583 {
1584 	struct data_range *tmp;
1585 	struct data_range *new;
1586 	struct range_list *ret = NULL;
1587 
1588 	if (!rl)
1589 		return NULL;
1590 	if (sval_is_positive(rl_min(rl)))
1591 		return NULL;
1592 
1593 	FOR_EACH_PTR(rl, tmp) {
1594 		if (sval_is_positive(tmp->min))
1595 			break;
1596 		if (sval_is_positive(tmp->max)) {
1597 			new = alloc_range(tmp->min, tmp->max);
1598 			new->max.value = -1;
1599 			add_range(&ret, new->min, new->max);
1600 			break;
1601 		}
1602 		add_range(&ret, tmp->min, tmp->max);
1603 	} END_FOR_EACH_PTR(tmp);
1604 
1605 	return ret;
1606 }
1607 
1608 static struct range_list *get_pos_rl(struct range_list *rl)
1609 {
1610 	struct data_range *tmp;
1611 	struct data_range *new;
1612 	struct range_list *ret = NULL;
1613 
1614 	if (!rl)
1615 		return NULL;
1616 	if (sval_is_negative(rl_max(rl)))
1617 		return NULL;
1618 
1619 	FOR_EACH_PTR(rl, tmp) {
1620 		if (sval_is_negative(tmp->max))
1621 			continue;
1622 		if (sval_is_positive(tmp->min)) {
1623 			add_range(&ret, tmp->min, tmp->max);
1624 			continue;
1625 		}
1626 		new = alloc_range(tmp->min, tmp->max);
1627 		new->min.value = 0;
1628 		add_range(&ret, new->min, new->max);
1629 	} END_FOR_EACH_PTR(tmp);
1630 
1631 	return ret;
1632 }
1633 
1634 static struct range_list *divide_rl_helper(struct range_list *left, struct range_list *right)
1635 {
1636 	sval_t right_min, right_max;
1637 	sval_t min, max;
1638 
1639 	if (!left || !right)
1640 		return NULL;
1641 
1642 	/* let's assume we never divide by zero */
1643 	right_min = rl_min(right);
1644 	right_max = rl_max(right);
1645 	if (right_min.value == 0 && right_max.value == 0)
1646 		return NULL;
1647 	if (right_min.value == 0)
1648 		right_min.value = 1;
1649 	if (right_max.value == 0)
1650 		right_max.value = -1;
1651 
1652 	max = sval_binop(rl_max(left), '/', right_min);
1653 	min = sval_binop(rl_min(left), '/', right_max);
1654 
1655 	return alloc_rl(min, max);
1656 }
1657 
1658 static struct range_list *handle_divide_rl(struct range_list *left, struct range_list *right)
1659 {
1660 	struct range_list *left_neg, *left_pos, *right_neg, *right_pos;
1661 	struct range_list *neg_neg, *neg_pos, *pos_neg, *pos_pos;
1662 	struct range_list *ret;
1663 
1664 	if (is_whole_rl(right))
1665 		return NULL;
1666 
1667 	left_neg = get_neg_rl(left);
1668 	left_pos = get_pos_rl(left);
1669 	right_neg = get_neg_rl(right);
1670 	right_pos = get_pos_rl(right);
1671 
1672 	neg_neg = divide_rl_helper(left_neg, right_neg);
1673 	neg_pos = divide_rl_helper(left_neg, right_pos);
1674 	pos_neg = divide_rl_helper(left_pos, right_neg);
1675 	pos_pos = divide_rl_helper(left_pos, right_pos);
1676 
1677 	ret = rl_union(neg_neg, neg_pos);
1678 	ret = rl_union(ret, pos_neg);
1679 	return rl_union(ret, pos_pos);
1680 }
1681 
1682 static struct range_list *ptr_add_mult(struct range_list *left, int op, struct range_list *right)
1683 {
1684 	struct range_list *ret;
1685 	sval_t l_sval, r_sval, res;
1686 
1687 	/*
1688 	 * This function is sort of the wrong API because it takes two pointer
1689 	 * and adds them together.  The caller is expected to figure out
1690 	 * alignment.  Neither of those are the correct things to do.
1691 	 *
1692 	 * Really this function is quite bogus...
1693 	 */
1694 
1695 	if (rl_to_sval(left, &l_sval) && rl_to_sval(right, &r_sval)) {
1696 		res = sval_binop(l_sval, op, r_sval);
1697 		return alloc_rl(res, res);
1698 	}
1699 
1700 	if (rl_min(left).value != 0 || rl_max(right).value != 0) {
1701 		ret = alloc_rl(valid_ptr_min_sval, valid_ptr_max_sval);
1702 		return cast_rl(rl_type(left), ret);
1703 	}
1704 
1705 	return alloc_whole_rl(rl_type(left));
1706 }
1707 
1708 static struct range_list *handle_add_mult_rl(struct range_list *left, int op, struct range_list *right)
1709 {
1710 	sval_t min, max;
1711 
1712 	if (type_is_ptr(rl_type(left)) || type_is_ptr(rl_type(right)))
1713 		return ptr_add_mult(left, op, right);
1714 
1715 	if (sval_binop_overflows(rl_min(left), op, rl_min(right)))
1716 		return NULL;
1717 	min = sval_binop(rl_min(left), op, rl_min(right));
1718 
1719 	if (sval_binop_overflows(rl_max(left), op, rl_max(right)))
1720 		return NULL;
1721 	max = sval_binop(rl_max(left), op, rl_max(right));
1722 
1723 	return alloc_rl(min, max);
1724 }
1725 
1726 static struct range_list *handle_sub_rl(struct range_list *left_orig, struct range_list *right_orig)
1727 {
1728 	struct range_list *left_rl, *right_rl;
1729 	struct symbol *type;
1730 	sval_t min, max;
1731 	sval_t min_ll, max_ll, res_ll;
1732 	sval_t tmp;
1733 
1734 	/* TODO:  These things should totally be using dranges where possible */
1735 
1736 	if (!left_orig || !right_orig)
1737 		return NULL;
1738 
1739 	type = &int_ctype;
1740 	if (type_positive_bits(rl_type(left_orig)) > type_positive_bits(type))
1741 		type = rl_type(left_orig);
1742 	if (type_positive_bits(rl_type(right_orig)) > type_positive_bits(type))
1743 		type = rl_type(right_orig);
1744 
1745 	left_rl = cast_rl(type, left_orig);
1746 	right_rl = cast_rl(type, right_orig);
1747 
1748 	max = rl_max(left_rl);
1749 	min = sval_type_min(type);
1750 
1751 	min_ll = rl_min(left_rl);
1752 	min_ll.type = &llong_ctype;
1753 	max_ll = rl_max(right_rl);
1754 	max_ll.type = &llong_ctype;
1755 	res_ll = min_ll;
1756 	res_ll.value = min_ll.value - max_ll.value;
1757 
1758 	if (!sval_binop_overflows(rl_min(left_rl), '-', rl_max(right_rl))) {
1759 		tmp = sval_binop(rl_min(left_rl), '-', rl_max(right_rl));
1760 		if (sval_cmp(tmp, min) > 0)
1761 			min = tmp;
1762 	} else if (type_positive_bits(type) < 63 &&
1763 		   !sval_binop_overflows(min_ll, '-', max_ll) &&
1764 		   (min.value != 0 && sval_cmp(res_ll, min) >= 0)) {
1765 		struct range_list *left_casted, *right_casted, *result;
1766 
1767 		left_casted = cast_rl(&llong_ctype, left_orig);
1768 		right_casted = cast_rl(&llong_ctype, right_orig);
1769 		result = handle_sub_rl(left_casted, right_casted);
1770 		return cast_rl(type, result);
1771 	}
1772 
1773 	if (!sval_is_max(rl_max(left_rl))) {
1774 		tmp = sval_binop(rl_max(left_rl), '-', rl_min(right_rl));
1775 		if (sval_cmp(tmp, max) < 0)
1776 			max = tmp;
1777 	}
1778 
1779 	if (sval_is_min(min) && sval_is_max(max))
1780 		return NULL;
1781 
1782 	return alloc_rl(min, max);
1783 }
1784 
1785 static unsigned long long rl_bits_always_set(struct range_list *rl)
1786 {
1787 	return sval_fls_mask(rl_min(rl));
1788 }
1789 
1790 static unsigned long long rl_bits_maybe_set(struct range_list *rl)
1791 {
1792 	return sval_fls_mask(rl_max(rl));
1793 }
1794 
1795 static struct range_list *handle_OR_rl(struct range_list *left, struct range_list *right)
1796 {
1797 	unsigned long long left_min, left_max, right_min, right_max;
1798 	sval_t min, max;
1799 	sval_t sval;
1800 
1801 	if ((rl_to_sval(left, &sval) || rl_to_sval(right, &sval)) &&
1802 	    !sval_binop_overflows(rl_max(left), '+', rl_max(right)))
1803 		return rl_binop(left, '+', right);
1804 
1805 	left_min = rl_bits_always_set(left);
1806 	left_max = rl_bits_maybe_set(left);
1807 	right_min = rl_bits_always_set(right);
1808 	right_max = rl_bits_maybe_set(right);
1809 
1810 	min.type = max.type = &ullong_ctype;
1811 	min.uvalue = left_min | right_min;
1812 	max.uvalue = left_max | right_max;
1813 
1814 	return cast_rl(rl_type(left), alloc_rl(min, max));
1815 }
1816 
1817 static struct range_list *handle_XOR_rl(struct range_list *left, struct range_list *right)
1818 {
1819 	unsigned long long left_set, left_maybe;
1820 	unsigned long long right_set, right_maybe;
1821 	sval_t zero, max;
1822 
1823 	left_set = rl_bits_always_set(left);
1824 	left_maybe = rl_bits_maybe_set(left);
1825 
1826 	right_set = rl_bits_always_set(right);
1827 	right_maybe = rl_bits_maybe_set(right);
1828 
1829 	zero = max = rl_min(left);
1830 	zero.uvalue = 0;
1831 	max.uvalue = fls_mask((left_maybe | right_maybe) ^ (left_set & right_set));
1832 
1833 	return cast_rl(rl_type(left), alloc_rl(zero, max));
1834 }
1835 
1836 static sval_t sval_lowest_set_bit(sval_t sval)
1837 {
1838 	sval_t ret = { .type = sval.type };
1839 	int i;
1840 
1841 	for (i = 0; i < 64; i++) {
1842 		if (sval.uvalue & 1ULL << i) {
1843 			ret.uvalue = (1ULL << i);
1844 			return ret;
1845 		}
1846 	}
1847 	return ret;
1848 }
1849 
1850 static struct range_list *handle_AND_rl_sval(struct range_list *rl, sval_t sval)
1851 {
1852 	struct range_list *known_rl;
1853 	sval_t zero = { 0 };
1854 	sval_t min;
1855 
1856 	zero.type = sval.type;
1857 	zero.value = 0;
1858 
1859 	if (sm_fls64(rl_max(rl).uvalue) < find_first_zero_bit(sval.uvalue) &&
1860 	    sm_fls64(rl_min(rl).uvalue) < find_first_zero_bit(sval.uvalue))
1861 		return rl;
1862 
1863 	min = sval_lowest_set_bit(sval);
1864 
1865 	if (min.value != 0) {
1866 		sval_t max, mod;
1867 
1868 		max = rl_max(rl);
1869 		mod = sval_binop(max, '%', min);
1870 		if (mod.value) {
1871 			max = sval_binop(max, '-', mod);
1872 			max.value++;
1873 			if (max.value > 0 && sval_cmp(max, rl_max(rl)) < 0)
1874 				rl = remove_range(rl, max, rl_max(rl));
1875 		}
1876 	}
1877 
1878 	known_rl = alloc_rl(min, sval);
1879 
1880 	rl = rl_intersection(rl, known_rl);
1881 	zero = rl_min(rl);
1882 	zero.value = 0;
1883 	add_range(&rl, zero, zero);
1884 
1885 	return rl;
1886 }
1887 
1888 static struct range_list *fudge_AND_rl(struct range_list *rl)
1889 {
1890 	struct range_list *ret;
1891 	sval_t min;
1892 
1893 	min = sval_lowest_set_bit(rl_min(rl));
1894 	ret = clone_rl(rl);
1895 	add_range(&ret, min, rl_min(rl));
1896 
1897 	return ret;
1898 }
1899 
1900 static struct range_list *handle_AND_rl(struct range_list *left, struct range_list *right)
1901 {
1902 	sval_t sval, zero;
1903 	struct range_list *rl;
1904 
1905 	if (rl_to_sval(left, &sval))
1906 		return handle_AND_rl_sval(right, sval);
1907 	if (rl_to_sval(right, &sval))
1908 		return handle_AND_rl_sval(left, sval);
1909 
1910 	left = fudge_AND_rl(left);
1911 	right = fudge_AND_rl(right);
1912 
1913 	rl = rl_intersection(left, right);
1914 	zero = rl_min(rl);
1915 	zero.value = 0;
1916 	add_range(&rl, zero, zero);
1917 
1918 	return rl;
1919 }
1920 
1921 static struct range_list *handle_lshift(struct range_list *left_orig, struct range_list *right_orig)
1922 {
1923 	struct range_list *left;
1924 	struct data_range *tmp;
1925 	struct range_list *ret = NULL;
1926 	sval_t zero = { .type = rl_type(left_orig), };
1927 	sval_t shift, min, max;
1928 	bool add_zero = false;
1929 
1930 	if (!rl_to_sval(right_orig, &shift) || sval_is_negative(shift))
1931 		return NULL;
1932 	if (shift.value == 0)
1933 		return left_orig;
1934 
1935 	/* Cast to unsigned for easier left shift math */
1936 	if (type_positive_bits(rl_type(left_orig)) < 32)
1937 		left = cast_rl(&uint_ctype, left_orig);
1938 	else if(type_positive_bits(rl_type(left_orig)) == 63)
1939 		left = cast_rl(&ullong_ctype, left_orig);
1940 	else
1941 		left = left_orig;
1942 
1943 	FOR_EACH_PTR(left, tmp) {
1944 		min = tmp->min;
1945 		max = tmp->max;
1946 
1947 		if (min.value == 0 || max.value > sval_type_max(max.type).uvalue >> shift.uvalue)
1948 			add_zero = true;
1949 		if (min.value == 0 && max.value == 0)
1950 			continue;
1951 		if (min.value == 0)
1952 			min.value = 1;
1953 		min = sval_binop(min, SPECIAL_LEFTSHIFT, shift);
1954 		max = sval_binop(max, SPECIAL_LEFTSHIFT, shift);
1955 		add_range(&ret, min, max);
1956 	} END_FOR_EACH_PTR(tmp);
1957 
1958 	if (!rl_fits_in_type(ret, rl_type(left_orig)))
1959 		add_zero = true;
1960 	ret = cast_rl(rl_type(left_orig), ret);
1961 	if (add_zero)
1962 		add_range(&ret, zero, zero);
1963 
1964 	return ret;
1965 }
1966 
1967 static struct range_list *handle_rshift(struct range_list *left_orig, struct range_list *right_orig)
1968 {
1969 	struct data_range *tmp;
1970 	struct range_list *ret = NULL;
1971 	sval_t shift, min, max;
1972 
1973 	if (!rl_to_sval(right_orig, &shift) || sval_is_negative(shift))
1974 		return NULL;
1975 	if (shift.value == 0)
1976 		return left_orig;
1977 
1978 	FOR_EACH_PTR(left_orig, tmp) {
1979 		min = sval_binop(tmp->min, SPECIAL_RIGHTSHIFT, shift);
1980 		max = sval_binop(tmp->max, SPECIAL_RIGHTSHIFT, shift);
1981 		add_range(&ret, min, max);
1982 	} END_FOR_EACH_PTR(tmp);
1983 
1984 	return ret;
1985 }
1986 
1987 struct range_list *rl_binop(struct range_list *left, int op, struct range_list *right)
1988 {
1989 	struct symbol *cast_type;
1990 	sval_t left_sval, right_sval;
1991 	struct range_list *ret = NULL;
1992 
1993 	cast_type = rl_type(left);
1994 	if (sval_type_max(rl_type(left)).uvalue < sval_type_max(rl_type(right)).uvalue)
1995 		cast_type = rl_type(right);
1996 	if (sval_type_max(cast_type).uvalue < INT_MAX)
1997 		cast_type = &int_ctype;
1998 
1999 	left = cast_rl(cast_type, left);
2000 	right = cast_rl(cast_type, right);
2001 
2002 	if (!left && !right)
2003 		return NULL;
2004 
2005 	if (rl_to_sval(left, &left_sval) && rl_to_sval(right, &right_sval)) {
2006 		sval_t val = sval_binop(left_sval, op, right_sval);
2007 		return alloc_rl(val, val);
2008 	}
2009 
2010 	switch (op) {
2011 	case '%':
2012 		ret = handle_mod_rl(left, right);
2013 		break;
2014 	case '/':
2015 		ret = handle_divide_rl(left, right);
2016 		break;
2017 	case '*':
2018 	case '+':
2019 		ret = handle_add_mult_rl(left, op, right);
2020 		break;
2021 	case '|':
2022 		ret = handle_OR_rl(left, right);
2023 		break;
2024 	case '^':
2025 		ret = handle_XOR_rl(left, right);
2026 		break;
2027 	case '&':
2028 		ret = handle_AND_rl(left, right);
2029 		break;
2030 	case '-':
2031 		ret = handle_sub_rl(left, right);
2032 		break;
2033 	case SPECIAL_RIGHTSHIFT:
2034 		return handle_rshift(left, right);
2035 	case SPECIAL_LEFTSHIFT:
2036 		return handle_lshift(left, right);
2037 	}
2038 
2039 	return ret;
2040 }
2041 
2042 void free_data_info_allocs(void)
2043 {
2044 	struct allocator_struct *desc = &data_info_allocator;
2045 	struct allocation_blob *blob = desc->blobs;
2046 
2047 	free_all_rl();
2048 	clear_math_cache();
2049 
2050 	desc->blobs = NULL;
2051 	desc->allocations = 0;
2052 	desc->total_bytes = 0;
2053 	desc->useful_bytes = 0;
2054 	desc->freelist = NULL;
2055 	while (blob) {
2056 		struct allocation_blob *next = blob->next;
2057 		blob_free(blob, desc->chunking);
2058 		blob = next;
2059 	}
2060 	clear_data_range_alloc();
2061 }
2062 
2063 void split_comparison_rl(struct range_list *left_orig, int op, struct range_list *right_orig,
2064 		struct range_list **left_true_rl, struct range_list **left_false_rl,
2065 		struct range_list **right_true_rl, struct range_list **right_false_rl)
2066 {
2067 	struct range_list *left_true, *left_false;
2068 	struct range_list *right_true, *right_false;
2069 	sval_t min, max;
2070 
2071 	min = sval_type_min(rl_type(left_orig));
2072 	max = sval_type_max(rl_type(left_orig));
2073 
2074 	left_true = clone_rl(left_orig);
2075 	left_false = clone_rl(left_orig);
2076 	right_true = clone_rl(right_orig);
2077 	right_false = clone_rl(right_orig);
2078 
2079 	switch (op) {
2080 	case '<':
2081 	case SPECIAL_UNSIGNED_LT:
2082 		left_true = remove_range(left_orig, rl_max(right_orig), max);
2083 		if (!sval_is_min(rl_min(right_orig))) {
2084 			left_false = remove_range(left_orig, min, sub_one(rl_min(right_orig)));
2085 		}
2086 
2087 		right_true = remove_range(right_orig, min, rl_min(left_orig));
2088 		if (!sval_is_max(rl_max(left_orig)))
2089 			right_false = remove_range(right_orig, add_one(rl_max(left_orig)), max);
2090 		break;
2091 	case SPECIAL_UNSIGNED_LTE:
2092 	case SPECIAL_LTE:
2093 		if (!sval_is_max(rl_max(right_orig)))
2094 			left_true = remove_range(left_orig, add_one(rl_max(right_orig)), max);
2095 		left_false = remove_range(left_orig, min, rl_min(right_orig));
2096 
2097 		if (!sval_is_min(rl_min(left_orig)))
2098 			right_true = remove_range(right_orig, min, sub_one(rl_min(left_orig)));
2099 		right_false = remove_range(right_orig, rl_max(left_orig), max);
2100 
2101 		if (sval_cmp(rl_min(left_orig), rl_min(right_orig)) == 0)
2102 			left_false = remove_range(left_false, rl_min(left_orig), rl_min(left_orig));
2103 		if (sval_cmp(rl_max(left_orig), rl_max(right_orig)) == 0)
2104 			right_false = remove_range(right_false, rl_max(left_orig), rl_max(left_orig));
2105 		break;
2106 	case SPECIAL_EQUAL:
2107 		left_true = rl_intersection(left_orig, right_orig);
2108 		right_true = clone_rl(left_true);
2109 
2110 		if (sval_cmp(rl_min(right_orig), rl_max(right_orig)) == 0)
2111 			left_false = remove_range(left_orig, rl_min(right_orig), rl_min(right_orig));
2112 		if (sval_cmp(rl_min(left_orig), rl_max(left_orig)) == 0)
2113 			right_false = remove_range(right_orig, rl_min(left_orig), rl_min(left_orig));
2114 		break;
2115 	case SPECIAL_UNSIGNED_GTE:
2116 	case SPECIAL_GTE:
2117 		if (!sval_is_min(rl_min(right_orig)))
2118 			left_true = remove_range(left_orig, min, sub_one(rl_min(right_orig)));
2119 		left_false = remove_range(left_orig, rl_max(right_orig), max);
2120 
2121 		if (!sval_is_max(rl_max(left_orig)))
2122 			right_true = remove_range(right_orig, add_one(rl_max(left_orig)), max);
2123 		right_false = remove_range(right_orig, min, rl_min(left_orig));
2124 
2125 		if (sval_cmp(rl_min(left_orig), rl_min(right_orig)) == 0)
2126 			right_false = remove_range(right_false, rl_min(left_orig), rl_min(left_orig));
2127 		if (sval_cmp(rl_max(left_orig), rl_max(right_orig)) == 0)
2128 			left_false = remove_range(left_false, rl_max(left_orig), rl_max(left_orig));
2129 		break;
2130 	case '>':
2131 	case SPECIAL_UNSIGNED_GT:
2132 		left_true = remove_range(left_orig, min, rl_min(right_orig));
2133 		if (!sval_is_max(rl_max(right_orig)))
2134 			left_false = remove_range(left_orig, add_one(rl_max(right_orig)), max);
2135 
2136 		right_true = remove_range(right_orig, rl_max(left_orig), max);
2137 		if (!sval_is_min(rl_min(left_orig)))
2138 			right_false = remove_range(right_orig, min, sub_one(rl_min(left_orig)));
2139 		break;
2140 	case SPECIAL_NOTEQUAL:
2141 		left_false = rl_intersection(left_orig, right_orig);
2142 		right_false = clone_rl(left_false);
2143 
2144 		if (sval_cmp(rl_min(right_orig), rl_max(right_orig)) == 0)
2145 			left_true = remove_range(left_orig, rl_min(right_orig), rl_min(right_orig));
2146 		if (sval_cmp(rl_min(left_orig), rl_max(left_orig)) == 0)
2147 			right_true = remove_range(right_orig, rl_min(left_orig), rl_min(left_orig));
2148 		break;
2149 	default:
2150 		sm_perror(" unhandled comparison %d", op);
2151 		return;
2152 	}
2153 
2154 	if (left_true_rl) {
2155 		*left_true_rl = left_true;
2156 		*left_false_rl = left_false;
2157 	}
2158 	if (right_true_rl) {
2159 		*right_true_rl = right_true;
2160 		*right_false_rl = right_false;
2161 	}
2162 }
2163