diff options
author | rdivacky <rdivacky@FreeBSD.org> | 2009-11-05 17:18:09 +0000 |
---|---|---|
committer | rdivacky <rdivacky@FreeBSD.org> | 2009-11-05 17:18:09 +0000 |
commit | b3a51061b1b9c4add078237850649f7c9efb13ab (patch) | |
tree | 8b316eca843681b024034db1125707173b9adb4a /test/CodeGenCXX/virt.cpp | |
parent | b6d5e15aae202f157c6cd63da8fa4b089e7b31e9 (diff) | |
download | FreeBSD-src-b3a51061b1b9c4add078237850649f7c9efb13ab.zip FreeBSD-src-b3a51061b1b9c4add078237850649f7c9efb13ab.tar.gz |
Update clang to r86140.
Diffstat (limited to 'test/CodeGenCXX/virt.cpp')
-rw-r--r-- | test/CodeGenCXX/virt.cpp | 112 |
1 files changed, 67 insertions, 45 deletions
diff --git a/test/CodeGenCXX/virt.cpp b/test/CodeGenCXX/virt.cpp index 7911940..193a96d 100644 --- a/test/CodeGenCXX/virt.cpp +++ b/test/CodeGenCXX/virt.cpp @@ -48,9 +48,11 @@ public: void F::foo() { } int j; +void *vp; void test2() { F f; static int sz = (char *)(&f.f) - (char *)(&f); + vp = &sz; j = sz; // FIXME: These should result in a frontend constant a la fold, no run time // initializer @@ -91,50 +93,6 @@ int main() { // CHECK-LP64: movl $1, 12(%rax) // CHECK-LP64: movl $2, 8(%rax) -// FIXME: This is the wrong thunk, but until these issues are fixed, better -// than nothing. -// CHECK-LP64: __ZTcvn16_n72_v16_n32_N8test16_D4foo1Ev: -// CHECK-LP64-NEXT:Leh_func_begin43: -// CHECK-LP64-NEXT: subq $24, %rsp -// CHECK-LP64-NEXT:Llabel43: -// CHECK-LP64-NEXT: movq %rdi, %rax -// CHECK-LP64-NEXT: movq %rax, 8(%rsp) -// CHECK-LP64-NEXT: movq 8(%rsp), %rax -// CHECK-LP64-NEXT: movq %rax, %rcx -// CHECK-LP64-NEXT: movabsq $-16, %rdx -// CHECK-LP64-NEXT: addq %rdx, %rcx -// CHECK-LP64-NEXT: movq -16(%rax), %rax -// CHECK-LP64-NEXT: movq -72(%rax), %rax -// CHECK-LP64-NEXT: addq %rax, %rcx -// CHECK-LP64-NEXT: movq %rcx, %rax -// CHECK-LP64-NEXT: movq %rax, %rdi -// CHECK-LP64-NEXT: call __ZTch0_v16_n32_N8test16_D4foo1Ev -// CHECK-LP64-NEXT: movq %rax, 16(%rsp) -// CHECK-LP64-NEXT: movq 16(%rsp), %rax -// CHECK-LP64-NEXT: addq $24, %rsp -// CHECK-LP64-NEXT: ret - -// CHECK-LP64: __ZTch0_v16_n32_N8test16_D4foo1Ev: -// CHECK-LP64-NEXT:Leh_func_begin44: -// CHECK-LP64-NEXT: subq $24, %rsp -// CHECK-LP64-NEXT:Llabel44: -// CHECK-LP64-NEXT: movq %rdi, %rax -// CHECK-LP64-NEXT: movq %rax, 8(%rsp) -// CHECK-LP64-NEXT: movq 8(%rsp), %rax -// CHECK-LP64-NEXT: movq %rax, %rdi -// CHECK-LP64-NEXT: call __ZN8test16_D4foo1Ev -// CHECK-LP64-NEXT: movq %rax, %rcx -// CHECK-LP64-NEXT: movabsq $16, %rdx -// CHECK-LP64-NEXT: addq %rdx, %rcx -// CHECK-LP64-NEXT: movq 16(%rax), %rax -// CHECK-LP64-NEXT: movq -32(%rax), %rax -// CHECK-LP64-NEXT: addq %rax, %rcx -// CHECK-LP64-NEXT: movq %rcx, %rax -// CHECK-LP64-NEXT: movq %rax, 16(%rsp) -// CHECK-LP64-NEXT: movq 16(%rsp), %rax -// CHECK-LP64-NEXT: addq $24, %rsp -// CHECK-LP64-NEXT: ret - struct test12_A { virtual void foo0() { } virtual void foo(); @@ -207,6 +165,7 @@ void test12_foo() { // CHECK-LPOPT64-NEXT: movq _test12_pa(%rip), %rdi // CHECK-LPOPT64-NEXT: call __ZN8test12_A3fooEv + struct test6_B2 { virtual void funcB2(); char b[1000]; }; struct test6_B1 : virtual test6_B2 { virtual void funcB1(); }; @@ -1003,9 +962,12 @@ virtual void foo_B2() { } }; struct test16_D : test16_NV1, virtual test16_B2 { - virtual test16_D *foo1() { return 0; } + virtual void bar(); + virtual test16_D *foo1(); }; +void test16_D::bar() { } + // CHECK-LP64: __ZTV8test16_D: // CHECK-LP64-NEXT: .quad 32 // CHECK-LP64-NEXT: .quad 16 @@ -1013,6 +975,7 @@ struct test16_D : test16_NV1, virtual test16_B2 { // CHECK-LP64-NEXT: .quad __ZTI8test16_D // CHECK-LP64-NEXT: .quad __ZN10test16_NV16fooNV1Ev // CHECK-LP64-NEXT: .quad __ZN10test16_NV17foo_NV1Ev +// CHECK-LP64-NEXT: .quad __ZN8test16_D3barEv // CHECK-LP64-NEXT: .quad __ZN8test16_D4foo1Ev // CHECK-LP64-NEXT: .space 8 // CHECK-LP64-NEXT: .space 8 @@ -1056,6 +1019,7 @@ struct test16_D : test16_NV1, virtual test16_B2 { // CHECK-LP32-NEXT: .long __ZTI8test16_D // CHECK-LP32-NEXT: .long __ZN10test16_NV16fooNV1Ev // CHECK-LP32-NEXT: .long __ZN10test16_NV17foo_NV1Ev +// CHECK-LP32-NEXT: .long __ZN8test16_D3barEv // CHECK-LP32-NEXT: .long __ZN8test16_D4foo1Ev // CHECK-LP32-NEXT: .space 4 // CHECK-LP32-NEXT: .space 4 @@ -1093,6 +1057,37 @@ struct test16_D : test16_NV1, virtual test16_B2 { // CHECK-LP32-NEXT: .long __ZN10test16_NV28foo_NV2bEv +// FIXME: This is the wrong thunk, but until these issues are fixed, better +// than nothing. +// CHECK-LPOPT64: __ZTcvn16_n72_v16_n32_N8test16_D4foo1Ev: +// CHECK-LPOPT64-NEXT:Leh_func_begin +// CHECK-LPOPT64-NEXT: subq $8, %rsp +// CHECK-LPOPT64-NEXT:Llabel +// CHECK-LPOPT64-NEXT: movq -16(%rdi), %rax +// CHECK-LPOPT64-NEXT: movq -72(%rax), %rax +// CHECK-LPOPT64-NEXT: leaq -16(%rax,%rdi), %rdi +// FIXME: We want a tail call here +// CHECK-LPOPT64-NEXT: call __ZTch0_v16_n32_N8test16_D4foo1Ev +// CHECK-LPOPT64-NEXT: addq $8, %rsp +// CHECK-LPOPT64-NEXT: ret + +// CHECK-LPOPT64: __ZTch0_v16_n32_N8test16_D4foo1Ev: +// CHECK-LPOPT64-NEXT:Leh_func_begin +// CHECK-LPOPT64-NEXT: subq $8, %rsp +// CHECK-LPOPT64-NEXT:Llabel +// CHECK-LPOPT64-NEXT: call __ZN8test16_D4foo1Ev +// CHECK-LPOPT64-NEXT: testq %rax, %rax +// CHECK-LPOPT64-NEXT: je LBB102_2 +// CHECK-LPOPT64-NEXT: movq 16(%rax), %rcx +// CHECK-LPOPT64-NEXT: movq -32(%rcx), %rcx +// CHECK-LPOPT64-NEXT: leaq 16(%rcx,%rax), %rax +// CHECK-LPOPT64-NEXT: addq $8, %rsp +// CHECK-LPOPT64-NEXT: ret +// CHECK-LPOPT64-NEXT:LBB102_2: +// CHECK-LPOPT64-NEXT: addq $8, %rsp +// CHECK-LPOPT64-NEXT: ret + + class test17_B1 { virtual void foo() = 0; virtual void bar() { } @@ -1237,6 +1232,33 @@ struct test19_D : virtual test19_B4 { // CHECK-LP64-NEXT .quad __ZN9test19_B43fB4Ev +class test20_V { + virtual void foo1(); +}; +class test20_V1 { + virtual void foo2(); +}; +class test20_B : virtual test20_V { +} b; +class test20_B1 : virtual test20_V1 { +}; +class test20_D : public test20_B, public test20_B1 { +} d; + +// CHECK-LP64: __ZTV8test20_D: +// CHECK-LP64-NEXT: .quad 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad __ZTI8test20_D +// CHECK-LP64-NEXT: .quad __ZN8test20_V4foo1Ev +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .space 8 +// CHECK-LP64-NEXT: .quad 18446744073709551608 +// CHECK-LP64-NEXT: .quad __ZTI8test20_D +// CHECK-LP64-NEXT: .quad __ZN9test20_V14foo2Ev + + // CHECK-LP64: __ZTV1B: // CHECK-LP64-NEXT: .space 8 |