1 // two_file_test_1_v1.cc -- a two file test case for gold, file 1 of 2 2 3 // Copyright (C) 2006-2014 Free Software Foundation, Inc. 4 // Written by Ian Lance Taylor <iant (at) 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 } 237