Что такое правильная абстракция для модуля компиляции в LLVM? - PullRequest
3 голосов
/ 23 марта 2012

в LLVM у нас есть LLVMContext, который является единицей хранения, и у нас есть llvm::Module, где создаются новые символы (функции и типы).

мой вопрос; Какую абстракцию llvm использовать для модулей компиляции? такое Module? или это на самом деле предназначено для большей области, то есть цель общей библиотеки

Мне кажется, что модуль компиляции должен удовлетворять результат "все или ничего"; либо он компилирует весь свой контент без ошибок, либо имеются ошибки, и его необходимо исправить и собрать заново, прежде чем какие-либо символы в CU будут пригодны для использования. В моей голове, это определение того, что единица компиляции должна представлять

Если модуль является правильной абстракцией для CU, как я могу представить символы в других (правильно скомпилированных) объектах Module новому модулю, который собирается построить, чтобы он мог их найти? мне нужно добавить объявления или есть какой-то другой быстрый способ для этого?

точка в соответствующей строке в clang будет очень полезна

Ответы [ 2 ]

4 голосов
/ 24 марта 2012

Модуль является правильной абстракцией для модуля компиляции. Вы можете связать вместе модули, чтобы выполнить весь анализ программы оттуда.

2 голосов
/ 01 апреля 2012

это попытка ответить на мой вопрос:

Класс llvm::Linker имеет возможность взять несколько модулей и вернуть один составной модуль обратно, содержащий все символы в существующих модулях. После того, как соединение сделано и составной модуль создан, мне все еще не ясно, каковы правила относительно владения входными модулями.

В любом случае класс должен позволять вам идти по пути увеличения модуля. Скажем, вы пытаетесь реализовать REPL, что означает, что вы добавляете новые символы в глобальное пространство имен:

План REPL будет работать следующим образом:

  • написать некоторую функцию в REPL
  • скомпилировать функцию как единый модуль, назвать его «базовым»
  • написать еще несколько функций в REPL
  • скомпилировать новые функции в новом модуле
  • если новый функциональный модуль успешно компилируется, свяжите «base» и новый модуль в новом модуле, назовите его «base.2»
  • промыть и повторить

    Если вы заменяете символ или функцию по имени, вы хотите, чтобы более старые символы видели переопределенную версию вашего символа. Поэтому, когда вы определяете новую функцию, вам нужно убедиться, что ваш getOrInsertFunction вызывается в существующем «базовом» модуле, а также в новом.

...