Auto merge of #122362 - Zoxc:rustc_driver_static_std, r= · rust-lang/rust@380a85b (original) (raw)

`@@ -57,7 +57,7 @@ use crate::errors::{

`

57

57

`RequiredPanicStrategy, RlibRequired, RustcLibRequired, TwoPanicRuntimes,

`

58

58

`};

`

59

59

``

60

``

`-

use rustc_data_structures::fx::FxHashMap;

`

``

60

`+

use rustc_data_structures::fx::{FxHashMap, FxHashSet};

`

61

61

`use rustc_hir::def_id::CrateNum;

`

62

62

`use rustc_middle::middle::dependency_format::{Dependencies, DependencyList, Linkage};

`

63

63

`use rustc_middle::ty::TyCtxt;

`

`@@ -156,25 +156,46 @@ fn calculate_type(tcx: TyCtxt<'_>, ty: CrateType) -> DependencyList {

`

156

156

`Linkage::Dynamic | Linkage::IncludedFromDylib => {}

`

157

157

`}

`

158

158

``

``

159

`+

let all_dylibs = || {

`

``

160

`+

tcx.crates(()).iter().filter(|&&cnum| {

`

``

161

`+

!tcx.dep_kind(cnum).macros_only() && tcx.used_crate_source(cnum).dylib.is_some()

`

``

162

`+

})

`

``

163

`+

};

`

``

164

+

``

165

`+

let mut upstream_in_dylibs = FxHashSet::default();

`

``

166

+

``

167

`+

if sess.opts.unstable_opts.prefer_deps_of_dynamic || tcx.features().rustc_private {

`

``

168

`+

// Find all libraries statically linked to upstream dylibs.

`

``

169

`+

for &cnum in all_dylibs() {

`

``

170

`+

let deps = tcx.dylib_dependency_formats(cnum);

`

``

171

`+

for &(depnum, style) in deps.iter() {

`

``

172

`+

if let RequireStatic = style {

`

``

173

`+

upstream_in_dylibs.insert(depnum);

`

``

174

`+

}

`

``

175

`+

}

`

``

176

`+

}

`

``

177

`+

}

`

``

178

+

159

179

`let mut formats = FxHashMap::default();

`

160

180

``

161

181

`// Sweep all crates for found dylibs. Add all dylibs, as well as their

`

162

182

`// dependencies, ensuring there are no conflicts. The only valid case for a

`

163

183

`// dependency to be relied upon twice is for both cases to rely on a dylib.

`

164

``

`-

for &cnum in tcx.crates(()).iter() {

`

165

``

`-

if tcx.dep_kind(cnum).macros_only() {

`

``

184

`+

for &cnum in all_dylibs() {

`

``

185

`+

if upstream_in_dylibs.contains(&cnum) {

`

``

186

`+

info!("skipping dylib: {}", tcx.crate_name(cnum));

`

``

187

`+

// If this dylib is also available statically linked to another dylib

`

``

188

`+

// we try to use that instead.

`

166

189

`continue;

`

167

190

`}

`

``

191

+

168

192

`let name = tcx.crate_name(cnum);

`

169

``

`-

let src = tcx.used_crate_source(cnum);

`

170

``

`-

if src.dylib.is_some() {

`

171

``

`-

info!("adding dylib: {}", name);

`

172

``

`-

add_library(tcx, cnum, RequireDynamic, &mut formats);

`

173

``

`-

let deps = tcx.dylib_dependency_formats(cnum);

`

174

``

`-

for &(depnum, style) in deps.iter() {

`

175

``

`-

info!("adding {:?}: {}", style, tcx.crate_name(depnum));

`

176

``

`-

add_library(tcx, depnum, style, &mut formats);

`

177

``

`-

}

`

``

193

`+

info!("adding dylib: {}", name);

`

``

194

`+

add_library(tcx, cnum, RequireDynamic, &mut formats);

`

``

195

`+

let deps = tcx.dylib_dependency_formats(cnum);

`

``

196

`+

for &(depnum, style) in deps.iter() {

`

``

197

`+

info!("adding {:?}: {}", style, tcx.crate_name(depnum));

`

``

198

`+

add_library(tcx, depnum, style, &mut formats);

`

178

199

`}

`

179

200

`}

`

180

201

``