2014-09-29 2 views
6

ich vor kurzem mit einem Dritten Bibliothek in ein Problem lief das den folgenden Code wurde mit Test für Mixed-Endian-Floating-Point-Format auf ARM-Plattformen:korrekt Mixed-Endian-Gleitkomma-Format auf ARM-Plattform erkennen

#if defined(__arm__) && !(__ARM_EABI__) 

Diese Überprüfung hat das Mixed-Endian-Format auf Android-Plattformen falsch erkannt, funktioniert aber auf iOS-Plattformen korrekt. Nach einigen Recherchen fand ich die debian ArmEabiPort document, die für Floating-Point die folgende in den GCC Präprozessormakros enthält Abschnitt, der sagt (Hervorhebung von mir):

Wenn Code Portierung auf „armel“ werden folgende Präprozessormakros sind interessant:

  • __VFP_FP__ bedeutet, dass das Gleitkommaformat in Nutzung der in der ARM VFP-Einheit ist, die nativen-endian IEEE-754 ist.

  • __MAVERICK__ bedeutet, dass das Fließkommaformat das des Cirrus Logic MaverickCrunch ist, das ebenfalls IEEE-754 ist und immer Little-Endian ist.

  • __SOFTFP__ bedeutet, dass anstelle von Gleitkommaanweisungen Bibliotheksaufrufe für mathematische Gleitkommaoperationen generiert werden, sodass der Code auf einem Prozessor ohne FPU ausgeführt wird.

__VFP_FP__ und __MAVERICK__ schließen sich gegenseitig aus. Wenn keine Einstellung erfolgt, bedeutet dies, dass das verwendete Fließkommaformat das alte Mischformat 4567der FPA-Einheit ist.

Für unsere speziellen Fall den Scheck an die folgende regelte das Problem der Aktualisierung:

#if defined(__arm__) && !(__VFP_FP__) 

und funktioniert sowohl auf Android und iOS-Plattformen. Obwohl aus dem Dokument der richtigere Kontrolle wäre:

#if defined(__arm__) && !(__VFP_FP__) && !(__MAVERICK__) 

Wir möchten einen Patch zurück an die Drittanbieter einreichen, aber dem alten Scheck funktioniert für die Person, unter Berücksichtigung, die es vorgelegt und wie schwierig es ist, finde Dokumentation Ich habe nicht das Gefühl, dass ich genug Informationen habe, um das zu korrigieren.

Gibt es Fälle, in denen der letzte Check fehlschlägt? Das Debian-Dokument behandelt speziell gcc, wie tragbar sind diese Makros?

aktualisieren

Basierend auf den hilfreichen Kommentare von artless Lärm kocht die Frage nach unten zu:

Die __ARM_EABI__ Makroprüfung wurde von einem anderen Benutzer als Patch eingeführt für Mixed-Endian-Gleitkomma-Format zu überprüfen . Offensichtlich gibt es Systeme, für die dieses Makro arbeitet, welche Systeme sind das? Würde das __VFP_FP__ Makro diese Systeme abdecken oder muss ich dieses Makro ebenfalls berücksichtigen, um zu verhindern, dass bestehende Benutzer beim Einreichen eines Patches beschädigt werden.

+0

@artlessnoise tagged 'gcc', weil das ist, was wir derzeit bauen, aber ich sollte dieses Tag wahrscheinlich entfernen, da es ein wenig verwirrend ist. Da wir einen Patch zurück an das Open-Source-Projekt senden möchten, sollte der Code idealerweise portabler sein, aber wir haben keine Möglichkeit, dies zu überprüfen, und ich bezweifle auch, dass das Projekt dies tut. –

+0

@artlessnoise wie für das VFP-Zitat, der Rest sagt es * Es spricht nur das Fließkomma-Datenformat im Einsatz * was ist uns wichtig, ich habe den Beitrag bearbeitet, um zu erwähnen, wir kümmern uns um Fließkomma-Format. –

+0

@artlessnoise persönlich mit 'gcc 4.8' und höher und' clang 3.4' und höher. Die Plattformen sind relativ aktuelle Android- und iOS-Geräte. Ein wirklich tragbarer Scheck könnte auf Grund Ihres ersten Kommentars schwierig sein, es wäre schön, die Grenzen ein wenig besser zu verstehen. Gibt es Plattformen, für die der ursprüngliche Check funktionieren würde, aber der neue, den ich verwende, würde nicht funktionieren? –

Antwort

2

Sie werden auch nicht Sie sind, um sicherzustellen, überprüfen möchten, auf einem weichen Schwimmer Werkzeugkette, da die Soft-Float-Bibliotheken haben nicht die Mixed-Endian-Ausgabe:

#if defined(arm) && !defined(__SOFTFP__) && !defined(__VFP_FP__) && !defined(__MAVERICK__) 

In Bezug auf Compiler-Unterstützung - diese sollten in Clang arbeiten, aber offensichtlich werden die kommerziellen ARM-Compiler etwas ganz anderes tun.

+0

Irgendeine Idee, für welches System das '__ARM_EABI__' funktioniert? –

+0

Keine Ahnung @ShafikYaghmour ... – LThode

Verwandte Themen