diff --git a/Makefile b/Makefile index 8783c3553901cec4b7726750d755e4814e498af8..159ee327f979ba035292eb26832d7805d4951d2a 100644 --- a/Makefile +++ b/Makefile @@ -277,7 +277,8 @@ EXPORTS = ${MODWRAP} \ ANSI_OBJS =\ o.alloc o.armprof o.armsys o.clib o.ctype o.error o.fpprintf \ o.kernel o.locale o.math o.memcpset o.overmgr o.printf o.scanf \ - o.signal o.sort o.stdio o.stdlib o.string o.swiv o.time o.fenv + o.signal o.sort o.stdio o.stdlib o.string o.swiv o.time o.fenv \ + o.longlong RM_OBJS =\ rm_o.k_modbody \ @@ -289,6 +290,7 @@ RM_OBJS =\ rm_o.error \ rm_o.fpprintf \ rm_o.locale \ + rm_o.longlong \ rm_o.math \ rm_o.memcpset \ rm_o.printf \ @@ -562,17 +564,41 @@ lib.risc_oslib: ${RLIB_OBJS} lib.riscoslibm: ${RLIB_MOD_OBJS} ${LIBFILE} ${LIBFLAGS} $@ ${RLIB_MOD_OBJS} -lib.stubs: clib.s.cl_stub_r +o.cl_stub_r: clib.s.cl_stub_r ${OBJASM} ${ALFLAGS} -from clib.s.cl_stub_r -to $@ -lib.rstubs: rlib.s.rl_stub_r +o.cl_stub2_r: clib.s.cl_stub2_r + ${OBJASM} ${ALFLAGS} -from clib.s.cl_stub2_r -to $@ + +o.k_stub2_r: kernel.s.k_stub2_r + ${OBJASM} ${ALFLAGS} -from kernel.s.k_stub2_r -to $@ + +o_rl.rl_stub_r: rlib.s.rl_stub_r ${OBJASM} ${ALFLAGS} -from rlib.s.rl_stub_r -to $@ -lib.romcstubs: clib.s.cl_stub_rm - ${OBJASM} ${AFLAGS} -from clib.s.cl_stub_rm -to $@ +rm_o.cl_stub_rm: clib.s.cl_stub_rm + ${OBJASM} ${ALFLAGS} -from clib.s.cl_stub_rm -to $@ + +rm_o.cl_stub2_rm: clib.s.cl_stub2_rm + ${OBJASM} ${ALFLAGS} -from clib.s.cl_stub2_rm -to $@ + +rm_o.k_stub2_rm: kernel.s.k_stub2_rm + ${OBJASM} ${ALFLAGS} -from kernel.s.k_stub2_rm -to $@ + +rm_o_rl.rl_stub_rm: rlib.s.rl_stub_rm + ${OBJASM} ${ALFLAGS} -from rlib.s.rl_stub_rm -to $@ + +lib.stubs: o.cl_stub_r o.k_stub2_r o.cl_stub2_r + ${LIBFILE} ${LIBFLAGS} $@ o.cl_stub_r o.k_stub2_r o.cl_stub2_r + +lib.rstubs: o_rl.rl_stub_r o.k_stub2_r o.cl_stub2_r + ${LIBFILE} ${LIBFLAGS} $@ o_rl.rl_stub_r o.k_stub2_r o.cl_stub2_r + +lib.romcstubs: rm_o.cl_stub_rm rm_o.k_stub2_rm rm_o.cl_stub2_rm + ${LIBFILE} ${LIBFLAGS} $@ rm_o.cl_stub_rm rm_o.k_stub2_rm rm_o.cl_stub2_rm -lib.romstubs: rlib.s.rl_stub_rm - ${OBJASM} ${AFLAGS} -from rlib.s.rl_stub_rm -to $@ +lib.romstubs: rm_o_rl.rl_stub_rm rm_o.k_stub2_rm rm_o.cl_stub2_rm + ${LIBFILE} ${LIBFLAGS} $@ rm_o_rl.rl_stub_rm rm_o.k_stub2_rm rm_o.cl_stub2_rm lib.romastubs: rlib.s.rl_stub_a ${OBJASM} ${AFLAGS} -from rlib.s.rl_stub_a -to $@ diff --git a/VersionASM b/VersionASM index e655f00a96615c5a3fb983f246374aced08d123b..c4ce7be67215c5438da3acccef65fac8b65a5730 100644 --- a/VersionASM +++ b/VersionASM @@ -1,6 +1,6 @@ ; ; This file is automatically maintained by srccommit, do not edit manually. -; Last processed by srccommit version: 1.62. +; Last processed by srccommit version: 1.63. ; GBLS Module_MajorVersion GBLA Module_Version @@ -12,14 +12,14 @@ GBLS Module_HelpVersion GBLS Module_ComponentName GBLS Module_ComponentPath -Module_MajorVersion SETS "5.40" -Module_Version SETA 540 +Module_MajorVersion SETS "5.41" +Module_Version SETA 541 Module_MinorVersion SETS "" -Module_Date SETS "12 Apr 2002" -Module_ApplicationDate2 SETS "12-Apr-02" -Module_ApplicationDate4 SETS "12-Apr-2002" +Module_Date SETS "22 May 2002" +Module_ApplicationDate2 SETS "22-May-02" +Module_ApplicationDate4 SETS "22-May-2002" Module_ComponentName SETS "RISC_OSLib" Module_ComponentPath SETS "RiscOS/Sources/Lib/RISC_OSLib" -Module_FullVersion SETS "5.40" -Module_HelpVersion SETS "5.40 (12 Apr 2002)" +Module_FullVersion SETS "5.41" +Module_HelpVersion SETS "5.41 (22 May 2002)" END diff --git a/VersionNum b/VersionNum index d4bb3807acaa272514f8d932a592e127773c7e12..90360e061a41c08b9ceca4d8bcc58291a4611f8b 100644 --- a/VersionNum +++ b/VersionNum @@ -1,24 +1,24 @@ -/* (5.40) +/* (5.41) * * This file is automatically maintained by srccommit, do not edit manually. - * Last processed by srccommit version: 1.62. + * Last processed by srccommit version: 1.63. * */ -#define Module_MajorVersion_CMHG 5.40 +#define Module_MajorVersion_CMHG 5.41 #define Module_MinorVersion_CMHG -#define Module_Date_CMHG 12 Apr 2002 +#define Module_Date_CMHG 22 May 2002 -#define Module_MajorVersion "5.40" -#define Module_Version 540 +#define Module_MajorVersion "5.41" +#define Module_Version 541 #define Module_MinorVersion "" -#define Module_Date "12 Apr 2002" +#define Module_Date "22 May 2002" -#define Module_ApplicationDate2 "12-Apr-02" -#define Module_ApplicationDate4 "12-Apr-2002" +#define Module_ApplicationDate2 "22-May-02" +#define Module_ApplicationDate4 "22-May-2002" #define Module_ComponentName "RISC_OSLib" #define Module_ComponentPath "RiscOS/Sources/Lib/RISC_OSLib" -#define Module_FullVersion "5.40" -#define Module_HelpVersion "5.40 (12 Apr 2002)" -#define Module_LibraryVersionInfo "5:40" +#define Module_FullVersion "5.41" +#define Module_HelpVersion "5.41 (22 May 2002)" +#define Module_LibraryVersionInfo "5:41" diff --git a/c/alloc b/c/alloc index 2ba0d455f36887e7e4ecfc8dc55ea7ed96b3ecb0..025dbfb3019b6470dd9d0d0c44b45e15e97909a7 100644 --- a/c/alloc +++ b/c/alloc @@ -345,9 +345,7 @@ static int *stackOnEntryToAlloc; #define STACKDEPTH(local, depth) #endif -static void _alloc_die(message, rc) -char *message; -int rc; +static void _alloc_die(char *message, int rc) { char *cs, *ct; @@ -376,16 +374,14 @@ int rc; #endif } -static void bad_size(size) -size_t size; +static void bad_size(size_t size) { IGNORE(size); _alloc_die(_kernel_getmessage("Over-large or -ve size request", "C11"), FAILED); } #ifdef STATS -void print_event(event) -int event; +void print_event(int event) { switch (event) { case GARBAGE_COLLECT: D0("Garbage Collect :"); break; @@ -398,10 +394,7 @@ int event; } } -static void MakeEventRec(thisEvent, type, size) -int thisEvent; -Events type; -size_t size; +static void MakeEventRec(int thisEvent, Events type, size_t size) { statsP->nextEvent = thisEvent + 1; thisEvent %= MAXEVENTS; @@ -431,22 +424,15 @@ size_t size; /* ------------------------- Statistics reporting --------------------------*/ -extern void _GetStorageInfo(info) -StorageInfoP info; +extern void _GetStorageInfo(StorageInfoP info) { statsP->stats.currentHeapRequirement = totalHeap - totalFree; *info = statsP->stats; } -extern void _NextHeapElement( - nextBase, guard, size, free, heapHole, bitmap, firstWord) -BlockP *nextBase; -unsigned int *guard; -size_t *size; -int *free; -int *heapHole; -int *bitmap; -unsigned int *firstWord; +extern void _NextHeapElement(BlockP *nextBase, unsigned int *guard, + size_t *size, int *free, int *heapHole, + int *bitmap, unsigned int *firstWord) { BlockP junkBlock; if (*nextBase == NULL) {junkBlock = heapLow;} else {junkBlock = *nextBase;} #ifdef BLOCKS_GUARDED @@ -470,9 +456,7 @@ unsigned int *firstWord; if (*nextBase > heapHigh) *nextBase = NULL; } -extern int _GetEventData(event, info) -int event; -EventInfoP info; +extern int _GetEventData(int event, EventInfoP info) { int index; int previous; if ((event >= statsP->nextEvent) || (event < statsP->nextEvent-MAXEVENTS) @@ -584,8 +568,7 @@ static void ShowStats(void) #endif #ifdef GC -static void SetBlockFree(block) -BlockP block; +static void SetBlockFree(BlockP block) { D1("!!SetBlockFree &%X\n", (unsigned) block); block->size |= FREEBIT; @@ -600,8 +583,7 @@ static void init_bitmaps(void) memset(mapForExistingHeap, ~0, SIZE(ADDBYTES(mapForExistingHeap,-OVERHEAD))); } -extern int __register_gc_proc(proc) -GCProc proc; +extern int __register_gc_proc(GCProc proc) { ACQUIREMUTEX; F0("!!__register_gc_proc\n"); @@ -618,14 +600,12 @@ GCProc proc; #endif #ifdef BLOCKS_GUARDED -extern void __heap_checking_on_all_deallocates(on) -int on; +extern void __heap_checking_on_all_deallocates(int on) { checkDeallocates = on; } -extern void __heap_checking_on_all_allocates(on) -int on; +extern void __heap_checking_on_all_allocates(int on) { checkAllocates = on; } @@ -729,8 +709,7 @@ static int internal_coalesce(void) return OK; } -static int InsertBlockInOverflowList(block) -BlockP block; +static int InsertBlockInOverflowList(BlockP block) { #if HEAP_ALLOCATED_IN_ASCENDING_ADDRESS_ORDER F0("!!InsertBlockInOverflowList &") @@ -772,10 +751,8 @@ BlockP block; return OK; } -static int GetMoreOSHeap(minSize, base_ptr, size_ptr) -size_t minSize; -BlockP *base_ptr; -size_t *size_ptr; +static int GetMoreOSHeap(size_t minSize, BlockP *base_ptr, + size_t *size_ptr) { size_t size = *size_ptr; BlockP base = *base_ptr; #ifdef GC @@ -1065,13 +1042,11 @@ static int check_heap(void) } #endif -#define COALESCED (1<<31) -#define DONEGC (1<<30) -#define FORCECOALESCE (1<<29) +#define COALESCED (1u<<31) +#define DONEGC (1u<<30) +#define FORCECOALESCE (1u<<29) -static int primitive_alloc(gcBits, size/*words*/) -int gcBits; -size_t size; +static int primitive_alloc(int gcBits, size_t size/*words*/) { BlockP block; size_t actualSize; register int index; @@ -1293,8 +1268,7 @@ split_block: RELEASEANDRETURN((int)block) } -static int primitive_dealloc(block) -BlockP block; +static int primitive_dealloc(BlockP block) { int size; ACQUIREMUTEX; F0("!!primitive_dealloc: block ") @@ -1346,8 +1320,7 @@ BlockP block; /* * Put the veneer functions here for now: don't really need all these. */ -extern size_t _byte_size(p) -VoidStar p; +extern size_t _byte_size(VoidStar p) { BlockP block = (BlockP)p; if (block != NULL) { /* decrement the pointer (block) by the number of overhead bytes */ @@ -1357,8 +1330,7 @@ VoidStar p; return 0; } -extern VoidStar malloc(size) -size_t size; +extern VoidStar malloc(size_t size) { VoidStar ptr; if (_kernel_processor_mode() & 0xF) /* not USR26 or USR32 */ return _kernel_RMAalloc(size); @@ -1376,9 +1348,7 @@ size_t size; return ptr; } -extern VoidStar realloc(p, size) -VoidStar p; -size_t size; +extern VoidStar realloc(VoidStar p, size_t size) { int rc; size_t old; VoidStar new = NULL; @@ -1421,9 +1391,7 @@ size_t size; return p; } -extern VoidStar calloc(count, size) -size_t count; -size_t size; +extern VoidStar calloc(size_t count, size_t size) { VoidStar r; /* * This miserable code computes a full 64-bit product for count & size @@ -1450,8 +1418,7 @@ size_t size; return r; } -extern void free(p) -VoidStar p; +extern void free(VoidStar p) { int rc; /* free(0) now allowed!!! ECN - 21 09 93 */ if (!p) return; @@ -1471,9 +1438,7 @@ VoidStar p; } #ifdef CAMEL -static void _allocate(a, bitlen) -VoidStar *a; -size_t bitlen; +static void _allocate(VoidStar *a, size_t bitlen) /* Default storage allocator */ { int local; if (bitlen > 0) { @@ -1489,9 +1454,7 @@ size_t bitlen; } #endif -extern void _deallocate(a, bitlen) -VoidStar *a; -size_t bitlen; +extern void _deallocate(VoidStar *a, size_t bitlen) /* Default storage deallocator */ { VoidStar p = *a; int rc; @@ -1506,8 +1469,7 @@ size_t bitlen; } } -extern VoidStar _sys_alloc(n) -size_t n; +extern VoidStar _sys_alloc(size_t n) { VoidStar a = malloc(n); if (a == NULL) _alloc_die(_kernel_getmessage("No store left for I/O buffer or the like", "C17"), FAILED); @@ -1515,9 +1477,7 @@ size_t n; } #ifdef GC -extern VoidStar _gc_malloc(gcbits, size) -int gcbits; -size_t size; +extern VoidStar _gc_malloc(int gcbits, size_t size) { VoidStar ptr; ptr = (VoidStar) primitive_alloc(gcbits, BYTESTOWORDS(size)); if ((int)ptr == FAILED || (int)ptr == CORRUPT) { @@ -1530,10 +1490,7 @@ size_t size; return ptr; } -extern void _gcallocate(a, bitlen, gcbits) -VoidStar *a; -size_t bitlen; -int gcbits; +extern void _gcallocate(VoidStar *a, size_t bitlen, int gcbits) /* The M2 ALLOCATE function */ { int local; if (bitlen > 0) { @@ -1548,9 +1505,7 @@ int gcbits; } else *a = NULL; } -extern void _set_gcbits(a, gcbits) -VoidStar *a; -int gcbits; +extern void _set_gcbits(VoidStar *a, int gcbits) { BlockP p = (BlockP)*a; /* * Must acquire the storage lock:- else we cannot change the word (which @@ -1641,7 +1596,7 @@ static int _allocated_by_me(BlockP block) return 0; } -extern int _alloc_reinit() +extern int _alloc_reinit(void) { _kernel_stack_chunk *prev = _kernel_current_stack_chunk(); _kernel_stack_chunk *chunk = prev->sc_next; diff --git a/c/fpprintf b/c/fpprintf index 75a9c70baefd4e14e8572edbb8bb3da747650be1..68b158fb7b2ac9461f55303e687530415e5d8827 100644 --- a/c/fpprintf +++ b/c/fpprintf @@ -54,6 +54,7 @@ extern int __vfprintf(FILE *fp, const char *fmt, #define _PADZERO 0200 /* *** DEPRECATED FEATURE *** */ #define _FPCONV 0400 #define _CHARSPEC 01000 +#define _LONGLONGSPEC 02000 #ifndef NO_FLOATING_POINT diff --git a/c/locale b/c/locale index 2c44c29a5cc652f15697231efbcc25f29bf90e09..fa02a4fa9ab74f080d940040d8cbab941eadf98d 100644 --- a/c/locale +++ b/c/locale @@ -378,7 +378,8 @@ size_t strftime(char *s, size_t maxsize, const char *fmt, const struct tm *tt) /* Format for "C" locale changed as per C99 */ if (!territory) sprintf(ss, "%s %s %2d %.2d:%.2d:%.2d %d", - abbrweek[tt->tm_wday], abbrmonth[tt->tm_mon], tt->tm_mday, + tt->tm_wday < 7U ? abbrweek[tt->tm_wday] : "???", + abbrmonth[tt->tm_mon], tt->tm_mday, tt->tm_hour, tt->tm_min, tt->tm_sec, tt->tm_year + 1900); /*sprintf(ss, "%02d %s %d %02d:%02d:%02d", tt->tm_mday, abbrmonth[tt->tm_mon], tt->tm_year + 1900, diff --git a/c/math b/c/math index 2119cc915f7f08bdff4e88bded71df5411ab0593..b9715256288bc6c2d0c5a8f2a4edd0cc13bc6914 100644 --- a/c/math +++ b/c/math @@ -54,8 +54,7 @@ #ifndef DO_NOT_SUPPORT_UNNORMALIZED_NUMBERS -double frexp(d, lvn) -double d; int *lvn; +double frexp(double d, int *lvn) { /* This version works even if d starts off as an unnormalized number in */ /* the IEEE sense. But in that special case it will be mighty slow! */ @@ -90,8 +89,7 @@ double d; int *lvn; #else /* DO_NOT_SUPPORT_UNNORMALIZED_NUMBERS */ -double frexp(d, lvn) -double d; int *lvn; +double frexp(double d, int *lvn) { fp_number d1; if (d==0.0) @@ -106,8 +104,7 @@ double d; int *lvn; #endif /* DO_NOT_SUPPORT_UNNORMALIZED_NUMBERS */ -double ldexp(d, n) -double d; int n; +double ldexp(double d, int n) { fp_number d1; int nx; diff --git a/c/printf b/c/printf index 9d813a83fbb86978b1030390562e2131ed9cc35d..73db8e4c3bb25a1dc2a20fd12ebbb6005f23469a 100644 --- a/c/printf +++ b/c/printf @@ -75,6 +75,7 @@ int _sprintf_lf(char *buff, const char *fmt, ...); #define _PADZERO 0200 /* *** DEPRECATED FEATURE *** */ #define _FPCONV 0400 #define _CHARSPEC 01000 +#define _LONGLONGSPEC 02000 #endif /* _LJUSTIFY */ @@ -96,7 +97,7 @@ static int pr_num(unsigned int v, int flags, char *prefix, #endif static int printf_display(FILE *p, int flags, int ch, int precision, int width, - unsigned int v, fp_print fp_display_fn, char *prefix, + unsigned long long v, fp_print fp_display_fn, char *prefix, char *hextab, double *d) { int charcount = 0; @@ -123,7 +124,7 @@ static int printf_display(FILE *p, int flags, int ch, int precision, int width, case 'u': case 'i': case 'd': while (v != 0) - { unsigned int vDiv10 = _kernel_udiv10(v); + { unsigned long long vDiv10 = v / 10U; buff[len++] = '0' + v - vDiv10 * 10U; v = vDiv10; } @@ -220,7 +221,7 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, /* to a real string before use, but necessary in that passing unset */ /* parameters to functions is illegal in C. */ char *prefix, *hextab = 0; - unsigned int v; + unsigned long long v; #ifndef NO_FLOATING_POINT double d; #endif @@ -293,29 +294,41 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, } if (t >= 0) flags |= _PRECGIVEN, precision = t; } - if (ch=='l' || ch=='L' || ch=='j' || ch=='z' || ch=='t') + if (ch=='l' || ch=='L' || ch=='z' || ch=='t') /* 'l' Indicate that a numeric argument is 'long'. Here int and long */ /* are the same (32 bits) and so I can ignore this flag! */ /* 'L' Marks floating arguments as being of type long double. Here this */ /* is the same as just double, and so I can ignore the flag. */ -/* 'j' Indicates that a numeric argument is 'intmax_t', or that a %n */ -/* argument is a pointer to an intmax_t. We can ignore it. */ /* 'z' Indicates that a numeric argument is 'size_t', or that a %n */ /* argument is a pointer to a size_t. We can ignore it. */ /* 't' Indicates that a numeric argument is 'ptrdiff_t', or that a %n */ /* argument is a pointer to a ptrdiff_t. We can ignore it. */ - { flags |= _LONGSPECIFIER; + { int last = ch; + flags |= _LONGSPECIFIER; ch = *fmt++; +/* 'll' Indicates that a numeric argument is 'long long', or that a %n */ +/* argument is a pointer to long long int. */ + if (ch=='l' && last =='l') + { flags |= _LONGLONGSPEC; + ch = *fmt++; + } } else if (ch=='h') -/* 'h' Indicates that an integer value is to be treated as short. */ +/* 'h' Indicates that an integer value is to be treated as short. */ { flags |= _SHORTSPEC; ch = *fmt++; +/* 'hh' Indicates that an integer value is to be treated as char. */ if (ch=='h') { flags |= _CHARSPEC; ch = *fmt++; } } + else if (ch=='j') +/* 'j' Indicates that a numeric argument is '[u]intmax_t', or than a %n */ +/* argument is a pointer to intmax_t. */ + { flags |= _LONGSPECIFIER|_LONGLONGSPEC; + ch = *fmt++; + } /* Now the options have been decoded - I can process the main dispatch */ switch (ch) @@ -347,8 +360,13 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, continue; /* %n assigns the number of chars printed so far to the next arg (which */ -/* is expected to be of type (int *). */ - case 'n': { int *xp = va_arg(args, int *); +/* is expected to be of type (int *), or (long long *) if 'j' or 'll'. */ + case 'n': if (flags & _LONGLONGSPEC) + { long long *xp = va_arg(args, long long *); + *xp = charcount; + } + else + { int *xp = va_arg(args, int *); *xp = charcount; } continue; @@ -375,7 +393,8 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, /* when printing things that are not (decimal) digits. */ /* I can share some messy decoding here with the code that deals with */ /* octal and decimal output via %o and %d. */ - case 'X': v = va_arg(args, int); + case 'X': v = (flags & _LONGLONGSPEC) ? va_arg(args, unsigned long long) + : va_arg(args, unsigned int); if (flags & _SHORTSPEC) v = (unsigned short)v; if (flags & _CHARSPEC) v = (unsigned char)v; hextab = "0123456789ABCDEF"; @@ -383,7 +402,8 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, if (flags & _PRECGIVEN) flags &= ~_PADZERO; break; - case 'x': v = va_arg(args, int); + case 'x': v = (flags & _LONGLONGSPEC) ? va_arg(args, unsigned long long) + : va_arg(args, unsigned int); if (flags & _SHORTSPEC) v = (unsigned short)v; if (flags & _CHARSPEC) v = (unsigned char)v; hextab = "0123456789abcdef"; @@ -400,14 +420,16 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, precision = 8; break; - case 'o': v = va_arg(args, int); + case 'o': v = (flags & _LONGLONGSPEC) ? va_arg(args, unsigned long long) + : va_arg(args, unsigned int); if (flags & _SHORTSPEC) v = (unsigned short)v; if (flags & _CHARSPEC) v = (unsigned char)v; prefix = (flags&_VARIANT) ? "0" : ""; if (flags & _PRECGIVEN) flags &= ~_PADZERO; break; - case 'u': v = va_arg(args, unsigned int); + case 'u': v = (flags & _LONGLONGSPEC) ? va_arg(args, unsigned long long) + : va_arg(args, unsigned int); if (flags & _SHORTSPEC) v = (unsigned short)v; if (flags & _CHARSPEC) v = (unsigned char)v; prefix = ""; @@ -415,10 +437,12 @@ int __vfprintf(FILE *p, const char *fmt, va_list args, break; case 'i': - case 'd': { int w = va_arg(args, int); + case 'd': { long long w; + w = (flags & _LONGLONGSPEC) ? va_arg(args, long long) + : va_arg(args, int); if (flags & _SHORTSPEC) w = (signed short)w; if (flags & _CHARSPEC) w = (signed char)w; - if (w<0) v = 0U-w, prefix = "-"; + if (w<0) v = 0ULL-w, prefix = "-"; else v = w, prefix = (flags&_SIGNED) ? "+" : (flags&_BLANKER) ? " " : ""; diff --git a/c/scanf b/c/scanf index cbcf04b74ceffd363b8e0ba234defabf3f8e4942..fdeefd62cd29af190dae0e94f40fa673da9ac7ee 100644 --- a/c/scanf +++ b/c/scanf @@ -56,12 +56,14 @@ extern int __backspace(FILE *stream); /* a strict R-inverse of getc() */ #define NUMOK 0400 /* ditto + rd_int */ #define NUMNEG 01000 /* ditto + rd_int */ #define CHAR 02000 +#define LONGLONG 04000 #define countgetc(p) (charcount++, getc(p)) /* The next macros, with the help of the compiler, ensures that we can */ /* test for LONG and SHORT properly, but not general extra code. */ +#define isLONGLONG_(flag) ((flag) & LONGLONG) #define isLONG_(flag) ((flag) & LONG && sizeof(int) != sizeof(long)) #define isSHORT_(flag) ((flag) & SHORT) #define isCHAR_(flag) ((flag) & CHAR) @@ -97,7 +99,7 @@ static int ch_val(int ch, int radix) static long int rd_int(FILE *p, va_list res, int flag, int radix, int field) { long int charcount = -1; /* allow for always ungetc */ - unsigned long int n = 0; + unsigned long long int n = 0; int ch; while (isspace(ch = countgetc(p))); /* leading whitespace */ if (ch == EOF) return CVTEOF; @@ -132,19 +134,21 @@ case '+': ch = countgetc(p); if (!(flag & NOSTORE)) { /* This code is pretty specious on a 2's complement machine */ if (flag & ALLOWSIGN) - { long int m = flag & NUMNEG ? -n : n; + { long long m = flag & NUMNEG ? -n : n; int *p = va_arg(res, int *); /* rely on sizeof(int*)=sizeof(short*) */ if isCHAR_(flag) *(signed char *)p = (signed char)m; else if isSHORT_(flag) *(short *)p = (short)m; - else if isLONG_(flag) *(long *)p = m; + else if isLONG_(flag) *(long *)p = (long)m; + else if isLONGLONG_(flag) *(long long *)p = m; else *(int *)p = (int)m; } else /* pointer case comes here too - with quite some type pun! */ { unsigned int *p = va_arg(res, unsigned int *); /* rely on sizeof(unsigned int *)==sizeof(unsigned short *) */ if isCHAR_(flag) *(unsigned char *)p = (unsigned char)n; - if isSHORT_(flag) *(unsigned short *)p = (unsigned short)n; - else if isLONG_(flag) *(unsigned long *)p = n; + else if isSHORT_(flag) *(unsigned short *)p = (unsigned short)n; + else if isLONG_(flag) *(unsigned long *)p = (unsigned long)n; + else if isLONGLONG_(flag) *(unsigned long long *)p = n; else *(unsigned int *)p = (unsigned int)n; } } @@ -699,13 +703,18 @@ case '%': { int field = 0, flag = 0; flag |= FIELDGIVEN; } if (!(flag & FIELDGIVEN)) field = INT_MAX; - if (fch == 'l') fch = *fmt++, flag |= LONG; + if (fch == 'l') + { fch = *fmt++; + if (fch == 'l') fch = *fmt++, flag |= LONGLONG; + else flag |= LONG; + } else if (fch == 'L') fch = *fmt++, flag |= LONG | LONGDOUBLE; else if (fch == 'h') { fch = *fmt++, flag |= SHORT; if (fch == 'h') fch = *fmt++, flag |= CHAR; } - else if (fch == 'j' || fch == 'z' || fch == 't') fch = *fmt++; + else if (fch == 'z' || fch == 't') fch = *fmt++; + else if (fch == 'j') fch = *fmt++, flag |= LONGLONG; switch (fch) { default: return cnt; /* illegal conversion code */ @@ -758,6 +767,7 @@ case '%': { int field = 0, flag = 0; case 'n': if isCHAR_(flag) *va_arg(argv, char *) = (char)charcount; else if isSHORT_(flag) *va_arg(argv, short *) = (short)charcount; else if isLONG_(flag) *va_arg(argv, long *) = charcount; + else if isLONGLONG_(flag) *va_arg(argv, long long *) = charcount; else *va_arg(argv, int *) = (int)charcount; continue; case 'o': worked = rd_int(p, argv, flag | ALLOWSIGN, 8, field); diff --git a/c/signal b/c/signal index fb4417ed05168cc694b797daf2f43c1010fbf803..89469380d74977e569ce911a2d51394607525cd7 100644 --- a/c/signal +++ b/c/signal @@ -122,7 +122,7 @@ static void _default_sigstak_handler() _kernel_exit(100); } #else -extern void _default_sigstak_handler(); +extern void _default_sigstak_handler(void); #endif extern void __default_signal_handler(int sig) diff --git a/c/stdlib b/c/stdlib index f12b9fcbcd0a8fb35e9b71b535abaffb2687ca98..2bdac5ade4c6305a03a49b04f65985012e7410bb 100644 --- a/c/stdlib +++ b/c/stdlib @@ -101,7 +101,7 @@ void srand(unsigned int seed) #define EXIT_LIMIT 33 typedef void (*vprocp)(void); -static union { vprocp p; int i; } _exitvector[EXIT_LIMIT] = {}; +static union { vprocp p; int i; } _exitvector[EXIT_LIMIT] = { 0 }; /* initialised so not in bss (or shared library trouble) */ static struct { char number_of_exit_functions; @@ -172,5 +172,13 @@ long int labs(long int x) else return x; } +#if 0 +/* Compiler generates poo code at the minute - in machine code for now */ +long long int llabs(long long int x) { + if (x<0) return (-x); + else return x; +} +#endif + /* end of stdlib.c */ diff --git a/clib/h/fenv b/clib/h/fenv index 2ff9e3e5537f9b8d17f9ba63d0d6244af8523571..77c9219ecbe1c7c7c44d67cb431f4c483e407a13 100644 --- a/clib/h/fenv +++ b/clib/h/fenv @@ -25,9 +25,9 @@ typedef unsigned int fexcept_t; /* represents the floating-point status flags collectively */ -typedef struct fenv_t -{ unsigned status; - unsigned reserved[5]; +typedef struct __fenv_t_struct +{ unsigned __status; + unsigned __reserved[5]; } fenv_t; /* represents the entire floating-point environment */ @@ -50,19 +50,19 @@ typedef struct fenv_t #ifdef __cplusplus extern "C" { #endif -int feclearexcept(int excepts); +int feclearexcept(int /*excepts*/); /* attempts to clear the supported floating-point exceptions represented */ /* by its argument. */ /* Returns: zero if the excepts argument is zero or if all the specified */ /* exceptions were successfully cleared. Otherwise, it returns */ /* a nonzero value. */ -int fegetexceptflag(fexcept_t *flagp, int excepts); +int fegetexceptflag(fexcept_t */*flagp*/, int /*excepts*/); /* attempts to store an implementation-defined representation of the */ /* states of the floating-point status flags indicated by the argument */ /* excepts in the object pointed to by the argument flagp. */ /* Returns: zero if the representation was successfully stored. */ /* Otherwise, it returns a nonzero value. */ -int feraiseexcept(int excepts); +int feraiseexcept(int /*excepts*/); /* attempts to raise the supported floating-point exceptions represented */ /* by its argument. The order in which these floating-point exceptions */ /* are raised is unspecified, except as stated in F.7.6. Whether the */ @@ -72,7 +72,7 @@ int feraiseexcept(int excepts); /* Returns: zero if the excepts argument is zero or if all the specified */ /* exceptions were successfully raised. Otherwise, it returns a */ /* nonzero value. */ -int fesetexceptflag(const fexcept_t *flagp, int excepts); +int fesetexceptflag(const fexcept_t */*flagp*/, int /*excepts*/); /* attempts to set the floating-point status flags indicated by the */ /* argument excepts to the states stored in the object pointed to by */ /* flagp. The value of *flagp shall have been set by a previous call to */ @@ -83,7 +83,7 @@ int fesetexceptflag(const fexcept_t *flagp, int excepts); /* Returns: zero if the excepts argument is zero or if all the specified */ /* flags were successfully set to the appropriate state. */ /* Otherwise, it returns a nonzero value. */ -int fetestexcept(int excepts); +int fetestexcept(int /*excepts*/); /* determines which of a specified subset of the floating-point */ /* exception flags are currently set. The excepts argument specifies the */ /* floating-point status flags to be queried. */ @@ -97,26 +97,26 @@ int fegetround(void); /* current rounding direction or a negative value if there is */ /* no such rounding direction macro or the current rounding */ /* direction is not determinable. */ -int fesetround(int round); +int fesetround(int /*round*/); /* establishes the rounding direction represented by its argument round. */ /* If the argument is not equal to the value of a rounding direction */ /* macro, the rounding direction is not changed. */ /* Returns: zero if and only if the requested rounding direction was */ /* established. */ -int fegetenv(fenv_t *envp); +int fegetenv(fenv_t */*envp*/); /* attempts to store the current floating-point environment in the */ /* object pointed to by envp. */ /* Returns: zero if the environment was successfully stored. Otherwise, */ /* it returns a nonzero value. */ -int feholdexcept(fenv_t *envp); +int feholdexcept(fenv_t */*envp*/); /* saves the current floating-point environment in the object pointed to */ /* by envp, clears the floating-point status flags, and then installs a */ /* non-stop (continue on floating-point exceptions) mode for all */ /* floating-point exceptions. */ /* Returns: zero if and only if non-stop floating-point exception */ /* handling was successfully installed. */ -int fesetenv(const fenv_t *envp); +int fesetenv(const fenv_t */*envp*/); /* attempts to establish the floating-point environment represented by */ /* the object pointed to by envp. The argument envp shall point to an */ /* object set by a call to fegetenv or feholdexcept, or equal a */ @@ -125,7 +125,7 @@ int fesetenv(const fenv_t *envp); /* argument, and does not raise these floating-point exceptions. */ /* Returns: zero if the environment was successfully established. */ /* Otherwise, it returns a nonzero value. */ -int feupdateenv(const fenv_t *envp); +int feupdateenv(const fenv_t */*envp*/); /* attempts to save the currently raised floating-point exceptions in */ /* its automatic storage, install the floating-point environment */ /* represented by the object pointed to by envp, and then raise the */ diff --git a/clib/h/inttypes b/clib/h/inttypes index 70382fab2eba68634ba2ddfa366f261193b9433e..38bbfcff75f622c3dcc34a2c43151f5392fc230b 100644 --- a/clib/h/inttypes +++ b/clib/h/inttypes @@ -17,182 +17,200 @@ /* inttypes.h: ISO 'C' (ISO/IEC 9899:1999) library header, section 7.8 */ /* Copyright (C) Element 14 Ltd. 1999 */ -/* version 1.00 */ +/* version 1.01 */ #ifndef __inttypes_h #define __inttypes_h #include "stdint.h" -/* - * A set of C9X-style definitions that make sense for the current - * (Norcroft 5) implementation. Note that we have no 64-bit types, - * as a conforming C9X implementation must. We also don't supply - * the four functions we're supposed to supply. - */ - #if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) #define PRId8 "d" #define PRId16 "d" #define PRId32 "d" +#define PRId64 "lld" #define PRIdLEAST8 "d" #define PRIdLEAST16 "d" #define PRIdLEAST32 "d" +#define PRIdLEAST64 "lld" #define PRIdFAST8 "d" #define PRIdFAST16 "d" #define PRIdFAST32 "d" -#define PRIdMAX "d" +#define PRIdFAST64 "lld" +#define PRIdMAX "lld" #define PRIdPTR "d" #define PRIi8 "i" #define PRIi16 "i" #define PRIi32 "i" +#define PRIi64 "lli" #define PRIiLEAST8 "i" #define PRIiLEAST16 "i" #define PRIiLEAST32 "i" +#define PRIiLEAST64 "lli" #define PRIiFAST8 "i" #define PRIiFAST16 "i" #define PRIiFAST32 "i" -#define PRIiMAX "i" +#define PRIiFAST64 "lli" +#define PRIiMAX "lli" #define PRIiPTR "i" #define PRIo8 "o" #define PRIo16 "o" #define PRIo32 "o" +#define PRIo64 "llo" #define PRIoLEAST8 "o" #define PRIoLEAST16 "o" #define PRIoLEAST32 "o" +#define PRIoLEAST64 "llo" #define PRIoFAST8 "o" #define PRIoFAST16 "o" #define PRIoFAST32 "o" -#define PRIoMAX "o" +#define PRIoFAST64 "llo" +#define PRIoMAX "llo" #define PRIoPTR "o" #define PRIu8 "u" #define PRIu16 "u" #define PRIu32 "u" +#define PRIu64 "llu" #define PRIuLEAST8 "u" #define PRIuLEAST16 "u" #define PRIuLEAST32 "u" +#define PRIuLEAST64 "llu" #define PRIuFAST8 "u" #define PRIuFAST16 "u" #define PRIuFAST32 "u" -#define PRIuMAX "u" +#define PRIuFAST64 "llu" +#define PRIuMAX "llu" #define PRIuPTR "u" #define PRIx8 "x" #define PRIx16 "x" #define PRIx32 "x" +#define PRIx64 "llx" #define PRIxLEAST8 "x" #define PRIxLEAST16 "x" #define PRIxLEAST32 "x" +#define PRIxLEAST64 "llx" #define PRIxFAST8 "x" #define PRIxFAST16 "x" #define PRIxFAST32 "x" -#define PRIxMAX "x" +#define PRIxFAST64 "llx" +#define PRIxMAX "llx" #define PRIxPTR "x" #define PRIX8 "X" #define PRIX16 "X" #define PRIX32 "X" +#define PRIX64 "llX" #define PRIXLEAST8 "X" #define PRIXLEAST16 "X" #define PRIXLEAST32 "X" +#define PRIXLEAST64 "llX" #define PRIXFAST8 "X" #define PRIXFAST16 "X" #define PRIXFAST32 "X" -#define PRIXMAX "X" +#define PRIXFAST64 "llX" +#define PRIXMAX "llX" #define PRIXPTR "X" #define SCNd8 "hhd" #define SCNd16 "hd" #define SCNd32 "d" +#define SCNd64 "lld" #define SCNdLEAST8 "hhd" #define SCNdLEAST16 "hd" #define SCNdLEAST32 "d" +#define SCNdLEAST64 "lld" #define SCNdFAST8 "hhd" #define SCNdFAST16 "d" #define SCNdFAST32 "d" -#define SCNdMAX "d" +#define SCNdFAST64 "lld" +#define SCNdMAX "lld" #define SCNdPTR "d" #define SCNi8 "hhi" #define SCNi16 "hi" #define SCNi32 "i" +#define SCNi64 "lli" #define SCNiLEAST8 "hhi" #define SCNiLEAST16 "hi" #define SCNiLEAST32 "i" +#define SCNiLEAST64 "lli" #define SCNiFAST8 "hhi" #define SCNiFAST16 "i" #define SCNiFAST32 "i" -#define SCNiMAX "i" +#define SCNiFAST64 "lli" +#define SCNiMAX "lli" #define SCNiPTR "i" #define SCNo8 "hho" #define SCNo16 "ho" #define SCNo32 "o" +#define SCNo64 "llo" #define SCNoLEAST8 "hho" #define SCNoLEAST16 "ho" #define SCNoLEAST32 "o" +#define SCNoLEAST64 "llo" #define SCNoFAST8 "hho" #define SCNoFAST16 "o" #define SCNoFAST32 "o" -#define SCNoMAX "o" +#define SCNoFAST64 "llo" +#define SCNoMAX "llo" #define SCNoPTR "o" #define SCNu8 "hhu" #define SCNu16 "hu" #define SCNu32 "u" +#define SCNu64 "llu" #define SCNuLEAST8 "hhu" #define SCNuLEAST16 "hu" #define SCNuLEAST32 "u" +#define SCNuLEAST64 "llu" #define SCNuFAST8 "hhu" #define SCNuFAST16 "u" #define SCNuFAST32 "u" -#define SCNuMAX "u" +#define SCNuFAST64 "llu" +#define SCNuMAX "llu" #define SCNuPTR "u" #define SCNx8 "hhx" #define SCNx16 "hx" #define SCNx32 "x" +#define SCNx64 "llx" #define SCNxLEAST8 "hhx" #define SCNxLEAST16 "hx" #define SCNxLEAST32 "x" +#define SCNxLEAST64 "llx" #define SCNxFAST8 "hhx" #define SCNxFAST16 "x" #define SCNxFAST32 "x" -#define SCNxMAX "x" +#define SCNxFAST64 "llx" +#define SCNxMAX "llx" #define SCNxPTR "x" #endif -/* - * The following are fudged with macros, as we don't have real functions - * for them. - */ - -#ifndef __div_t -# define __div_t 1 -typedef struct div_t { int quot, rem; } div_t; -#endif - -#define imaxdiv_t div_t +#if 0 +/* Not actually in the C library yet */ +typedef struct imaxdiv_t { intmax_t quot, rem; } imaxdiv_t; #ifdef __cplusplus extern "C" { #endif -extern div_t div(int /*numer*/, int /*denom*/); -extern long int strtol(const char * /*nptr*/, char **/*endptr*/, int /*base*/); -extern unsigned long int strtoul(const char * /*nptr*/, - char ** /*endptr*/, int /*base*/); +extern intmax_t imaxabs(intmax_t /*j*/); +extern imaxdiv_t imaxdiv(intmax_t /*numer*/, intmax_t /*denom*/); +extern intmax_t strtoimax(const char * restrict /*nptr*/, + char ** restrict /*endptr*/, int /*base*/); +extern uintmax_t strtoumax(const char * restrict /*nptr*/, + char ** restrict /*endptr*/, int /*base*/); #ifdef __cplusplus } #endif -#define imaxdiv(a,b) div(a,b) -#define strtoimax(a,b,c) ((intmax_t)strtol(a,b,c)) -#define strtoumax(a,b,c) ((uintmax_t)strtoul(a,b,c)) +#endif /* 0 */ #endif diff --git a/clib/h/kernel b/clib/h/kernel index d7881adff7965d408a2f673fa4e9898ef0151898..2acb0c282af5c9eac8890ca7dd3d17fc32a660e5 100644 --- a/clib/h/kernel +++ b/clib/h/kernel @@ -273,6 +273,16 @@ extern void _kernel_register_allocs(allocproc *malloc, freeproc *free); * of stack. */ +extern void *__rt_allocauto(unsigned); +extern void __rt_freeauto(void *); +/* + * Allocate and free blocks of memory with "automatic" storage - ie associated + * with the current stack frame. In future, this will allow automatic clear-up + * when the stack is unwound, eg by longjmp(), but this is not yet implemented. + * Uses the malloc and free procedures registered above. + * __rt_allocauto always returns a valid block, or generates an error. + */ + typedef int _kernel_ExtendProc(int /*n*/, void** /*p*/); extern _kernel_ExtendProc *_kernel_register_slotextend(_kernel_ExtendProc *proc); /* When the initial heap is full, the kernel is normally capable of extending diff --git a/clib/h/limits b/clib/h/limits index 642804da585d7210584617e73d88b704d340d05b..c749871c0c25f082238d686a1881783a7a3c25c5 100644 --- a/clib/h/limits +++ b/clib/h/limits @@ -15,10 +15,10 @@ #pragma force_top_level #pragma include_only_once -/* limits.h: ANSI 'C' (X3J11 Oct 88) library header, section 2.2.4.2 */ +/* limits.h: ISO 'C' (9899:1999) library header, section 5.2.4.2.1 */ /* Copyright (C) Codemist Ltd., 1988 */ /* Copyright (C) Acorn Computers Ltd. 1991, 1992 */ -/* version 2.00 */ +/* version 3.00 */ #ifndef __limits_h #define __limits_h @@ -43,7 +43,7 @@ /* minimum value for an object of type short int */ #define SHRT_MAX 0x7fff /* maximum value for an object of type short int */ -#define USHRT_MAX 65535U +#define USHRT_MAX 65535 /* maximum value for an object of type unsigned short int */ #define INT_MIN (~0x7fffffff) /* -2147483648 and 0x80000000 are unsigned */ /* minimum value for an object of type int */ @@ -51,12 +51,22 @@ /* maximum value for an object of type int */ #define UINT_MAX 0xffffffff /* maximum value for an object of type unsigned int */ -#define LONG_MIN (~0x7fffffff) +#define LONG_MIN (~0x7fffffffL) /* minimum value for an object of type long int */ -#define LONG_MAX 0x7fffffff +#define LONG_MAX 0x7fffffffL /* maximum value for an object of type long int */ -#define ULONG_MAX 0xffffffffU +#define ULONG_MAX 0xffffffffL /* maximum value for an object of type unsigned long int */ +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901 +#define LLONG_MIN (~0x7fffffffffffffffLL) + /* minimum value for an object of type long long int */ +#define LLONG_MAX 0x7fffffffffffffffLL + /* maximum value for an object of type long long int */ +#define ULLONG_MAX 0xffffffffffffffffLL + /* maximum value for an object of type unsigned long long int */ +#endif +#endif #endif diff --git a/clib/h/stdarg b/clib/h/stdarg index 3dbf82d1f385ca1b2a17649365805af19d7ede97..e9e4cec5ff49878799e41a79218848d591d28098 100644 --- a/clib/h/stdarg +++ b/clib/h/stdarg @@ -15,16 +15,16 @@ #pragma force_top_level #pragma include_only_once -/* stdarg.h: ANSI 'C' (X3J11 Oct 88) library header, section 4.8 */ +/* stdarg.h: ISO 'C' (9899:1999) library header, section 7.15 */ /* Copyright (C) Codemist Ltd. */ /* Copyright (C) Acorn Computers Ltd. 1991, 1992 */ -/* version 3.01 */ +/* version 3.10 */ #ifndef __stdarg_h #define __stdarg_h /* - * stdarg.h declares a type and defines three macros, for advancing through a + * stdarg.h declares a type and defines four macros, for advancing through a * list of arguments whose number and types are not known to the called * function when it is translated. A function may be called with a variable * number of arguments of differing types. Its parameter list contains one or @@ -115,6 +115,17 @@ template <class T> struct __alignoftest */ #endif +#define va_copy(dest,src) ((void)(*(dest) = *(src))) + /* + * The va_copy macro initialises dest as a copy of src, as if the va_start + * macro had been applied to dest followed by the same sequences of uses + * of the va_arg macro as had previously been used to reach the present + * state of src. Neither the va_copy nor va_start macro shall be invoked + * to reinitialise dest without an intervening invocation of the va_end + * macro for the same dest. + * Returns: no value. + */ + #define va_end(ap) ((void)(*(ap) = (char *)-256)) /* * The va_end macro facilitates a normal return from the function whose diff --git a/clib/h/stdbool b/clib/h/stdbool index 04ca4fcf5848efa11a2ec7fe58a6a784c7a9365e..b3d5eff872f816c8dc6b55b33d64822b75c9b6fd 100644 --- a/clib/h/stdbool +++ b/clib/h/stdbool @@ -15,48 +15,24 @@ #pragma force_top_level #pragma include_only_once -/* stdbool.h: ISO 'C' (WG14/N843 Aug 98) library header, section 7.16 */ -/* Copyright (C) Element 14 Ltd. 1999 */ -/* version 1.00 */ +/* stdbool.h: ISO 'C' (9899:1999) library header, section 7.16 */ +/* Copyright (C) Acorn Computers Ltd. 2002 */ +/* version 1.01 */ #ifndef __stdbool_h #define __stdbool_h -#define false 0 -#define true 1 - -#ifdef __STDC_VERSION__ -#if __STDC_VERSION__ >= 199901L - -/* - * According to the FDIS of August 1998, _Bool is a built-in type, and - * bool is #defined to it. This will require compiler support... - */ -#define bool _Bool - -#define __bool_true_false_are_defined 1 - -#endif +#if __STDC_VERSION__ < 199901 +# error <stdbool.h> can only be used in C99 #endif -#ifndef __bool_true_false_are_defined +#define false 0 +#define true 1 -/* - * This is bool, as per the working draft of November 1997. We can do this - * without tweaking the compiler. This should be largely indistiguishable - * when used in a conformant manner. Note that sizeof(bool) will almost - * certainly shrink from 4 to 1 when _Bool is implemented... - * - * Would like bool to be a char, but it must be useable as a bitfield. - * Therefore, we use int. Note that an int bitfield is unsigned, so bool:1 - * is unsigned, as required. - */ -typedef int bool; +#define bool _Bool #define __bool_true_false_are_defined 1 #endif -#endif - /* end of stdbool.h */ diff --git a/clib/h/stdint b/clib/h/stdint index ff350467319cb57dcbdd5df81418097cbb43ba92..e379489e69628734e47e7664000d6adeb3a276d4 100644 --- a/clib/h/stdint +++ b/clib/h/stdint @@ -15,103 +15,110 @@ #pragma force_top_level #pragma include_only_once -/* stdint.h: ISO 'C' (WG14/N843 Aug 98) library header, section 7.18 */ -/* Copyright (C) Element 14 Ltd. 1999 */ -/* version 1.00 */ +/* stdint.h: ISO 'C' (9899:1999) library header, section 7.18 */ +/* Copyright (C) Acorn Computers Ltd. 2002 */ +/* version 1.02 */ #ifndef __stdint_h #define __stdint_h -/* - * A set of C9X-style definitions that make sense for the current - * (Norcroft 5) implementation. Note that we have no 64-bit types, - * as a conforming C9X implementation must. - */ - -/* - * cfront cannot cope with the signed type declarations - */ -#ifdef __cplusplus -# if __cplusplus < 199711 -# error stdint.h cannot be used with this C++ compiler -# endif +#if __STDC_VERSION__ < 199901 +# error <stdint.h> can only be used in C99 #endif /* Types with exactly the specified width */ -typedef signed char int8_t; -typedef signed short int16_t; -typedef signed int int32_t; -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed int int32_t; +typedef signed long long int64_t; +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; /* The smallest types with at least the specified width */ -typedef signed char int_least8_t; -typedef signed short int_least16_t; -typedef signed int int_least32_t; -typedef unsigned char uint_least8_t; -typedef unsigned short uint_least16_t; -typedef unsigned int uint_least32_t; +typedef signed char int_least8_t; +typedef signed short int_least16_t; +typedef signed int int_least32_t; +typedef signed long long int_least64_t; +typedef unsigned char uint_least8_t; +typedef unsigned short uint_least16_t; +typedef unsigned int uint_least32_t; +typedef unsigned long long uint_least64_t; /* The "fastest" types with at least the specified width */ -typedef signed char int_fast8_t; -typedef signed int int_fast16_t; /* actually 32 bits */ -typedef signed int int_fast32_t; -typedef unsigned char uint_fast8_t; -typedef unsigned int uint_fast16_t; /* actually 32 bits */ -typedef unsigned int uint_fast32_t; +typedef signed char int_fast8_t; +typedef signed int int_fast16_t; /* actually 32 bits */ +typedef signed int int_fast32_t; +typedef signed long long int_fast64_t; +typedef unsigned char uint_fast8_t; +typedef unsigned int uint_fast16_t; /* actually 32 bits */ +typedef unsigned int uint_fast32_t; +typedef unsigned long long uint_fast64_t; /* Integer types capable of holding a "void *" pointer */ -typedef signed int intptr_t; -typedef unsigned int uintptr_t; +typedef signed int intptr_t; +typedef unsigned int uintptr_t; /* Integer types that can hold any value of any type */ -typedef signed int intmax_t; -typedef unsigned int uintmax_t; +typedef signed long long intmax_t; +typedef unsigned long long uintmax_t; #if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) #define INT8_MIN (-128) #define INT16_MIN (-32768) #define INT32_MIN (~0x7FFFFFFF) +#define INT64_MIN (~0x7FFFFFFFFFFFFFFF) #define INT8_MAX 127 #define INT16_MAX 32767 #define INT32_MAX 2147483647 -#define UINT8_MAX 255u -#define UINT16_MAX 65535u +#define INT64_MAX 9223372036854775807 +#define UINT8_MAX 255 +#define UINT16_MAX 65535 #define UINT32_MAX 4294967295u +#define UINT64_MAX 18446744073709551615u #define INT_LEAST8_MIN (-128) #define INT_LEAST16_MIN (-32768) #define INT_LEAST32_MIN (~0x7FFFFFFF) +#define INT_LEAST64_MIN (~0x7FFFFFFFFFFFFFFF) #define INT_LEAST8_MAX 127 #define INT_LEAST16_MAX 32767 #define INT_LEAST32_MAX 2147483647 -#define UINT_LEAST8_MAX 255u -#define UINT_LEAST16_MAX 65535u +#define INT_LEAST64_MAX 9223372036854775807 +#define UINT_LEAST8_MAX 255 +#define UINT_LEAST16_MAX 65535 #define UINT_LEAST32_MAX 4294967295u +#define UINT_LEAST64_MAX 18446744073709551615u #define INT_FAST8_MIN (-128) #define INT_FAST16_MIN (~0x7FFFFFFF) #define INT_FAST32_MIN (~0x7FFFFFFF) +#define INT_FAST64_MIN (~0x7FFFFFFFFFFFFFFF) #define INT_FAST8_MAX 127 #define INT_FAST16_MAX 2147483647 #define INT_FAST32_MAX 2147483647 +#define INT_FAST64_MAX 9223372036854775807 #define UINT_FAST8_MAX 255u #define UINT_FAST16_MAX 4294967295u #define UINT_FAST32_MAX 4294967295u +#define UINT_FAST64_MAX 18446744073709551615u #define INTPTR_MIN (~0x7FFFFFFF) #define INTPTR_MAX 2147483647 #define UINTPTR_MAX 4294967295u -#define INTMAX_MIN (~0x7FFFFFFF) -#define INTMAX_MAX 2147483647 -#define UINTMAX_MAX 4294967295u +#define INTMAX_MIN (~0x7FFFFFFFFFFFFFFF) +#define INTMAX_MAX 9223372036854775807 +#define UINTMAX_MAX 18446744073709551615u #define PTRDIFF_MIN (~0x7FFFFFFF) #define PTRDIFF_MAX 2147483647 +#define SIG_ATOMIC_MIN (~0x7FFFFFFF) +#define SIG_ATOMIC_MAX 2147483647 + #define SIZE_MAX 4294967295u #define WCHAR_MIN (~0x7FFFFFFF) @@ -124,12 +131,14 @@ typedef unsigned int uintmax_t; #define INT8_C(n) n #define INT16_C(n) n #define INT32_C(n) n +#define INT64_C(n) n##ll #define UINT8_C(n) n##u #define UINT16_C(n) n##u #define UINT32_C(n) n##u +#define UINT64_C(n) n##ull -#define INTMAX_C(n) n -#define UINTMAX_C(n) n##u +#define INTMAX_C(n) n##ll +#define UINTMAX_C(n) n##ull #endif diff --git a/clib/h/stdlib b/clib/h/stdlib index 9a11a6e37cbd97d00e9373505809f08cdcd6f756..b6f1c9f5b3d0eacac57f2d28b36f66170bb0bbad 100644 --- a/clib/h/stdlib +++ b/clib/h/stdlib @@ -15,7 +15,7 @@ #pragma force_top_level #pragma include_only_once -/* stdlib.h: ANSI draft (X3J11 May 88) library header, section 4.10 */ +/* stdlib.h: ISO 'C' (9899:1999) library header, section 7.20 */ /* Copyright (C) Codemist Ltd. */ /* Copyright (C) Acorn Computers Ltd., 1990, 1992 */ /* version 2.00 */ @@ -42,13 +42,16 @@ # define NULL 0 /* from <stddef.h> */ #endif -#ifndef __div_t -# define __div_t 1 typedef struct div_t { int quot, rem; } div_t; /* type of the value returned by the div function. */ -#endif typedef struct ldiv_t { long int quot, rem; } ldiv_t; /* type of the value returned by the ldiv function. */ +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ >= 199901 +typedef struct lldiv_t { long long int quot, rem; } lldiv_t; + /* type of the value returned by the lldiv function. */ +#endif +#endif #ifdef __EXIT_FAILURE # define EXIT_FAILURE __EXIT_FAILURE @@ -382,36 +385,38 @@ extern int abs(int /*j*/); */ extern div_t div(int /*numer*/, int /*denom*/); /* - * computes the quotient and remainder of the division of the numerator - * numer by the denominator denom. If the division is inexact, the resulting - * quotient is the integer of lesser magnitude that is the nearest to the - * algebraic quotient. If the result cannot be represented, the behaviour is - * undefined; otherwise, quot * demon + rem shall equal numer. + * computes numer / denom and numer % denom in a single operation. * Returns: a structure of type div_t, comprising both the quotient and the - * remainder. the structure shall contain the following members, - * in either order. - * int quot; int rem; + * remainder. */ extern long int labs(long int /*j*/); /* - * computes the absolute value of an long integer j. If the result cannot be + * computes the absolute value of an integer j. If the result cannot be * represented, the behaviour is undefined. * Returns: the absolute value. */ extern ldiv_t ldiv(long int /*numer*/, long int /*denom*/); /* - * computes the quotient and remainder of the division of the numerator - * numer by the denominator denom. If the division is inexact, the sign of - * the resulting quotient is that of the algebraic quotient, and the - * magnitude of the resulting quotient is the largest integer less than the - * magnitude of the algebraic quotient. If the result cannot be represented, - * the behaviour is undefined; otherwise, quot * demon + rem shall equal - * numer. - * Returns: a structure of type ldiv_t, comprising both the quotient and the - * remainder. the structure shall contain the following members, - * in either order. - * long int quot; long int rem; + * computes numer / denom and numer % denom in a single operation. + * Returns: a structure of type div_t, comprising both the quotient and the + * remainder. */ +#ifdef __STDC_VERSION__ +#if __STDC_VERSION__ > 199901 +extern long long int llabs(long long int /*j*/); + /* + * computes the absolute value of an integer j. If the result cannot be + * represented, the behaviour is undefined. + * Returns: the absolute value. + */ +extern lldiv_t lldiv(long long int /*numer*/, long long int /*denom*/); + /* + * computes numer / denom and numer % denom in a single operation. + * Returns: a structure of type div_t, comprising both the quotient and the + * remainder. + */ +#endif +#endif /* * Multibyte Character Functions. diff --git a/clib/s/cl_body b/clib/s/cl_body index 568b630af0803a270846e7d0f2eeb98f57c5a2d9..ef1f7be53ec02c676f9c426a013a846ce0a3b96c 100644 --- a/clib/s/cl_body +++ b/clib/s/cl_body @@ -98,6 +98,8 @@ $Label IMPORT |_kernel_sdiv| IMPORT |_kernel_srem| + IMPORT |_ll_sdiv| + IMPORT |_kernel_stkovf_split_0frame| IMPORT |_kernel_stkovf_split| @@ -336,7 +338,6 @@ Raised div ldiv -imaxdiv FunctionEntry "a1" MOV a1, a3 BL _kernel_sdiv ; a1 := a2 / a1, a2 := a2 % a1 @@ -344,6 +345,24 @@ imaxdiv STMIA ip, {a1,a2} Return ,LinkNotStacked +lldiv ; a1 -> result, a2 = num.l, a3=num.h, a4=den.l, den.h on stack +imaxdiv + FunctionEntry "a1" + MOV a1, a2 + MOV a2, a3 + MOV a3, a4 + LDR a4, [sp, #8] + BL _ll_sdiv ; (a1,a2) := (a1,a2) / (a3,a4), (a3,a4) := (a1,a2) % (a3,a4) + Pull "ip,lr" + STMIA ip, {a1-a4} + Return ,LinkNotStacked + +llabs + TEQ a2, #0 + Return ,LinkNotStacked,PL + RSBS a1, a1, #0 + RSC a2, a2, #0 + Return ,LinkNotStacked |x$multiply| ; a1 := a2 * a1. diff --git a/clib/s/cl_entries b/clib/s/cl_entries index b8d803528ac060bc909cfa0e358a7a4c440b9e11..b17ce434c56a47d36076b0d6fa6fb857480664cd 100644 --- a/clib/s/cl_entries +++ b/clib/s/cl_entries @@ -214,61 +214,5 @@ Entry _swi, imported, , unveneered Entry _swix, imported, , unveneered - Entry __fpclassifyf, , , unveneered - Entry __fpclassifyd, , , unveneered - Entry __signbitf, , , unveneered - Entry __signbitd, , , unveneered - Entry copysign, , , unveneered - Entry copysignf, , , unveneered - Entry nan, imported, , unveneered - Entry nanf, imported, , unveneered - Entry nextafter, , , unveneered - Entry nextafterf, , , unveneered - Entry fdim, imported, , unveneered - Entry fdimf, imported, , unveneered - Entry fmax, , , unveneered - Entry fmaxf, , , unveneered - Entry fmin, , , unveneered - Entry fminf, , , unveneered - Entry fabsf, imported, , unveneered - Entry hypot, , , unveneered - Entry hypotf, , , unveneered - - Entry feclearexcept, imported, , unveneered - Entry fegetexceptflag, imported, , unveneered - Entry feraiseexcept, imported, , unveneered - Entry fesetexceptflag, imported, , unveneered - Entry fetestexcept, imported, , unveneered - Entry fegetround, imported, , unveneered - Entry fesetround, imported, , unveneered - Entry fegetenv, imported, , unveneered - Entry feholdexcept, imported, , unveneered - Entry fesetenv, imported, , unveneered - Entry feupdateenv, imported, , unveneered - - Entry _snprintf, imported, , unveneered - Entry snprintf, imported, , unveneered - Entry vsnprintf, imported, , unveneered - Entry vfscanf, imported, , unveneered - Entry vscanf, imported, , unveneered - Entry vsscanf, imported, , unveneered - - Entry ceilf, imported, , unveneered - Entry floorf, imported, , unveneered - Entry nearbyint, , , unveneered - Entry nearbyintf, , , unveneered - Entry rint, imported, , unveneered - Entry rintf, imported, , unveneered - Entry lrint, imported, , unveneered - Entry lrintf, imported, , unveneered - Entry round, , , unveneered - Entry roundf, , , unveneered - Entry lround, , , unveneered - Entry lroundf, , , unveneered - Entry trunc, imported, , unveneered - Entry truncf, imported, , unveneered - Entry remainder, , , unveneered - Entry remainderf, , , unveneered - ; __va_illegal_arg 0 END diff --git a/clib/s/cl_entry2 b/clib/s/cl_entry2 new file mode 100644 index 0000000000000000000000000000000000000000..1de9f637557d2a058a09b4a6aac601176b306528 --- /dev/null +++ b/clib/s/cl_entry2 @@ -0,0 +1,81 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; +;-*- Mode: Assembler -*- +; +; Copyright (C) Acorn Computers Ltd., 1989. +; +; Add new entries ONLY AT THE END of the list +; + + Entry __fpclassifyf, , , unveneered + Entry __fpclassifyd, , , unveneered + Entry __signbitf, , , unveneered + Entry __signbitd, , , unveneered + Entry copysign, , , unveneered + Entry copysignf, , , unveneered + Entry nan, imported, , unveneered + Entry nanf, imported, , unveneered + Entry nextafter, , , unveneered + Entry nextafterf, , , unveneered + Entry fdim, imported, , unveneered + Entry fdimf, imported, , unveneered + Entry fmax, , , unveneered + Entry fmaxf, , , unveneered + Entry fmin, , , unveneered + Entry fminf, , , unveneered + Entry fabsf, imported, , unveneered + Entry hypot, , , unveneered + Entry hypotf, , , unveneered + + Entry feclearexcept, imported, , unveneered + Entry fegetexceptflag, imported, , unveneered + Entry feraiseexcept, imported, , unveneered + Entry fesetexceptflag, imported, , unveneered + Entry fetestexcept, imported, , unveneered + Entry fegetround, imported, , unveneered + Entry fesetround, imported, , unveneered + Entry fegetenv, imported, , unveneered + Entry feholdexcept, imported, , unveneered + Entry fesetenv, imported, , unveneered + Entry feupdateenv, imported, , unveneered + + Entry _snprintf, imported, , unveneered + Entry snprintf, imported, , unveneered + Entry vsnprintf, imported, , unveneered + Entry vfscanf, imported, , unveneered + Entry vscanf, imported, , unveneered + Entry vsscanf, imported, , unveneered + + Entry ceilf, imported, , unveneered + Entry floorf, imported, , unveneered + Entry nearbyint, , , unveneered + Entry nearbyintf, , , unveneered + Entry rint, imported, , unveneered + Entry rintf, imported, , unveneered + Entry lrint, imported, , unveneered + Entry lrintf, imported, , unveneered + Entry round, , , unveneered + Entry roundf, , , unveneered + Entry lround, , , unveneered + Entry lroundf, , , unveneered + Entry trunc, imported, , unveneered + Entry truncf, imported, , unveneered + Entry remainder, , , unveneered + Entry remainderf, , , unveneered + + Entry llabs, , , unveneered + Entry lldiv, , , unveneered + + END diff --git a/clib/s/cl_mod_r b/clib/s/cl_mod_r index 36ff647a59819ae88182c966609907b372f0a7c0..77401dd276b11b5aef936712c34800526adde482 100644 --- a/clib/s/cl_mod_r +++ b/clib/s/cl_mod_r @@ -51,6 +51,12 @@ dataStart & dataStart & |CLib_data_end| + & 5 + & entries2Start + & entries2End + & 0 + & 0 + AREA |RTSK$$Data|, READONLY IMPORT |C$$code$$Base| @@ -79,6 +85,10 @@ entriesStart GET clib.s.cl_entries entriesEnd +entries2Start + GET clib.s.cl_entry2 +entries2End + EXPORT |__main| ; The compiler produces references to this, so it must be defined, ; but it had better not be branched to. diff --git a/clib/s/cl_stub b/clib/s/cl_stub index 3370c0e8068b5aa18aab1748966a655cfe325428..aa5dfcd012c98f15104d25bffddb1758db83292d 100644 --- a/clib/s/cl_stub +++ b/clib/s/cl_stub @@ -92,7 +92,9 @@ SharedLibrary SETL {TRUE} ; r6 = requested stack size (in K) << 16 ; r6 bit 0 indicates 32-bit mode - ADR r0, |_lib_init_table| + IMPORT |Stub$$Init$$Base| + LDR r0, =|Stub$$Init$$Base| +; ADR r0, |_lib_init_table| LDR r6, =|__root_stack_size| CMP r6, #0 MOVEQ r6, #RootStackSize @@ -212,7 +214,8 @@ LookupError LDR r2, [r12, #blocksize] ADD r2, r2, r1 ; Pointer to high end of block LDR r3, =|Image$$ZI$$Base| - ADR r0, |_lib_init_table| + LDR r0, =|Stub$$Init$$Base| +; ADR r0, |_lib_init_table| LDR r6, =|__root_stack_size| CMP r6, #0 MOVEQ r6, #RootStackSize :SHL: 6 @@ -324,6 +327,19 @@ LookupError ] ] +|_k_init_block| + & |Image$$RO$$Base| + & |RTSK$$Data$$Base| + & |RTSK$$Data$$Limit| + + LTORG + + GET clib.s.cl_init + + LTORG + + AREA |Stub$$Init|, CODE, READONLY + |_lib_init_table| & 1 & |_k_entries_start| @@ -348,18 +364,9 @@ LookupError ] ] - & -1 - -|_k_init_block| - & |Image$$RO$$Base| - & |RTSK$$Data$$Base| - & |RTSK$$Data$$Limit| + AREA |Stub$$InitEnd|, CODE, READONLY - LTORG - - GET clib.s.cl_init - - LTORG + & -1 AREA |Stub$$Entries|, CODE, READONLY diff --git a/clib/s/cl_stub2 b/clib/s/cl_stub2 new file mode 100644 index 0000000000000000000000000000000000000000..b11dec30060d573a859b720d05f6e819a421604f --- /dev/null +++ b/clib/s/cl_stub2 @@ -0,0 +1,63 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; +; -*- Mode: Assembler -*- +;* Lastedit: 08 Mar 90 15:18:04 by Harry Meekings * +;* Shared C library: stub for clients to link with +; 2-Mar-89: IDJ: taken for RISC_OSLib purposes +; +; Copyright (C) Acorn Computers Ltd., 1988. +; + + GBLL Brazil_Compatible + GBLL ModeMayBeNonUser + GBLL SharedLibrary + +Brazil_Compatible SETL {FALSE} +ModeMayBeNonUser SETL {TRUE} +SharedLibrary SETL {TRUE} + + GET s.h_Regs + GET s.h_Brazil + GET s.h_stubs + GET s.h_stack + GET s.h_workspc + + AREA |Stub$$Init|, CODE, READONLY + + & 5 + & |_clib_entries2_start| + & |_clib_entries2_end| + & 0 + & 0 + + AREA |Stub$$Entries|, CODE, READONLY + +; Don't GET the stub entries if in ROM + + + GBLS GetRoundObjAsm +|_clib_entries2_start| + [ Code_Destination = "RAM" +GetRoundObjAsm SETS " GET clib.s.cl_entry2" + | +GetRoundObjAsm SETS "" + ] +$GetRoundObjAsm +|_clib_entries2_end| + [ Code_Destination = "RAM" :LAND: APCS_Type <> "APCS-R" + % |_clib_entries2_end| - |_clib_entries2_start| + ] + + END diff --git a/clib/s/cl_stub2_r b/clib/s/cl_stub2_r new file mode 100644 index 0000000000000000000000000000000000000000..4c4489830b8d13d6bc5029675104ad6ac55dadbd --- /dev/null +++ b/clib/s/cl_stub2_r @@ -0,0 +1,22 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + GBLS Calling_Standard + +Calling_Standard SETS "APCS_U" + + GBLS Code_Destination +Code_Destination SETS "RAM" + + LNK clib.s.cl_stub2 diff --git a/clib/s/cl_stub2_rm b/clib/s/cl_stub2_rm new file mode 100644 index 0000000000000000000000000000000000000000..caccc285967cade718afea18f083d7a7c68be480 --- /dev/null +++ b/clib/s/cl_stub2_rm @@ -0,0 +1,24 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + GBLS Calling_Standard + +Calling_Standard SETS "APCS_U" + + GBLS Code_Destination +Code_Destination SETS "ROM" + + GBLL Module_Only + + LNK clib.s.cl_stub2 diff --git a/h/alloc b/h/alloc index 900c1156f06e511b36e04a5d46041bdc1c8d22c1..1e1d540fd3349c1f1ebecad89104cc92da114f3a 100644 --- a/h/alloc +++ b/h/alloc @@ -60,11 +60,11 @@ typedef struct BlockStruct { #define SIZEMASK 0x07ffffff /* all except top five bits, when applied */ /* to block.size yields no of address units */ /* of user space in this block. */ -#define PUREDATABIT (1<<31) /* indicates the block contains no pointers */ -#define NOTGCABLEBIT (1<<30) /* the block is not to be garbage collected */ -#define USEDBIT (1<<29) /* if set, indicates that the block is not free */ -#define FREEBIT (1<<28) /* if set, indicates that the block is free */ -#define HEAPHOLEBIT (1<<27) /* block used for marking start of heap hole */ +#define PUREDATABIT (1u<<31) /* indicates the block contains no pointers */ +#define NOTGCABLEBIT (1u<<30) /* the block is not to be garbage collected */ +#define USEDBIT (1u<<29) /* if set, indicates that the block is not free */ +#define FREEBIT (1u<<28) /* if set, indicates that the block is free */ +#define HEAPHOLEBIT (1u<<27) /* block used for marking start of heap hole */ #define GUARDCONSTANT 0x3E694C3C /* not a legal word pointer */ #define GCABLE 0 #define GCDATA PUREDATABIT diff --git a/kernel/s/k_body b/kernel/s/k_body index 87badcdcd229ef495523e657aee18b25123d6005..4b26a7ad070122a7318bbbc8c673b9673528cef8 100644 --- a/kernel/s/k_body +++ b/kernel/s/k_body @@ -55,6 +55,8 @@ EXPORT |_kernel_register_allocs| EXPORT |_kernel_register_slotextend| EXPORT |_kernel_alloc| + EXPORT |__rt_allocauto| + EXPORT |__rt_freeauto| EXPORT |_kernel_current_stack_chunk| EXPORT |_kernel_stkovf_split_0frame| @@ -2566,6 +2568,29 @@ alloc_return_block ; if I do, it complicates malloc and alloc above. Return ,LinkNotStacked +; In future these could be sophisticated allocators that associate +; allocated blocks with stack chunks, allowing longjmp() et al to +; clear them up. But for now, this suffices for C99's VLAs. +|__rt_allocauto| + FunctionEntry + LoadStaticBase ip, a2 + MOV lr, pc + LDR pc, [ip, #O_allocProc] + TEQ a1, #0 + Return ,,NE + LoadStaticBase ip, a1 + LDR lr, [sp], #4 + ADD ip, ip, #O_registerDump + STMIA ip, {a1 - r14} + ADR r0, E_StackOverflow + BL |_kernel_copyerror| + SWI GenerateError + +|__rt_freeauto| + LoadStaticBase ip, a2 + LDR pc, [ip, #O_freeProc] + + ;*-------------------------------------------------------------------* ;* Stack chunk handling * ;*-------------------------------------------------------------------* @@ -3059,6 +3084,8 @@ s_sh0 RSBS ip, a1, a2 RSBMI a2, a2, #0 Return ,LinkNotStacked + EXPORT __rt_div0 +__rt_div0 dividebyzero ; Dump all registers, then enter the abort code. ; We need to discover whether we were doing a divide (in which case, diff --git a/kernel/s/k_entries2 b/kernel/s/k_entries2 new file mode 100644 index 0000000000000000000000000000000000000000..bee4e398f12f26ec17a53c3d9426d24c67b81268 --- /dev/null +++ b/kernel/s/k_entries2 @@ -0,0 +1,78 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; +;-*- Mode: Assembler -*- +; Last modified 20 May 02 16:30:31 by KJB +; +; Copyright (C) Acorn Computers Ltd., 2002. +; +; Add new entries ONLY AT THE END of the list + + Entry __rt_allocauto, , , unveneered + Entry __rt_freeauto, , , unveneered + + Entry _ll_from_u, imported, , unveneered + Entry _ll_from_l, imported, , unveneered + Entry _ll_to_l, imported, , unveneered + + Entry _ll_add, imported, , unveneered + Entry _ll_addlu, imported, , unveneered + Entry _ll_addls, imported, , unveneered + Entry _ll_adduu, imported, , unveneered + Entry _ll_addss, imported, , unveneered + Entry _ll_sub, imported, , unveneered + Entry _ll_sublu, imported, , unveneered + Entry _ll_subls, imported, , unveneered + Entry _ll_subuu, imported, , unveneered + Entry _ll_subss, imported, , unveneered + Entry _ll_rsb, imported, , unveneered + Entry _ll_rsblu, imported, , unveneered + Entry _ll_rsbls, imported, , unveneered + Entry _ll_rsbuu, imported, , unveneered + Entry _ll_rsbss, imported, , unveneered + Entry _ll_mul, imported, , unveneered + Entry _ll_mullu, imported, , unveneered + Entry _ll_mulls, imported, , unveneered + Entry _ll_muluu, imported, , unveneered + Entry _ll_mulss, imported, , unveneered + Entry _ll_udiv, imported, , unveneered + Entry _ll_urdv, imported, , unveneered + Entry _ll_udiv10, imported, , unveneered + Entry _ll_sdiv, imported, , unveneered + Entry _ll_srdv, imported, , unveneered + Entry _ll_sdiv10, imported, , unveneered + + Entry _ll_not, imported, , unveneered + Entry _ll_neg, imported, , unveneered + Entry _ll_and, imported, , unveneered + Entry _ll_or, imported, , unveneered + Entry _ll_eor, imported, , unveneered + Entry _ll_shift_l, imported, , unveneered + Entry _ll_ushift_r, imported, , unveneered + Entry _ll_sshift_r, imported, , unveneered + + Entry _ll_cmpu, imported, , unveneered + Entry _ll_cmpge, imported, , unveneered + Entry _ll_cmple, imported, , unveneered + + Entry _ll_uto_d, imported, , unveneered + Entry _ll_sto_d, imported, , unveneered + Entry _ll_uto_f, imported, , unveneered + Entry _ll_sto_f, imported, , unveneered + Entry _ll_ufrom_d, imported, , unveneered + Entry _ll_sfrom_d, imported, , unveneered + Entry _ll_ufrom_f, imported, , unveneered + Entry _ll_sfrom_f, imported, , unveneered + + END diff --git a/kernel/s/k_mod_r b/kernel/s/k_mod_r index 63a2defd145a0df1c7b596a62614eabb69f6a66a..790cebf48b563d30194204e7235c05b40219a904 100644 --- a/kernel/s/k_mod_r +++ b/kernel/s/k_mod_r @@ -51,6 +51,12 @@ dataEnd & dataStart & dataEnd + & 4 + & entries2Start + & entries2End + & 0 + & 0 + AREA |RTSK$$Data|, DATA, READONLY ; an empty one, so the symbols below are always defined @@ -62,4 +68,8 @@ entriesStart GET kernel.s.k_entries entriesEnd +entries2Start + GET kernel.s.k_entries2 +entries2End + LNK kernel.s.k_body diff --git a/kernel/s/k_stub2 b/kernel/s/k_stub2 new file mode 100644 index 0000000000000000000000000000000000000000..b76d2948a7ef8c8679b87ec4f6720501bc258567 --- /dev/null +++ b/kernel/s/k_stub2 @@ -0,0 +1,63 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; +; -*- Mode: Assembler -*- +;* Lastedit: 08 Mar 90 15:18:04 by Harry Meekings * +;* Shared C library: stub for clients to link with +; 2-Mar-89: IDJ: taken for RISC_OSLib purposes +; +; Copyright (C) Acorn Computers Ltd., 1988. +; + + GBLL Brazil_Compatible + GBLL ModeMayBeNonUser + GBLL SharedLibrary + +Brazil_Compatible SETL {FALSE} +ModeMayBeNonUser SETL {TRUE} +SharedLibrary SETL {TRUE} + + GET s.h_Regs + GET s.h_Brazil + GET s.h_stubs + GET s.h_stack + GET s.h_workspc + + AREA |Stub$$Init|, CODE, READONLY + + & 4 + & |_k_entries2_start| + & |_k_entries2_end| + & 0 + & 0 + + AREA |Stub$$Entries|, CODE, READONLY + +; Don't GET the stub entries if in ROM + + + GBLS GetRoundObjAsm +|_k_entries2_start| + [ Code_Destination = "RAM" +GetRoundObjAsm SETS " GET kernel.s.k_entries2" + | +GetRoundObjAsm SETS "" + ] +$GetRoundObjAsm +|_k_entries2_end| + [ Code_Destination = "RAM" :LAND: APCS_Type <> "APCS-R" + % |_k_entries2_end| - |_k_entries2_start| + ] + + END diff --git a/kernel/s/k_stub2_r b/kernel/s/k_stub2_r new file mode 100644 index 0000000000000000000000000000000000000000..23791bda979483f00d82210d0a8e3528bb752c43 --- /dev/null +++ b/kernel/s/k_stub2_r @@ -0,0 +1,22 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + GBLS Calling_Standard + +Calling_Standard SETS "APCS_U" + + GBLS Code_Destination +Code_Destination SETS "RAM" + + LNK kernel.s.k_stub2 diff --git a/kernel/s/k_stub2_rm b/kernel/s/k_stub2_rm new file mode 100644 index 0000000000000000000000000000000000000000..536f424d40b2b8480dc81409050a10363ff902b5 --- /dev/null +++ b/kernel/s/k_stub2_rm @@ -0,0 +1,22 @@ +; Copyright 2002 Pace Micro Technology plc +; +; Licensed under the Apache License, Version 2.0 (the "License"); +; you may not use this file except in compliance with the License. +; You may obtain a copy of the License at +; +; http://www.apache.org/licenses/LICENSE-2.0 +; +; Unless required by applicable law or agreed to in writing, software +; distributed under the License is distributed on an "AS IS" BASIS, +; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +; See the License for the specific language governing permissions and +; limitations under the License. +; + GBLS Calling_Standard + +Calling_Standard SETS "APCS_U" + + GBLS Code_Destination +Code_Destination SETS "ROM" + + LNK kernel.s.k_stub2 diff --git a/s/initmodule b/s/initmodule index 8588d0eb7a98780de38d0aca96b6953af07bcef8..bd90ea8d27bb3f00a2f9b4477434438e64571590 100644 --- a/s/initmodule +++ b/s/initmodule @@ -444,8 +444,11 @@ libdatasize_text staticsizeok ] - SUB r3, r3, r2 ; size of library chunk statics + SUBS r3, r3, r2 ; size of library chunk statics + BLE NextLibraryChunk ; no statics for this chunk + ; and the offset must agree with that for all earlier chunks + LDR r1, [r13, #Proc_RegOffset + 4] LDR r1, [r1, #SC_SLOffset+SL_Client_Offset] ADD r2, r2, r1 ; relocate address to copy to!! @@ -456,9 +459,6 @@ staticsizeok BNE Failed MOV r5, r1 - CMP r3, #0 - BLE NextLibraryChunk ; no statics for this chunk - ; Copy the data from our fixed static data area to the clients dynamic ; static data area. No zero initialised data at all. CopyLibStatics