Home | History | Annotate | Download | only in Runtime
      1 /* This file tests that we can successfully call each compiler-rt function. It is
      2    designed to check that the runtime libraries are available for linking and
      3    that they contain the expected contents. It is not designed to test the
      4    correctness of the individual functions in compiler-rt.
      5 
      6    This test is assumed to be run on a 10.6 machine. The two environment
      7    variables below should be set to 10.4 and 10.5 machines which can be directly
      8    ssh/rsync'd to in order to actually test the executables can run on the
      9    desired targets.
     10 */
     11 
     12 // RUN: export TENFOUR_X86_MACHINE=localhost
     13 // RUN: export TENFIVE_X86_MACHINE=localhost
     14 // RUN: export ARM_MACHINE=localhost
     15 // RUN: export ARM_SYSROOT=$(xcodebuild -sdk iphoneos -version Path)
     16 
     17 // RUN: echo iPhoneOS, ARM, v6, thumb
     18 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv6 -mthumb -c %s -o %t.o
     19 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv6 -mthumb -v -Wl,-t,-v -o %t %t.o 1>&2
     20 // RUN: rsync -arv %t $ARM_MACHINE:/tmp/a.out
     21 // RUN: ssh $ARM_MACHINE /tmp/a.out
     22 // RUN: echo
     23 
     24 // RUN: echo iPhoneOS, ARM, v6, no-thumb
     25 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv6 -mno-thumb -c %s -o %t.o
     26 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv6 -mno-thumb -v -Wl,-t,-v -o %t %t.o 1>&2
     27 // RUN: rsync -arv %t $ARM_MACHINE:/tmp/a.out
     28 // RUN: ssh $ARM_MACHINE /tmp/a.out
     29 // RUN: echo
     30 
     31 // RUN: echo iPhoneOS, ARM, v7, thumb
     32 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv7 -mthumb -c %s -o %t.o
     33 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv7 -mthumb -v -Wl,-t,-v -o %t %t.o 1>&2
     34 // RUN: rsync -arv %t $ARM_MACHINE:/tmp/a.out
     35 // RUN: ssh $ARM_MACHINE /tmp/a.out
     36 // RUN: echo
     37 
     38 // RUN: echo iPhoneOS, ARM, v7, no-thumb
     39 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv7 -mno-thumb -c %s -o %t.o
     40 // RUN: %clang -isysroot $ARM_SYSROOT -arch armv7 -mno-thumb -v -Wl,-t,-v -o %t %t.o 1>&2
     41 // RUN: rsync -arv %t $ARM_MACHINE:/tmp/a.out
     42 // RUN: ssh $ARM_MACHINE /tmp/a.out
     43 // RUN: echo
     44 
     45 // RUN: echo 10.4, i386
     46 // RUN: %clang -arch i386 -mmacosx-version-min=10.4 -c %s -o %t.o
     47 // RUN: %clang -arch i386 -mmacosx-version-min=10.4 -v -Wl,-t,-v -o %t %t.o 1>&2
     48 // RUN: %t
     49 // RUN: echo
     50 
     51 // RUN: rsync -arv %t $TENFOUR_X86_MACHINE:/tmp/a.out
     52 // RUN: ssh $TENFOUR_X86_MACHINE /tmp/a.out
     53 // RUN: echo
     54 
     55 // RUX: rsync -arv %t $TENFIVE_X86_MACHINE:/tmp/a.out
     56 // RUX: ssh $TENFIVE_X86_MACHINE /tmp/a.out
     57 // RUN: echo
     58 
     59 // RUN: echo 10.5, i386
     60 // RUN: %clang -arch i386 -mmacosx-version-min=10.5 -c %s -o %t.o
     61 // RUN: %clang -arch i386 -mmacosx-version-min=10.5 -v -Wl,-t,-v -o %t %t.o 1>&2
     62 // RUN: %t
     63 // RUN: echo
     64 
     65 // RUN: rsync -arv %t $TENFIVE_X86_MACHINE:/tmp/a.out
     66 // RUN: ssh $TENFIVE_X86_MACHINE /tmp/a.out
     67 // RUN: echo
     68 
     69 // RUN: echo 10.6, i386
     70 // RUN: %clang -arch i386 -mmacosx-version-min=10.6 -c %s -o %t.o
     71 // RUN: %clang -arch i386 -mmacosx-version-min=10.6 -v -Wl,-t,-v -o %t %t.o 1>&2
     72 // RUN: %t
     73 // RUN: echo
     74 
     75 // RUN: echo 10.4, x86_64
     76 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.4 -c %s -o %t.o
     77 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.4 -v -Wl,-t,-v -o %t %t.o 1>&2
     78 // RUN: %t
     79 // RUN: echo
     80 
     81 // RUN: rsync -arv %t $TENFOUR_X86_MACHINE:/tmp/a.out
     82 // RUN: ssh $TENFOUR_X86_MACHINE /tmp/a.out
     83 // RUN: echo
     84 
     85 // RUN: rsync -arv %t $TENFIVE_X86_MACHINE:/tmp/a.out
     86 // RUN: ssh $TENFIVE_X86_MACHINE /tmp/a.out
     87 // RUN: echo
     88 
     89 // RUN: echo 10.5, x86_64
     90 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.5 -c %s -o %t.o
     91 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.5 -v -Wl,-t,-v -o %t %t.o 1>&2
     92 // RUN: %t
     93 // RUN: echo
     94 
     95 // RUN: rsync -arv %t $TENFIVE_X86_MACHINE:/tmp/a.out
     96 // RUN: ssh $TENFIVE_X86_MACHINE /tmp/a.out
     97 // RUN: echo
     98 
     99 // RUN: echo 10.6, x86_64
    100 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.6 -c %s -o %t.o
    101 // RUN: %clang -arch x86_64 -mmacosx-version-min=10.6 -v -Wl,-t,-v -o %t %t.o 1>&2
    102 // RUN: %t
    103 // RUN: echo
    104 
    105 #include <assert.h>
    106 #include <stdio.h>
    107 #include <sys/utsname.h>
    108 
    109 typedef int si_int;
    110 typedef unsigned su_int;
    111 
    112 typedef long long di_int;
    113 typedef unsigned long long du_int;
    114 
    115 // Integral bit manipulation
    116 
    117 di_int __ashldi3(di_int a, si_int b);      // a << b
    118 di_int __ashrdi3(di_int a, si_int b);      // a >> b  arithmetic (sign fill)
    119 di_int __lshrdi3(di_int a, si_int b);      // a >> b  logical    (zero fill)
    120 
    121 si_int __clzsi2(si_int a);  // count leading zeros
    122 si_int __clzdi2(di_int a);  // count leading zeros
    123 si_int __ctzsi2(si_int a);  // count trailing zeros
    124 si_int __ctzdi2(di_int a);  // count trailing zeros
    125 
    126 si_int __ffsdi2(di_int a);  // find least significant 1 bit
    127 
    128 si_int __paritysi2(si_int a);  // bit parity
    129 si_int __paritydi2(di_int a);  // bit parity
    130 
    131 si_int __popcountsi2(si_int a);  // bit population
    132 si_int __popcountdi2(di_int a);  // bit population
    133 
    134 // Integral arithmetic
    135 
    136 di_int __negdi2    (di_int a);                         // -a
    137 di_int __muldi3    (di_int a, di_int b);               // a * b
    138 di_int __divdi3    (di_int a, di_int b);               // a / b   signed
    139 du_int __udivdi3   (du_int a, du_int b);               // a / b   unsigned
    140 di_int __moddi3    (di_int a, di_int b);               // a % b   signed
    141 du_int __umoddi3   (du_int a, du_int b);               // a % b   unsigned
    142 du_int __udivmoddi4(du_int a, du_int b, du_int* rem);  // a / b, *rem = a % b
    143 
    144 //  Integral arithmetic with trapping overflow
    145 
    146 si_int __absvsi2(si_int a);           // abs(a)
    147 di_int __absvdi2(di_int a);           // abs(a)
    148 
    149 si_int __negvsi2(si_int a);           // -a
    150 di_int __negvdi2(di_int a);           // -a
    151 
    152 si_int __addvsi3(si_int a, si_int b);  // a + b
    153 di_int __addvdi3(di_int a, di_int b);  // a + b
    154 
    155 si_int __subvsi3(si_int a, si_int b);  // a - b
    156 di_int __subvdi3(di_int a, di_int b);  // a - b
    157 
    158 si_int __mulvsi3(si_int a, si_int b);  // a * b
    159 di_int __mulvdi3(di_int a, di_int b);  // a * b
    160 
    161 //  Integral comparison: a  < b -> 0
    162 //                       a == b -> 1
    163 //                       a  > b -> 2
    164 
    165 si_int __cmpdi2 (di_int a, di_int b);
    166 si_int __ucmpdi2(du_int a, du_int b);
    167 
    168 //  Integral / floating point conversion
    169 
    170 di_int __fixsfdi(      float a);
    171 di_int __fixdfdi(     double a);
    172 di_int __fixxfdi(long double a);
    173 
    174 su_int __fixunssfsi(      float a);
    175 su_int __fixunsdfsi(     double a);
    176 su_int __fixunsxfsi(long double a);
    177 
    178 du_int __fixunssfdi(      float a);
    179 du_int __fixunsdfdi(     double a);
    180 du_int __fixunsxfdi(long double a);
    181 
    182 float       __floatdisf(di_int a);
    183 double      __floatdidf(di_int a);
    184 long double __floatdixf(di_int a);
    185 
    186 float       __floatundisf(du_int a);
    187 double      __floatundidf(du_int a);
    188 long double __floatundixf(du_int a);
    189 
    190 //  Floating point raised to integer power
    191 
    192 float       __powisf2(      float a, si_int b);  // a ^ b
    193 double      __powidf2(     double a, si_int b);  // a ^ b
    194 long double __powixf2(long double a, si_int b);  // a ^ b
    195 
    196 //  Complex arithmetic
    197 
    198 //  (a + ib) * (c + id)
    199 
    200       float _Complex __mulsc3( float a,  float b,  float c,  float d);
    201      double _Complex __muldc3(double a, double b, double c, double d);
    202 long double _Complex __mulxc3(long double a, long double b,
    203                               long double c, long double d);
    204 
    205 //  (a + ib) / (c + id)
    206 
    207       float _Complex __divsc3( float a,  float b,  float c,  float d);
    208      double _Complex __divdc3(double a, double b, double c, double d);
    209 long double _Complex __divxc3(long double a, long double b,
    210                               long double c, long double d);
    211 
    212 #ifndef __arm
    213 #define HAS_LONG_DOUBLE
    214 #endif
    215 
    216 int main(int argc, char **argv) {
    217   du_int du_tmp;
    218   struct utsname name;
    219 #ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
    220   const char *target_name = "OS X";
    221   unsigned target_version = __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__;
    222   unsigned target_maj = target_version / 100;
    223   unsigned target_min = (target_version / 10) % 10;
    224   unsigned target_micro = target_version % 10;
    225 #else
    226   const char *target_name = "iPhoneOS";
    227   unsigned target_version = __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__;
    228   unsigned target_maj = target_version / 10000;
    229   unsigned target_min = (target_version / 100) % 100;
    230   unsigned target_micro = target_version % 100;
    231 #endif
    232 
    233   if (uname(&name))
    234     return 1;
    235 
    236   fprintf(stderr, "%s: clang_rt test:\n", argv[0]);
    237   fprintf(stderr, "  target  : %s %d.%d.%d\n\n", target_name,
    238           target_maj, target_min, target_micro);
    239   fprintf(stderr, "  sysname : %s\n", name.sysname);
    240   fprintf(stderr, "  nodename: %s\n", name.nodename);
    241   fprintf(stderr, "  release : %s\n", name.release);
    242   fprintf(stderr, "  version : %s\n", name.version);
    243   fprintf(stderr, "  machine : %s\n", name.machine);
    244 
    245   assert(__ashldi3(1, 1) == 2);
    246   assert(__ashrdi3(2, 1) == 1);
    247   assert(__lshrdi3(2, 1) == 1);
    248   assert(__clzsi2(1) == 31);
    249   assert(__clzdi2(1) == 63);
    250   assert(__ctzsi2(2) == 1);
    251   assert(__ctzdi2(2) == 1);
    252   assert(__ffsdi2(12) == 3);
    253   assert(__paritysi2(13) == 1);
    254   assert(__paritydi2(13) == 1);
    255   assert(__popcountsi2(13) == 3);
    256   assert(__popcountdi2(13) == 3);
    257   assert(__negdi2(3) == -3);
    258   assert(__muldi3(2,2) == 4);
    259   assert(__divdi3(-4,2) == -2);
    260   assert(__udivdi3(4,2) == 2);
    261   assert(__moddi3(3,2) == 1);
    262   assert(__umoddi3(3,2) == 1);
    263   assert(__udivmoddi4(5,2,&du_tmp) == 2 && du_tmp == 1);
    264   assert(__absvsi2(-2) == 2);
    265   assert(__absvdi2(-2) == 2);
    266   assert(__negvsi2(2) == -2);
    267   assert(__negvdi2(2) == -2);
    268   assert(__addvsi3(2, 3) == 5);
    269   assert(__addvdi3(2, 3) == 5);
    270   assert(__subvsi3(2, 3) == -1);
    271   assert(__subvdi3(2, 3) == -1);
    272   assert(__mulvsi3(2, 3) == 6);
    273   assert(__mulvdi3(2, 3) == 6);
    274   assert(__cmpdi2(3, 2) == 2);
    275   assert(__ucmpdi2(3, 2) == 2);
    276   assert(__fixsfdi(2.0) == 2);
    277   assert(__fixdfdi(2.0) == 2);
    278   assert(__fixunssfsi(2.0) == 2);
    279   assert(__fixunsdfsi(2.0) == 2);
    280   assert(__fixunssfdi(2.0) == 2);
    281   assert(__fixunsdfdi(2.0) == 2);
    282   assert(__floatdisf(2) == 2.0);
    283   assert(__floatdidf(2) == 2.0);
    284   assert(__floatundisf(2) == 2.0);
    285   assert(__floatundidf(2) == 2.0);
    286   assert(__powisf2(2.0, 2) == 4.0);
    287   assert(__powidf2(2.0, 2) == 4.0);
    288 
    289   // FIXME: Clang/LLVM seems to be miscompiling _Complex currently, probably an
    290   // ABI issue.
    291 #ifndef __arm
    292   {
    293     _Complex float a = __mulsc3(1.0, 2.0, 4.0, 8.0);
    294     _Complex float b = (-12.0 + 16.0j);
    295     fprintf(stderr, "a: (%f + %f), b: (%f + %f)\n",
    296             __real a, __imag a, __real b, __imag b);
    297   }
    298   assert(__mulsc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
    299   assert(__muldc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
    300   assert(__divsc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
    301   assert(__divdc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
    302 #endif
    303 
    304 #ifdef HAS_LONG_DOUBLE
    305   assert(__divxc3(1.0, 2.0, 4.0, 8.0) == (0.25 + 0j));
    306   assert(__fixunsxfdi(2.0) == 2);
    307   assert(__fixunsxfsi(2.0) == 2);
    308   assert(__fixxfdi(2.0) == 2);
    309   assert(__floatdixf(2) == 2.0);
    310   assert(__floatundixf(2) == 2);
    311   assert(__mulxc3(1.0, 2.0, 4.0, 8.0) == (-12.0 + 16.0j));
    312   assert(__powixf2(2.0, 2) == 4.0);
    313 #endif
    314 
    315   // Test some calls which are used on armv6/thumb. The calls/prototypes are
    316   // fake, it would be nice to test correctness, but mostly we just want to
    317   // make sure we resolve symbols correctly.
    318 #if defined(__arm) && defined(__ARM_ARCH_6K__) && defined(__thumb__)
    319   if (argc == 100) {
    320     extern void __restore_vfp_d8_d15_regs(void), __save_vfp_d8_d15_regs(void);
    321     extern void __switch8(void), __switchu8(void),
    322       __switch16(void), __switch32(void);
    323     extern void __addsf3vfp(void);
    324 
    325     __addsf3vfp();
    326     __restore_vfp_d8_d15_regs();
    327     __save_vfp_d8_d15_regs();
    328     __switch8();
    329     __switchu8();
    330     __switch16();
    331     __switch32();
    332   }
    333 #endif
    334 
    335   fprintf(stderr, "    OK!\n");
    336 
    337   return 0;
    338 }
    339