Как определить, действительно ли Mono использует LLVM? - PullRequest
0 голосов
/ 10 октября 2018

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

На самом деле я думал о двух способах обнаружения этого:

  • Использование чего-либо в командной строке.
  • Использование некоторого кода непосредственно из приложения Mono.

Редактировать 2018-10-12 : Интересный факт, начиная с версии 5.16, LLVM больше не поддерживается.

1 Ответ

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

Я пришел к решению.Однако кажется, что в настоящее время Mono очень нестабилен на LLVM, поэтому приведенный ниже код C # является теоретическим (я мог бы проверить его только без LLVM).

Идея

Спасибо arnt, который дал мнеИдея проверить подключенные библиотеки.LLVM загружается, если во время выполнения mono открывается библиотека с именем libmono-llvm.so.Из этого мы можем вывести способ bash и C #, чтобы определить, используем ли мы LLVM или нет.

Внимание : это работает только в Linux (поскольку использует procfs)

Использование bash

Учитывая mono pid в качестве $1 параметра, следующая команда возвращает 1, если используется LLVM, 0 в противном случае.

find /proc/$1/map_files/ -maxdepth 1 -type l -ls | grep libmono-llvm.so | head -1 | wc -l

Во время выполнения в C #

using System.Diagnostics;
using System.IO;
using Mono.Unix;

public static class LlvmInformation
{
    private static bool? _isLlvmEnabled;

    /// <summary>
    /// Gets a value indicating whether Mono uses LLVM.
    /// </summary>
    /// <value>
    ///   <c>true</c> if this instance is LLVM enabled; otherwise, <c>false</c>.
    /// </value>
    public static bool IsLlvmEnabled
    {
        get
        {
            if (!_isLlvmEnabled.HasValue)
                _isLlvmEnabled = LoadLlvmEnabled();
            return _isLlvmEnabled.Value;
        }
    }

    private static bool LoadLlvmEnabled()
    {
        var pid = Process.GetCurrentProcess().Id;
        var mapFilesDirectory = $"/proc/{pid}/map_files";
        var mapFiles = Directory.EnumerateFiles(mapFilesDirectory);
        foreach (var mapFile in mapFiles)
        {
            var symbolicLinkInfo = new UnixSymbolicLinkInfo(mapFile);
            if (symbolicLinkInfo.FileType == FileTypes.SymbolicLink
                && symbolicLinkInfo.GetContents().Name.Contains("libmono-llvm.so"))
                return true;
        }

        return false;
    }
}

Удачи с этим!

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