| OLD | NEW | 
|    1 ; Tests that we generate an ELF container with fields that make sense, |    1 ; Tests that we generate an ELF container with fields that make sense, | 
|    2 ; cross-validating against llvm-mc. |    2 ; cross-validating against llvm-mc. | 
|    3  |    3  | 
|    4 ; For the integrated ELF writer, we can't pipe the output because we need |    4 ; For the integrated ELF writer, we can't pipe the output because we need | 
|    5 ; to seek backward and patch up the file headers. So, use a temporary file. |    5 ; to seek backward and patch up the file headers. So, use a temporary file. | 
|    6 ; RUN: %p2i -i %s --args -O2 --verbose none -filetype=obj -o %t \ |    6 ; RUN: %p2i -i %s --args -O2 --verbose none -filetype=obj -o %t \ | 
|    7 ; RUN:   && llvm-readobj -file-headers -sections -section-data \ |    7 ; RUN:   && llvm-readobj -file-headers -sections -section-data \ | 
|    8 ; RUN:       -relocations -symbols %t | FileCheck %s |    8 ; RUN:       -relocations -symbols %t | FileCheck %s | 
|    9  |    9  | 
|   10 ; RUN: %p2i -i %s --args -O2 --verbose none \ |   10 ; RUN: %p2i -i %s --args -O2 --verbose none \ | 
|   11 ; RUN:   | llvm-mc -triple=i686-none-nacl -filetype=obj -o - \ |   11 ; RUN:   | llvm-mc -triple=i686-none-nacl -filetype=obj -o - \ | 
|   12 ; RUN:   | llvm-readobj -file-headers -sections -section-data \ |   12 ; RUN:   | llvm-readobj -file-headers -sections -section-data \ | 
|   13 ; RUN:       -relocations -symbols - | FileCheck %s |   13 ; RUN:       -relocations -symbols - | FileCheck %s | 
|   14  |   14  | 
|   15 ; Add a run that shows relocations in code inline. |   15 ; Add a run that shows relocations in code inline. | 
|   16 ; RUN: %p2i -i %s --args -O2 --verbose none -filetype=obj -o %t \ |   16 ; RUN: %p2i -i %s --args -O2 --verbose none -filetype=obj -o %t \ | 
|   17 ; RUN:   && llvm-objdump -d -r -x86-asm-syntax=intel %t \ |   17 ; RUN:   && objdump -w -d -r -Mintel %t \ | 
|   18 ; RUN:   | FileCheck --check-prefix=TEXT-RELOCS %s |   18 ; RUN:   | FileCheck --check-prefix=TEXT-RELOCS %s | 
|   19  |   19  | 
|   20 ; Use intrinsics to test external calls. |   20 ; Use intrinsics to test external calls. | 
|   21 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) |   21 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) | 
|   22 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) |   22 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1) | 
|   23  |   23  | 
|   24 ; Try other external functions (for cross tests). |   24 ; Try other external functions (for cross tests). | 
|   25 ; Not testing external global variables since the NaCl bitcode writer |   25 ; Not testing external global variables since the NaCl bitcode writer | 
|   26 ; refuses to freeze such IR. |   26 ; refuses to freeze such IR. | 
|   27 declare void @external_foo(i32) |   27 declare void @external_foo(i32) | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|   46 @double_zero_const = internal constant [8 x i8] zeroinitializer, align 32 |   46 @double_zero_const = internal constant [8 x i8] zeroinitializer, align 32 | 
|   47 @double_zero_const2 = internal constant [8 x i8] zeroinitializer, align 8 |   47 @double_zero_const2 = internal constant [8 x i8] zeroinitializer, align 8 | 
|   48  |   48  | 
|   49 ; Use float/double constants to test constant pools. |   49 ; Use float/double constants to test constant pools. | 
|   50 define internal float @returnFloatConst() { |   50 define internal float @returnFloatConst() { | 
|   51 entry: |   51 entry: | 
|   52   %f = fadd float -0.0, 0x3FF3AE1400000000 |   52   %f = fadd float -0.0, 0x3FF3AE1400000000 | 
|   53   ret float %f |   53   ret float %f | 
|   54 } |   54 } | 
|   55 ; TEXT-RELOCS-LABEL: returnFloatConst |   55 ; TEXT-RELOCS-LABEL: returnFloatConst | 
|   56 ; TEXT-RELOCS: movss |   56 ; TEXT-RELOCS: movss {{.*}} R_386_32 .L$float$0 | 
|   57 ; TEXT-RELOCS-NEXT: R_386_32 .L$float$0 |   57 ; TEXT-RELOCS: addss {{.*}} R_386_32 .L$float$1 | 
|   58 ; TEXT-RELOCS: addss |  | 
|   59 ; TEXT-RELOCS-NEXT: R_386_32 .L$float$1 |  | 
|   60  |   58  | 
|   61 define internal double @returnDoubleConst() { |   59 define internal double @returnDoubleConst() { | 
|   62 entry: |   60 entry: | 
|   63   %d = fadd double 0x7FFFFFFFFFFFFFFFF, 0xFFF7FFFFFFFFFFFF |   61   %d = fadd double 0x7FFFFFFFFFFFFFFFF, 0xFFF7FFFFFFFFFFFF | 
|   64   %d2 = fadd double %d, 0xFFF8000000000003 |   62   %d2 = fadd double %d, 0xFFF8000000000003 | 
|   65   ret double %d2 |   63   ret double %d2 | 
|   66 } |   64 } | 
|   67 ; TEXT-RELOCS-LABEL: returnDoubleConst |   65 ; TEXT-RELOCS-LABEL: returnDoubleConst | 
|   68 ; TEXT-RELOCS: movsd |   66 ; TEXT-RELOCS: movsd {{.*}} R_386_32 .L$double$0 | 
|   69 ; TEXT-RELOCS-NEXT: R_386_32 .L$double$0 |   67 ; TEXT-RELOCS: addsd {{.*}} R_386_32 .L$double$1 | 
|   70 ; TEXT-RELOCS: addsd |   68 ; TEXT-RELOCS: addsd {{.*}} R_386_32 .L$double$2 | 
|   71 ; TEXT-RELOCS-NEXT: R_386_32 .L$double$1 |  | 
|   72 ; TEXT-RELOCS: addsd |  | 
|   73 ; TEXT-RELOCS-NEXT: R_386_32 .L$double$2 |  | 
|   74  |   69  | 
|   75 ; Test intrinsics that call out to external functions. |   70 ; Test intrinsics that call out to external functions. | 
|   76 define internal void @test_memcpy(i32 %iptr_dst, i32 %len) { |   71 define internal void @test_memcpy(i32 %iptr_dst, i32 %len) { | 
|   77 entry: |   72 entry: | 
|   78   %dst = inttoptr i32 %iptr_dst to i8* |   73   %dst = inttoptr i32 %iptr_dst to i8* | 
|   79   %src = bitcast [7 x i8]* @bytes to i8* |   74   %src = bitcast [7 x i8]* @bytes to i8* | 
|   80   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, |   75   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, | 
|   81                                        i32 %len, i32 1, i1 false) |   76                                        i32 %len, i32 1, i1 false) | 
|   82   ret void |   77   ret void | 
|   83 } |   78 } | 
|   84 ; TEXT-RELOCS-LABEL: test_memcpy |   79 ; TEXT-RELOCS-LABEL: test_memcpy | 
|   85 ; TEXT-RELOCS: mov |   80 ; TEXT-RELOCS: mov {{.*}} R_386_32 bytes | 
|   86 ; TEXT-RELOCS: R_386_32 bytes |  | 
|   87  |   81  | 
|   88 define internal void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { |   82 define internal void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) { | 
|   89 entry: |   83 entry: | 
|   90   %val = trunc i32 %wide_val to i8 |   84   %val = trunc i32 %wide_val to i8 | 
|   91   %dst = inttoptr i32 %iptr_dst to i8* |   85   %dst = inttoptr i32 %iptr_dst to i8* | 
|   92   call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, |   86   call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val, | 
|   93                                   i32 %len, i32 1, i1 false) |   87                                   i32 %len, i32 1, i1 false) | 
|   94   ret void |   88   ret void | 
|   95 } |   89 } | 
|   96 ; TEXT-RELOCS-LABEL: test_memset |   90 ; TEXT-RELOCS-LABEL: test_memset | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
|  107   call void @external_foo(i32 42) |  101   call void @external_foo(i32 42) | 
|  108   ret void |  102   ret void | 
|  109 } |  103 } | 
|  110  |  104  | 
|  111 ; Test copying a function pointer, or a global data pointer. |  105 ; Test copying a function pointer, or a global data pointer. | 
|  112 define internal i32 @test_ret_fp() { |  106 define internal i32 @test_ret_fp() { | 
|  113   %r = ptrtoint float ()* @returnFloatConst to i32 |  107   %r = ptrtoint float ()* @returnFloatConst to i32 | 
|  114   ret i32 %r |  108   ret i32 %r | 
|  115 } |  109 } | 
|  116 ; TEXT-RELOCS-LABEL: test_ret_fp |  110 ; TEXT-RELOCS-LABEL: test_ret_fp | 
|  117 ; TEXT-RELOCS-NEXT: mov |  111 ; TEXT-RELOCS-NEXT: mov {{.*}} R_386_32 returnFloatConst | 
|  118 ; TEXT-RELOCS-NEXT: R_386_32 returnFloatConst |  | 
|  119  |  112  | 
|  120 define internal i32 @test_ret_global_pointer() { |  113 define internal i32 @test_ret_global_pointer() { | 
|  121   %r = ptrtoint [7 x i8]* @bytes to i32 |  114   %r = ptrtoint [7 x i8]* @bytes to i32 | 
|  122   ret i32 %r |  115   ret i32 %r | 
|  123 } |  116 } | 
|  124 ; TEXT-RELOCS-LABEL: test_ret_global_pointer |  117 ; TEXT-RELOCS-LABEL: test_ret_global_pointer | 
|  125 ; TEXT-RELOCS-NEXT: mov |  118 ; TEXT-RELOCS-NEXT: mov {{.*}} R_386_32 bytes | 
|  126 ; TEXT-RELOCS-NEXT: R_386_32 bytes |  | 
|  127  |  119  | 
|  128 ; Test defining a non-internal function. |  120 ; Test defining a non-internal function. | 
|  129 define void @_start(i32) { |  121 define void @_start(i32) { | 
|  130   %f = call float @returnFloatConst() |  122   %f = call float @returnFloatConst() | 
|  131   %d = call double @returnDoubleConst() |  123   %d = call double @returnDoubleConst() | 
|  132   call void @test_memcpy(i32 0, i32 99) |  124   call void @test_memcpy(i32 0, i32 99) | 
|  133   call void @test_memset(i32 0, i32 0, i32 99) |  125   call void @test_memset(i32 0, i32 0, i32 99) | 
|  134   %f2 = call float @test_call_internal() |  126   %f2 = call float @test_call_internal() | 
|  135   %p1 = call i32 @test_ret_fp() |  127   %p1 = call i32 @test_ret_fp() | 
|  136   %p2 = call i32 @test_ret_global_pointer() |  128   %p2 = call i32 @test_ret_global_pointer() | 
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  646 ; CHECK:        Symbol { |  638 ; CHECK:        Symbol { | 
|  647 ; CHECK:          Name: memset |  639 ; CHECK:          Name: memset | 
|  648 ; CHECK-NEXT:     Value: 0x0 |  640 ; CHECK-NEXT:     Value: 0x0 | 
|  649 ; CHECK-NEXT:     Size: 0 |  641 ; CHECK-NEXT:     Size: 0 | 
|  650 ; CHECK-NEXT:     Binding: Global |  642 ; CHECK-NEXT:     Binding: Global | 
|  651 ; CHECK-NEXT:     Type: None |  643 ; CHECK-NEXT:     Type: None | 
|  652 ; CHECK-NEXT:     Other: 0 |  644 ; CHECK-NEXT:     Other: 0 | 
|  653 ; CHECK-NEXT:     Section: Undefined |  645 ; CHECK-NEXT:     Section: Undefined | 
|  654 ; CHECK-NEXT:   } |  646 ; CHECK-NEXT:   } | 
|  655 ; CHECK: ] |  647 ; CHECK: ] | 
| OLD | NEW |