Создание AST из функции с несколькими возвращаемыми значениями для llvm - PullRequest
0 голосов
/ 11 сентября 2011

Например, у меня есть эта функция:

def max(a,b) {
   if(a < b) return b;
   if(a > b) return a;
}

Мне любопытно, как разобрать это в AST. Если я это хорошо понимаю, то узел его тела должен возвращать ReturnInst *.

Но в моем AST это тело содержит два узла (как выражения), один для первого if и другой для другого.

Есть какой-то трюк, или дизайн с самого начала неправильный?

Редактировать: я только что нашел решение:

  1. CreateAlloca в начале тела.
  2. CreateStore и переходить к метке конца при каждом возврате.
  3. В конце метки вернуть переменную.

Это хорошая идея? А как прыгать / переходить с llvm?

Ответы [ 2 ]

1 голос
/ 11 сентября 2011

Вы можете попробовать онлайн демо: http://llvm.org/demo/ Введите C или C ++ для того, что вы хотите сделать, и он покажет вам вывод LLVM.

0 голосов
/ 11 сентября 2011

Ваше обрисованное в общих чертах решение с alloca + store + jump определенно работает, если я правильно понимаю. И да, оптимизаторы LLVM справятся с этим просто отлично. В качестве альтернативы, нет никаких ограничений на количество инструкций ret в данной функции.

Не уверен, что вы спрашиваете при создании goto; если вам удалось написать оператор if, это тот же вид инструкции br, который вам нужен в конце. В общем, запуск "clang -S -emit-llvm" над простым кодом - хороший способ увидеть, как генерировать простые конструкции. Кроме того, "llc -march = cpp" - хороший способ узнать, как создавать инструкции в C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...