Мой пропуск вставляет функции в определенные моменты, и эти функции собирают некоторую информацию. В конце модуля я хочу отображать все, что я собрал, таким образом, я хочу вставить функцию в конец модуля, который будет выполнять задание на печать для меня. У меня есть проблема с обнаружением самого конца модуля, чтобы вставить функцию прямо перед ним. Помощь и руководство будут оценены!Как вставить вызов функции в самом конце модуля в проходе LLVM?
ответ
Я думаю, что нет простого и простого способа сделать это. Вам нужно искать два вида точек выхода в коде.
1) В коде могут быть вызовы таких функций, как exit()
, который будет точкой выхода программы. Поэтому вам нужно искать тех, кто находится в проходе, и вставлять перед ними свой вызов функции. Если вы не хотите испытывать проблемы, чтобы проверить каждую инструкцию в коде, то может быть, вы можете вручную заменить вызовы на exit()
в функции кода с помощью новой функции выхода (что-то вроде exit_())
, которое содержит вызов функцию, которую вы хотите вызвать, а затем фактический вызов функции exit()
.Этот последний подход требует, чтобы у вас был доступ к коду заранее.
2) Программа выйдет в конце функции ввода (обычно main
). Таким образом, вы можете проверить, совпадает ли имя функции с потенциальной функцией точки входа или нет, и вставить вызов функции перед оператором return. Если у него нет оператора возврата, вставьте его в конце всех инструкций.
Справа. Спасибо за подробный ответ. Итак, независимо от того, как программа заканчивается, функция, вызываемая для завершения ocur, - это exit(), поэтому я могу ее заменить или вставить мою функцию перед командой exit()? –
Да, вы можете вставлять свои вызовы до '' 'exit()' '', и вам также необходимо позаботиться о функции входа, как описано в пункте 2 в ответе выше. – deLta
Yup. Итак, имя функции, где exit должно содержать запись, например, main()? –
Вы хотите вывести это в конце модуля? Или вы хотите, чтобы вы выходили до завершения программы? – Brian
До завершения программы. –
Вы должны посмотреть на использование atexit(). – Brian