1 /*---------------------------------------------------------------------------*
2   Project:  Dolphin OS relocatable module demo
3   File:     a.cpp
4 
5   Copyright 2000-2002 Nintendo.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Log: a.cpp,v $
14   Revision 1.2.70.1  2009/12/08 09:30:24  iwai_yuma
15   Changed SD2Var section. .sdata2 => .sdata
16 
17   Revision 1.2  2006/02/20 04:13:12  mitu
18   changed include path from dolphin/ to revolution/.
19 
20   Revision 1.1  2006/01/26 08:01:00  hiratsu
21   Relocatable module demo.
22 
23 
24     6     4/09/04 11:43 Shiki
25     Added check code for sdata and sdata2.
26 
27     5     8/23/02 17:43 Shiki
28     Added call to InlineFunc().
29 
30     4     01/05/09 15:12 Shiki
31     Added const variables to generate .rodata section.
32 
33     3     01/04/02 13:42 Shiki
34     Added _unresolved() and IsAThere().
35 
36     2     10/31/00 4:54p Shiki
37     Fixed OSReport msg.
38 
39     1     10/31/00 3:50p Shiki
40     Modified from .c version.
41 
42     2     4/19/00 12:47a Shiki
43     Added _unresolved().
44 
45     1     4/14/00 11:37p Shiki
46     Initial check-in.
47   $NoKeywords: $
48  *---------------------------------------------------------------------------*/
49 
50 #include <revolution.h>
51 #include "inline.h"
52 #include "a.h"
53 #include "b.h"
54 
55 #ifdef __cplusplus
56 extern "C" {
57 #endif
58 
59 typedef void (*voidfunctionptr) (void); /* ptr to function returning void */
60 __declspec(section ".init") extern voidfunctionptr _ctors[];
61 __declspec(section ".init") extern voidfunctionptr _dtors[];
62 
63 __declspec(section ".sdata") extern int SDVar;
64 __declspec(section ".sdata") extern int SD2Var;
65 
66 void _prolog(void);
67 void _epilog(void);
68 void _unresolved(void);
69 
70 #ifdef __cplusplus
71 }
72 #endif
73 
_prolog(void)74 void _prolog(void)
75 {
76     voidfunctionptr *constructor;
77 
78     /*
79      *  call static initializers
80      */
81     for (constructor = _ctors; *constructor; constructor++) {
82         (*constructor)();
83     }
84     MainA();
85 }
86 
_epilog(void)87 void _epilog(void)
88 {
89     voidfunctionptr *destructor;
90 
91     /*
92      *  call destructors
93      */
94     for (destructor = _dtors; *destructor; destructor++) {
95         (*destructor)();
96     }
97 }
98 
_unresolved(void)99 void _unresolved(void)
100 {
101     u32     i;
102     u32*    p;
103 
104     OSReport("\nError: A called an unlinked function.\n");
105     OSReport("Address:      Back Chain    LR Save\n");
106     for (i = 0, p = (u32*) OSGetStackPointer(); // get current sp
107          p && (u32) p != 0xffffffff && i++ < 16;
108          p = (u32*) *p)                         // get caller sp
109     {
110         OSReport("0x%08x:   0x%08x    0x%08x\n", p, p[0], p[1]);
111     }
112     OSReport("\n");
113 }
114 
115 int A::count;
116 
117 A StaticA01;
118 A StaticA02;
119 
120 static u8 Zero;
121 static u8 One = 1;
122 
MainA(void)123 void MainA(void)
124 {
125     OSReport("Hello, I'm MainA()! %d %d\n", Zero, One);
126     A a;
127 
128     // Generate weak symbol 'InlineFunc'
129     InlineFunc(3, 4);
130 
131     const Vec up = {0.0f, 1.0f, 0.0f};
132     const Vec trg = {0.0f, 0.0f, 0.0f};
133     const Vec pos = {0.0f, 0.0f, -10.0f};
134 
135     OSReport("SDVar(%p) SD2Var(%p)\n", &SDVar, &SD2Var);
136     ++SDVar;
137     ++SD2Var;
138 
139     IsBThere();
140 }
141 
IsAThere(void)142 void IsAThere(void)
143 {
144     OSReport("Yes, I'm A.\n");
145 }
146