home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / unix / unixlib_1 / !UnixLib37_src_sys_s__alloca < prev    next >
Encoding:
Text File  |  1996-11-09  |  2.2 KB  |  116 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_alloca,v $
  4. ; $Date: 1996/11/06 22:01:42 $
  5. ; $Revision: 1.3 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: _alloca,v $
  10. ; Revision 1.3  1996/11/06 22:01:42  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.2  1996/10/30 21:59:00  unixlib
  14. ; Massive changes made by Nick Burret and Peter Burwood.
  15. ;
  16. ; Revision 1.1  1996/04/19 21:34:32  simon
  17. ; Initial revision
  18. ;
  19. ;----------------------------------------------------------------------------
  20.  
  21.     GET    Unix37:unixlib.s.asm_dec
  22.  
  23.     AREA    |C$$code|,CODE,READONLY
  24.  
  25.     IMPORT  malloc
  26.     IMPORT  free
  27.     IMPORT  |__base|
  28.     IMPORT  abort
  29.  
  30.     EXPORT  |__alloca|
  31.     EXPORT  alloca
  32.     EXPORT  |__builtin_alloca|
  33.     NAME    __alloca
  34. alloca        ; just in case
  35. |__alloca|
  36. |__builtin_alloca|
  37.  
  38.     CMP    a1,#0
  39.     MOVEQS  pc,lr
  40.  
  41.     ADD    a1,a1,#8
  42.     STMFD    sp!,{lr}
  43.     BL    malloc
  44.     CMP    a1,#0
  45.     CMPNE    fp,#0
  46.     [ ALLOCA_FATAL = 0
  47.     LDMEQFD    sp!,{pc}^
  48.     |
  49.     ; If we could not malloc any space then print an error message
  50.     ; and force an abort - just like a true alloca function should.
  51.     ADREQ    a1, |__alloca_malloc_msg|
  52.     SWIEQ    XOS_Write0
  53.     BEQ    abort        ; never returns
  54.     ]
  55.  
  56.     LDR    a2,[fp,#-4]
  57.     LDR    a3,[pc,#|__alloca_list_ptr|-.-8]
  58.     LDR    a4,[a3,#0]
  59.     STR    a4,[a1,#0]
  60.     STR    a2,[a1,#4]
  61.     STR    a1,[a3,#0]
  62.     AND    a2,a2,#&fc000003
  63.     ADR    a3,|__alloca_free|
  64.     BIC    a3,a3,#&fc000003
  65.     ORR    a2,a2,a3
  66.     STR    a2,[fp,#-4]
  67.     ADD    a1,a1,#8
  68.     LDMFD    sp!,{pc}^
  69.  
  70. |__alloca_free|
  71.     STMFD    sp!,{a1,a2,v1}
  72.     LDR    a3,[pc,#|__alloca_list_ptr|-.-8]
  73.     LDR    a1,[a3,#0]
  74.     LDMIA    a1, {a4, v1}
  75.     STR    a4,[a3,#0]
  76.     BL    free
  77.     MOV    a3,v1
  78.     LDR    a2,[pc,#|__base_ptr|-.-8]
  79.     LDR    a2,[a2,#0]
  80.     CMP    a3,a2
  81.     BCC    |__alloca_rtn_corrupt|
  82.     BIC    a2,a3,#3
  83.     CMP    a3,a2
  84.     BNE    |__alloca_rtn_corrupt|
  85.     LDMFD    sp!,{a1,a2,v1}
  86.     MOVS    pc,a3
  87.  
  88.     [ ALLOCA_FATAL = 1
  89. |__alloca_malloc_msg|
  90.     DCB    "could not claim enough space for alloca"
  91.     DCB    13,10,0
  92.     ]
  93.  
  94. |__alloca_rtn_msg|
  95.     DCB    "return from alloca() not possible, return point corrupted"
  96.     DCB    13,10,0
  97.     ALIGN
  98.  
  99. |__alloca_rtn_corrupt|
  100.     ADR    a1,|__alloca_rtn_msg|
  101.     SWI    XOS_Write0
  102.     B    abort        ; never returns
  103.  
  104. |__base_ptr|
  105.     DCD    |__base|
  106. |__alloca_list_ptr|
  107.     DCD    |__alloca_list|
  108.  
  109.     AREA    |C$$data|, DATA
  110.  
  111.     EXPORT  |__alloca_list|
  112. |__alloca_list|
  113.     DCD    0
  114.  
  115.     END
  116.