1*67e74705SXin Li // RUN: %clang_cc1 < %s -triple i386-mingw32 -fms-extensions -emit-llvm -x c++ | FileCheck %s 2*67e74705SXin Li 3*67e74705SXin Li // optnone wins over inlinehint. 4*67e74705SXin Li // Test that both func1 and func2 are marked optnone and noinline. 5*67e74705SXin Li 6*67e74705SXin Li // Definition with both optnone and inlinehint. 7*67e74705SXin Li __attribute__((optnone)) func1(int a)8*67e74705SXin Liinline int func1(int a) { 9*67e74705SXin Li return a + a + a + a; 10*67e74705SXin Li } 11*67e74705SXin Li // CHECK: @_Z5func1i({{.*}}) [[OPTNONE:#[0-9]+]] 12*67e74705SXin Li 13*67e74705SXin Li // optnone declaration, inlinehint definition. 14*67e74705SXin Li __attribute__((optnone)) 15*67e74705SXin Li int func2(int a); 16*67e74705SXin Li func2(int a)17*67e74705SXin Liinline int func2(int a) { 18*67e74705SXin Li return a + a + a + a; 19*67e74705SXin Li } 20*67e74705SXin Li // CHECK: @_Z5func2i({{.*}}) [[OPTNONE]] 21*67e74705SXin Li 22*67e74705SXin Li // Keep alive the definitions of func1 and func2. foo()23*67e74705SXin Liint foo() { 24*67e74705SXin Li int val = func1(1); 25*67e74705SXin Li return val + func2(2); 26*67e74705SXin Li } 27*67e74705SXin Li 28*67e74705SXin Li // optnone wins over minsize. 29*67e74705SXin Li __attribute__((optnone)) 30*67e74705SXin Li int func3(int a); 31*67e74705SXin Li 32*67e74705SXin Li __attribute__((minsize)) func3(int a)33*67e74705SXin Liint func3(int a) { 34*67e74705SXin Li return a + a + a + a; 35*67e74705SXin Li } 36*67e74705SXin Li // Same attribute set as everything else, therefore no 'minsize'. 37*67e74705SXin Li // CHECK: @_Z5func3i({{.*}}) [[OPTNONE]] 38*67e74705SXin Li 39*67e74705SXin Li 40*67e74705SXin Li // Verify that noreturn is compatible with optnone. 41*67e74705SXin Li __attribute__((noreturn)) 42*67e74705SXin Li extern void exit_from_function(); 43*67e74705SXin Li 44*67e74705SXin Li __attribute__((noreturn)) __attribute((optnone)) noreturn_function(int a)45*67e74705SXin Liextern void noreturn_function(int a) { exit_from_function(); } 46*67e74705SXin Li // CHECK: @_Z17noreturn_functioni({{.*}}) [[NORETURN:#[0-9]+]] 47*67e74705SXin Li 48*67e74705SXin Li 49*67e74705SXin Li // Verify that __declspec(noinline) is compatible with optnone. 50*67e74705SXin Li __declspec(noinline) __attribute__((optnone)) func4()51*67e74705SXin Livoid func4() { return; } 52*67e74705SXin Li // CHECK: @_Z5func4v() [[OPTNONE]] 53*67e74705SXin Li 54*67e74705SXin Li __declspec(noinline) 55*67e74705SXin Li extern void func5(); 56*67e74705SXin Li 57*67e74705SXin Li __attribute__((optnone)) func5()58*67e74705SXin Livoid func5() { return; } 59*67e74705SXin Li // CHECK: @_Z5func5v() [[OPTNONE]] 60*67e74705SXin Li 61*67e74705SXin Li 62*67e74705SXin Li // Verify also that optnone can be used on dllexport functions. 63*67e74705SXin Li // Adding attribute optnone on a dllimport function has no effect. 64*67e74705SXin Li 65*67e74705SXin Li __attribute__((dllimport)) 66*67e74705SXin Li __attribute__((optnone)) 67*67e74705SXin Li int imported_optnone_func(int a); 68*67e74705SXin Li 69*67e74705SXin Li __attribute__((dllexport)) 70*67e74705SXin Li __attribute__((optnone)) exported_optnone_func(int a)71*67e74705SXin Liint exported_optnone_func(int a) { 72*67e74705SXin Li return imported_optnone_func(a); // use of imported func 73*67e74705SXin Li } 74*67e74705SXin Li // CHECK: @_Z21exported_optnone_funci({{.*}}) [[OPTNONE]] 75*67e74705SXin Li // CHECK: declare dllimport {{.*}} @_Z21imported_optnone_funci({{.*}}) [[DLLIMPORT:#[0-9]+]] 76*67e74705SXin Li 77*67e74705SXin Li 78*67e74705SXin Li // CHECK: attributes [[OPTNONE]] = { noinline {{.*}} optnone 79*67e74705SXin Li // CHECK: attributes [[NORETURN]] = { noinline noreturn {{.*}} optnone 80*67e74705SXin Li 81*67e74705SXin Li // CHECK: attributes [[DLLIMPORT]] = 82*67e74705SXin Li // CHECK-NOT: optnone 83