os/kernelhwsrv/kernel/eka/compsupp/rvct2_2/ucppinit_aeabi.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "ARM EABI LICENCE.txt"
     5 // which accompanies this distribution, and is available
     6 // in kernel/eka/compsupp.
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // toplevel initialization/destruction routines for 'user side' code compiled 
    15 // with the ARMCC EABI compiler. intended for static linking
    16 // The code supports 2.2 both bpabi and non-bpabi. The values in .init_array are
    17 // pointers in both environments, so the library is common to both.
    18 // 
    19 //
    20 
    21 extern "C" {
    22 
    23 // This calls each of the compiler constructed functions referenced from pi_ctorvec.
    24 // These functions arrange to 'call' the appropriate constructor for the 'static' instance
    25 // (in fact the call may be inlined). If the class of the instance has a destructor then 
    26 // compiler records that this object needs 'destructing' at 'exit' time. It does this by 
    27 // calling the function __cxa_atexit. We provide our own definition of this.
    28 // 
    29 
    30 #ifdef __thumb
    31   __asm void __cpp_initialize__aeabi_(void)
    32     {
    33     CODE16
    34 #ifndef _NO_FP
    35     IMPORT    _fp_init [WEAK]
    36 #endif
    37     IMPORT    |SHT$$INIT_ARRAY$$Base| [WEAK]
    38     IMPORT    |SHT$$INIT_ARRAY$$Limit| [WEAK]
    39 
    40     // export std::nothrow from here
    41     EXPORT    _ZSt7nothrow
    42 
    43 #ifndef _NO_FP
    44     LDR      r0,fpinit
    45 #endif
    46     PUSH     {r4-r6,r14}
    47 #ifndef _NO_FP
    48     CMP      r0,#0
    49     BEQ      skip
    50     BL       _fp_init  ;
    51 skip
    52 #endif
    53     LDR      r4,base
    54     LDR      r5,limit
    55     B        check
    56 loop
    57     LDR      r0,[r4,#0]
    58 
    59     BLX      r0
    60     ADD      r4,#4
    61 check
    62     CMP      r4,r5
    63     BCC      loop
    64     POP      {r4-r6,pc}
    65 
    66 #ifndef _NO_FP
    67     ALIGN 4 
    68 fpinit
    69     DCD    _fp_init
    70 #endif
    71 
    72 // cheat - saved a whole 4 bytes!!! - value is never used
    73 _ZSt7nothrow
    74 base
    75     DCD    |SHT$$INIT_ARRAY$$Base|
    76 limit
    77     DCD    |SHT$$INIT_ARRAY$$Limit|
    78 
    79     }
    80 
    81 #else
    82   __asm void __cpp_initialize__aeabi_(void)
    83     {
    84     CODE32
    85 #ifndef _NO_FP
    86     IMPORT    _fp_init [WEAK]
    87 #endif
    88     IMPORT    |SHT$$INIT_ARRAY$$Base| [WEAK]
    89     IMPORT    |SHT$$INIT_ARRAY$$Limit| [WEAK]
    90 
    91     // export std::nothrow from here
    92     EXPORT    _ZSt7nothrow
    93 
    94 #ifndef _NO_FP
    95     LDR	     r0, fpinit
    96 #endif
    97     STMFD    r13!,{r3-r5,r14}
    98 #ifndef _NO_FP
    99     CMP      r0, #0
   100     BEQ	     skip
   101     BL	     _fp_init
   102 skip
   103 #endif
   104     LDR      r4,base
   105     LDR      r5,limit
   106     CMP      r4,r5
   107     LDMEQFD  r13!,{r3-r5,pc}
   108 loop
   109 	LDR      r0,[r4,#0]
   110 #ifdef __MARM_ARMV4__
   111     ADR      r14,ret
   112     MOV      pc,r0
   113 #else
   114     BLX      r0
   115 #endif
   116 ret
   117     ADD      r4,r4,#4
   118     CMP      r4,r5
   119     BNE      loop
   120     LDMFD    r13!,{r3-r5,pc}
   121 
   122 #ifndef _NO_FP
   123 fpinit
   124     DCD    _fp_init
   125 #endif
   126 
   127 base
   128     DCD    |SHT$$INIT_ARRAY$$Base|
   129 limit
   130     DCD    |SHT$$INIT_ARRAY$$Limit|
   131 
   132 // cheat - defining this here saves a whole 4 bytes!!! - value is never used
   133 _ZSt7nothrow
   134 
   135     }
   136 #endif
   137 
   138 }