LLVM代码生成导致seg错误?

9 llvm

我对语言创建和编译器构建感兴趣,并且已经在这里通过示例进行了处理:http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/.作者使用的是LLVM 2.6,在对LLVM 2.7进行了一些更改后,我得到了所有代码生成代码进行编译.在给编译器输入测试代码时,

int do_math( int a ) {
  int x = a * 5 + 3
}

do_math( 10 )
Run Code Online (Sandbox Code Playgroud)

程序正常工作,直到它尝试运行代码,此时它会出现段错误.我正在我的系统上构建LLDB,但与此同时,任何人都看到这个LLVM中有明显的seg错误吗?

; ModuleID = 'main'

define internal void @main() {
entry:
  %0 = call i64 @do_math(i64 10)                  ; <i64> [#uses=0]
  ret void
}

define internal i64 @do_math(i64) {
entry:
  %a = alloca i64                                 ; <i64*> [#uses=1]
  %x = alloca i64                                 ; <i64*> [#uses=1]
  %1 = add i64 5, 3                               ; <i64> [#uses=1]
  %2 = load i64* %a                               ; <i64> [#uses=1]
  %3 = mul i64 %2, %1                             ; <i64> [#uses=1]
  store i64 %3, i64* %x
  ret void
}
Run Code Online (Sandbox Code Playgroud)

输出只是:

Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我的主题是OS X x86_64.

谢谢.

小智 16

我遇到了同样的问题.我删除了Loren的编译器,除了执行之外,一切正常.

分段错误是由以下事实引起的:

ExecutionEngine*ee = EngineBuilder(module).create();

返回NULL.要查看实际错误,您需要获取错误字符串:

std :: string错误; ExecutionEngine*ee = EngineBuilder(module).setErrorStr(&error).create();

在你的情况下你应该看到:

"无法找到此三联的目标(没有注册目标)

要修复你需要打电话

InitializeNativeTarget();

但如果你得到:

JIT没有联系在一起.

你应该包括:

LLVM/ExecutionEngine/MCJIT.h

这将链接JIT引擎.