home *** CD-ROM | disk | FTP | other *** search
- ;----------------------------------------------------------------------------
- ;
- ; $Source: /unixb/home/unixlib/source/unixlib37/src/sys/s/RCS/_alloca,v $
- ; $Date: 1996/11/06 22:01:42 $
- ; $Revision: 1.3 $
- ; $State: Rel $
- ; $Author: unixlib $
- ;
- ; $Log: _alloca,v $
- ; Revision 1.3 1996/11/06 22:01:42 unixlib
- ; Yet more changes by NB, PB and SC.
- ;
- ; Revision 1.2 1996/10/30 21:59:00 unixlib
- ; Massive changes made by Nick Burret and Peter Burwood.
- ;
- ; Revision 1.1 1996/04/19 21:34:32 simon
- ; Initial revision
- ;
- ;----------------------------------------------------------------------------
-
- GET Unix37:unixlib.s.asm_dec
-
- AREA |C$$code|,CODE,READONLY
-
- IMPORT malloc
- IMPORT free
- IMPORT |__base|
- IMPORT abort
-
- EXPORT |__alloca|
- EXPORT alloca
- EXPORT |__builtin_alloca|
- NAME __alloca
- alloca ; just in case
- |__alloca|
- |__builtin_alloca|
-
- CMP a1,#0
- MOVEQS pc,lr
-
- ADD a1,a1,#8
- STMFD sp!,{lr}
- BL malloc
- CMP a1,#0
- CMPNE fp,#0
- [ ALLOCA_FATAL = 0
- LDMEQFD sp!,{pc}^
- |
- ; If we could not malloc any space then print an error message
- ; and force an abort - just like a true alloca function should.
- ADREQ a1, |__alloca_malloc_msg|
- SWIEQ XOS_Write0
- BEQ abort ; never returns
- ]
-
- LDR a2,[fp,#-4]
- LDR a3,[pc,#|__alloca_list_ptr|-.-8]
- LDR a4,[a3,#0]
- STR a4,[a1,#0]
- STR a2,[a1,#4]
- STR a1,[a3,#0]
- AND a2,a2,#&fc000003
- ADR a3,|__alloca_free|
- BIC a3,a3,#&fc000003
- ORR a2,a2,a3
- STR a2,[fp,#-4]
- ADD a1,a1,#8
- LDMFD sp!,{pc}^
-
- |__alloca_free|
- STMFD sp!,{a1,a2,v1}
- LDR a3,[pc,#|__alloca_list_ptr|-.-8]
- LDR a1,[a3,#0]
- LDMIA a1, {a4, v1}
- STR a4,[a3,#0]
- BL free
- MOV a3,v1
- LDR a2,[pc,#|__base_ptr|-.-8]
- LDR a2,[a2,#0]
- CMP a3,a2
- BCC |__alloca_rtn_corrupt|
- BIC a2,a3,#3
- CMP a3,a2
- BNE |__alloca_rtn_corrupt|
- LDMFD sp!,{a1,a2,v1}
- MOVS pc,a3
-
- [ ALLOCA_FATAL = 1
- |__alloca_malloc_msg|
- DCB "could not claim enough space for alloca"
- DCB 13,10,0
- ]
-
- |__alloca_rtn_msg|
- DCB "return from alloca() not possible, return point corrupted"
- DCB 13,10,0
- ALIGN
-
- |__alloca_rtn_corrupt|
- ADR a1,|__alloca_rtn_msg|
- SWI XOS_Write0
- B abort ; never returns
-
- |__base_ptr|
- DCD |__base|
- |__alloca_list_ptr|
- DCD |__alloca_list|
-
- AREA |C$$data|, DATA
-
- EXPORT |__alloca_list|
- |__alloca_list|
- DCD 0
-
- END
-