| // RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck %s | |
| // CHECK: @foo | |
| // Make sure we mangle overloadable, even in C system headers. | |
| # 1 "somesystemheader.h" 1 3 4 | |
| // CHECK: @_Z2f0i | |
| void __attribute__((__overloadable__)) f0(int a) {} | |
| // CHECK: @_Z2f0l | |
| void __attribute__((__overloadable__)) f0(long b) {} | |
| // Unless it's unmarked. | |
| // CHECK: @f0 | |
| void f0(float b) {} | |
| // CHECK: @bar | |
| // These should get merged. | |
| void foo() __asm__("bar"); | |
| void foo2() __asm__("bar"); | |
| int nux __asm__("foo"); | |
| extern float nux2 __asm__("foo"); | |
| int test() { | |
| foo(); | |
| foo2(); | |
| return nux + nux2; | |
| } | |
| // Function becomes a variable. | |
| void foo3() __asm__("var"); | |
| void test2() { | |
| foo3(); | |
| } | |
| int foo4 __asm__("var") = 4; | |
| // Variable becomes a function | |
| extern int foo5 __asm__("var2"); | |
| void test3() { | |
| foo5 = 1; | |
| } | |
| void foo6() __asm__("var2"); | |
| void foo6() { | |
| } | |
| int foo7 __asm__("foo7") __attribute__((used)); | |
| float foo8 __asm__("foo7") = 42; | |
| // PR4412 | |
| int func(void); | |
| extern int func (void) __asm__ ("FUNC"); | |
| // CHECK: @FUNC | |
| int func(void) { | |
| return 42; | |
| } | |
| // CHECK: @_Z4foo9Dv4_f | |
| typedef __attribute__(( vector_size(16) )) float float4; | |
| void __attribute__((__overloadable__)) foo9(float4 f) {} | |
| // Intrinsic calls. | |
| extern int llvm_cas(volatile int*, int, int) | |
| __asm__("llvm.atomic.cmp.swap.i32.p0i32"); | |
| int foo10(volatile int* add, int from, int to) { | |
| // CHECK: call i32 @llvm.atomic.cmp.swap.i32.p0 | |
| return llvm_cas(add, from, to); | |
| } |