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