summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn-Mark Bell <jmb@netsurf-browser.org>2022-06-05 19:58:38 +0100
committerJohn-Mark Bell <jmb@netsurf-browser.org>2022-11-03 18:29:13 +0000
commit7528906749297b4ec23b5a28c0d7dba6ff0fa12e (patch)
tree4aafc13cdd9022c920e19e23cec9bd4b5665603e
parentcb9b11929ef84b01afd2e073092c0d7261ebdaf9 (diff)
downloadtoolchains-7528906749297b4ec23b5a28c0d7dba6ff0fa12e.tar.gz
toolchains-7528906749297b4ec23b5a28c0d7dba6ff0fa12e.tar.bz2
Fix __standard_time()
Territory_ConvertDateAndTime modifies r0-r3. Previously, UnixLib was only telling the compiler that r0 and r1 were modified. This resulted in the register allocator assuming that the value of r2 on exit was the same as it was on entry and thus returning a completely garbage value as the result of __standard_time(). Resolve this by telling the compiler the full facts.
-rw-r--r--arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p26
1 files changed, 26 insertions, 0 deletions
diff --git a/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p
new file mode 100644
index 0000000..fcdc7f3
--- /dev/null
+++ b/arm-riscos-gnueabihf/recipes/patches/gccsdk/unixlib-stdtime.p
@@ -0,0 +1,26 @@
+Index: libunixlib/time/stdtime.c
+===================================================================
+--- libunixlib/time/stdtime.c (revision 7698)
++++ libunixlib/time/stdtime.c (working copy)
+@@ -23,9 +23,11 @@
+ register const char *str __asm ("r4") = __str;
+ register const _kernel_oserror *err __asm ("r0");
+ register char *term __asm ("r1");
++ register size_t left __asm ("r2");
++ register const char *ostr __asm ("r3");
+ __asm__ volatile ("SWI\t%[SWI_Territory_ConvertDateAndTime]\n\t"
+ "MOVVC\tr0, #0\n\t"
+- : "=r" (err), "=r" (term)
++ : "=r" (err), "=r" (term), "=r" (left), "=r" (ostr)
+ : "r" (territory), "r" (ro_time), "r" (buf), "r" (size), "r" (str),
+ [SWI_Territory_ConvertDateAndTime] "i" (Territory_ConvertDateAndTime | (1<<17))
+ : "r14", "cc", "memory");
+@@ -48,7 +50,7 @@
+ #ifdef __TARGET_SCL__
+ -1,
+ #else
+- __locale_territory[LC_TIME],
++ __locale_global.locale_territory[LC_TIME],
+ #endif
+ riscos_time,
+ result,