blob: 3c47af9bb9ca3d750afb656ee9004cb124a24847 [file] [log] [blame]
Erich Keane19a8adc2018-10-25 18:57:19 +00001// RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefix=LINUX
2// RUN: %clang_cc1 -std=c++11 -triple x86_64-windows-pc -emit-llvm %s -o - | FileCheck %s --check-prefix=WINDOWS
3// Test ensures that this properly differentiates between types in different
Erich Keane281d20b2018-01-08 21:34:17 +00004// namespaces.
5int __attribute__((target("sse4.2"))) foo(int) { return 0; }
6int __attribute__((target("arch=sandybridge"))) foo(int);
7int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;}
8int __attribute__((target("default"))) foo(int) { return 2; }
9
10namespace ns {
11int __attribute__((target("sse4.2"))) foo(int) { return 0; }
12int __attribute__((target("arch=sandybridge"))) foo(int);
13int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;}
14int __attribute__((target("default"))) foo(int) { return 2; }
15}
16
17int bar() {
18 return foo(1) + ns::foo(2);
19}
20
Fangrui Song9ca1b942019-09-11 01:54:48 +000021// LINUX: @_Z3fooi.ifunc = weak_odr ifunc i32 (i32), i32 (i32)* ()* @_Z3fooi.resolver
22// LINUX: @_ZN2ns3fooEi.ifunc = weak_odr ifunc i32 (i32), i32 (i32)* ()* @_ZN2ns3fooEi.resolver
Erich Keane281d20b2018-01-08 21:34:17 +000023
Tim Northovera009a602019-08-03 14:28:34 +000024// LINUX: define i32 @_Z3fooi.sse4.2(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000025// LINUX: ret i32 0
Tim Northovera009a602019-08-03 14:28:34 +000026// LINUX: define i32 @_Z3fooi.arch_ivybridge(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000027// LINUX: ret i32 1
Tim Northovera009a602019-08-03 14:28:34 +000028// LINUX: define i32 @_Z3fooi(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000029// LINUX: ret i32 2
Erich Keane281d20b2018-01-08 21:34:17 +000030
Tim Northovera009a602019-08-03 14:28:34 +000031// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z.sse4.2"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000032// WINDOWS: ret i32 0
Tim Northovera009a602019-08-03 14:28:34 +000033// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z.arch_ivybridge"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000034// WINDOWS: ret i32 1
Tim Northovera009a602019-08-03 14:28:34 +000035// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000036// WINDOWS: ret i32 2
Erich Keane281d20b2018-01-08 21:34:17 +000037
Tim Northovera009a602019-08-03 14:28:34 +000038// LINUX: define i32 @_ZN2ns3fooEi.sse4.2(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000039// LINUX: ret i32 0
Tim Northovera009a602019-08-03 14:28:34 +000040// LINUX: define i32 @_ZN2ns3fooEi.arch_ivybridge(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000041// LINUX: ret i32 1
Tim Northovera009a602019-08-03 14:28:34 +000042// LINUX: define i32 @_ZN2ns3fooEi(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000043// LINUX: ret i32 2
Erich Keane281d20b2018-01-08 21:34:17 +000044
Tim Northovera009a602019-08-03 14:28:34 +000045// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z.sse4.2"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000046// WINDOWS: ret i32 0
Tim Northovera009a602019-08-03 14:28:34 +000047// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z.arch_ivybridge"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000048// WINDOWS: ret i32 1
Tim Northovera009a602019-08-03 14:28:34 +000049// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z"(i32 %0)
Erich Keane19a8adc2018-10-25 18:57:19 +000050// WINDOWS: ret i32 2
Erich Keane281d20b2018-01-08 21:34:17 +000051
Erich Keane19a8adc2018-10-25 18:57:19 +000052// LINUX: define i32 @_Z3barv()
53// LINUX: call i32 @_Z3fooi.ifunc(i32 1)
54// LINUX: call i32 @_ZN2ns3fooEi.ifunc(i32 2)
55
56// WINDOWS: define dso_local i32 @"?bar@@YAHXZ"()
57// WINDOWS: call i32 @"?foo@@YAHH@Z.resolver"(i32 1)
58// WINDOWS: call i32 @"?foo@ns@@YAHH@Z.resolver"(i32 2)
59
Fangrui Song9ca1b942019-09-11 01:54:48 +000060// LINUX: define weak_odr i32 (i32)* @_Z3fooi.resolver() comdat
Erich Keane19a8adc2018-10-25 18:57:19 +000061// LINUX: ret i32 (i32)* @_Z3fooi.arch_sandybridge
62// LINUX: ret i32 (i32)* @_Z3fooi.arch_ivybridge
63// LINUX: ret i32 (i32)* @_Z3fooi.sse4.2
64// LINUX: ret i32 (i32)* @_Z3fooi
65
Fangrui Song9ca1b942019-09-11 01:54:48 +000066// WINDOWS: define weak_odr dso_local i32 @"?foo@@YAHH@Z.resolver"(i32 %0) comdat
Erich Keane19a8adc2018-10-25 18:57:19 +000067// WINDOWS: call i32 @"?foo@@YAHH@Z.arch_sandybridge"(i32 %0)
68// WINDOWS: call i32 @"?foo@@YAHH@Z.arch_ivybridge"(i32 %0)
69// WINDOWS: call i32 @"?foo@@YAHH@Z.sse4.2"(i32 %0)
70// WINDOWS: call i32 @"?foo@@YAHH@Z"(i32 %0)
71
Fangrui Song9ca1b942019-09-11 01:54:48 +000072// LINUX: define weak_odr i32 (i32)* @_ZN2ns3fooEi.resolver() comdat
Erich Keane19a8adc2018-10-25 18:57:19 +000073// LINUX: ret i32 (i32)* @_ZN2ns3fooEi.arch_sandybridge
74// LINUX: ret i32 (i32)* @_ZN2ns3fooEi.arch_ivybridge
75// LINUX: ret i32 (i32)* @_ZN2ns3fooEi.sse4.2
76// LINUX: ret i32 (i32)* @_ZN2ns3fooEi
77
Fangrui Song9ca1b942019-09-11 01:54:48 +000078// WINDOWS: define weak_odr dso_local i32 @"?foo@ns@@YAHH@Z.resolver"(i32 %0) comdat
Erich Keane19a8adc2018-10-25 18:57:19 +000079// WINDOWS: call i32 @"?foo@ns@@YAHH@Z.arch_sandybridge"(i32 %0)
80// WINDOWS: call i32 @"?foo@ns@@YAHH@Z.arch_ivybridge"(i32 %0)
81// WINDOWS: call i32 @"?foo@ns@@YAHH@Z.sse4.2"(i32 %0)
82// WINDOWS: call i32 @"?foo@ns@@YAHH@Z"(i32 %0)
83
84// LINUX: declare i32 @_Z3fooi.arch_sandybridge(i32)
85// LINUX: declare i32 @_ZN2ns3fooEi.arch_sandybridge(i32)
86
87// WINDOWS: declare dso_local i32 @"?foo@@YAHH@Z.arch_sandybridge"(i32)
88// WINDOWS: declare dso_local i32 @"?foo@ns@@YAHH@Z.arch_sandybridge"(i32)