как сгенерировать IR LLVM при вложении базового блока в LLVM - PullRequest
0 голосов
/ 07 сентября 2018

Существует функция базового блока A, другой блок внутри блока A, как генерировать IR LLVM. Например:

int fun()
{/*block A*/
  int i=0;
  {/*block B*/
    int i=1
    printf("i in block B is %d\n",i);
  }
  printf("i in block A is %d\n",i);
 }

1 Ответ

0 голосов
/ 10 сентября 2018

Ваши блоки A и B не являются базовыми блоками, они просто блоки. C (или любой другой язык) не имеет понятия базовых блоков - LLVM делает.

Базовые блоки в LLVM не должны (и часто не) соответствуют блокам на исходном языке. По сути, базовый блок - это просто блок кода, такой, что вы никогда не прыгаете в или из середины его. Вы прыгаете только в начало блока и прыгаете только с его конца.

Блоки в исходных языках могут служить многим целям. Иногда они используются как часть операторов потока управления, а иногда нет. И иногда вы можете иметь контроль потока без блоков. Например, во многих языках циклы и операторы if могут использоваться с одним телом оператора, который не является составным оператором (например, if (condition) return; - здесь нет блока, но все еще поток управления). Точно так же switch операторы обычно не имеют блока для каждого случая, и, конечно, есть goto.

Таким образом, при наличии потока управления без блоков сгенерированная программа будет содержать больше базовых блоков, чем блоки с исходной программой. И в противоположном случае, когда есть блоки без потока управления, сгенерированная программа будет содержать меньше базовых блоков.

В вашем примере функция fun не содержит никакого потока управления, кроме неявного возврата в конце функции. Поэтому вы должны генерировать только один базовый блок для него.

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