如何判断Mono是否实际使用LLVM?

时间:2018-10-10 09:02:21

标签: mono llvm

从版本5.14开始,Mono显然默认情况下启用LLVM的使用(这就是mono --version告诉我的内容)。
我还安装了软件包llvm,我想知道是否有办法确定Mono是否实际使用LLVM而不是其内置的JIT

实际上,我在想两种检测方法:

  • 在命令行中使用某些内容。
  • 直接从Mono应用程序中使用一些代码。

编辑2018-10-12 :有趣的是,从版本5.16开始,不再支持LLVM。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。但是,目前看来Mono在LLVM上非常不稳定,因此以下C#代码是理论上的(我只能在没有LLVM的情况下进行检查)。

想法

感谢arnt,他给了我检查映射库的想法。 如果mono运行时打开名为libmono-llvm.so的库,则将加载LLVM。 由此,我们可以推断出bash方式和C#来检测是否正在使用LLVM。

警告:仅在Linux上有效(因为它使用了procfs)

使用bash

使用mono pid作为$1参数,如果使用LLVM,则以下命令返回1,否则返回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;
    }
}

祝你好运!