Я интересуюсь созданием языка и конструкцией компилятора, и работал через пример здесь: 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 )
программа работает правильно, пока она не пытается выполнить код, в который точка это segfaults. Я нахожусь в процессе создания LLDB в моей системе, но это тем временем, кто-либо видит, что очевидный seg дает сбой в этом LLVM asm?
; ModuleID = 'main'
define internal void @main() {
entry:
%0 = call i64 @do_math(i64 10) ; [#uses=0]
ret void
}
define internal i64 @do_math(i64) {
entry:
%a = alloca i64 ; [#uses=1]
%x = alloca i64 ; [#uses=1]
%1 = add i64 5, 3 ; [#uses=1]
%2 = load i64* %a ; [#uses=1]
%3 = mul i64 %2, %1 ; [#uses=1]
store i64 %3, i64* %x
ret void
}
Вывод справедлив:
Segmentation fault
Моей дугой является 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
}
Кроме того, ваш прототип main ()
может не соответствовать тому, что ожидает ваша библиотека времени выполнения C. Кроме того, вы понимаете, что не возвращаете результат do_math ()
, верно?