Генерация кода LLVM, вызывающая seg отказ?

Я интересуюсь созданием языка и конструкцией компилятора, и работал через пример здесь: 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.

Спасибо.

9
задан 9 August 2010 в 13:12
поделиться

1 ответ

Опубликованный вами 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 () , верно?

0
ответ дан 4 December 2019 в 12:58
поделиться