2014-05-27 3 views
0

У меня есть небольшой парсер языка, который использует LLVM для генерации и запуска кода на основе учебника Kaleidoscope.Как освободить llvm :: module

Мое ограничение заключается в том, что мне нужно воссоздать модуль, потому что мне нужно обрабатывать один и тот же файл ввода несколько раз, а после первой компиляции LLVM будет жаловаться на модуль, уже содержащий функции x и т. Д. Единственный путь вперед Я вижу, это воссоздать модуль между ними, и это означает, что я должен воссоздать ExecutionEngine.

Однако, существует огромное количество утечек памяти, которые я хочу избавиться. Как правильно освободить llvm::Module и llvm::ExecutionEngine?

Если я просто удалю оба, это segfaults где-то в LLVM. Моя текущая реализация выглядит следующим образом:

TheExecutionEngine->removeModule(module); 
delete module(); 
delete TheExecutionEngine; 

Однако, есть еще около 14 тысяч утечек сообщили, так что это кажется неправильным.

Мне не нужно дублировать существующие функции в модуле. Я просто хочу новый, пустой.

+0

Вы посмотрели CloneModule? Может помочь в первую очередь дублировать модуль - http://llvm.org/docs/doxygen/html/CloneModule_8cpp_source.html#l00034 –

ответ

1

Если вы правильно поняли, вы хотите создать экземпляры ExecutionEngine и Module несколько раз в течение всего срока действия вашей программы и правильно очистить их.

Не удаляйте модуль отдельно, так как ExecutionEngine «владеет» его после вас addModule. Это означает, что он позаботится об удалении и очистке.

В LLVM всегда лучше учиться на примерах. Я предлагаю вам взглянуть на исходный код tools/lli/lli.cpp, который делает все, что вам нужно, включая очистку.

Смежные вопросы