Mono LLVM и LLVM-IR

Я играю с Mono LLVM (http://www.mono-project.com/Mono:Runtime:Documentation:LLVM), и похоже, что они используют LLVM здесь как JIT, а не как генератор кода. Но, согласно документам, они проходят через LLVM-IR перед генерированием собственного кода:

  • во-первых, нормальный моно JIT IR генерируется из кода IL
  • IR преобразуется в форму SSA
  • IR преобразуется в LLVM IR
  • LLVM IR скомпилирован LLVM в собственный код

Итак, мне интересно, есть ли способ поймать эту третью фазу и использовать IR для подачи моего LLVM-сервера. Это позволило бы мне бесплатно получить С# до LLVM-IR.

Спасибо за любую помощь!

Ответы

Ответ 1

Поддержка Mono LLVM работает, пытаясь загрузить libmono-llvm.so из соответствующего $libdir, например. на OSX /usr/bin/mono загрузится /Library/Frameworks/Mono.framework/Libraries/libmono-llvm.dylib. Смотрите код загрузки LLVM в mono/mini/mini-llvm.h, в частности mono_llvm_load() и try_llvm_load().

Итак, похоже, если вы назовете свой LLVM-сервер mono-llvm, он будет использоваться при запуске моно в качестве mono --llvm. Тем не менее, mono_llvm_load(), по-видимому, требует определенного экспорта из библиотеки mono-llvm, например mono_llvm_init и mono_llvm_cleanup, поэтому я уверен, что для вашего LLVM-сервера потребуется дополнительная работа, чтобы позволить Mono используйте его, и я не уверен, где это узнать (кроме grep ping для "LLVM" в источниках Mono...).

Это также означает, что бэкэнд LLVM не может быть повторно использован из предварительно построенного моно; то есть вам может понадобиться создать свое собственное моно, чтобы использовать ваш LLVM-сервер, поскольку монопольная предварительная сборка будет обеспечивать бэкэнд mono-llvm, который нельзя подключить. (Я не знаю, как подключаемый или не подключаемый сервер LLVM.)