Построение автоматического программного обеспечения для LLVM-бит-кода

Я хотел бы скомпилировать программное обеспечение, использующее систему сборки autotools, в биткод LLVM; то есть, я хотел бы, чтобы исполняемые файлы, полученные в конце, были бит-кодом LLVM, а не фактическим машинным кодом.

(Цель состоит в том, чтобы иметь возможность запускать инструменты анализа кода бит LLVM для всей программы.)

Я попытался указать CC="clang -emit-llvm -use-gold-plugins" и варианты configure script, но безрезультатно. Всегда что-то происходит не так (например, пакет создает статические библиотеки .a, на которые отказался компоновщик).

Мне кажется, что правильный способ сделать это будет заключаться в том, что бит-код LLVM должен быть целью кросс-компиляции. для установки с помощью --host=, но нет такой стандартной цели (даже если есть цель для Knuth MMIX).

До сих пор я использовал kludges, например компиляцию с CC="clang -emit-llvm -use-gold-plugins" и бегущие строки ссылок (используя llvm-ld или llvm-link) вручную. Это работает для простых пакетов, таких как grep.

Я хотел бы, чтобы метод, который был устойчивым и работал с большинством, если не все, настраивал сценарии, в том числе, когда есть промежуточные файлы .a или промежуточные цели.

Ответ 1

Есть несколько методов, таких как this. Но для простых построений, где промежуточные статические библиотеки не используются, вы можете сделать что-то более простое. Список вещей, которые вам понадобятся,

  • llvm, настроенный с поддержкой плагина gold. См. это
  • лязг
  • dragonegg, если вам нужен front-end for fortran, go и т.д.

Ключ должен включать '-flto' для clang или dragonegg (front-end), как во время компиляции, так и времени ссылки. Это просто для clang:

CC = clang
CLINKER = clang
CFLAGS = -flto -c
CLINKFLAGS = -flto -Wl,-plugin-opt=also-emit-llvm

При необходимости добавьте опцию '-plugin-opt', чтобы указать опцию codelen, специфичную для llvm:

-Wl,-plugin-opt=also-emit-llvm,-plugin-opt=-disable-fp-elim

Байт-код сбрасываемой цельной проблемой будет сидеть вместе с вашим окончательным исполняемым файлом.

При использовании dragonegg необходимы две дополнительные вещи.

Во-первых, dragonegg не знает о местоположении плагина llvm gold, его нужно указывать в флагах компоновщика, подобных этому -Wl,-plugin=/path/to/LLVMgold.so,-plugin-opt=...

Во-вторых, dragonegg может только сбрасывать IR, а не байт-код. Для этой цели вам понадобится обертка script. Я создал один здесь. Прекрасно работает для меня.