Анализ индекса JumpTable ИК-кода LLVM - PullRequest
0 голосов
/ 02 января 2019

Я собираюсь проанализировать фрагмент ИК-кода 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. Что-то вроде этого.

Понятно ли мне это?Спасибо за вашу помощь.

...