Skip to content

Commit 45060c2

Browse files
committedAug 15, 2020
Auto merge of #75549 - tmandry:rollup-sxjwa0w, r=tmandry
Rollup of 4 pull requests Successful merges: - #75376 (Set CMAKE_SYSTEM_NAME when cross-compiling) - #75448 (merge `as_local_hir_id` with `local_def_id_to_hir_id`) - #75513 (Recover gracefully from `struct` parse errors) - #75545 (std/sys/unix/time: make it easier for LLVM to optimize `Instant` subtraction.) Failed merges: - #75514 (Replaced `log` with `tracing`) r? @ghost
2 parents 668a34e + 29a9462 commit 45060c2

File tree

89 files changed

+281
-271
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+281
-271
lines changed
 

‎library/std/src/sys/unix/time.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,29 @@ impl Timespec {
2020

2121
fn sub_timespec(&self, other: &Timespec) -> Result<Duration, Duration> {
2222
if self >= other {
23-
Ok(if self.t.tv_nsec >= other.t.tv_nsec {
24-
Duration::new(
25-
(self.t.tv_sec - other.t.tv_sec) as u64,
26-
(self.t.tv_nsec - other.t.tv_nsec) as u32,
27-
)
23+
// NOTE(eddyb) two aspects of this `if`-`else` are required for LLVM
24+
// to optimize it into a branchless form (see also #75545):
25+
//
26+
// 1. `self.t.tv_sec - other.t.tv_sec` shows up as a common expression
27+
// in both branches, i.e. the `else` must have its `- 1`
28+
// subtraction after the common one, not interleaved with it
29+
// (it used to be `self.t.tv_sec - 1 - other.t.tv_sec`)
30+
//
31+
// 2. the `Duration::new` call (or any other additional complexity)
32+
// is outside of the `if`-`else`, not duplicated in both branches
33+
//
34+
// Ideally this code could be rearranged such that it more
35+
// directly expresses the lower-cost behavior we want from it.
36+
let (secs, nsec) = if self.t.tv_nsec >= other.t.tv_nsec {
37+
((self.t.tv_sec - other.t.tv_sec) as u64, (self.t.tv_nsec - other.t.tv_nsec) as u32)
2838
} else {
29-
Duration::new(
30-
(self.t.tv_sec - 1 - other.t.tv_sec) as u64,
39+
(
40+
(self.t.tv_sec - other.t.tv_sec - 1) as u64,
3141
self.t.tv_nsec as u32 + (NSEC_PER_SEC as u32) - other.t.tv_nsec as u32,
3242
)
33-
})
43+
};
44+
45+
Ok(Duration::new(secs, nsec))
3446
} else {
3547
match other.sub_timespec(self) {
3648
Ok(d) => Err(d),

‎src/bootstrap/native.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,14 +282,6 @@ impl Step for Llvm {
282282
"LLVM_CONFIG_PATH",
283283
host_bin.join("llvm-config").with_extension(EXE_EXTENSION),
284284
);
285-
286-
if target.contains("netbsd") {
287-
cfg.define("CMAKE_SYSTEM_NAME", "NetBSD");
288-
} else if target.contains("freebsd") {
289-
cfg.define("CMAKE_SYSTEM_NAME", "FreeBSD");
290-
} else if target.contains("windows") {
291-
cfg.define("CMAKE_SYSTEM_NAME", "Windows");
292-
}
293285
}
294286

295287
if let Some(ref suffix) = builder.config.llvm_version_suffix {
@@ -378,6 +370,22 @@ fn configure_cmake(
378370
}
379371
cfg.target(&target.triple).host(&builder.config.build.triple);
380372

373+
if target != builder.config.build {
374+
if target.contains("netbsd") {
375+
cfg.define("CMAKE_SYSTEM_NAME", "NetBSD");
376+
} else if target.contains("freebsd") {
377+
cfg.define("CMAKE_SYSTEM_NAME", "FreeBSD");
378+
} else if target.contains("windows") {
379+
cfg.define("CMAKE_SYSTEM_NAME", "Windows");
380+
}
381+
// When cross-compiling we should also set CMAKE_SYSTEM_VERSION, but in
382+
// that case like CMake we cannot easily determine system version either.
383+
//
384+
// Since, the LLVM itself makes rather limited use of version checks in
385+
// CMakeFiles (and then only in tests), and so far no issues have been
386+
// reported, the system version is currently left unset.
387+
}
388+
381389
let sanitize_cc = |cc: &Path| {
382390
if target.contains("msvc") {
383391
OsString::from(cc.to_str().unwrap().replace("\\", "/"))

0 commit comments

Comments
 (0)
Please sign in to comment.