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