Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LLVM代码生成导致seg故障?_Llvm - Fatal编程技术网

LLVM代码生成导致seg故障?

LLVM代码生成导致seg故障?,llvm,Llvm,我对语言创建和编译器构造感兴趣,并且一直在这里学习示例:。作者使用的是LLVM2.6,在对LLVM2.7做了一些修改之后,我得到了所有要编译的代码生成代码。向编译器提供测试代码时 int do_math( int a ) { int x = a * 5 + 3 } do_math( 10 ) 程序正常工作,直到它尝试运行代码,在这一点上,它会出现故障。我正在我的系统上构建LLDB,但与此同时,有人看到这个LLVM asm中存在明显的seg故障吗 ; ModuleID = 'main'

我对语言创建和编译器构造感兴趣,并且一直在这里学习示例:。作者使用的是LLVM2.6,在对LLVM2.7做了一些修改之后,我得到了所有要编译的代码生成代码。向编译器提供测试代码时

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

do_math( 10 )
程序正常工作,直到它尝试运行代码,在这一点上,它会出现故障。我正在我的系统上构建LLDB,但与此同时,有人看到这个LLVM asm中存在明显的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
}
我的arch是OS X x86_64


谢谢。

您发布的LLVM ASM不是您提供的C代码的正确翻译。您正在将
%a
分配为堆栈变量,然后从中加载未初始化的数据并使用它。您要做的是将参数命名为
%a
,并使用该值。请尝试改用以下代码:

define internal i64 @do_math(i64 %a) {
entry:
  %x = alloca i64                                 ; <i64*> [#uses=1]
  %1 = add i64 5, 3                               ; <i64> [#uses=1]
  %2 = mul i64 %a, %1                             ; <i64> [#uses=1]
  store i64 %2, i64* %x
  ret void
}
define internal i64@do_math(i64%a){
条目:
%x=alloca i64;[#使用=1]
%1=添加i64 5,3;[#使用=1]
%2=mul i64%a,%1;[#使用=1]
存储i64%2,i64*%x
ret void
}

另外,您的
main()
原型可能与您的C运行时库所期望的不匹配。而且,除此之外,您确实意识到您没有返回来自
dou math()
的结果,对吗?

我也遇到了同样的问题。我拆掉了Loren的编译器,除了执行之外,一切都很好

分段故障是由以下事实造成的:

ExecutionEngine*ee=EngineBuilder(模块).create()

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

字符串错误; ExecutionEngine*ee=EngineBuilder(模块).setErrorStr(&error).create()

在您的情况下,您可能会看到:

“找不到此三元组的目标(未注册任何目标)

要解决这个问题,你需要打电话

InitializeEnableTarget()

但如果你得到:

尚未在中链接JIT

你应该包括:

llvm/ExecutionEngine/MCJIT.h


它将链接JIT引擎。

代码不是完全的“C代码”,它是一种类似C的语言,构建在我链接到的教程中。我知道“do_math”函数不会像它所说的那样返回int。ASM是由AST和一些代码生成代码生成的,所以我会看看它为什么要使用uninit序列化数据。
define internal i64 @do_math(i64 %a) {
entry:
  %x = alloca i64                                 ; <i64*> [#uses=1]
  %1 = add i64 5, 3                               ; <i64> [#uses=1]
  %2 = mul i64 %a, %1                             ; <i64> [#uses=1]
  store i64 %2, i64* %x
  ret void
}