Проверка оптимизированного файла.
BOLT перемещает и/или изменяет бинарный код приложения или библиотеки в целях оптимизации. Такие преобразования являются нетривиальным изменением, и BOLT не может гарантировать корректность оптимизированного приложения. Поэтому есть необходимость тестирования приложения после оптимизации.
Нет универсального способа тестирования любого приложения, поэтому тестирование должно задаваться индивидуально для каждого приложения в системе. Также нужно дать пользователю сообщить демону perfd, что данное приложение или библиотеку по каким-либо причинам не следует оптимизировать.
Возможно объединить эти два требования в один подход, который позволит пользователю при помощи одного и того же механизма задавать как способ тестирования приложений, так и исключать любое приложение из оптимизации.
test_hook: текстовый файл, в котором задаётся метод тестирования данного входного файла.
Огранизация test_hook:
<паттерн 1> <скрипт тестирования 1>
<паттерн 2> <скрипт 2>
...
Например:
*clang /path/to/clang_test.sh
*chrome /path/to/chrome_test.sh
/usr/lib64/* false
test_hook и скрипты задаются пользователем.
Паттерн – регулярное выражение, с которым сравниваются входные файлы (полный путь к исходному файлу). Паттерны в test_hook проверяются по порядку. Если данный паттерн матчит имя входного файла, то вызывается соответствующий скрипт. Если ни один паттерн не матчит имя данного входного файла, то проверка считается неуспешной. Если файла test_hook не существует, то проверка считается неуспешной.
Скрипт принимает два параметра: полный путь к исходному файлу, полный путь к оптимизированному файлу. Скрипт некоторым образом проверяет оптимизированный файл. Если скрипт завершается с кодом 0, то проверка считается успешной, иначе неуспешной.
perfd.py:
- задать метод, который по данному исходному имени файла найдет соответствущий скрипт, или None если скрипт не был зарегистрирован:
get_hook(objfile) -> hookname
- задать метод, вызывающий проверку для данного файла:
test_hook(objfile) -> bool
- вызвать
get_hook
- если скрипт найден: вызвать скрипт
hookname
с параметрами: исходное имя файла (objfile), имя оптимизированного файла (outfile) - вернуть True если проверка успешна (код возврата скрипта 0), False иначе
- если скрипт не найден: вернуть False
- вызвать
test_hook:
- создать файл test_hook, задать один паттерн и проверочный скрипт для компилятора clang (указать полный путь к clang)
- проверочный скрипт: вызвать
clang(outfile) --version
(исходный файл objfile игнорируется)
- проверочный скрипт: вызвать