1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s
2524ed953823ee605793c93452a2f86e4a7c4a2feDaniel Dunbar
34e274e955451632e6ba287bb03fb7a7840c3505eRafael Espindola// CHECK: @foo
4524ed953823ee605793c93452a2f86e4a7c4a2feDaniel Dunbar
5457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor// Make sure we mangle overloadable, even in C system headers.
6524ed953823ee605793c93452a2f86e4a7c4a2feDaniel Dunbar# 1 "somesystemheader.h" 1 3 4
7457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor// CHECK: @_Z2f0i
8524ed953823ee605793c93452a2f86e4a7c4a2feDaniel Dunbarvoid __attribute__((__overloadable__)) f0(int a) {}
9457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor// CHECK: @_Z2f0l
10524ed953823ee605793c93452a2f86e4a7c4a2feDaniel Dunbarvoid __attribute__((__overloadable__)) f0(long b) {}
11ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner
124e274e955451632e6ba287bb03fb7a7840c3505eRafael Espindola// CHECK: @bar
13ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner
14ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner// These should get merged.
15ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattnervoid foo() __asm__("bar");
16ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattnervoid foo2() __asm__("bar");
17ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner
18ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattnerint nux __asm__("foo");
19ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattnerextern float nux2 __asm__("foo");
20ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner
21ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattnerint test() {
22ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner  foo();
23ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner  foo2();
24ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner
25ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner  return nux + nux2;
26ca3f25c1fb9bbf0d807985baee460670b7f195b4Chris Lattner}
27570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner
28570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner
29570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner// Function becomes a variable.
30570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattnervoid foo3() __asm__("var");
31570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner
32570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattnervoid test2() {
33570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner  foo3();
34570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner}
35570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattnerint foo4 __asm__("var") = 4;
36570585c91dee98d7ba8ccf1198c03208ba17966bChris Lattner
370558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner
380558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner// Variable becomes a function
390558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattnerextern int foo5 __asm__("var2");
400558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner
410558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattnervoid test3() {
420558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner  foo5 = 1;
430558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner}
440558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner
450558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattnervoid foo6() __asm__("var2");
460558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattnervoid foo6() {
470558e79840bfdbbd38c6e2b4f6765bf0158e85f4Chris Lattner}
4835f38a2c22d68c22e2dbe8e9ee84c120c8f327bbChris Lattner
4935f38a2c22d68c22e2dbe8e9ee84c120c8f327bbChris Lattner
5035f38a2c22d68c22e2dbe8e9ee84c120c8f327bbChris Lattner
5135f38a2c22d68c22e2dbe8e9ee84c120c8f327bbChris Lattnerint foo7 __asm__("foo7") __attribute__((used));
5235f38a2c22d68c22e2dbe8e9ee84c120c8f327bbChris Lattnerfloat foo8 __asm__("foo7") = 42;
53457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor
54457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor// PR4412
55457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregorint func(void);
56457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregorextern int func (void) __asm__ ("FUNC");
57457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor
584e274e955451632e6ba287bb03fb7a7840c3505eRafael Espindola// CHECK: @FUNC
59457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregorint func(void) {
60457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor  return 42;
61457e2815d43fa68f7ff7cd2f7e9d1bf7b6fdc653Douglas Gregor}
620e5f067da58e43aa9bdfd1317283b52d4beeb19aNick Lewycky
630e5f067da58e43aa9bdfd1317283b52d4beeb19aNick Lewycky// CHECK: @_Z4foo9Dv4_f
640e5f067da58e43aa9bdfd1317283b52d4beeb19aNick Lewyckytypedef __attribute__(( vector_size(16) )) float float4;
650e5f067da58e43aa9bdfd1317283b52d4beeb19aNick Lewyckyvoid __attribute__((__overloadable__)) foo9(float4 f) {}
666931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne
676931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne// Intrinsic calls.
686931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourneextern int llvm_cas(volatile int*, int, int)
696931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne  __asm__("llvm.atomic.cmp.swap.i32.p0i32");
706931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne
716931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourneint foo10(volatile int* add, int from, int to) {
726931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne  // CHECK: call i32 @llvm.atomic.cmp.swap.i32.p0i32
736931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne  return llvm_cas(add, from, to);
746931743e29845d66d919a83db5a7b734f57ffdf2Peter Collingbourne}
75