1// two_file_test_1.cc -- a two file test case for gold, file 1 of 2
2
3// Copyright 2006, 2007, 2008 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 tests references between files.  This is file 1, and
24// two_file_test_2.cc is file 2.  We test in several different ways:
25
26// Files 1 and 2 linked together in executable.
27// File 1 in executable, file 2 in shared library.
28// File 1 in shared library, file 2 in executable.
29// Files 1 and 2 linked together in shared library.
30// Files 1 and 2 in different shared libraries.
31
32// We test the following cases.
33
34// 1  Code in file 1 calls code in file 2.
35// 2  Code in file 1 refers to global data in file 2.
36// 3  Code in file 1 referes to common symbol in file 2.
37// 4  Code in file 1 refers to offset within global data in file 2.
38// 5  Code in file 1 refers to offset within common symbol in file 2.
39// 6  Data in file 1 refers to global data in file 2.
40// 7  Data in file 1 refers to common symbol in file 2.
41// 8  Data in file 1 refers to offset within global data in file 2.
42// 9  Data in file 1 refers to offset within common symbol in file 2.
43// 10 Data in file 1 refers to function in file 2.
44// 11 Pass function pointer from file 1 to file 2.
45// 12 Compare address of function for equality in both files.
46// 13 Compare address of inline function for equality in both files.
47// 14 Compare string constants in file 1 and file 2.
48// 15 Compare wide string constants in file 1 and file 2.
49// 16 Call a function directly after its address has been taken.
50// 17 File 1 checks array of string constants defined in file 2.
51// 18 File 1 checks string constants referenced in code in file 2.
52
53#include "two_file_test.h"
54
55// 1  Code in file 1 calls code in file 2.
56
57bool
58t1()
59{
60  return t1_2() == 123;
61}
62
63// 2  Code in file 1 refers to global data in file 2.
64
65bool
66t2()
67{
68  return v2 == 456;
69}
70
71// 3  Code in file 1 referes to common symbol in file 2.
72
73bool
74t3()
75{
76  return v3 == 789;
77}
78
79// 4  Code in file 1 refers to offset within global data in file 2.
80
81bool
82t4()
83{
84  return v4[5] == ',';
85}
86
87// 5  Code in file 1 refers to offset within common symbol in file 2.
88
89bool
90t5()
91{
92  return v5[7] == 'w';
93}
94
95// 6  Data in file 1 refers to global data in file 2.
96
97int* p6 = &v2;
98
99bool
100t6()
101{
102  return *p6 == 456;
103}
104
105// 7  Data in file 1 refers to common symbol in file 2.
106
107int* p7 = &v3;
108
109bool
110t7()
111{
112  return *p7 == 789;
113}
114
115// 8  Data in file 1 refers to offset within global data in file 2.
116
117char* p8 = &v4[6];
118
119bool
120t8()
121{
122  return *p8 == ' ';
123}
124
125// 9  Data in file 1 refers to offset within common symbol in file 2.
126
127char* p9 = &v5[8];
128
129bool
130t9()
131{
132  return *p9 == 'o';
133}
134
135// 10 Data in file 1 refers to function in file 2.
136
137int (*pfn)() = &f10;
138
139bool
140t10()
141{
142  return (*pfn)() == 135;
143}
144
145// 11 Pass function pointer from file 1 to file 2.
146
147int
148f11a()
149{
150  return 246;
151}
152
153bool
154t11()
155{
156  return f11b(&f11a) == 246;
157}
158
159// 12 Compare address of function for equality in both files.
160
161bool
162t12()
163{
164  return &t12 == f12();
165}
166
167// 13 Compare address of inline function for equality in both files.
168
169bool
170t13()
171{
172  return &f13i == f13();
173}
174
175// 14 Compare string constants in file 1 and file 2.
176
177bool
178t14()
179{
180  const char* s1 = TEST_STRING_CONSTANT;
181  const char* s2 = f14();
182  while (*s1 != '\0')
183    if (*s1++ != *s2++)
184      return false;
185  return *s2 == '\0';
186}
187
188// 15 Compare wide string constants in file 1 and file 2.
189
190bool
191t15()
192{
193  const wchar_t* s1 = TEST_WIDE_STRING_CONSTANT;
194  const wchar_t* s2 = f15();
195  while (*s1 != '\0')
196    if (*s1++ != *s2++)
197      return false;
198  return *s2 == '\0';
199}
200
201// 16 Call a function directly after its address has been taken.
202
203bool
204t16()
205{
206  return f10() == 135;
207}
208
209// 17 File 1 checks array of string constants defined in file 2.
210
211bool
212t17()
213{
214  char c = 'a';
215  for (int i = 0; i < T17_COUNT; ++i)
216    {
217      if (t17data[i][0] != c || t17data[i][1] != '\0')
218	return false;
219      ++c;
220    }
221  return true;
222}
223
224// 18 File 1 checks string constants referenced in code in file 2.
225
226bool
227t18()
228{
229  char c = 'a';
230  for (int i = 0; i < T17_COUNT; ++i)
231    {
232      const char* s = f18(i);
233      if (s[0] != c || s[1] != '\0')
234        return false;
235      ++c;
236    }
237  return true;
238}
239