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引擎.
归档时间: |
|
查看次数: |
3411 次 |
最近记录: |