MAC OSX Intel LLVM Assembler bug (causes Vorbis OGG loader to crash)

У меня возникла загадочная ошибка при загрузке файлов Vorbis Ogg на Mac OSX. Первый файл загружается корректно, а при загрузке второго происходит сбой в каком-то коде, который указывает, что файл поврежден, то же самое происходит, даже если я загружаю один и тот же файл дважды.

После долгих часов глубокой отладки внутри Vorbis я выяснил, что ошибка вызвана тем, что системная функция "pow" (double power of) возвращает (nan) для полностью корректного ввода, и это происходит только при втором вызове (ov_read), при первом вызове те же самые точные значения, переданные в "pow", возвращают корректный результат.

8 часов спустя и много чтения документации Intel x87 я нашел проблему. Короче говоря, глубоко внутри vorbis есть функция "vorbis_ftoi ", которая использует этот ассемблерный код:

__asm__("fistl %0": "=m"(i) : "t"(f));

Который должен продвигать и продвигаться по стеку Intel FPU. Однако на LLVM она генерирует такой код:

fld    QWORD PTR [ebp-0x20]
fist   DWORD PTR [ebp-0x14]

Который проталкивается в стек, но никогда не выталкивается, вызывая переполнение стека FPU. И это явно ошибка в LLVM

Правильный код, сгенерированный GCC, выглядит так:

fld    QWORD PTR [ebp-0x20]
fist   DWORD PTR [ebp-0xc]
fstp   st(0)        // pops off the stack

Я потратил полтора дня и несколько байт своего Брайана на изучение какого-то мусора (набор инструкций и регистры x87), так что я решил поделиться этим.

Auday

9
задан Bill Lynch 10 October 2011 в 17:03
поделиться