Перекомпилируйте код x86 с LLVM в более быстрый x86 - PullRequest
15 голосов
/ 09 января 2011

Можно ли запустить компилятор LLVM с вводом 32-битного кода x86?Существует огромный алгоритм, у которого нет исходного кода, и я хочу, чтобы он работал быстрее на том же оборудовании.Могу ли я перевести его с x86 обратно на x86 с оптимизацией.

Этот код выполняется долго, поэтому я хочу выполнить его статическую перекомпиляцию.Кроме того, я могу создать его профиль времени выполнения и дать подсказки LLVM, какие ветви более вероятны.

Исходный код написан для x86 + x87 и не использует SSE / MMX / SSE2.После перекомпиляции у него есть шансы использовать x86_64 и / или SSE3.Также код будет регенерирован более оптимальным способом в аппаратный декодер.

Спасибо.

Ответы [ 3 ]

11 голосов
/ 09 января 2011

LLVM не может сделать это из коробки. Вам нужно написать двоичный преобразователь x86 в LLVM (IR). Это было бы очень нетривиальной задачей. Если код x86 был достаточно простым, он мог бы отображаться довольно близко к IR, но некоторые инструкции x86 не будут отображаться напрямую, например манипуляции с указателем стека.

Edit: Вы также можете попробовать применить подход, аналогичный тому, что делает QEMU. QEMU переводит двоичные файлы на лету, чтобы при запуске кода PowerPC каждый базовый блок переводился в код X86 перед его выполнением. Вы могли бы выяснить, как разбить ваш объектный файл на основные блоки и сгенерировать LLVM IR для каждого блока, отбросить что-либо (например, передачу параметров и т. Д.) И заменить его прямым LLVM IR.

Тем не менее, большая работа. Наверное, проще переписать алгоритм с нуля.

Этот точный процесс описан в «Динамический перевод x86 в LLVM с использованием QEMU»

1 голос
/ 28 ноября 2011

Проект MAO , кажется, делает часть того, что вы хотите (x86-> промежуточный язык).

edit : @osgx, вам нужно посмотреть на веб-сайте mao статус проекта и подробную информацию о том, какие программы они могут обрабатывать. (Самоизменяющийся код может быть сложным, хотя.)

0 голосов
/ 27 марта 2012

Из того, что я знаю, разборка кода x86 на 100% правильно невозможна. Поскольку данные и код смешаны, а также из-за инструкций переменной длины. Единственный способ правильно разобрать это интерпретировать на лету.

...