1// 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 2 3// CHECK-DAG: @extern_var_global_module = external {{(dso_local )?}}global 4// CHECK-DAG: @inline_var_global_module = linkonce_odr {{(dso_local )?}}global 5// CHECK-DAG: @_ZL24static_var_global_module = internal global 6// CHECK-DAG: @_ZL23const_var_global_module = internal constant 7// 8// With strong-ownership, the module is mangled into exported symbols 9// that are attached to a named module. 10// CHECK-DAG: @_ZW6Module19extern_var_exported = external {{(dso_local )?}}global 11// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we 12// can discard this global and its initializer (if any), and other TUs are not 13// permitted to run the initializer for this variable. 14// CHECK-DAG: @_ZW6Module19inline_var_exported = linkonce_odr {{(dso_local )?}}global 15// CHECK-DAG: @_ZW6Module18const_var_exported = {{(dso_local )?}}constant 16// 17// CHECK-DAG: @_ZW6Module25extern_var_module_linkage = external {{(dso_local )?}}global 18// FIXME: Should this be 'weak_odr global'? Presumably it must be, since we 19// can discard this global and its initializer (if any), and other TUs are not 20// permitted to run the initializer for this variable. 21// CHECK-DAG: @_ZW6Module25inline_var_module_linkage = linkonce_odr {{(dso_local )?}}global 22// CHECK-DAG: @_ZW6Module25static_var_module_linkage = {{(dso_local )?}}global 23// CHECK-DAG: @_ZW6Module24const_var_module_linkage = {{(dso_local )?}}constant 24// 25// CHECK-DAG: @_ZW6Module25unused_var_module_linkage = {{(dso_local )?}}global i32 4 26// CHECK-DAG: @_ZW6Module32unused_static_var_module_linkage = {{(dso_local )?}}global i32 5 27// CHECK-DAG: @_ZW6Module31unused_const_var_module_linkage = {{(dso_local )?}}constant i32 7 28 29static void unused_static_global_module() {} 30static void used_static_global_module() {} 31 32inline void unused_inline_global_module() {} 33inline void used_inline_global_module() {} 34 35extern int extern_var_global_module; 36inline int inline_var_global_module; 37static int static_var_global_module; 38const int const_var_global_module = 3; 39 40// CHECK: define {{(dso_local )?}}void {{.*}}@_Z23noninline_global_modulev 41void noninline_global_module() { 42 // FIXME: This should be promoted to module linkage and given a 43 // module-mangled name, if it's called from an inline function within 44 // the module interface. 45 // (We should try to avoid this when it's not reachable from outside 46 // the module interface unit.) 47 // CHECK: define internal {{.*}}@_ZL25used_static_global_modulev 48 used_static_global_module(); 49 // CHECK: define linkonce_odr {{.*}}@_Z25used_inline_global_modulev 50 used_inline_global_module(); 51 52 (void)&extern_var_global_module; 53 (void)&inline_var_global_module; 54 (void)&static_var_global_module; 55 (void)&const_var_global_module; 56} 57 58export module Module; 59 60export { 61 inline void unused_inline_exported() {} 62 inline void used_inline_exported() {} 63 64 extern int extern_var_exported; 65 inline int inline_var_exported; 66 const int const_var_exported = 3; 67 68 // CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module18noninline_exportedv 69 void noninline_exported() { 70 (void)&extern_var_exported; 71 (void)&inline_var_exported; 72 (void)&const_var_exported; 73 } 74} 75 76// FIXME: Ideally we wouldn't emit this as its name is not visible outside this 77// TU, but this module interface might contain a template that can use this 78// function so we conservatively emit it for now. 79// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module28unused_static_module_linkagev 80static void unused_static_module_linkage() {} 81// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module26used_static_module_linkagev 82static void used_static_module_linkage() {} 83 84inline void unused_inline_module_linkage() {} 85inline void used_inline_module_linkage() {} 86 87extern int extern_var_module_linkage; 88inline int inline_var_module_linkage; 89static int static_var_module_linkage; 90const int const_var_module_linkage = 3; 91 92// CHECK: define {{(dso_local )?}}void {{.*}}@_ZW6Module24noninline_module_linkagev 93void noninline_module_linkage() { 94 used_static_module_linkage(); 95 // CHECK: define linkonce_odr {{.*}}@_ZW6Module26used_inline_module_linkagev 96 used_inline_module_linkage(); 97 98 (void)&extern_var_module_linkage; 99 (void)&inline_var_module_linkage; 100 (void)&static_var_module_linkage; 101 (void)&const_var_module_linkage; 102} 103 104int unused_var_module_linkage = 4; 105static int unused_static_var_module_linkage = 5; 106inline int unused_inline_var_module_linkage = 6; 107const int unused_const_var_module_linkage = 7; 108 109struct a { 110 struct b {}; 111 struct c {}; 112}; 113// CHECK: define {{(dso_local )?}}void @_ZW6Module1fNS_1a1bENS0_1cE( 114void f(a::b, a::c) {} 115