1 // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
2 
3 // CHECK: @foo
4 
5 // Make sure we mangle overloadable, even in C system headers.
6 # 1 "somesystemheader.h" 1 3 4
7 // CHECK: @_Z2f0i
f0(int a)8 void __attribute__((__overloadable__)) f0(int a) {}
9 // CHECK: @_Z2f0l
f0(long b)10 void __attribute__((__overloadable__)) f0(long b) {}
11 
12 // CHECK: @bar
13 
14 // These should get merged.
15 void foo() __asm__("bar");
16 void foo2() __asm__("bar");
17 
18 int nux __asm__("foo");
19 extern float nux2 __asm__("foo");
20 
test()21 int test() {
22   foo();
23   foo2();
24 
25   return nux + nux2;
26 }
27 
28 
29 // Function becomes a variable.
30 void foo3() __asm__("var");
31 
test2()32 void test2() {
33   foo3();
34 }
35 int foo4 __asm__("var") = 4;
36 
37 
38 // Variable becomes a function
39 extern int foo5 __asm__("var2");
40 
test3()41 void test3() {
42   foo5 = 1;
43 }
44 
45 void foo6() __asm__("var2");
foo6()46 void foo6() {
47 }
48 
49 
50 
51 int foo7 __asm__("foo7") __attribute__((used));
52 float foo8 __asm__("foo7") = 42;
53 
54 // PR4412
55 int func(void);
56 extern int func (void) __asm__ ("FUNC");
57 
58 // CHECK: @FUNC
func(void)59 int func(void) {
60   return 42;
61 }
62 
63 // CHECK: @_Z4foo9Dv4_f
64 typedef __attribute__(( vector_size(16) )) float float4;
foo9(float4 f)65 void __attribute__((__overloadable__)) foo9(float4 f) {}
66 
67 // Intrinsic calls.
68 extern int llvm_cas(volatile int*, int, int)
69   __asm__("llvm.atomic.cmp.swap.i32.p0i32");
70 
foo10(volatile int * add,int from,int to)71 int foo10(volatile int* add, int from, int to) {
72   // CHECK: call i32 @llvm.atomic.cmp.swap.i32.p0i32
73   return llvm_cas(add, from, to);
74 }
75