]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_target/src/spec/x86_64_fortanix_unknown_sgx.rs
Rollup merge of #104464 - mati865:reduce-eh-overallocation-amd64, r=thomcc
[rust.git] / compiler / rustc_target / src / spec / x86_64_fortanix_unknown_sgx.rs
1 use std::borrow::Cow;
2
3 use super::{cvs, Cc, LinkerFlavor, Lld, Target, TargetOptions};
4
5 pub fn target() -> Target {
6     let pre_link_args = TargetOptions::link_args(
7         LinkerFlavor::Gnu(Cc::No, Lld::No),
8         &[
9             "-e",
10             "elf_entry",
11             "-Bstatic",
12             "--gc-sections",
13             "-z",
14             "text",
15             "-z",
16             "norelro",
17             "--no-undefined",
18             "--error-unresolved-symbols",
19             "--no-undefined-version",
20             "-Bsymbolic",
21             "--export-dynamic",
22             // The following symbols are needed by libunwind, which is linked after
23             // libstd. Make sure they're included in the link.
24             "-u",
25             "__rust_abort",
26             "-u",
27             "__rust_c_alloc",
28             "-u",
29             "__rust_c_dealloc",
30             "-u",
31             "__rust_print_err",
32             "-u",
33             "__rust_rwlock_rdlock",
34             "-u",
35             "__rust_rwlock_unlock",
36             "-u",
37             "__rust_rwlock_wrlock",
38         ],
39     );
40
41     const EXPORT_SYMBOLS: &[&str] = &[
42         "sgx_entry",
43         "HEAP_BASE",
44         "HEAP_SIZE",
45         "RELA",
46         "RELACOUNT",
47         "ENCLAVE_SIZE",
48         "CFGDATA_BASE",
49         "DEBUG",
50         "EH_FRM_HDR_OFFSET",
51         "EH_FRM_HDR_LEN",
52         "EH_FRM_OFFSET",
53         "EH_FRM_LEN",
54         "TEXT_BASE",
55         "TEXT_SIZE",
56     ];
57     let opts = TargetOptions {
58         os: "unknown".into(),
59         env: "sgx".into(),
60         vendor: "fortanix".into(),
61         abi: "fortanix".into(),
62         linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
63         linker: Some("rust-lld".into()),
64         max_atomic_width: Some(64),
65         cpu: "x86-64".into(),
66         features: "+rdrnd,+rdseed,+lvi-cfi,+lvi-load-hardening".into(),
67         llvm_args: cvs!["--x86-experimental-lvi-inline-asm-hardening"],
68         position_independent_executables: true,
69         pre_link_args,
70         override_export_symbols: Some(EXPORT_SYMBOLS.iter().cloned().map(Cow::from).collect()),
71         relax_elf_relocations: true,
72         ..Default::default()
73     };
74     Target {
75         llvm_target: "x86_64-elf".into(),
76         pointer_width: 64,
77         data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
78             .into(),
79         arch: "x86_64".into(),
80         options: opts,
81     }
82 }