mono环境下运行的F#编译器中的堆栈溢出

mono环境下运行的F#编译器中的堆栈溢出,f#,mono,stack-overflow,llvm-fs,F#,Mono,Stack Overflow,Llvm Fs,我正在为我的项目更新工具,所以我安装了新版本的mono并尝试编译它。在OS X下使用mono 3.10.0和fsharpc 3.1或在ubuntu下使用mono 3.2.8和fsharpc 3.0编译失败,堆栈溢出: Unhandled Exception: System.StackOverflowException: The requested operation caused a stack overflow. at (wrapper managed-to-native) object:

我正在为我的项目更新工具,所以我安装了新版本的mono并尝试编译它。在OS X下使用
mono 3.10.0
fsharpc 3.1
或在ubuntu下使用
mono 3.2.8
fsharpc 3.0
编译失败,堆栈溢出:

Unhandled Exception:
System.StackOverflowException: The requested operation caused a stack overflow.
  at (wrapper managed-to-native) object:__icall_wrapper_mono_object_isinst (object,intptr)
  at (wrapper castclass) object:__castclass_with_cache (object,intptr,intptr)
  at Microsoft.FSharp.Compiler.Driver+DelayedDisposables.System-IDisposable-Dispose () [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.Driver.typecheckAndCompile (System.String[] argv, Boolean bannerAlreadyPrinted, Exiter exiter, Microsoft.FSharp.Compiler.ErrorLoggerProvider errorLoggerProvider) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.Driver.mainCompile (System.String[] argv, Boolean bannerAlreadyPrinted, Exiter exiter) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.CommandLineMain.runMain (System.String[] argv) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.CommandLineMain.main (System.String[] argv) [0x00000] in <filename unknown>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.StackOverflowException: The requested operation caused a stack overflow.
  at (wrapper managed-to-native) object:__icall_wrapper_mono_object_isinst (object,intptr)
  at (wrapper castclass) object:__castclass_with_cache (object,intptr,intptr)
  at Microsoft.FSharp.Compiler.Driver+DelayedDisposables.System-IDisposable-Dispose () [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.Driver.typecheckAndCompile (System.String[] argv, Boolean bannerAlreadyPrinted, Exiter exiter, Microsoft.FSharp.Compiler.ErrorLoggerProvider errorLoggerProvider) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.Driver.mainCompile (System.String[] argv, Boolean bannerAlreadyPrinted, Exiter exiter) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.CommandLineMain.runMain (System.String[] argv) [0x00000] in <filename unknown>:0 
  at Microsoft.FSharp.Compiler.CommandLineMain.main (System.String[] argv) [0x00000] in <filename unknown>:0 
在windows
fsc 12.0.30815.0
下,编译完成,无错误:

fsc --nologo --debug --sig:LLVMFSharp.fsi --target:library --out:LLVMFSharp.dll src/LLVM/FFIUtil.fs src/LLVM/Generated.fs src/LLVM/Core.fs src/LLVM/BitReader.fs src/LLVM/ExecutionEngine.fs src/LLVM/Extra.fs src/LLVM/Target.fs src/LLVM/Quote.fs

这是一个已知的问题,有没有办法解决?我尝试过向mono运行时传递不同的选项,但没有一个选项导致编译器正常退出。我记得在过去,mono在尾呼指令方面遇到了一些问题,但我认为这些问题基本上已经解决了。谢谢

这对于注释来说太长了,但是错误是由generated.fs中的这一位代码触发的(注释掉它会停止堆栈溢出-注释掉后会出现错误)(第6496-6506行):

[]
外部无效*(*LLVMGenericValueRef*)运行函数本机(
void*(*LLVMExecutionEngineerf*)EE,
无效*(*LLVMValueRef*)F,
uint32努马格斯,
void*(*LLVMGenericValueRef**)参数)
//我不知道如何生成LLVMRunFunction的“F#friendly”版本
崩溃发生在输出签名文件的代码中


禁用签名文件可以解决问题(但仍有一个潜在的bug)。

我忘了说这个编译与F#2.0编译器附带的旧mono配合得很好(但我不确定确切的版本)。这看起来像是编译器中的回归。我会把它报告为一个bug。如果有人关注这个bug,这里是bug报告,把它作为F#编译器bug归档可能也是个好主意。谢谢你的指点和解决方法。关闭签名文件生成对我来说是一个很好的解决方法,尤其是因为我可以只使用windows构建的签名输出。当我有时间的时候,我会按照你的建议给mono添加一个bug报告。
fsc --nologo --debug --sig:LLVMFSharp.fsi --target:library --out:LLVMFSharp.dll src/LLVM/FFIUtil.fs src/LLVM/Generated.fs src/LLVM/Core.fs src/LLVM/BitReader.fs src/LLVM/ExecutionEngine.fs src/LLVM/Extra.fs src/LLVM/Target.fs src/LLVM/Quote.fs
 [<DllImport(
            llvmAssemblyName,
            EntryPoint="LLVMRunFunction",
            CallingConvention=CallingConvention.Cdecl,
            CharSet=CharSet.Ansi)>]
        extern void* (* LLVMGenericValueRef *) runFunctionNative(
            void* (* LLVMExecutionEngineRef *) EE,
            void* (* LLVMValueRef *) F,
            uint32 NumArgs,
            void* (* LLVMGenericValueRef* *) Args)
        // I don't know how to generate an "F# friendly" version of LLVMRunFunction