Я собираюсь проанализировать фрагмент ИК-кода LLVM с помощью одной гигантской функции, созданной некоторыми другими языками.Так что в основном мне нужно будет восстановить некоторую информацию CG и CFG из этой гигантской функции, следуя некоторым знаниям о точках входа в функцию.
Хотя в целом это работает для меня, одной проблемой является анализ JumpTable.Так что в основном у меня много базовых блоков, которые заканчиваются или начинаются с записи JumpTable, что-то вроде:
.473: ; preds = %.461, %JumpTable
call void @check(i64* %gas.ptr, i64 12, i8* %jmpBuf)
%210 = getelementptr i256, i256* %sp.473, i64 -2
%211 = load i256, i256* %210, align 16
%212 = getelementptr i256, i256* %sp.473, i64 -1
%213 = load i256, i256* %212, align 16
%214 = getelementptr i256, i256* %sp.473, i64 -2
store i256 %213, i256* %214, align 16
br label %JumpTable
.348: ; preds = %.347, %JumpTable
call void @check(i64* %gas.ptr, i64 9, i8* %jmpBuf)
%133 = getelementptr i256, i256* %sp.348, i64 -1
%134 = load i256, i256* %133, align 16
br label %JumpTable
А вот как выглядит моя JumpTable:
JumpTable: ; preds = %.473, %.348
%target = phi i256 [ %134, %.348 ], [ %211, %.473 ]
switch i256 %target, label %Exit [
i256 66, label %.66
i256 68, label %.68
i256 79, label %.79
i256 81, label %.81
i256 92, label %.92
i256 188, label %.188
i256 202, label %.202
i256 347, label %.347
i256 348, label %.348
i256 350, label %.350
i256 432, label %.432
i256 461, label %.461
i256 473, label %.473
]
Проблема в том, что прямо сейчас, когда я пересекаю CFG, последующие блоки таблицы переходов будут включать ВСЕ основные блоки, доступные с помощью JumpTable.Другими словами, я мог бы получить очень неточные результаты анализа (да, конечно, это «звук»).
Поэтому я пишу, чтобы спросить, возможно ли выполнить какой-либо «диапазонный» анализ, чтобы вывести значениехранится в индексе JumpTable?Например, при переходе к BB .348
было бы здорово знать, что указатель %134
может быть только 5 или 6. Что-то вроде этого.
Понятно ли мне это?Спасибо за вашу помощь.