@@ -101,62 +101,42 @@ pub(crate) fn get_fn<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'t
101
101
let is_generic =
102
102
instance. args . non_erasable_generics ( tcx, instance. def_id ( ) ) . next ( ) . is_some ( ) ;
103
103
104
- if is_generic {
105
- // This is a monomorphization. Its expected visibility depends
106
- // on whether we are in share-generics mode.
107
-
108
- if cx . tcx . sess . opts . share_generics ( ) {
109
- // We are in share_generics mode.
110
-
104
+ let is_hidden = if is_generic {
105
+ // This is a monomorphization of a generic function.
106
+ if !cx . tcx . sess . opts . share_generics ( ) {
107
+ // When not sharing generics, all instances are in the same
108
+ // crate and have hidden visibility.
109
+ true
110
+ } else {
111
111
if let Some ( instance_def_id) = instance_def_id. as_local ( ) {
112
- // This is a definition from the current crate. If the
113
- // definition is unreachable for downstream crates or
114
- // the current crate does not re-export generics, the
115
- // definition of the instance will have been declared
116
- // as `hidden`.
117
- if cx. tcx . is_unreachable_local_definition ( instance_def_id)
112
+ // This is a monomorphization of a generic function
113
+ // defined in the current crate. It is hidden if:
114
+ // - the definition is unreachable for downstream
115
+ // crates, or
116
+ // - the current crate does not re-export generics
117
+ // (because the crate is a C library or executable)
118
+ cx. tcx . is_unreachable_local_definition ( instance_def_id)
118
119
|| !cx. tcx . local_crate_exports_generics ( )
119
- {
120
- llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
121
- }
122
120
} else {
123
121
// This is a monomorphization of a generic function
124
- // defined in an upstream crate.
125
- if instance. upstream_monomorphization ( tcx) . is_some ( ) {
126
- // This is instantiated in another crate. It cannot
127
- // be `hidden`.
128
- } else {
129
- // This is a local instantiation of an upstream definition.
130
- // If the current crate does not re-export it
131
- // (because it is a C library or an executable), it
132
- // will have been declared `hidden`.
133
- if !cx. tcx . local_crate_exports_generics ( ) {
134
- llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
135
- }
136
- }
122
+ // defined in an upstream crate. It is hidden if:
123
+ // - it is instantiated in this crate, and
124
+ // - the current crate does not re-export generics
125
+ instance. upstream_monomorphization ( tcx) . is_none ( )
126
+ && !cx. tcx . local_crate_exports_generics ( )
137
127
}
138
- } else {
139
- // When not sharing generics, all instances are in the same
140
- // crate and have hidden visibility
141
- llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
142
128
}
143
129
} else {
144
- // This is a non-generic function
145
- if cx. tcx . is_codegened_item ( instance_def_id) {
146
- // This is a function that is instantiated in the local crate
147
-
148
- if instance_def_id. is_local ( ) {
149
- // This is function that is defined in the local crate.
150
- // If it is not reachable, it is hidden.
151
- if !cx. tcx . is_reachable_non_generic ( instance_def_id) {
152
- llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
153
- }
154
- } else {
155
- // This is a function from an upstream crate that has
156
- // been instantiated here. These are always hidden.
157
- llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
158
- }
159
- }
130
+ // This is a non-generic function. It is hidden if:
131
+ // - it is instantiated in the local crate, and
132
+ // - it is defined an upstream crate (non-local), or
133
+ // - it is not reachable
134
+ cx. tcx . is_codegened_item ( instance_def_id)
135
+ && ( !instance_def_id. is_local ( )
136
+ || !cx. tcx . is_reachable_non_generic ( instance_def_id) )
137
+ } ;
138
+ if is_hidden {
139
+ llvm:: LLVMRustSetVisibility ( llfn, llvm:: Visibility :: Hidden ) ;
160
140
}
161
141
162
142
// MinGW: For backward compatibility we rely on the linker to decide whether it
0 commit comments