Ich hatte einen mysteriösen Fehler beim Laden von Vorbis Ogg-Dateien auf Mac OSX. Die erste Datei wird korrekt geladen, die zweite stürzt in einem Code ab, der anzeigt, dass die Datei beschädigt ist, dasselbe passiert auch, wenn ich die gleiche Datei zweimal lade.
Nach vielen Stunden tiefem Debugging in Vorbis habe ich herausgefunden, dass der Fehler durch die Systemfunktion "pow" (doppelte Potenz) verursacht wird, die ein (nan) für eine vollständig gültige Eingabe zurückgibt, und das erst beim zweiten Aufruf to (ov_read), beim ersten Aufruf geben die gleichen exakten Werte an "pow" das gültige Ergebnis zurück.
8 Stunden später und viele Intel x87 Dokumentation lesen ich das Problem gefunden. Lange Rede, kurzer Sinn, es gibt eine Funktion tief in vorbis "vorbis_ftoi", die diesen Assemblercode verwendet:
%Vor%Was sollte Push und Pop auf dem Intel FPU Stack. Auf LLVM erzeugt es jedoch diesen Code:
%Vor%Was auf den Stack drückt, aber nie platzt, verursacht einen FPU-Stack-Überlauf. Und das ist offensichtlich ein Fehler in LLVM
Der richtige Code, der von GCC generiert wird, sieht folgendermaßen aus:
%Vor%Ich verschwendete eineinhalb Tage und einige Bytes meiner Brian, die etwas Müll (x87 Instruction Set und Register) dazu lernten, also würde ich es teilen.
Auday