Как различить адреса стека / кучи в ИК-коде llvm? - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы найти способ определить, является ли операнд загрузки / хранения в LLVM IR адресом стека или адресом кучи в проходе LLVM (проход, закодированный в C ++), т.е.

if (inst is a store) {
  if (inst->getOperand(1) is a heap address) {
    // do something with the heap address
  }
}

И действовать аналогично для нагрузок.Глядя в код IR, они ссылаются одинаково:

store i32 5, i32* %c, align 4 // storing value to a local variable
store i32 1, i32* %4, align 4 // storing value to something on the heap, do something with the heap address

Есть идеи?

1 Ответ

0 голосов
/ 20 ноября 2018

Мой интерфейс делает это (ну, что-то вроде этого).Возможно, вы не сможете сделать это достаточно хорошо, чтобы достичь своих целей, но если вы это сделаете, то это один из подходов:

Рассматривать каждый возвращаемый результат malloc() (или как называется ваш распределитель) как кучупеременная и каждый результат alloca() в качестве переменной стека.Для каждого из них классифицируйте больше значений, посмотрев на for(auto x : y->users());getelementptr или приведение malloc() также является переменной кучи.

Однако это не классифицирует каждое значение.Загрузка указателя из структуры / массива в куче может вернуть что-то в стек и наоборот.Аргументы функции могут быть либо.Но, возможно, вам не нужно классифицировать каждое значение.

...