11283e986SRichard Smith// RUN: %clang_cc1 -fmodules-ts %s -triple %itanium_abi_triple -emit-llvm -o - | FileCheck %s --implicit-check-not unused_inline --implicit-check-not unused_stastic_global_module 21283e986SRichard Smith 3922f2aa9SRafael Espindola// CHECK-DAG: @extern_var_global_module = external {{(dso_local )?}}global 4922f2aa9SRafael Espindola// CHECK-DAG: @inline_var_global_module = linkonce_odr {{(dso_local )?}}global 51283e986SRichard Smith// CHECK-DAG: @_ZL24static_var_global_module = internal global 61283e986SRichard Smith// CHECK-DAG: @_ZL23const_var_global_module = internal constant 71283e986SRichard Smith// 8*ae4dce86SNathan Sidwell// With strong-ownership, the module is mangled into exported symbols 9*ae4dce86SNathan Sidwell// that are attached to a named module. 10*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global 111283e986SRichard Smith// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we 121283e986SRichard Smith// can discard this global and its initializer (if any), and other TUs are not 131283e986SRichard Smith// permitted to run the initializer for this variable. 14*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global 15*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module18const_var_exported = {{(dso_local )?}}constant 161283e986SRichard Smith// 17*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global 181283e986SRichard Smith// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we 191283e986SRichard Smith// can discard this global and its initializer (if any), and other TUs are not 201283e986SRichard Smith// permitted to run the initializer for this variable. 21*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global 22*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25static_var_module_linkage = {{(dso_local )?}}global 23*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module24const_var_module_linkage = {{(dso_local )?}}constant 24cd4a7a46SRichard Smith// 25*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module25unused_var_module_linkage = {{(dso_local )?}}global i32 4 26*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module32unused_static_var_module_linkage = {{(dso_local )?}}global i32 5 27*ae4dce86SNathan Sidwell// CHECK-DAG: @_ZW6Module31unused_const_var_module_linkage = {{(dso_local )?}}constant i32 7 28b51cf113SRichard Smith 29b51cf113SRichard Smithstatic void unused_static_global_module() {} 30b51cf113SRichard Smithstatic void used_static_global_module() {} 311283e986SRichard Smith 32b51cf113SRichard Smithinline void unused_inline_global_module() {} 33b51cf113SRichard Smithinline void used_inline_global_module() {} 341283e986SRichard Smith 351283e986SRichard Smithextern int extern_var_global_module; 361283e986SRichard Smithinline int inline_var_global_module; 371283e986SRichard Smithstatic int static_var_global_module; 381283e986SRichard Smithconst int const_var_global_module = 3; 391283e986SRichard Smith 40922f2aa9SRafael Espindola// CHECK: define {{(dso_local )?}}void {{.*}}@_Z23noninline_global_modulev 41b51cf113SRichard Smithvoid noninline_global_module() { 42b51cf113SRichard Smith // FIXME: This should be promoted to module linkage and given a 43b51cf113SRichard Smith // module-mangled name, if it's called from an inline function within 44b51cf113SRichard Smith // the module interface. 45b51cf113SRichard Smith // (We should try to avoid this when it's not reachable from outside 46b51cf113SRichard Smith // the module interface unit.) 47b51cf113SRichard Smith // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev 48b51cf113SRichard Smith used_static_global_module(); 49b51cf113SRichard Smith // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev 50b51cf113SRichard Smith used_inline_global_module(); 511283e986SRichard Smith 521283e986SRichard Smith (void)&extern_var_global_module; 531283e986SRichard Smith (void)&inline_var_global_module; 541283e986SRichard Smith (void)&static_var_global_module; 551283e986SRichard Smith (void)&const_var_global_module; 56b51cf113SRichard Smith} 57b51cf113SRichard Smith 58b51cf113SRichard Smithexport module Module; 59b51cf113SRichard Smith 60b51cf113SRichard Smithexport { 61b51cf113SRichard Smith inline void unused_inline_exported() {} 62b51cf113SRichard Smith inline void used_inline_exported() {} 631283e986SRichard Smith 641283e986SRichard Smith extern int extern_var_exported; 651283e986SRichard Smith inline int inline_var_exported; 661283e986SRichard Smith const int const_var_exported = 3; 671283e986SRichard Smith 68*ae4dce86SNathan Sidwell // CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module18noninline_exportedv 69b51cf113SRichard Smith void noninline_exported() { 701283e986SRichard Smith (void)&extern_var_exported; 711283e986SRichard Smith (void)&inline_var_exported; 721283e986SRichard Smith (void)&const_var_exported; 73b51cf113SRichard Smith } 74b51cf113SRichard Smith} 75b51cf113SRichard Smith 761283e986SRichard Smith// FIXME: Ideally we wouldn't emit this as its name is not visible outside this 771283e986SRichard Smith// TU, but this module interface might contain a template that can use this 781283e986SRichard Smith// function so we conservatively emit it for now. 79*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module28unused_static_module_linkagev 80b51cf113SRichard Smithstatic void unused_static_module_linkage() {} 81*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module26used_static_module_linkagev 82b51cf113SRichard Smithstatic void used_static_module_linkage() {} 831283e986SRichard Smith 84b51cf113SRichard Smithinline void unused_inline_module_linkage() {} 85b51cf113SRichard Smithinline void used_inline_module_linkage() {} 861283e986SRichard Smith 871283e986SRichard Smithextern int extern_var_module_linkage; 881283e986SRichard Smithinline int inline_var_module_linkage; 891283e986SRichard Smithstatic int static_var_module_linkage; 901283e986SRichard Smithconst int const_var_module_linkage = 3; 911283e986SRichard Smith 92*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module24noninline_module_linkagev 93b51cf113SRichard Smithvoid noninline_module_linkage() { 94b51cf113SRichard Smith used_static_module_linkage(); 95*ae4dce86SNathan Sidwell // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev 96b51cf113SRichard Smith used_inline_module_linkage(); 971283e986SRichard Smith 981283e986SRichard Smith (void)&extern_var_module_linkage; 991283e986SRichard Smith (void)&inline_var_module_linkage; 1001283e986SRichard Smith (void)&static_var_module_linkage; 1011283e986SRichard Smith (void)&const_var_module_linkage; 102b51cf113SRichard Smith} 103dd8b5337SRichard Smith 104cd4a7a46SRichard Smithint unused_var_module_linkage = 4; 105cd4a7a46SRichard Smithstatic int unused_static_var_module_linkage = 5; 106cd4a7a46SRichard Smithinline int unused_inline_var_module_linkage = 6; 107cd4a7a46SRichard Smithconst int unused_const_var_module_linkage = 7; 108cd4a7a46SRichard Smith 109dd8b5337SRichard Smithstruct a { 110dd8b5337SRichard Smith struct b {}; 111dd8b5337SRichard Smith struct c {}; 112dd8b5337SRichard Smith}; 113*ae4dce86SNathan Sidwell// CHECK: define {{(dso_local )?}}void @_ZW6Module1fNS_1a1bENS0_1cE( 114dd8b5337SRichard Smithvoid f(a::b, a::c) {} 115