Home | History | Annotate | Download | only in testsuite
      1 // two_file_test_1.cc -- a two file test case for gold, file 1 of 2
      2 
      3 // Copyright (C) 2006-2016 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 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 }
    239