Skip to content

Commit ecd7ea8

Browse files
authored
Merge branch 'rust-lang:master' into must-use-alloc-constructors
2 parents 58cc18c + 9e8356c commit ecd7ea8

File tree

15 files changed

+216
-61
lines changed

15 files changed

+216
-61
lines changed

compiler/rustc_codegen_llvm/src/callee.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ pub fn get_fn(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) -> &'ll Value
175175
// should use dllimport for functions.
176176
if cx.use_dll_storage_attrs
177177
&& tcx.is_dllimport_foreign_item(instance_def_id)
178-
&& tcx.sess.target.env != "gnu"
178+
&& !matches!(tcx.sess.target.env.as_ref(), "gnu" | "uclibc")
179179
{
180180
llvm::LLVMSetDLLStorageClass(llfn, llvm::DLLStorageClass::DllImport);
181181
}

compiler/rustc_middle/src/ty/layout.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3012,7 +3012,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
30123012
};
30133013

30143014
let target = &self.tcx.sess.target;
3015-
let target_env_gnu_like = matches!(&target.env[..], "gnu" | "musl");
3015+
let target_env_gnu_like = matches!(&target.env[..], "gnu" | "musl" | "uclibc");
30163016
let win_x64_gnu = target.os == "windows" && target.arch == "x86_64" && target.env == "gnu";
30173017
let linux_s390x_gnu_like =
30183018
target.os == "linux" && target.arch == "s390x" && target_env_gnu_like;
@@ -3110,7 +3110,7 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
31103110
if arg.layout.is_zst() {
31113111
// For some forsaken reason, x86_64-pc-windows-gnu
31123112
// doesn't ignore zero-sized struct arguments.
3113-
// The same is true for {s390x,sparc64,powerpc}-unknown-linux-{gnu,musl}.
3113+
// The same is true for {s390x,sparc64,powerpc}-unknown-linux-{gnu,musl,uclibc}.
31143114
if is_return
31153115
|| rust_abi
31163116
|| (!win_x64_gnu
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
use crate::spec::{Target, TargetOptions};
2+
3+
// This target is for uclibc Linux on ARMv7 without NEON or
4+
// thumb-mode. See the thumbv7neon variant for enabling both.
5+
6+
pub fn target() -> Target {
7+
let base = super::linux_uclibc_base::opts();
8+
Target {
9+
llvm_target: "armv7-unknown-linux-gnueabihf".to_string(),
10+
pointer_width: 32,
11+
data_layout: "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64".to_string(),
12+
arch: "arm".to_string(),
13+
14+
options: TargetOptions {
15+
// Info about features at https://wiki.debian.org/ArmHardFloatPort
16+
features: "+v7,+vfp3,-d32,+thumb2,-neon".to_string(),
17+
cpu: "generic".to_string(),
18+
max_atomic_width: Some(64),
19+
mcount: "_mcount".to_string(),
20+
abi: "eabihf".to_string(),
21+
..base
22+
},
23+
}
24+
}

compiler/rustc_target/src/spec/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,8 @@ supported_targets! {
952952
("bpfel-unknown-none", bpfel_unknown_none),
953953

954954
("armv6k-nintendo-3ds", armv6k_nintendo_3ds),
955+
956+
("armv7-unknown-linux-uclibceabihf", armv7_unknown_linux_uclibceabihf),
955957
}
956958

957959
/// Warnings encountered when parsing the target `json`.

library/std/src/sys/unix/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,9 @@ cfg_if::cfg_if! {
307307
#[link(name = "zircon")]
308308
#[link(name = "fdio")]
309309
extern "C" {}
310+
} else if #[cfg(all(target_os = "linux", target_env = "uclibc"))] {
311+
#[link(name = "dl")]
312+
extern "C" {}
310313
}
311314
}
312315

library/std/src/sys/unix/thread.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,8 @@ pub mod guard {
594594
Some(stackaddr - guardsize..stackaddr)
595595
} else if cfg!(all(target_os = "linux", target_env = "musl")) {
596596
Some(stackaddr - guardsize..stackaddr)
597-
} else if cfg!(all(target_os = "linux", target_env = "gnu")) {
597+
} else if cfg!(all(target_os = "linux", any(target_env = "gnu", target_env = "uclibc")))
598+
{
598599
// glibc used to include the guard area within the stack, as noted in the BUGS
599600
// section of `man pthread_attr_getguardsize`. This has been corrected starting
600601
// with glibc 2.27, and in some distro backports, so the guard is now placed at the

library/unwind/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ cfg_if::cfg_if! {
6363
// don't want to duplicate it here.
6464
#[cfg(all(
6565
target_os = "linux",
66-
target_env = "gnu",
66+
any(target_env = "gnu", target_env = "uclibc"),
6767
not(feature = "llvm-libunwind"),
6868
not(feature = "system-llvm-libunwind")
6969
))]
@@ -72,7 +72,7 @@ extern "C" {}
7272

7373
#[cfg(all(
7474
target_os = "linux",
75-
target_env = "gnu",
75+
any(target_env = "gnu", target_env = "uclibc"),
7676
not(feature = "llvm-libunwind"),
7777
feature = "system-llvm-libunwind"
7878
))]

