rustc_target/spec/targets/
i686_unknown_linux_musl.rs

1use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, RustcAbi, StackProbeType, Target, base};
2
3pub(crate) fn target() -> Target {
4    let mut base = base::linux_musl::opts();
5    base.rustc_abi = Some(RustcAbi::X86Sse2);
6    // If you want to change the base CPU, please see `i686_unknown_linux_gnu.rs`
7    // for an important comment.
8    base.cpu = "pentium4".into();
9    base.max_atomic_width = Some(64);
10    base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m32", "-Wl,-melf_i386"]);
11    base.stack_probes = StackProbeType::Inline;
12    // FIXME(compiler-team#422): musl targets should be dynamically linked by default.
13    base.crt_static_default = true;
14
15    // The unwinder used by i686-unknown-linux-musl, the LLVM libunwind
16    // implementation, apparently relies on frame pointers existing... somehow.
17    // It's not clear to me why nor where this dependency is introduced, but the
18    // test suite does not pass with frame pointers eliminated and it passes
19    // with frame pointers present.
20    //
21    // If you think that this is no longer necessary, then please feel free to
22    // ignore! If it still passes the test suite and the bots then sounds good
23    // to me.
24    //
25    // This may or may not be related to this bug:
26    // https://llvm.org/bugs/show_bug.cgi?id=30879
27    base.frame_pointer = FramePointer::Always;
28
29    Target {
30        llvm_target: "i686-unknown-linux-musl".into(),
31        metadata: crate::spec::TargetMetadata {
32            description: Some("32-bit Linux with musl 1.2.3".into()),
33            tier: Some(2),
34            host_tools: Some(false),
35            std: Some(true),
36        },
37        pointer_width: 32,
38        data_layout: "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-\
39            i128:128-f64:32:64-f80:32-n8:16:32-S128"
40            .into(),
41        arch: "x86".into(),
42        options: base,
43    }
44}