2011-01-08 2 views
12

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

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

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

Спасибо.

+1

Это не ответ, но я помню, что были созданы программы для Amiga для «оптимизации» кода, скомпилированного для MC68000, чтобы он быстрее работал на более новых процессорах за счет совместимости. Но я не знаю такой попытки для x86. – liori

+0

ИМО, вам, возможно, потребуется больше времени, используя что-то вроде IDA и hex-лучей или Ollydbg, чтобы перепроектировать сборку обратно на язык более высокого уровня (C или C++). – Necrolis

+1

[RevGen] (http://stackoverflow.com/questions/ 9359487/source-code-of-revgen-tool) является одним из x86-> LLVM-переводчиков. Он также имеет переводчик от x86 до статического двоичного. Он использует Qemu и модифицированный MIPS TCG, который генерирует IR. – osgx

ответ

10

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

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

Тем не менее БОЛЬШАЯ работа. Вероятно, проще переписать алгоритм с нуля.

Этот точный процесс описан в "Dynamically Translating x86 to LLVM using QEMU"

+0

Есть ли проекты, чтобы сделать то же самое? – osgx

+0

Не похоже. В рабочем коде для оптимизатора LLVM просто нет информации, необходимой для работы. Код должен быть обращен назад к представлению высокого уровня, прежде чем он может быть полезен для векторизации и перекомпиляции для 64-битного кода, а компиляторы просто не так хороши в умозаключениях. Возможно, вы сможете использовать эмулятор x86, который выполняет динамическую перекомпиляцию, но вряд ли сможет векторизовать математику, и накладные расходы отрицательно повлияют на прирост производительности. – user57368

+0

Для накладных расходов: есть некоторый код, который я хочу запустить быстро. Я могу потратить 1 час работы оптимизатора, прежде чем я запустил новый код. Цель - получить более быстрый код с более медленного времени. Процесс перекомпиляции должен выполняться статически, один раз. – osgx

1

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

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

+1

Привет. Что такое статус МАО? Какую часть x86/x86_64 можно обработать? Может ли он работать с самомодифицированным кодом (UPX упакован, например) – osgx

0

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

+0

Интерпретация необходима только для самомодифицируемого кода. Статический код может быть легко разобран (с любым дизассемблером). Работа с динамическим кодом возможна только в том случае, если во время выполнения будет рекомпилятор или если динамический код может быть распакован в статический код (в моем случае используется EXE, упакованный как UPX, и его можно распаковать) – osgx

+0

@osgx: это неверно. Например, методы десинхронизации могут легко путать дизассемблеры. – molnarg

+0

Ну, технически это правда, но ничто не стоит делать на 100% возможным. так что теоретически, 100%? никогда невозможно ... на практике 99,98% очень возможно ... на самом деле хорошо документировано, как вы преодолеваете теоретические ограничения и получаете ценный результат. – TechZilla