src/doc/rustc/src/platform-support.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ target | std | host | notes
220220
`armv6-unknown-netbsd-eabihf` | ? | |
221221
`armv6k-nintendo-3ds` | * | | ARMv6K Nintendo 3DS, Horizon (Requires devkitARM toolchain)
222222
`armv7-apple-ios` | ✓ | | ARMv7 iOS, Cortex-a8
223+
`armv7-unknown-linux-uclibceabihf` | ✓ | ? | ARMv7 Linux uClibc
223224
`armv7-unknown-freebsd` | ✓ | ✓ | ARMv7 FreeBSD
224225
`armv7-unknown-netbsd-eabihf` | ✓ | ✓ |
225226
`armv7-wrs-vxworks-eabihf` | ? | |
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# armv7-unknown-linux-uclibceabihf
2+
3+
**Tier: 3**
4+
5+
This tier supports the ARMv7 processor running a Linux kernel and uClibc-ng standard library. It provides full support for rust and the rust standard library.
6+
7+
## Designated Developers
8+
9+
* [@skrap](https://github.com/skrap)
10+
11+
## Requirements
12+
13+
This target is cross compiled, and requires a cross toolchain. You can find suitable pre-built toolchains at [bootlin](https://toolchains.bootlin.com/) or build one yourself via [buildroot](https://buildroot.org).
14+
15+
## Building
16+
17+
### Get a C toolchain
18+
19+
Compiling rust for this target has been tested on `x86_64` linux hosts. Other host types have not been tested, but may work, if you can find a suitable cross compilation toolchain for them.
20+
21+
If you don't already have a suitable toolchain, download one [here](https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf--uclibc--bleeding-edge-2020.08-1.tar.bz2), and unpack it into a directory.
22+
23+
### Configure rust
24+
25+
The target can be built by enabling it for a `rustc` build, by placing the following in `config.toml`:
26+
27+
```toml
28+
[build]
29+
target = ["armv7-unknown-linux-uclibceabihf"]
30+
stage = 2
31+
32+
[target.armv7-unknown-linux-uclibceabihf]
33+
# ADJUST THIS PATH TO POINT AT YOUR TOOLCHAIN
34+
cc = "/TOOLCHAIN_PATH/bin/arm-buildroot-linux-uclibcgnueabihf-gcc"
35+
```
36+
37+
### Build
38+
39+
```sh
40+
# in rust dir
41+
./x.py build --stage 2
42+
```
43+
44+
## Building and Running Rust Programs
45+
46+
To test cross-compiled binaries on a `x86_64` system, you can use the `qemu-arm` [userspace emulation](https://qemu-project.gitlab.io/qemu/user/main.html) program. This avoids having a full emulated ARM system by doing dynamic binary translation and dynamic system call translation. It lets you run ARM programs directly on your `x86_64` kernel. It's very convenient!
47+
48+
To use:
49+
50+
* Install `qemu-arm` according to your distro.
51+
* Link your built toolchain via:
52+
* `rustup toolchain link stage2 ${RUST}/build/x86_64-unknown-linux-gnu/stage2`
53+
* Create a test program
54+
55+
```sh
56+
cargo new hello_world
57+
cd hello_world
58+
```
59+
60+
* Build and run
61+
62+
```sh
63+
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABIHF_RUNNER="qemu-arm -L ${TOOLCHAIN}/arm-buildroot-linux-uclibcgnueabihf/sysroot/" \
64+
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABIHF_LINKER=${TOOLCHAIN}/bin/arm-buildroot-linux-uclibcgnueabihf-gcc \
65+
cargo +stage2 run --target armv7-unknown-linux-uclibceabihf
66+
```

src/librustdoc/html/render/context.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::cell::RefCell;
22
use std::collections::BTreeMap;
3-
use std::error::Error as StdError;
43
use std::io;
54
use std::path::{Path, PathBuf};
65
use std::rc::Rc;
@@ -16,6 +15,7 @@ use rustc_span::symbol::sym;
1615

1716
use super::cache::{build_index, ExternalLocation};
1817
use super::print_item::{full_path, item_path, print_item};
18+
use super::templates;
1919
use super::write_shared::write_shared;
2020
use super::{
2121
collect_spans_and_sources, print_sidebar, settings, AllTypes, LinkFromSrc, NameDoc, StylePath,
@@ -33,7 +33,6 @@ use crate::formats::FormatRenderer;
3333
use crate::html::escape::Escape;
3434
use crate::html::format::Buffer;
3535
use crate::html::markdown::{self, plain_text_summary, ErrorCodes, IdMap};
36-
use crate::html::static_files::PAGE;
3736
use crate::html::{layout, sources};
3837

3938
/// Major driving force in all rustdoc rendering. This contains information
@@ -225,7 +224,7 @@ impl<'tcx> Context<'tcx> {
225224
&self.shared.layout,
226225
&page,
227226
|buf: &mut _| print_sidebar(self, it, buf),
228-
|buf: &mut _| print_item(self, it, buf, &page),
227+
|buf: &mut _| print_item(self, &self.shared.templates, it, buf, &page),
229228
&self.shared.style_files,
230229
)
231230
} else {
@@ -416,12 +415,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
416415
};
417416
let mut issue_tracker_base_url = None;
418417
let mut include_sources = true;
419-
420-
let mut templates = tera::Tera::default();
421-
templates.add_raw_template("page.html", PAGE).map_err(|e| Error {
422-
file: "page.html".into(),
423-
error: format!("{}: {}", e, e.source().map(|e| e.to_string()).unwrap_or_default()),
424-
})?;
418+
let templates = templates::load()?;
425419

426420
// Crawl the crate attributes looking for attributes which control how we're
427421
// going to emit HTML

0 commit comments

Comments
 (0)