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