В настоящее время я работаю над компилятором, использующим llvm, и он генерирует этот код, который создает ошибку segfault в последней инструкции dtore блока case_body функции test.main $ v.Я вообще не специалист по ручной отладке, а особенно начинающий с 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
}