blob: 4dc2b67b4644459ecf8448256eaa6408a93ed22a [file] [log] [blame]
Erich Keane281d20b2018-01-08 21:34:17 +00001// RUN: %clang_cc1 -std=c++11 -triple x86_64-linux-gnu -emit-llvm %s -o - | FileCheck %s
2// Test ensures that this properly differentiates between types in different
3// namespaces.
4int __attribute__((target("sse4.2"))) foo(int) { return 0; }
5int __attribute__((target("arch=sandybridge"))) foo(int);
6int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;}
7int __attribute__((target("default"))) foo(int) { return 2; }
8
9namespace ns {
10int __attribute__((target("sse4.2"))) foo(int) { return 0; }
11int __attribute__((target("arch=sandybridge"))) foo(int);
12int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;}
13int __attribute__((target("default"))) foo(int) { return 2; }
14}
15
16int bar() {
17 return foo(1) + ns::foo(2);
18}
19
20// CHECK: @_Z3fooi.ifunc = ifunc i32 (i32), i32 (i32)* ()* @_Z3fooi.resolver
21// CHECK: @_ZN2ns3fooEi.ifunc = ifunc i32 (i32), i32 (i32)* ()* @_ZN2ns3fooEi.resolver
22
23// CHECK: define i32 @_Z3fooi.sse4.2(i32)
24// CHECK: ret i32 0
25// CHECK: define i32 @_Z3fooi.arch_ivybridge(i32)
26// CHECK: ret i32 1
27// CHECK: define i32 @_Z3fooi(i32)
28// CHECK: ret i32 2
29
30// CHECK: define i32 @_ZN2ns3fooEi.sse4.2(i32)
31// CHECK: ret i32 0
32// CHECK: define i32 @_ZN2ns3fooEi.arch_ivybridge(i32)
33// CHECK: ret i32 1
34// CHECK: define i32 @_ZN2ns3fooEi(i32)
35// CHECK: ret i32 2
36
37// CHECK: define i32 @_Z3barv()
38// CHECK: call i32 @_Z3fooi.ifunc(i32 1)
39// CHECK: call i32 @_ZN2ns3fooEi.ifunc(i32 2)
40
Erich Keane0a6fde42018-01-16 19:49:52 +000041// CHECK: define i32 (i32)* @_Z3fooi.resolver() comdat
Erich Keane281d20b2018-01-08 21:34:17 +000042// CHECK: ret i32 (i32)* @_Z3fooi.arch_sandybridge
43// CHECK: ret i32 (i32)* @_Z3fooi.arch_ivybridge
44// CHECK: ret i32 (i32)* @_Z3fooi.sse4.2
45// CHECK: ret i32 (i32)* @_Z3fooi
46//
Erich Keane0a6fde42018-01-16 19:49:52 +000047// CHECK: define i32 (i32)* @_ZN2ns3fooEi.resolver() comdat
Erich Keane281d20b2018-01-08 21:34:17 +000048// CHECK: ret i32 (i32)* @_ZN2ns3fooEi.arch_sandybridge
49// CHECK: ret i32 (i32)* @_ZN2ns3fooEi.arch_ivybridge
50// CHECK: ret i32 (i32)* @_ZN2ns3fooEi.sse4.2
51// CHECK: ret i32 (i32)* @_ZN2ns3fooEi
52
53// CHECK: declare i32 @_Z3fooi.arch_sandybridge(i32)
54// CHECK: declare i32 @_ZN2ns3fooEi.arch_sandybridge(i32)