#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
, которая исправляет известную ошибку в реализации.