~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/gold/testsuite/two_file_test_1.cc

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
 
57
bool
 
58
t1()
 
59
{
 
60
  return t1_2() == 123;
 
61
}
 
62
 
 
63
// 2  Code in file 1 refers to global data in file 2.
 
64
 
 
65
bool
 
66
t2()
 
67
{
 
68
  return v2 == 456;
 
69
}
 
70
 
 
71
// 3  Code in file 1 referes to common symbol in file 2.
 
72
 
 
73
bool
 
74
t3()
 
75
{
 
76
  return v3 == 789;
 
77
}
 
78
 
 
79
// 4  Code in file 1 refers to offset within global data in file 2.
 
80
 
 
81
bool
 
82
t4()
 
83
{
 
84
  return v4[5] == ',';
 
85
}
 
86
 
 
87
// 5  Code in file 1 refers to offset within common symbol in file 2.
 
88
 
 
89
bool
 
90
t5()
 
91
{
 
92
  return v5[7] == 'w';
 
93
}
 
94
 
 
95
// 6  Data in file 1 refers to global data in file 2.
 
96
 
 
97
int* p6 = &v2;
 
98
 
 
99
bool
 
100
t6()
 
101
{
 
102
  return *p6 == 456;
 
103
}
 
104
 
 
105
// 7  Data in file 1 refers to common symbol in file 2.
 
106
 
 
107
int* p7 = &v3;
 
108
 
 
109
bool
 
110
t7()
 
111
{
 
112
  return *p7 == 789;
 
113
}
 
114
 
 
115
// 8  Data in file 1 refers to offset within global data in file 2.
 
116
 
 
117
char* p8 = &v4[6];
 
118
 
 
119
bool
 
120
t8()
 
121
{
 
122
  return *p8 == ' ';
 
123
}
 
124
 
 
125
// 9  Data in file 1 refers to offset within common symbol in file 2.
 
126
 
 
127
char* p9 = &v5[8];
 
128
 
 
129
bool
 
130
t9()
 
131
{
 
132
  return *p9 == 'o';
 
133
}
 
134
 
 
135
// 10 Data in file 1 refers to function in file 2.
 
136
 
 
137
int (*pfn)() = &f10;
 
138
 
 
139
bool
 
140
t10()
 
141
{
 
142
  return (*pfn)() == 135;
 
143
}
 
144
 
 
145
// 11 Pass function pointer from file 1 to file 2.
 
146
 
 
147
int
 
148
f11a()
 
149
{
 
150
  return 246;
 
151
}
 
152
 
 
153
bool
 
154
t11()
 
155
{
 
156
  return f11b(&f11a) == 246;
 
157
}
 
158
 
 
159
// 12 Compare address of function for equality in both files.
 
160
 
 
161
bool
 
162
t12()
 
163
{
 
164
  return &t12 == f12();
 
165
}
 
166
 
 
167
// 13 Compare address of inline function for equality in both files.
 
168
 
 
169
bool
 
170
t13()
 
171
{
 
172
  return &f13i == f13();
 
173
}
 
174
 
 
175
// 14 Compare string constants in file 1 and file 2.
 
176
 
 
177
bool
 
178
t14()
 
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
 
 
190
bool
 
191
t15()
 
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
 
 
203
bool
 
204
t16()
 
205
{
 
206
  return f10() == 135;
 
207
}
 
208
 
 
209
// 17 File 1 checks array of string constants defined in file 2.
 
210
 
 
211
bool
 
212
t17()
 
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
 
 
226
bool
 
227
t18()
 
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
}