diff options
Diffstat (limited to 'dev-lang/python/files/2.6/23_all_arm_OABI.patch')
-rw-r--r-- | dev-lang/python/files/2.6/23_all_arm_OABI.patch | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/dev-lang/python/files/2.6/23_all_arm_OABI.patch b/dev-lang/python/files/2.6/23_all_arm_OABI.patch deleted file mode 100644 index e373281..0000000 --- a/dev-lang/python/files/2.6/23_all_arm_OABI.patch +++ /dev/null @@ -1,185 +0,0 @@ -https://bugs.gentoo.org/show_bug.cgi?id=266703 -http://bugs.python.org/issue1762561 - ---- Objects/floatobject.c -+++ Objects/floatobject.c -@@ -1691,9 +1691,18 @@ - /* this is for the benefit of the pack/unpack routines below */ - - typedef enum { -- unknown_format, ieee_big_endian_format, ieee_little_endian_format -+ unknown_format, -+ ieee_big_endian_format, -+ ieee_little_endian_format, -+ ieee_arm_mixed_endian_format - } float_format_type; - -+/* byte order of a C double for each of the recognised IEEE formats */ -+ -+static const unsigned char BIG_ENDIAN_BYTEORDER[8] = {7,6,5,4,3,2,1,0}; -+static const unsigned char LITTLE_ENDIAN_BYTEORDER[8] = {0,1,2,3,4,5,6,7}; -+static const unsigned char ARM_MIXED_ENDIAN_BYTEORDER[8] = {4,5,6,7,0,1,2,3}; -+ - static float_format_type double_format, float_format; - static float_format_type detected_double_format, detected_float_format; - -@@ -1730,6 +1739,8 @@ - return PyString_FromString("IEEE, little-endian"); - case ieee_big_endian_format: - return PyString_FromString("IEEE, big-endian"); -+ case ieee_arm_mixed_endian_format: -+ return PyString_FromString("IEEE, ARM mixed-endian"); - default: - Py_FatalError("insane float_format or double_format"); - return NULL; -@@ -1743,8 +1754,9 @@ - "used in Python's test suite.\n" - "\n" - "typestr must be 'double' or 'float'. This function returns whichever of\n" --"'unknown', 'IEEE, big-endian' or 'IEEE, little-endian' best describes the\n" --"format of floating point numbers used by the C type named by typestr."); -+"'unknown', 'IEEE, big-endian', 'IEEE, little-endian' or\n" -+"'IEEE, ARM mixed-endian' best describes the format of floating-point\n" -+"numbers used by the C type named by typestr."); - - static PyObject * - float_setformat(PyTypeObject *v, PyObject* args) -@@ -1782,11 +1794,15 @@ - else if (strcmp(format, "IEEE, big-endian") == 0) { - f = ieee_big_endian_format; - } -+ else if (strcmp(format, "IEEE, ARM mixed-endian") == 0 && -+ p == &double_format) { -+ f = ieee_arm_mixed_endian_format; -+ } - else { - PyErr_SetString(PyExc_ValueError, - "__setformat__() argument 2 must be " -- "'unknown', 'IEEE, little-endian' or " -- "'IEEE, big-endian'"); -+ "'unknown', 'IEEE, little-endian', " -+ "'IEEE, big-endian' or 'IEEE, ARM mixed-endian'"); - return NULL; - - } -@@ -1809,8 +1825,10 @@ - "used in Python's test suite.\n" - "\n" - "typestr must be 'double' or 'float'. fmt must be one of 'unknown',\n" --"'IEEE, big-endian' or 'IEEE, little-endian', and in addition can only be\n" --"one of the latter two if it appears to match the underlying C reality.\n" -+"'IEEE, big-endian', 'IEEE, little-endian' or 'IEEE, ARM mixed-endian'\n" -+"and in addition can only be one of the last three if it appears to\n" -+"match the underlying C reality. Note that the ARM mixed-endian\n" -+"format can only be set for the 'double' type, not for 'float'.\n" - "\n" - "Overrides the automatic determination of C-level floating point type.\n" - "This affects how floats are converted to and from binary strings."); -@@ -2005,7 +2023,11 @@ - Note that if we're on some whacked-out platform which uses - IEEE formats but isn't strictly little-endian or big- - endian, we will fall back to the portable shifts & masks -- method. */ -+ method. -+ -+ Addendum: We also attempt to detect the mixed-endian IEEE format -+ used by the ARM old ABI (OABI) and also used by the FPA -+ floating-point unit on some older ARM processors. */ - - #if SIZEOF_DOUBLE == 8 - { -@@ -2014,6 +2036,8 @@ - detected_double_format = ieee_big_endian_format; - else if (memcmp(&x, "\x05\x04\x03\x02\x01\xff\x3f\x43", 8) == 0) - detected_double_format = ieee_little_endian_format; -+ else if (memcmp(&x, "\x01\xff\x3f\x43\x05\x04\x03\x02", 8) == 0) -+ detected_double_format = ieee_arm_mixed_endian_format; - else - detected_double_format = unknown_format; - } -@@ -2353,17 +2377,31 @@ - } - else { - const char *s = (char*)&x; -- int i, incr = 1; -+ int i; -+ const unsigned char *byteorder; - -- if ((double_format == ieee_little_endian_format && !le) -- || (double_format == ieee_big_endian_format && le)) { -- p += 7; -- incr = -1; -+ switch (double_format) { -+ case ieee_little_endian_format: -+ byteorder = LITTLE_ENDIAN_BYTEORDER; -+ break; -+ case ieee_big_endian_format: -+ byteorder = BIG_ENDIAN_BYTEORDER; -+ break; -+ case ieee_arm_mixed_endian_format: -+ byteorder = ARM_MIXED_ENDIAN_BYTEORDER; -+ break; -+ default: -+ Py_FatalError("insane float_format or double_format"); -+ return -1; - } - -- for (i = 0; i < 8; i++) { -- *p = *s++; -- p += incr; -+ if (le) { -+ for (i = 0; i < 8; i++) -+ p[byteorder[i]] = *s++; -+ } -+ else { -+ for (i = 0; i < 8; i++) -+ p[7-byteorder[i]] = *s++; - } - return 0; - } -@@ -2522,22 +2560,33 @@ - } - else { - double x; -+ char *s = (char*)&x; -+ const unsigned char *byteorder; -+ int i; -+ -+ switch (double_format) { -+ case ieee_little_endian_format: -+ byteorder = LITTLE_ENDIAN_BYTEORDER; -+ break; -+ case ieee_big_endian_format: -+ byteorder = BIG_ENDIAN_BYTEORDER; -+ break; -+ case ieee_arm_mixed_endian_format: -+ byteorder = ARM_MIXED_ENDIAN_BYTEORDER; -+ break; -+ default: -+ Py_FatalError("insane float_format or double_format"); -+ return -1.0; -+ } - -- if ((double_format == ieee_little_endian_format && !le) -- || (double_format == ieee_big_endian_format && le)) { -- char buf[8]; -- char *d = &buf[7]; -- int i; -- -- for (i = 0; i < 8; i++) { -- *d-- = *p++; -- } -- memcpy(&x, buf, 8); -+ if (le) { -+ for (i=0; i<8; i++) -+ *s++ = p[byteorder[i]]; - } - else { -- memcpy(&x, p, 8); -+ for (i=0; i<8; i++) -+ *s++ = p[7-byteorder[i]]; - } -- - return x; - } - } |