Clang Project

clang_source_code/test/CodeGenCXX/attr-target-mv-diff-ns.cpp
1// 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
4// 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
21// LINUX: @_Z3fooi.ifunc = ifunc i32 (i32), i32 (i32)* ()* @_Z3fooi.resolver
22// LINUX: @_ZN2ns3fooEi.ifunc = ifunc i32 (i32), i32 (i32)* ()* @_ZN2ns3fooEi.resolver
23
24// LINUX: define i32 @_Z3fooi.sse4.2(i32)
25// LINUX: ret i32 0
26// LINUX: define i32 @_Z3fooi.arch_ivybridge(i32)
27// LINUX: ret i32 1
28// LINUX: define i32 @_Z3fooi(i32)
29// LINUX: ret i32 2
30
31// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z.sse4.2"(i32)
32// WINDOWS: ret i32 0
33// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z.arch_ivybridge"(i32)
34// WINDOWS: ret i32 1
35// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z"(i32)
36// WINDOWS: ret i32 2
37
38// LINUX: define i32 @_ZN2ns3fooEi.sse4.2(i32)
39// LINUX: ret i32 0
40// LINUX: define i32 @_ZN2ns3fooEi.arch_ivybridge(i32)
41// LINUX: ret i32 1
42// LINUX: define i32 @_ZN2ns3fooEi(i32)
43// LINUX: ret i32 2
44
45// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z.sse4.2"(i32)
46// WINDOWS: ret i32 0
47// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z.arch_ivybridge"(i32)
48// WINDOWS: ret i32 1
49// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z"(i32)
50// WINDOWS: ret i32 2
51
52// 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
60// LINUX: define i32 (i32)* @_Z3fooi.resolver() comdat
61// 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
66// WINDOWS: define dso_local i32 @"?foo@@YAHH@Z.resolver"(i32) comdat
67// 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
72// LINUX: define i32 (i32)* @_ZN2ns3fooEi.resolver() comdat
73// 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
78// WINDOWS: define dso_local i32 @"?foo@ns@@YAHH@Z.resolver"(i32) comdat
79// 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)
89