ChangeLog rotatation and copyright year update
[external/binutils.git] / gold / testsuite / two_file_test_1_v1.cc
1 // two_file_test_1_v1.cc -- a two file test case for gold, file 1 of 2
2
3 // Copyright (C) 2006-2015 Free Software Foundation, Inc.
4 // Written by Ian Lance Taylor <iant@google.com>.
5
6 // This file is part of gold.
7
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 3 of the License, or
11 // (at your option) any later version.
12
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 // MA 02110-1301, USA.
22
23 // This is an alternate version of the source file two_file_test_1.cc,
24 // used to test incremental linking.  We build a binary first using this
25 // source file, then do an incremental link with the primary version of
26 // the file.
27
28 // This tests references between files.  This is file 1, and
29 // two_file_test_2.cc is file 2.  We test in several different ways:
30
31 // Files 1 and 2 linked together in executable.
32 // File 1 in executable, file 2 in shared library.
33 // File 1 in shared library, file 2 in executable.
34 // Files 1 and 2 linked together in shared library.
35 // Files 1 and 2 in different shared libraries.
36
37 // We test the following cases.
38
39 // 1  Code in file 1 calls code in file 2.
40 // 2  Code in file 1 refers to global data in file 2.
41 // 3  Code in file 1 referes to common symbol in file 2.
42 // 4  Code in file 1 refers to offset within global data in file 2.
43 // 5  Code in file 1 refers to offset within common symbol in file 2.
44 // 6  Data in file 1 refers to global data in file 2.
45 // 7  Data in file 1 refers to common symbol in file 2.
46 // 8  Data in file 1 refers to offset within global data in file 2.
47 // 9  Data in file 1 refers to offset within common symbol in file 2.
48 // 10 Data in file 1 refers to function in file 2.
49 // 11 Pass function pointer from file 1 to file 2.
50 // 12 Compare address of function for equality in both files.
51 // 13 Compare address of inline function for equality in both files.
52 // 14 Compare string constants in file 1 and file 2.
53 // 15 Compare wide string constants in file 1 and file 2.
54 // 16 Call a function directly after its address has been taken.
55 // 17 File 1 checks array of string constants defined in file 2.
56 // 18 File 1 checks string constants referenced in code in file 2.
57
58 #include "two_file_test.h"
59
60 // 1  Code in file 1 calls code in file 2.
61
62 bool
63 t1()
64 {
65   return t1_2() == 0;  // Intentionally wrong.
66 }
67
68 // 2  Code in file 1 refers to global data in file 2.
69
70 bool
71 t2()
72 {
73   return v2 == 0;  // Intentionally wrong.
74 }
75
76 // 3  Code in file 1 referes to common symbol in file 2.
77
78 bool
79 t3()
80 {
81   return v3 == 0;  // Intentionally wrong.
82 }
83
84 // 4  Code in file 1 refers to offset within global data in file 2.
85
86 bool
87 t4()
88 {
89   return v4[5] == ',';
90 }
91
92 // 5  Code in file 1 refers to offset within common symbol in file 2.
93
94 bool
95 t5()
96 {
97   return v5[7] == 'w';
98 }
99
100 // 6  Data in file 1 refers to global data in file 2.
101
102 int* p6 = &v2;
103
104 bool
105 t6()
106 {
107   return *p6 == 456;
108 }
109
110 // 7  Data in file 1 refers to common symbol in file 2.
111
112 int* p7 = &v3;
113
114 bool
115 t7()
116 {
117   return *p7 == 789;
118 }
119
120 // 8  Data in file 1 refers to offset within global data in file 2.
121
122 char* p8 = &v4[6];
123
124 bool
125 t8()
126 {
127   return *p8 == ' ';
128 }
129
130 // 9  Data in file 1 refers to offset within common symbol in file 2.
131
132 char* p9 = &v5[8];
133
134 bool
135 t9()
136 {
137   return *p9 == 'o';
138 }
139
140 // 10 Data in file 1 refers to function in file 2.
141
142 int (*pfn)() = &f10;
143
144 bool
145 t10()
146 {
147   return (*pfn)() == 135;
148 }
149
150 // 11 Pass function pointer from file 1 to file 2.
151
152 int
153 f11a()
154 {
155   return 246;
156 }
157
158 bool
159 t11()
160 {
161   return f11b(&f11a) == 246;
162 }
163
164 // 12 Compare address of function for equality in both files.
165
166 bool
167 t12()
168 {
169   return &t12 == f12();
170 }
171
172 // 13 Compare address of inline function for equality in both files.
173
174 bool
175 t13()
176 {
177   return &f13i == f13();
178 }
179
180 // 14 Compare string constants in file 1 and file 2.
181
182 bool
183 t14()
184 {
185   const char* s1 = TEST_STRING_CONSTANT;
186   const char* s2 = f14();
187   while (*s1 != '\0')
188     if (*s1++ != *s2++)
189       return false;
190   return *s2 == '\0';
191 }
192
193 // 15 Compare wide string constants in file 1 and file 2.
194
195 bool
196 t15()
197 {
198   const wchar_t* s1 = TEST_WIDE_STRING_CONSTANT;
199   const wchar_t* s2 = f15();
200   while (*s1 != '\0')
201     if (*s1++ != *s2++)
202       return false;
203   return *s2 == '\0';
204 }
205
206 // 16 Call a function directly after its address has been taken.
207
208 bool
209 t16()
210 {
211   return f10() == 135;
212 }
213
214 // 17 File 1 checks array of string constants defined in file 2.
215
216 bool
217 t17()
218 {
219   char c = 'a';
220   for (int i = 0; i < T17_COUNT; ++i)
221     {
222       if (t17data[i][0] != c || t17data[i][1] != '\0')
223         return false;
224       ++c;
225     }
226   return true;
227 }
228
229 // 18 File 1 checks string constants referenced in code in file 2.
230
231 bool
232 t18()
233 {
234   // Stubbed out; full implementation in two_file_test_1.cc.
235   return true;
236 }