xref: /llvm-project/clang/test/CodeGenCXX/attr-target-mv-out-of-line-defs.cpp (revision 6c12fd91540fe2f86b5032b10f04b74910b4c411)
1 // RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=ITANIUM,LINUX
2 // RUN: %clang_cc1 -std=c++11 -triple x86_64-apple-macos -emit-llvm %s -o - | FileCheck %s --check-prefixes=ITANIUM,DARWIN
3 // RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefix=WINDOWS
4 struct S {
5   int __attribute__((target("sse4.2"))) foo(int);
6   int __attribute__((target("arch=sandybridge"))) foo(int);
7   int __attribute__((target("arch=ivybridge"))) foo(int);
8   int __attribute__((target("default"))) foo(int);
9 };
10 
foo(int)11 int __attribute__((target("default"))) S::foo(int) { return 2; }
foo(int)12 int __attribute__((target("sse4.2"))) S::foo(int) { return 0; }
foo(int)13 int __attribute__((target("arch=ivybridge"))) S::foo(int) { return 1; }
14 
bar()15 int bar() {
16   S s;
17   return s.foo(0);
18 }
19 
20 // DARWIN-NOT: comdat
21 
22 // ITANIUM: @_ZN1S3fooEi.ifunc = weak_odr ifunc i32 (ptr, i32), ptr @_ZN1S3fooEi.resolver
23 
24 // ITANIUM: define{{.*}} i32 @_ZN1S3fooEi(ptr {{[^,]*}} %this, i32 noundef %0)
25 // ITANIUM: ret i32 2
26 
27 // WINDOWS: define dso_local noundef i32 @"?foo@S@@QEAAHH@Z"(ptr {{[^,]*}} %this, i32 noundef %0)
28 // WINDOWS: ret i32 2
29 
30 // ITANIUM: define{{.*}} i32 @_ZN1S3fooEi.sse4.2(ptr {{[^,]*}} %this, i32 noundef %0)
31 // ITANIUM: ret i32 0
32 
33 // WINDOWS: define dso_local noundef i32 @"?foo@S@@QEAAHH@Z.sse4.2"(ptr {{[^,]*}} %this, i32 noundef %0)
34 // WINDOWS: ret i32 0
35 
36 // ITANIUM: define{{.*}} i32 @_ZN1S3fooEi.arch_ivybridge(ptr {{[^,]*}} %this, i32 noundef %0)
37 // ITANIUM: ret i32 1
38 
39 // WINDOWS: define dso_local noundef i32 @"?foo@S@@QEAAHH@Z.arch_ivybridge"(ptr {{[^,]*}} %this, i32 noundef %0)
40 // WINDOWS: ret i32 1
41 
42 // ITANIUM: define{{.*}} i32 @_Z3barv()
43 // ITANIUM: %s = alloca %struct.S, align 1
44 // ITANIUM: %call = call noundef i32 @_ZN1S3fooEi.ifunc(ptr {{[^,]*}} %s, i32 noundef 0)
45 
46 // WINDOWS: define dso_local noundef i32 @"?bar@@YAHXZ"()
47 // WINDOWS: %s = alloca %struct.S, align 1
48 // WINDOWS: %call = call noundef i32 @"?foo@S@@QEAAHH@Z.resolver"(ptr {{[^,]*}} %s, i32 noundef 0)
49 
50 // ITANIUM: define weak_odr ptr @_ZN1S3fooEi.resolver()
51 // LINUX-SAME: comdat
52 // ITANIUM: ret ptr @_ZN1S3fooEi.arch_sandybridge
53 // ITANIUM: ret ptr @_ZN1S3fooEi.arch_ivybridge
54 // ITANIUM: ret ptr @_ZN1S3fooEi.sse4.2
55 // ITANIUM: ret ptr @_ZN1S3fooEi
56 
57 // WINDOWS: define weak_odr dso_local i32 @"?foo@S@@QEAAHH@Z.resolver"(ptr %0, i32 %1) comdat
58 // WINDOWS: call i32 @"?foo@S@@QEAAHH@Z.arch_sandybridge"(ptr %0, i32 %1)
59 // WINDOWS: call i32 @"?foo@S@@QEAAHH@Z.arch_ivybridge"(ptr %0, i32 %1)
60 // WINDOWS: call i32 @"?foo@S@@QEAAHH@Z.sse4.2"(ptr %0, i32 %1)
61 // WINDOWS: call i32 @"?foo@S@@QEAAHH@Z"(ptr %0, i32 %1)
62 
63 // ITANIUM: declare noundef i32 @_ZN1S3fooEi.arch_sandybridge(ptr {{[^,]*}}, i32 noundef)
64 
65 // WINDOWS: declare dso_local noundef i32 @"?foo@S@@QEAAHH@Z.arch_sandybridge"(ptr {{[^,]*}}, i32 noundef)
66