1c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg// RUN: %clang_cc1 -triple i386-pc-linux-gnu -emit-llvm -o - %s | FileCheck -check-prefix=CHECKBASIC %s
2c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg// RUN: %clang_cc1 -triple armv7a-eabi -mfloat-abi hard -emit-llvm -o - %s | FileCheck -check-prefix=CHECKCC %s
35e1e1f95c98b1add70c238093bbd5dc8d4f9c4e9Daniel Dunbar
45e1e1f95c98b1add70c238093bbd5dc8d4f9c4e9Daniel Dunbarint g0;
5c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg// CHECKBASIC: @g0 = common global i32 0
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines__thread int TL_WITH_ALIAS;
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECKBASIC-DAG: @TL_WITH_ALIAS = thread_local global i32 0, align 4
826994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenbergstatic int bar1 = 42;
9c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg// CHECKBASIC: @bar1 = internal global i32 42
1026994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenberg
115e1e1f95c98b1add70c238093bbd5dc8d4f9c4e9Daniel Dunbarextern int g1;
125e1e1f95c98b1add70c238093bbd5dc8d4f9c4e9Daniel Dunbarextern int g1 __attribute((alias("g0")));
1303954b3b6366223ed2ba85ed52ffe16c285142b7Rafael Espindola// CHECKBASIC-DAG: @g1 = alias i32* @g0
1426994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenberg
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesextern __thread int __libc_errno __attribute__ ((alias ("TL_WITH_ALIAS")));
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECKBASIC-DAG: @__libc_errno = thread_local alias i32* @TL_WITH_ALIAS
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
1826994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenbergvoid f0(void) { }
1926994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenbergextern void f1(void);
2026994a1c293e33bfa23d7c52e89a3e2eee31a976Alex Rosenbergextern void f1(void) __attribute((alias("f0")));
2103954b3b6366223ed2ba85ed52ffe16c285142b7Rafael Espindola// CHECKBASIC-DAG: @f1 = alias void ()* @f0
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECKBASIC-DAG: @test8_foo = weak alias bitcast (void ()* @test8_bar to void (...)*)
23c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECKBASIC-DAG: @test8_zed = alias bitcast (void ()* @test8_bar to void (...)*)
246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// CHECKBASIC-DAG: @test9_zed = alias void ()* @test9_bar
25c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKBASIC: define void @f0() [[NUW:#[0-9]+]] {
2682227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattner
2782227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattner// Make sure that aliases cause referenced values to be emitted.
2882227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattner// PR3200
2982227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattnerstatic inline int foo1() { return 0; }
3093ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECKBASIC-LABEL: define internal i32 @foo1()
3182227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattnerint foo() __attribute__((alias("foo1")));
3282227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattnerint bar() __attribute__((alias("bar1")));
3382227ff4eb665bbf41720ebdc0dc9215a86ba838Chris Lattner
3435f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattnerextern int test6();
3535f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattnervoid test7() { test6(); }  // test6 is emitted as extern.
3635f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattner
3735f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattner// test6 changes to alias.
3835f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattnerint test6() __attribute__((alias("test7")));
3935f6c136dd5201b87831dcdacc1eb4d2c2de0744Chris Lattner
40c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergstatic int inner(int a) { return 0; }
41c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergstatic int inner_weak(int a) { return 0; }
42c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergextern __typeof(inner) inner_a __attribute__((alias("inner")));
43c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergstatic __typeof(inner_weak) inner_weak_a __attribute__((weakref, alias("inner_weak")));
44c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg// CHECKCC: @inner_a = alias i32 (i32)* @inner
45c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKCC: define internal arm_aapcs_vfpcc i32 @inner(i32 %a) [[NUW:#[0-9]+]] {
46c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg
47c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergint outer(int a) { return inner(a); }
48c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKCC: define arm_aapcs_vfpcc i32 @outer(i32 %a) [[NUW]] {
49cbeda892668c7e7e8f0785bc72d96d28fe9ba8dfAlex Rosenberg// CHECKCC: call arm_aapcs_vfpcc  i32 @inner(i32 %{{.*}})
50c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenberg
51c857ce8b08397ed778928b8a000732ca90da2a8cAlex Rosenbergint outer_weak(int a) { return inner_weak_a(a); }
52c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKCC: define arm_aapcs_vfpcc i32 @outer_weak(i32 %a) [[NUW]] {
53cbeda892668c7e7e8f0785bc72d96d28fe9ba8dfAlex Rosenberg// CHECKCC: call arm_aapcs_vfpcc  i32 @inner_weak(i32 %{{.*}})
54c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKCC: define internal arm_aapcs_vfpcc i32 @inner_weak(i32 %a) [[NUW]] {
55f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
56c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKBASIC: attributes [[NUW]] = { nounwind{{.*}} }
57f7a9da053f5bd6c18450c1796d953b42c3b7ad3aBill Wendling
58c3af6799d4c8ec4b338236e4361c0795e9af890aBill Wendling// CHECKCC: attributes [[NUW]] = { nounwind{{.*}} }
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test8_bar() {}
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test8_foo() __attribute__((weak, alias("test8_bar")));
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid test8_zed() __attribute__((alias("test8_foo")));
636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test9_bar(void) { }
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test9_zed(void) __attribute__((section("test")));
666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid test9_zed(void) __attribute__((alias("test9_bar")));
67