]> oss.titaniummirror.com Git - msp430-gcc.git/blobdiff - boehm-gc/AmigaOS.c
Imported gcc-4.4.3
[msp430-gcc.git] / boehm-gc / AmigaOS.c
diff --git a/boehm-gc/AmigaOS.c b/boehm-gc/AmigaOS.c
deleted file mode 100644 (file)
index f4024a7..0000000
+++ /dev/null
@@ -1,623 +0,0 @@
-
-
-/******************************************************************
-
-  AmigaOS-spesific routines for GC.
-  This file is normally included from os_dep.c
-
-******************************************************************/
-
-
-#if !defined(GC_AMIGA_DEF) && !defined(GC_AMIGA_SB) && !defined(GC_AMIGA_DS) && !defined(GC_AMIGA_AM)
-# include "gc_priv.h"
-# include <stdio.h>
-# include <signal.h>
-# define GC_AMIGA_DEF
-# define GC_AMIGA_SB
-# define GC_AMIGA_DS
-# define GC_AMIGA_AM
-#endif
-
-
-#ifdef GC_AMIGA_DEF
-
-# ifndef __GNUC__
-#   include <exec/exec.h>
-# endif
-# include <proto/exec.h>
-# include <proto/dos.h>
-# include <dos/dosextens.h>
-# include <workbench/startup.h>
-
-#endif
-
-
-
-
-#ifdef GC_AMIGA_SB
-
-/******************************************************************
-   Find the base of the stack.
-******************************************************************/
-
-ptr_t GC_get_stack_base()
-{
-    struct Process *proc = (struct Process*)SysBase->ThisTask;
-    /* Reference: Amiga Guru Book Pages: 42,567,574 */
-    if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS
-        && proc->pr_CLI != NULL) {
-       /* first ULONG is StackSize */
-       /*longPtr = proc->pr_ReturnAddr;
-       size = longPtr[0];*/
-
-       return (char *)proc->pr_ReturnAddr + sizeof(ULONG);
-    } else {
-       return (char *)proc->pr_Task.tc_SPUpper;
-    }
-}
-
-#if 0 /* old version */
-ptr_t GC_get_stack_base()
-{
-    extern struct WBStartup *_WBenchMsg;
-    extern long __base;
-    extern long __stack;
-    struct Task *task;
-    struct Process *proc;
-    struct CommandLineInterface *cli;
-    long size;
-
-    if ((task = FindTask(0)) == 0) {
-       GC_err_puts("Cannot find own task structure\n");
-       ABORT("task missing");
-    }
-    proc = (struct Process *)task;
-    cli = BADDR(proc->pr_CLI);
-
-    if (_WBenchMsg != 0 || cli == 0) {
-       size = (char *)task->tc_SPUpper - (char *)task->tc_SPLower;
-    } else {
-       size = cli->cli_DefaultStack * 4;
-    }
-    return (ptr_t)(__base + GC_max(size, __stack));
-}
-#endif
-
-
-#endif
-
-
-#ifdef GC_AMIGA_DS
-/******************************************************************
-   Register data segments.
-******************************************************************/
-
-   void GC_register_data_segments()
-   {
-     struct Process    *proc;
-     struct CommandLineInterface *cli;
-     BPTR myseglist;
-     ULONG *data;
-     int       num;
-
-
-#    ifdef __GNUC__
-        ULONG dataSegSize;
-        GC_bool found_segment = FALSE;
-       extern char __data_size[];
-
-       dataSegSize=__data_size+8;
-       /* Can`t find the Location of __data_size, because
-           it`s possible that is it, inside the segment. */
-
-#     endif
-
-       proc= (struct Process*)SysBase->ThisTask;
-
-       /* Reference: Amiga Guru Book Pages: 538ff,565,573
-                    and XOper.asm */
-       if (proc->pr_Task.tc_Node.ln_Type==NT_PROCESS) {
-         if (proc->pr_CLI == NULL) {
-           myseglist = proc->pr_SegList;
-         } else {
-           /* ProcLoaded       'Loaded as a command: '*/
-           cli = BADDR(proc->pr_CLI);
-           myseglist = cli->cli_Module;
-         }
-       } else {
-         ABORT("Not a Process.");
-       }
-
-       if (myseglist == NULL) {
-           ABORT("Arrrgh.. can't find segments, aborting");
-       }
-
-       /* xoper hunks Shell Process */
-
-       num=0;
-        for (data = (ULONG *)BADDR(myseglist); data != NULL;
-             data = (ULONG *)BADDR(data[0])) {
-         if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) ||
-             ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) {
-#             ifdef __GNUC__
-               if (dataSegSize == data[-1]) {
-                 found_segment = TRUE;
-               }
-#            endif
-             GC_add_roots_inner((char *)&data[1],
-                                ((char *)&data[1]) + data[-1], FALSE);
-          }
-          ++num;
-        } /* for */
-#      ifdef __GNUC__
-          if (!found_segment) {
-            ABORT("Can`t find correct Segments.\nSolution: Use an newer version of ixemul.library");
-          }
-#      endif
-  }
-
-#if 0 /* old version */
-  void GC_register_data_segments()
-  {
-    extern struct WBStartup *_WBenchMsg;
-    struct Process     *proc;
-    struct CommandLineInterface *cli;
-    BPTR myseglist;
-    ULONG *data;
-
-    if ( _WBenchMsg != 0 ) {
-       if ((myseglist = _WBenchMsg->sm_Segment) == 0) {
-           GC_err_puts("No seglist from workbench\n");
-           return;
-       }
-    } else {
-       if ((proc = (struct Process *)FindTask(0)) == 0) {
-           GC_err_puts("Cannot find process structure\n");
-           return;
-       }
-       if ((cli = BADDR(proc->pr_CLI)) == 0) {
-           GC_err_puts("No CLI\n");
-           return;
-       }
-       if ((myseglist = cli->cli_Module) == 0) {
-           GC_err_puts("No seglist from CLI\n");
-           return;
-       }
-    }
-
-    for (data = (ULONG *)BADDR(myseglist); data != 0;
-         data = (ULONG *)BADDR(data[0])) {
-#        ifdef AMIGA_SKIP_SEG
-           if (((ULONG) GC_register_data_segments < (ULONG) &data[1]) ||
-           ((ULONG) GC_register_data_segments > (ULONG) &data[1] + data[-1])) {
-#       else
-          {
-#       endif /* AMIGA_SKIP_SEG */
-          GC_add_roots_inner((char *)&data[1],
-                            ((char *)&data[1]) + data[-1], FALSE);
-         }
-    }
-  }
-#endif /* old version */
-
-
-#endif
-
-
-
-#ifdef GC_AMIGA_AM
-
-#ifndef GC_AMIGA_FASTALLOC
-
-void *GC_amiga_allocwrapper(size_t size,void *(*AllocFunction)(size_t size2)){
-       return (*AllocFunction)(size);
-}
-
-void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2))
-       =GC_amiga_allocwrapper;
-
-#else
-
-
-
-
-void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2));
-
-void *(*GC_amiga_allocwrapper_do)(size_t size,void *(*AllocFunction)(size_t size2))
-       =GC_amiga_allocwrapper_firsttime;
-
-
-/******************************************************************
-   Amiga-spesific routines to obtain memory, and force GC to give
-   back fast-mem whenever possible.
-       These hacks makes gc-programs go many times faster when
-   the amiga is low on memory, and are therefore strictly necesarry.
-
-   -Kjetil S. Matheussen, 2000.
-******************************************************************/
-
-
-
-/* List-header for all allocated memory. */
-
-struct GC_Amiga_AllocedMemoryHeader{
-       ULONG size;
-       struct GC_Amiga_AllocedMemoryHeader *next;
-};
-struct GC_Amiga_AllocedMemoryHeader *GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(int)~(NULL);
-
-
-
-/* Type of memory. Once in the execution of a program, this might change to MEMF_ANY|MEMF_CLEAR */
-
-ULONG GC_AMIGA_MEMF = MEMF_FAST | MEMF_CLEAR;
-
-
-/* Prevents GC_amiga_get_mem from allocating memory if this one is TRUE. */
-#ifndef GC_AMIGA_ONLYFAST
-BOOL GC_amiga_dontalloc=FALSE;
-#endif
-
-#ifdef GC_AMIGA_PRINTSTATS
-int succ=0,succ2=0;
-int nsucc=0,nsucc2=0;
-int nullretries=0;
-int numcollects=0;
-int chipa=0;
-int allochip=0;
-int allocfast=0;
-int cur0=0;
-int cur1=0;
-int cur10=0;
-int cur50=0;
-int cur150=0;
-int cur151=0;
-int ncur0=0;
-int ncur1=0;
-int ncur10=0;
-int ncur50=0;
-int ncur150=0;
-int ncur151=0;
-#endif
-
-/* Free everything at program-end. */
-
-void GC_amiga_free_all_mem(void){
-       struct GC_Amiga_AllocedMemoryHeader *gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(GC_AMIGAMEM));
-       struct GC_Amiga_AllocedMemoryHeader *temp;
-
-#ifdef GC_AMIGA_PRINTSTATS
-       printf("\n\n"
-               "%d bytes of chip-mem, and %d bytes of fast-mem where allocated from the OS.\n",
-               allochip,allocfast
-       );
-       printf(
-               "%d bytes of chip-mem were returned from the GC_AMIGA_FASTALLOC supported allocating functions.\n",
-               chipa
-       );
-       printf("\n");
-       printf("GC_gcollect was called %d times to avoid returning NULL or start allocating with the MEMF_ANY flag.\n",numcollects);
-       printf("%d of them was a success. (the others had to use allocation from the OS.)\n",nullretries);
-       printf("\n");
-       printf("Succeded forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",succ,succ2);
-       printf("Failed forcing %d gc-allocations (%d bytes) of chip-mem to be fast-mem.\n",nsucc,nsucc2);
-       printf("\n");
-       printf(
-               "Number of retries before succeding a chip->fast force:\n"
-               "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n",
-               cur0,cur1,cur10,cur50,cur150,cur151
-       );
-       printf(
-               "Number of retries before giving up a chip->fast force:\n"
-               "0: %d, 1: %d, 2-9: %d, 10-49: %d, 50-149: %d, >150: %d\n",
-               ncur0,ncur1,ncur10,ncur50,ncur150,ncur151
-       );
-#endif
-
-       while(gc_am!=NULL){
-               temp=gc_am->next;
-               FreeMem(gc_am,gc_am->size);
-               gc_am=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(temp));
-       }
-}
-
-#ifndef GC_AMIGA_ONLYFAST
-
-/* All memory with address lower than this one is chip-mem. */
-
-char *chipmax;
-
-
-/*
- * Allways set to the last size of memory tried to be allocated.
- * Needed to ensure allocation when the size is bigger than 100000.
- *
- */
-size_t latestsize;
-
-#endif
-
-
-/*
- * The actual function that is called with the GET_MEM macro.
- *
- */
-
-void *GC_amiga_get_mem(size_t size){
-       struct GC_Amiga_AllocedMemoryHeader *gc_am;
-
-#ifndef GC_AMIGA_ONLYFAST
-       if(GC_amiga_dontalloc==TRUE){
-//             printf("rejected, size: %d, latestsize: %d\n",size,latestsize);
-               return NULL;
-       }
-
-       // We really don't want to use chip-mem, but if we must, then as little as possible.
-       if(GC_AMIGA_MEMF==(MEMF_ANY|MEMF_CLEAR) && size>100000 && latestsize<50000) return NULL;
-#endif
-
-       gc_am=AllocMem((ULONG)(size + sizeof(struct GC_Amiga_AllocedMemoryHeader)),GC_AMIGA_MEMF);
-       if(gc_am==NULL) return NULL;
-
-       gc_am->next=GC_AMIGAMEM;
-       gc_am->size=size + sizeof(struct GC_Amiga_AllocedMemoryHeader);
-       GC_AMIGAMEM=(struct GC_Amiga_AllocedMemoryHeader *)(~(int)(gc_am));
-
-//     printf("Allocated %d (%d) bytes at address: %x. Latest: %d\n",size,tot,gc_am,latestsize);
-
-#ifdef GC_AMIGA_PRINTSTATS
-       if((char *)gc_am<chipmax){
-               allochip+=size;
-       }else{
-               allocfast+=size;
-       }
-#endif
-
-       return gc_am+1;
-
-}
-
-
-
-
-#ifndef GC_AMIGA_ONLYFAST
-
-/* Tries very hard to force GC to find fast-mem to return. Done recursively
- * to hold the rejected memory-pointers reachable from the collector in an
- * easy way.
- *
- */
-#ifdef GC_AMIGA_RETRY
-void *GC_amiga_rec_alloc(size_t size,void *(*AllocFunction)(size_t size2),const int rec){
-       void *ret;
-
-       ret=(*AllocFunction)(size);
-
-#ifdef GC_AMIGA_PRINTSTATS
-       if((char *)ret>chipmax || ret==NULL){
-               if(ret==NULL){
-                       nsucc++;
-                       nsucc2+=size;
-                       if(rec==0) ncur0++;
-                       if(rec==1) ncur1++;
-                       if(rec>1 && rec<10) ncur10++;
-                       if(rec>=10 && rec<50) ncur50++;
-                       if(rec>=50 && rec<150) ncur150++;
-                       if(rec>=150) ncur151++;
-               }else{
-                       succ++;
-                       succ2+=size;
-                       if(rec==0) cur0++;
-                       if(rec==1) cur1++;
-                       if(rec>1 && rec<10) cur10++;
-                       if(rec>=10 && rec<50) cur50++;
-                       if(rec>=50 && rec<150) cur150++;
-                       if(rec>=150) cur151++;
-               }
-       }
-#endif
-
-       if (((char *)ret)<=chipmax && ret!=NULL && (rec<(size>500000?9:size/5000))){
-               ret=GC_amiga_rec_alloc(size,AllocFunction,rec+1);
-//             GC_free(ret2);
-       }
-
-       return ret;
-}
-#endif
-
-
-/* The allocating-functions defined inside the amiga-blocks in gc.h is called
- * via these functions.
- */
-
-
-void *GC_amiga_allocwrapper_any(size_t size,void *(*AllocFunction)(size_t size2)){
-       void *ret,*ret2;
-
-       GC_amiga_dontalloc=TRUE;        // Pretty tough thing to do, but its indeed necesarry.
-       latestsize=size;
-
-       ret=(*AllocFunction)(size);
-
-       if(((char *)ret) <= chipmax){
-               if(ret==NULL){
-                       //Give GC access to allocate memory.
-#ifdef GC_AMIGA_GC
-                       if(!GC_dont_gc){
-                               GC_gcollect();
-#ifdef GC_AMIGA_PRINTSTATS
-                               numcollects++;
-#endif
-                               ret=(*AllocFunction)(size);
-                       }
-#endif
-                       if(ret==NULL){
-                               GC_amiga_dontalloc=FALSE;
-                               ret=(*AllocFunction)(size);
-                               if(ret==NULL){
-                                       WARN("Out of Memory!  Returning NIL!\n", 0);
-                               }
-                       }
-#ifdef GC_AMIGA_PRINTSTATS
-                       else{
-                               nullretries++;
-                       }
-                       if(ret!=NULL && (char *)ret<=chipmax) chipa+=size;
-#endif
-               }
-#ifdef GC_AMIGA_RETRY
-               else{
-                       /* We got chip-mem. Better try again and again and again etc., we might get fast-mem sooner or later... */
-                       /* Using gctest to check the effectiviness of doing this, does seldom give a very good result. */
-                       /* However, real programs doesn't normally rapidly allocate and deallocate. */
-//                     printf("trying to force... %d bytes... ",size);
-                       if(
-                               AllocFunction!=GC_malloc_uncollectable
-#ifdef ATOMIC_UNCOLLECTABLE
-                               && AllocFunction!=GC_malloc_atomic_uncollectable
-#endif
-                       ){
-                               ret2=GC_amiga_rec_alloc(size,AllocFunction,0);
-                       }else{
-                               ret2=(*AllocFunction)(size);
-#ifdef GC_AMIGA_PRINTSTATS
-                               if((char *)ret2<chipmax || ret2==NULL){
-                                       nsucc++;
-                                       nsucc2+=size;
-                                       ncur0++;
-                               }else{
-                                       succ++;
-                                       succ2+=size;
-                                       cur0++;
-                               }
-#endif
-                       }
-                       if(((char *)ret2)>chipmax){
-//                             printf("Succeeded.\n");
-                               GC_free(ret);
-                               ret=ret2;
-                       }else{
-                               GC_free(ret2);
-//                             printf("But did not succeed.\n");
-                       }
-               }
-#endif
-       }
-
-       GC_amiga_dontalloc=FALSE;
-
-       return ret;
-}
-
-
-
-void (*GC_amiga_toany)(void)=NULL;
-
-void GC_amiga_set_toany(void (*func)(void)){
-       GC_amiga_toany=func;
-}
-
-#endif // !GC_AMIGA_ONLYFAST
-
-
-void *GC_amiga_allocwrapper_fast(size_t size,void *(*AllocFunction)(size_t size2)){
-       void *ret;
-
-       ret=(*AllocFunction)(size);
-
-       if(ret==NULL){
-               // Enable chip-mem allocation.
-//             printf("ret==NULL\n");
-#ifdef GC_AMIGA_GC
-               if(!GC_dont_gc){
-                       GC_gcollect();
-#ifdef GC_AMIGA_PRINTSTATS
-                       numcollects++;
-#endif
-                       ret=(*AllocFunction)(size);
-               }
-#endif
-               if(ret==NULL){
-#ifndef GC_AMIGA_ONLYFAST
-                       GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR;
-                       if(GC_amiga_toany!=NULL) (*GC_amiga_toany)();
-                       GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any;
-                       return GC_amiga_allocwrapper_any(size,AllocFunction);
-#endif
-               }
-#ifdef GC_AMIGA_PRINTSTATS
-               else{
-                       nullretries++;
-               }
-#endif
-       }
-
-       return ret;
-}
-
-void *GC_amiga_allocwrapper_firsttime(size_t size,void *(*AllocFunction)(size_t size2)){
-       atexit(&GC_amiga_free_all_mem);
-       chipmax=(char *)SysBase->MaxLocMem;             // For people still having SysBase in chip-mem, this might speed up a bit.
-       GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_fast;
-       return GC_amiga_allocwrapper_fast(size,AllocFunction);
-}
-
-
-#endif //GC_AMIGA_FASTALLOC
-
-
-
-/*
- * The wrapped realloc function.
- *
- */
-void *GC_amiga_realloc(void *old_object,size_t new_size_in_bytes){
-#ifndef GC_AMIGA_FASTALLOC
-       return GC_realloc(old_object,new_size_in_bytes);
-#else
-       void *ret;
-       latestsize=new_size_in_bytes;
-       ret=GC_realloc(old_object,new_size_in_bytes);
-       if(ret==NULL && GC_AMIGA_MEMF==(MEMF_FAST | MEMF_CLEAR)){
-               /* Out of fast-mem. */
-#ifdef GC_AMIGA_GC
-               if(!GC_dont_gc){
-                       GC_gcollect();
-#ifdef GC_AMIGA_PRINTSTATS
-                       numcollects++;
-#endif
-                       ret=GC_realloc(old_object,new_size_in_bytes);
-               }
-#endif
-               if(ret==NULL){
-#ifndef GC_AMIGA_ONLYFAST
-                       GC_AMIGA_MEMF=MEMF_ANY | MEMF_CLEAR;
-                       if(GC_amiga_toany!=NULL) (*GC_amiga_toany)();
-                       GC_amiga_allocwrapper_do=GC_amiga_allocwrapper_any;
-                       ret=GC_realloc(old_object,new_size_in_bytes);
-#endif
-               }
-#ifdef GC_AMIGA_PRINTSTATS
-               else{
-                       nullretries++;
-               }
-#endif
-       }
-       if(ret==NULL){
-               WARN("Out of Memory!  Returning NIL!\n", 0);
-       }
-#ifdef GC_AMIGA_PRINTSTATS
-       if(((char *)ret)<chipmax && ret!=NULL){
-               chipa+=new_size_in_bytes;
-       }
-#endif
-       return ret;
-#endif
-}
-
-#endif //GC_AMIGA_AM
-
-