Подтвердить что ты не робот

Перекомпилируйте x86-код с LLVM на несколько быстрее один x86

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Этот точный процесс описан в "Динамическое переключение x86 в LLVM с помощью QEMU"

Ответ 2

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

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

Ответ 3

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