Home | History | Annotate | Download | only in testsuite
      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