summary refs log tree commit diff
path: root/compiler/rustc_target/src/spec/avr_gnu_base.rs
blob: 527a322d56a4fd1f8b5d708650f2ecd0e9e5f475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use crate::spec::{LinkerFlavor, Target, TargetOptions, TargetResult};

/// A base target for AVR devices using the GNU toolchain.
///
/// Requires GNU avr-gcc and avr-binutils on the host system.
pub fn target(target_cpu: String) -> TargetResult {
    Ok(Target {
        arch: "avr".to_string(),
        data_layout: "e-P1-p:16:8-i8:8-i16:8-i32:8-i64:8-f32:8-f64:8-n8-a:8".to_string(),
        llvm_target: "avr-unknown-unknown".to_string(),
        target_endian: "little".to_string(),
        target_pointer_width: "16".to_string(),
        linker_flavor: LinkerFlavor::Gcc,
        target_os: "unknown".to_string(),
        target_env: "".to_string(),
        target_vendor: "unknown".to_string(),
        target_c_int_width: 16.to_string(),
        options: TargetOptions {
            cpu: target_cpu.clone(),
            exe_suffix: ".elf".to_string(),

            linker: Some("avr-gcc".to_owned()),
            dynamic_linking: false,
            executables: true,
            linker_is_gnu: true,
            has_rpath: false,
            position_independent_executables: false,
            eh_frame_header: false,
            pre_link_args: vec![(
                LinkerFlavor::Gcc,
                vec![
                    format!("-mmcu={}", target_cpu),
                    // We want to be able to strip as much executable code as possible
                    // from the linker command line, and this flag indicates to the
                    // linker that it can avoid linking in dynamic libraries that don't
                    // actually satisfy any symbols up to that point (as with many other
                    // resolutions the linker does). This option only applies to all
                    // following libraries so we're sure to pass it as one of the first
                    // arguments.
                    "-Wl,--as-needed".to_string(),
                ],
            )]
            .into_iter()
            .collect(),
            late_link_args: vec![(LinkerFlavor::Gcc, vec!["-lgcc".to_owned()])]
                .into_iter()
                .collect(),
            max_atomic_width: Some(0),
            atomic_cas: false,
            ..TargetOptions::default()
        },
    })
}