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