1 // 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. 4 int __attribute__((target("sse4.2"))) foo(int) { return 0; } 5 int __attribute__((target("arch=sandybridge"))) foo(int); 6 int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;} 7 int __attribute__((target("default"))) foo(int) { return 2; } 8 9 namespace ns { 10 int __attribute__((target("sse4.2"))) foo(int) { return 0; } 11 int __attribute__((target("arch=sandybridge"))) foo(int); 12 int __attribute__((target("arch=ivybridge"))) foo(int) {return 1;} 13 int __attribute__((target("default"))) foo(int) { return 2; } 14 } 15 16 int 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 41 // CHECK: define i32 (i32)* @_Z3fooi.resolver() comdat 42 // 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 // 47 // CHECK: define i32 (i32)* @_ZN2ns3fooEi.resolver() comdat 48 // 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) 55