Skip to content

Commit

Permalink
Auto merge of rust-lang#124050 - saethlin:less-sysroot-libc, r=ChrisD…
Browse files Browse the repository at this point in the history
…enton

Remove libc from MSVC targets

`@ChrisDenton` started working on a project to remove libc from Windows MSVC targets. I'm completing that work here.

The primary change is to cfg out the dependency in `library/`. And then there's a lot of test patching. Happy to separate this more if people want.
  • Loading branch information
bors committed May 14, 2024
2 parents ac385a5 + 9839e88 commit f5e8002
Show file tree
Hide file tree
Showing 31 changed files with 108 additions and 98 deletions.
4 changes: 0 additions & 4 deletions library/std/Cargo.toml
Expand Up @@ -33,10 +33,6 @@ addr2line = { version = "0.21.0", optional = true, default-features = false }
[target.'cfg(not(all(windows, target_env = "msvc")))'.dependencies]
libc = { version = "=0.2.153", default-features = false, features = ['rustc-dep-of-std'], public = true }

# Pin libc (pending https://github.com/rust-lang/rust/pull/124560)
[target.'cfg(all(windows, target_env = "msvc"))'.dependencies]
libc = { version = "=0.2.153", default-features = false }

[target.'cfg(all(not(target_os = "aix"), not(all(windows, target_env = "msvc", not(target_vendor = "uwp")))))'.dependencies]
object = { version = "0.32.0", default-features = false, optional = true, features = ['read_core', 'elf', 'macho', 'pe', 'unaligned', 'archive'] }

Expand Down
1 change: 1 addition & 0 deletions library/std/src/lib.rs
Expand Up @@ -435,6 +435,7 @@ extern crate alloc as alloc_crate;
// so include it here even if it's unused.
#[doc(masked)]
#[allow(unused_extern_crates)]
#[cfg(not(all(windows, target_env = "msvc")))]
extern crate libc;

// We always need an unwinder currently for backtraces
Expand Down
2 changes: 2 additions & 0 deletions library/std/src/os/raw/tests.rs
@@ -1,3 +1,5 @@
#![cfg(not(all(windows, target_env = "msvc")))]

use crate::any::TypeId;

