Tôi quan tâm đến việc tạo ngôn ngữ và xây dựng trình biên dịch, và đã làm việc thông qua ví dụ ở đây: http://gnuu.org/2009/09/18/writing-your-own-toy-compiler/. Tác giả đã sử dụng LLVM 2.6 và sau khi thực hiện một vài thay đổi cho LLVM 2.7, tôi đã nhận được tất cả mã tạo mã để biên dịch. Khi cung cấp mã kiểm tra, mã kiểm tra,Tạo mã LLVM gây ra lỗi seg?
int do_math(int a) {
int x = a * 5 + 3
}
do_math(10)
chương trình hoạt động chính xác cho đến khi nó cố gắng chạy mã, tại thời điểm nó phân tách. Tôi đang trong quá trình xây dựng LLDB trên hệ thống của tôi, nhưng trong khi chờ đợi, bất cứ ai nhìn thấy một lỗi seg rõ ràng trong ASV LLVM này?
; 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
}
Kết quả chỉ là:
Segmentation fault
vòm của tôi là OS X x86_64.
Cảm ơn.
Mã không chính xác 'Mã C', đó là ngôn ngữ giống như C, được xây dựng trong hướng dẫn tôi liên kết đến. Tôi hiểu rằng hàm 'do_math' không trả về int như nó nói. ASM được tạo ra từ một mã AST và một số mã tạo mã, vì vậy tôi sẽ xem liệu tôi có thể tìm hiểu tại sao nó đang cố gắng sử dụng dữ liệu chưa được khởi tạo hay không. –