2014-09-10 4 views
9

У меня есть ModulePass, который работает с инструментом opt, но мне трудно понять, как сделать его доступным для clang в командной строке. Мой текущий рабочий процесс, используя мой проход:Сделать модуль LLVM ModulePass доступным в командной строке clang

  1. лязгом -c -emit-LLVM [с-файлы исходного кода]
  2. LLVM-ссылка [LLVM файлов] битового кода
  3. неавтоматического -load [PassName]. так - [передать имя] [связан LLVM файл]
  4. ооо [полученный файл битового кода]
  5. НКУ [полученный ассемблер файл] -о [цель]

Я хотел бы получить мой пропуск интегрирован с команда clang чтобы он мог быть вызван как часть сборки существующего программного обеспечения (например, C++ standard library) без необходимости переделывать всю систему сборки для каждой вещи, которую я компилирую. Я видел подсказки о том, как это сделать, но мне не удалось собрать эти фрагменты в рабочую настройку.

Run an LLVM Pass Automatically with Clang описывает именно то, что я хочу, но метод, как представляется, устарел в LLVM 3.4 (PassManagerBuilder перенесен в унаследованное пространство имен).

LLVM - Run Own Pass automatically with clang, похоже, затрагивает основную проблему, но я надеялся, что смогу это сделать без необходимости изменять clang (что, как представляется, было предложено там).

Каков наилучший способ сделать новый проход доступным для clang используя LLVM 3.4?

ответ

7

Clang по-прежнему использует PassManagerBuilder от 3,5 (см. Класс PassManagerBuilderWrapper в BackendUtil.cpp). Поэтому я считаю, что расширение его с помощью RegisterStandardPasses, как и в моем сообщении в блоге, по-прежнему остается единственным способом добавить пропуск к менеджеру доступа Клана.

Сложно найти любую информацию о , так как устарел, поскольку инфраструктура «старого» менеджера переходов. Но поскольку Кланг все еще использует его, он не может быть , который устарел. :)

+0

Спасибо за ответ, тогда я продолжу настройку PassManagerBuilder. – Erik

+0

Работает на llvm-3.7. Примечание для регистрации ModulePass: измените '' EP_EarlyAsPossible'' на '' EP_ModuleOptimizerEarly'', иначе llvm может рассматривать его как FunctionPass и попытаться вызвать '' runOnFunction''. – xywang