LLVM-общая ошибка сегментации

#haskell #llvm

#haskell #llvm

Вопрос:

У меня есть два LLVM.General.Модули модуля, A и B. Моя цель — связать B с A, а затем записать сборку в файл. На данный момент я играю с игрушечной программой, чтобы узнать, как использовать интерфейс LLVM-General. Я использовал пакет LLVM-General-Pure для создания LLVM.General.Модули AST для некоторых серверных частей компилятора.

Я хотел бы перенести эти АСТ в мир C (LLVM.General.Модуль), свяжите их, а затем напишите сборку. Я обнаружил ошибку при связывании модулей C , но у меня такое ощущение, что ошибка заключается в том, как я создаю объекты C . Вот что я сделал:

 convASTToModE ast = do
a <- withContext $ context -> do
    x <- runErrorT $ withModuleFromAST context ast $ mod -> return mod 
    return x
return a
 

Комментарий: Я не смог найти функцию типа Module -> Module (например, moduleAST для создания AST из объекта C при использовании, скажем, withModuleFromLLVMAssembly) для передачи в withModuleFromAST, чтобы я вернул модуль, поэтому я просто использовал модуль. Я понимаю это так, что я могу что-то сделать с модулем, который я получаю от ast, и мне просто нужен модуль, поэтому я просто взял его. Я предполагаю, что это неправильно, но подумал, что это что-то сделает.

Когда я выполняю этот код на одном из моих модулей LLVM.General.AST.Module, код, похоже, работает нормально. Но когда я пытаюсь его использовать, он ломается. Например, если x является LLVM.General.AST.Module, и я делаю

 mod <- convASTToModE x
case mod of
    Left _ -> error ""
    Right mod' -> do
        assemb <- moduleLLVMAssembly mod
        putStrLn assemb
 

Я получаю ошибку сегментации.

LLVM-General-3.4.3.0 LLVM-3.4

ОБНОВЛЕНИЕ: я попробовал следующее:

 writeASTToLLVMAssembly ast filename = do
    withContext $ context -> do
        runErrorT $ withModuleFromAST context ast $ mod -> do
            runErrorT $ writeLLVMAssemblyToFile (File filename) mod
    return ()
 

Выдает:

 *** Error in `./LLVMImportAndLinkTest': munmap_chunk(): invalid pointer:
0x00000000012db000 ***
Aborted (core dumped)
 

Однако,

 showLLVMAssFromAST ast = do
    str <- withContext $ context -> do
       str2 <- runErrorT $ withModuleFromAST context ast $ mod -> do
            str3 <- moduleLLVMAssembly mod 
            return str3
       return str2
    case str of 
         Left _ -> error "ast not convertible to string"
         Right st -> return st
 

Проблем не возникает.

LLVM-General.3.4.3.0 LLVM-3.4

Например, с найденным LLVM.General.AST.Module http://lpaste.net/106407

Это довольно печатная версия AST, полученная путем загрузки http://lpaste.net/106408 в LLVM-General.

Эта сборка LLVM была сгенерирована из Clang путем компиляции файла C.

Комментарии:

1. Можете ли вы поделиться дополнительным контекстом, чтобы ваша проблема была воспроизводимой, и информацией о версии для llvm-general и LLVM.

2. Я добавил больше деталей для вас. Большое вам спасибо.

3. Возможно, вы захотите попробовать версию llvm-general 3.4.3.1 для Git, похоже, это была проблема с библиотекой, которая была исправлена в эти выходные. github.com/bscarlet/llvm-general/issues/109

4. Спасибо. Я не понимал, что это ошибка! Это действительно устраняет проблему.

5. @StephenDiehl поскольку ваш комментарий ответил на вопрос и устранил проблему, не могли бы вы отправить его в ответ, чтобы удалить это из очереди без ответа?

Ответ №1:

Решение заключается в обновлении версии llvm-general путем изменения зависимости llvm-general llvm-general >= 3.4.3 , которая исправляет известную ошибку в реализации.