Код, сгенерированный с ошибками LLVM-IR во время выполнения - PullRequest
0 голосов
/ 20 апреля 2020

Я нахожусь в процессе написания игрушечного компилятора и использую llvm 10 в качестве бэкэнда для него. Одной из функций, которые я хочу иметь, является тип связанного списка, как и функциональное программирование. IR, который я поставляю ниже, генерируется моим компилятором,

Я не могу дать вам код, потому что он состоит из нескольких тысяч строк и написан в ржавчине. Я скомпилировал llvm с утверждением, поэтому не думаю, что проблема в этом. Я почти уверен, что сгенерирую какое-то странное возвращаемое значение, поскольку программа вызывает ошибки только тогда, когда я возвращаю list_type.

Этот код выделяет alloc, и он не освобождает никакие данные. Это потому, что позже я поменяю его на сборщик мусора, это тоже не проблема.

Вопрос заключается в том, можете ли вы найти причину, по которой он segfaults во время выполнения? Я также могу предоставить исполняемый файл windows, если кто-то захочет.

def main():
            list[int] j
            int i 
            def list[int] test():
                list[int] j
                j := 5 # j
                j := 10 # j
                return j
            end
            j := test()
            i := head(j)
            puti(head(j))
        end

сгенерированный код LLVM-IR здесь

1 Ответ

0 голосов
/ 21 апреля 2020

Я нашел решение благодаря @arnt. Я в основном генерировал неправильный llvm-ir, потому что я создавал 2 инструкции возврата одна за другой. Это приводит llvm к неопределенному поведению, поэтому я бы предложил использовать верификатор , который поставляется вместе с llvm, для проверки целостности сгенерированного кода перед компиляцией.

...