macro_rules! ok {
Expand Down
27 changes: 5 additions & 22 deletions tests/incremental/foreign.rs
@@ -1,38 +1,21 @@
// Test what happens we save incremental compilation state that makes
// use of foreign items. This used to ICE (#34991).
//@ ignore-sgx no libc

//@ revisions: rpass1

#![feature(rustc_private)]

extern crate libc;

use std::ffi::CString;

mod mlibc {
use libc::{c_char, c_long, c_longlong};

extern "C" {
pub fn atol(x: *const c_char) -> c_long;
pub fn atoll(x: *const c_char) -> c_longlong;
// strlen is provided either by an external library or compiler-builtins as a fallback
pub fn strlen(x: *const std::ffi::c_char) -> usize;
}
}

fn atol(s: String) -> isize {
let c = CString::new(s).unwrap();
unsafe { mlibc::atol(c.as_ptr()) as isize }
}

fn atoll(s: String) -> i64 {
fn strlen(s: String) -> usize {
let c = CString::new(s).unwrap();
unsafe { mlibc::atoll(c.as_ptr()) as i64 }
unsafe { mlibc::strlen(c.as_ptr()) }
}

pub fn main() {
assert_eq!(atol("1024".to_string()) * 10, atol("10240".to_string()));
assert_eq!(
(atoll("11111111111111111".to_string()) * 10),
atoll("111111111111111110".to_string())
);
assert_eq!(strlen("1024".to_string()), strlen("2048".to_string()));
}
5 changes: 1 addition & 4 deletions tests/run-make/c-link-to-rust-va-list-fn/checkrust.rs
@@ -1,10 +1,7 @@
#![crate_type = "staticlib"]
#![feature(c_variadic)]
#![feature(rustc_private)]

extern crate libc;

use libc::{c_char, c_double, c_int, c_long, c_longlong};
use std::ffi::{c_char, c_double, c_int, c_long, c_longlong};
use std::ffi::VaList;
use std::ffi::{CString, CStr};

Expand Down
6 changes: 2 additions & 4 deletions tests/run-make/link-path-order/main.rs
@@ -1,10 +1,8 @@
#![feature(rustc_private)]

extern crate libc;
use std::ffi::c_int;

#[link(name = "foo", kind = "static")]
extern "C" {
fn should_return_one() -> libc::c_int;
fn should_return_one() -> c_int;
}

fn main() {
Expand Down
14 changes: 4 additions & 10 deletions tests/ui/env-null-vars.rs
@@ -1,21 +1,15 @@
// Ensure that env::vars() does not panic if environ is null.
// Regression test for rust-lang/rust#53200
//@ run-pass

#![allow(unused_imports)]

//@ ignore-windows

// issue-53200

#![feature(rustc_private)]
extern crate libc;

use std::env;

// FIXME: more platforms?
#[cfg(target_os = "linux")]
fn main() {
extern crate libc;
unsafe { libc::clearenv(); }
assert_eq!(env::vars().count(), 0);
assert_eq!(std::env::vars().count(), 0);
}

#[cfg(not(target_os = "linux"))]
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/error-codes/E0259.rs
@@ -1,8 +1,8 @@
#![feature(rustc_private)]
#![feature(test)]

extern crate alloc;

extern crate libc as alloc;
extern crate test as alloc;
//~^ ERROR E0259

fn main() {}
4 changes: 2 additions & 2 deletions tests/ui/error-codes/E0259.stderr
Expand Up @@ -4,13 +4,13 @@ error[E0259]: the name `alloc` is defined multiple times
LL | extern crate alloc;
| ------------------- previous import of the extern crate `alloc` here
LL |
LL | extern crate libc as alloc;
LL | extern crate test as alloc;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `alloc` reimported here
|
= note: `alloc` must be defined only once in the type namespace of this module
help: you can use `as` to change the binding name of the import
|
LL | extern crate libc as other_alloc;
LL | extern crate test as other_alloc;
|

error: aborting due to 1 previous error
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/feature-gates/rustc-private.rs
@@ -1,5 +1,5 @@
// gate-test-rustc_private

extern crate libc; //~ ERROR use of unstable library feature 'rustc_private'
extern crate cfg_if; //~ ERROR use of unstable library feature 'rustc_private'

fn main() {}
4 changes: 2 additions & 2 deletions tests/ui/feature-gates/rustc-private.stderr
@@ -1,8 +1,8 @@
error[E0658]: use of unstable library feature 'rustc_private': this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?
--> $DIR/rustc-private.rs:3:1
|
LL | extern crate libc;
| ^^^^^^^^^^^^^^^^^^
LL | extern crate cfg_if;
| ^^^^^^^^^^^^^^^^^^^^
|
= note: see issue #27812 <https://github.com/rust-lang/rust/issues/27812> for more information
= help: add `#![feature(rustc_private)]` to the crate attributes to enable
Expand Down
10 changes: 2 additions & 8 deletions tests/ui/foreign/foreign-fn-linkname.rs
@@ -1,20 +1,14 @@
//@ run-pass
//@ ignore-sgx no libc

// Ensure no false positive on "unused extern crate" lint
#![deny(unused_extern_crates)]

#![feature(rustc_private)]

extern crate libc;
use std::ffi::CString;

mod mlibc {
use libc::{c_char, size_t};
use std::ffi::c_char;

extern "C" {
#[link_name = "strlen"]
pub fn my_strlen(str: *const c_char) -> size_t;
pub fn my_strlen(str: *const c_char) -> usize;
}
}

Expand Down
30 changes: 26 additions & 4 deletions tests/ui/foreign/foreign2.rs
@@ -1,9 +1,8 @@
//@ run-pass
#![allow(dead_code)]
//@ pretty-expanded FIXME #23616
#![feature(rustc_private)]

extern crate libc;
#![allow(dead_code)]
#![feature(rustc_private)]

mod bar {
extern "C" {}
Expand All @@ -13,14 +12,37 @@ mod zed {
extern "C" {}
}

#[cfg(not(windows))]
mod mlibc {
use libc::{c_int, c_void, size_t, ssize_t};
extern crate libc;
use self::libc::{c_int, c_void, size_t, ssize_t};

extern "C" {
pub fn write(fd: c_int, buf: *const c_void, count: size_t) -> ssize_t;
}
}

#[cfg(windows)]
mod mlibc {
#![allow(non_snake_case)]

use std::ffi::c_void;

pub type BOOL = i32;
pub type HANDLE = *mut c_void;

#[link(name = "ntdll")]
extern "system" {
pub fn WriteFile(
hfile: HANDLE,
lpbuffer: *const u8,
nnumberofbytestowrite: u32,
lpnumberofbyteswritten: *mut u32,
lpoverlapped: *mut c_void,
) -> BOOL;
}
}

mod baz {
extern "C" {}
}
Expand Down
4 changes: 2 additions & 2 deletions tests/ui/imports/issue-37887.rs
@@ -1,4 +1,4 @@
fn main() {
extern crate libc; //~ ERROR use of unstable
use libc::*; //~ ERROR unresolved import
extern crate test; //~ ERROR use of unstable
use test::*; //~ ERROR unresolved import
}
16 changes: 8 additions & 8 deletions tests/ui/imports/issue-37887.stderr
@@ -1,19 +1,19 @@
error[E0432]: unresolved import `libc`
error[E0432]: unresolved import `test`
--> $DIR/issue-37887.rs:3:9
|
LL | use libc::*;
| ^^^^ maybe a missing crate `libc`?
LL | use test::*;
| ^^^^ maybe a missing crate `test`?
|
= help: consider adding `extern crate libc` to use the `libc` crate
= help: consider adding `extern crate test` to use the `test` crate

error[E0658]: use of unstable library feature 'rustc_private': this crate is being loaded from the sysroot, an unstable location; did you mean to load this crate from crates.io via `Cargo.toml` instead?
error[E0658]: use of unstable library feature 'test'
--> $DIR/issue-37887.rs:2:5
|
LL | extern crate libc;
LL | extern crate test;
| ^^^^^^^^^^^^^^^^^^
|
= note: see issue #27812 <https://github.com/rust-lang/rust/issues/27812> for more information
= help: add `#![feature(rustc_private)]` to the crate attributes to enable
= note: see issue #50297 <https://github.com/rust-lang/rust/issues/50297> for more information
= help: add `#![feature(test)]` to the crate attributes to enable
= note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date

error: aborting due to 2 previous errors
Expand Down
14 changes: 7 additions & 7 deletions tests/ui/lint/unnecessary-extern-crate.rs
@@ -1,12 +1,12 @@
//@ edition:2018

#![deny(unused_extern_crates)]
#![feature(test, rustc_private)]
#![feature(test)]

extern crate libc;
extern crate core;
//~^ ERROR unused extern crate
//~| HELP remove
extern crate libc as x;
extern crate core as x;
//~^ ERROR unused extern crate
//~| HELP remove

Expand All @@ -28,11 +28,11 @@ mod foo {

pub(super) extern crate alloc as d;

extern crate libc;
extern crate core;
//~^ ERROR unused extern crate
//~| HELP remove

extern crate libc as x;
extern crate core as x;
//~^ ERROR unused extern crate
//~| HELP remove

Expand All @@ -41,11 +41,11 @@ mod foo {
pub extern crate test as y;

mod bar {
extern crate libc;
extern crate core;
//~^ ERROR unused extern crate
//~| HELP remove

extern crate libc as x;
extern crate core as x;
//~^ ERROR unused extern crate
//~| HELP remove

Expand Down
12 changes: 6 additions & 6 deletions tests/ui/lint/unnecessary-extern-crate.stderr
@@ -1,7 +1,7 @@
error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:6:1
|
LL | extern crate libc;
LL | extern crate core;
| ^^^^^^^^^^^^^^^^^^ help: remove it
|
note: the lint level is defined here
Expand All @@ -13,31 +13,31 @@ LL | #![deny(unused_extern_crates)]
error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:9:1
|
LL | extern crate libc as x;
LL | extern crate core as x;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: remove it

error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:31:5
|
LL | extern crate libc;
LL | extern crate core;
| ^^^^^^^^^^^^^^^^^^ help: remove it

error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:35:5
|
LL | extern crate libc as x;
LL | extern crate core as x;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: remove it

error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:44:9
|
LL | extern crate libc;
LL | extern crate core;
| ^^^^^^^^^^^^^^^^^^ help: remove it

error: unused extern crate
--> $DIR/unnecessary-extern-crate.rs:48:9
|
LL | extern crate libc as x;
LL | extern crate core as x;
| ^^^^^^^^^^^^^^^^^^^^^^^ help: remove it

error: aborting due to 6 previous errors
Expand Down
1 change: 1 addition & 0 deletions tests/ui/meta/no_std-extern-libc.rs
@@ -1,5 +1,6 @@
// Test that `download-rustc` doesn't put duplicate copies of libc in the sysroot.
//@ check-pass
//@ ignore-windows doesn't necessarily have the libc crate
#![crate_type = "lib"]
#![no_std]
#![feature(rustc_private)]
Expand Down

0 comments on commit f5e8002

Please sign in to comment.