如何修复生成的llvm字节码中的分段错误?

时间:2019-03-23 00:24:19

标签: compiler-construction llvm llvm-ir

我当前正在使用llvm进行编译,并且它会生成此代码,该代码在test.main $ v函数的case_body块的最后dtore指令处产生段错误。我通常不是手动调试方面的专家,尤其是gdb等的初学者。

如果有人可以指出我在这里犯了什么严重错误,我将不胜感激!

; ModuleID = 'test.bc'
source_filename = "test"

%test.Node = type { i32, %test.OptionalNode }
%test.OptionalNode = type { i8, [8 x i8] }
%test.OptionalNode.nil = type { i8 }
%test.OptionalNode.some = type { i8, %test.Node* }

declare i32 @printf(i8*, ...)

define void @"test.Node.!ctor$[test.Node]i[test.OptionalNode]"(%test.Node* %this, i32 %_value, %test.OptionalNode %_next) {
entry:
  %arg0 = alloca %test.Node*
  store %test.Node* %this, %test.Node** %arg0
  %arg1 = alloca i32
  store i32 %_value, i32* %arg1
  %arg2 = alloca %test.OptionalNode
  store %test.OptionalNode %_next, %test.OptionalNode* %arg2
  %ldarg1 = load i32, i32* %arg1
  %tmpld_cls = load %test.Node*, %test.Node** %arg0
  %tmpfld = getelementptr inbounds %test.Node, %test.Node* %tmpld_cls, i32 0, i32 0
  store i32 %ldarg1, i32* %tmpfld
  %ldarg2 = load %test.OptionalNode, %test.OptionalNode* %arg2
  %tmpld_cls1 = load %test.Node*, %test.Node** %arg0
  %tmpfld2 = getelementptr inbounds %test.Node, %test.Node* %tmpld_cls1, i32 0, i32 1
  store %test.OptionalNode %ldarg2, %test.OptionalNode* %tmpfld2
  ret void
}

define i32 @"test.main$v"() {
entry:
  %n = alloca %test.OptionalNode
  %enm = alloca %test.OptionalNode
  %0 = bitcast %test.OptionalNode* %enm to %test.OptionalNode.nil*
  %1 = getelementptr inbounds %test.OptionalNode.nil, %test.OptionalNode.nil* %0, i32 0, i32 0
  store i8 0, i8* %1
  %2 = load %test.OptionalNode, %test.OptionalNode* %enm
  store %test.OptionalNode %2, %test.OptionalNode* %n
  %s = alloca %test.OptionalNode
  %enm1 = alloca %test.OptionalNode
  %3 = bitcast %test.OptionalNode* %enm1 to %test.OptionalNode.nil*
  %4 = getelementptr inbounds %test.OptionalNode.nil, %test.OptionalNode.nil* %3, i32 0, i32 0
  store i8 0, i8* %4
  %5 = load %test.OptionalNode, %test.OptionalNode* %enm1
  %tmpalloc = alloca %test.Node*
  %6 = load %test.Node*, %test.Node** %tmpalloc
  call void @"test.Node.!ctor$[test.Node]i[test.OptionalNode]"(%test.Node* %6, i32 3, %test.OptionalNode %5)
  %tmpload = load %test.Node*, %test.Node** %tmpalloc
  %enm2 = alloca %test.OptionalNode
  %7 = bitcast %test.OptionalNode* %enm2 to %test.OptionalNode.some*
  %8 = getelementptr inbounds %test.OptionalNode.some, %test.OptionalNode.some* %7, i32 0, i32 0
  store i8 1, i8* %8
  %9 = getelementptr inbounds %test.OptionalNode.some, %test.OptionalNode.some* %7, i32 0, i32 1
  store %test.Node* %tmpload, %test.Node** %9
  %10 = load %test.OptionalNode, %test.OptionalNode* %enm2
  store %test.OptionalNode %10, %test.OptionalNode* %s
  %r = alloca i32
  store i32 0, i32* %r
  br label %case_check

case_check:                                       ; preds = %entry
  %11 = getelementptr inbounds %test.OptionalNode, %test.OptionalNode* %s, i32 0, i32 0
  %12 = load i8, i8* %11
  %tmpicmpeq = icmp eq i8 %12, 1
  br i1 %tmpicmpeq, label %case_body, label %case_after

case_body:                                        ; preds = %case_check
  %n3 = alloca %test.Node*
  %13 = bitcast %test.OptionalNode* %s to %test.OptionalNode.some*
  %14 = getelementptr inbounds %test.OptionalNode.some, %test.OptionalNode.some* %13, i32 0, i32 1
  %15 = load %test.Node*, %test.Node** %14
  store %test.Node* %15, %test.Node** %n3
  %tmpld_cls = load %test.Node*, %test.Node** %n3
  %tmpgetfldgep = getelementptr inbounds %test.Node, %test.Node* %tmpld_cls, i32 0, i32 0
  %tmpgetfldld = load i32, i32* %tmpgetfldgep
  store i32 %tmpgetfldld, i32* %r
  br label %case_after

case_after:                                       ; preds = %case_body, %case_check
  br label %match_end

match_end:                                        ; preds = %case_after
  %tmploadlocal = load i32, i32* %r
  ret i32 %tmploadlocal
}

define i32 @main() {
entry:
  %call = tail call i32 @"test.main$v"()
  ret i32 %call
}

0 个答案:

没有答案