Add support for link-flavor rust-lld for iOS, tvOS and watchOS · rust-lang/rust@78bbe57 (original) (raw)

1

``

`-

use crate::{spec::cvs, spec::TargetOptions};

`

``

1

`+

use crate::spec::{cvs, LinkArgs, LinkerFlavor, LldFlavor, TargetOptions};

`

2

2

`use std::borrow::Cow;

`

3

3

``

4

4

`use Arch::*;

`

`@@ -17,6 +17,18 @@ pub enum Arch {

`

17

17

`Arm64_sim,

`

18

18

`}

`

19

19

``

``

20

`+

fn target_arch_name(arch: Arch) -> &'static str {

`

``

21

`+

match arch {

`

``

22

`+

Armv7 => "armv7",

`

``

23

`+

Armv7k => "armv7k",

`

``

24

`+

Armv7s => "armv7s",

`

``

25

`+

Arm64 | Arm64_macabi | Arm64_sim => "arm64",

`

``

26

`+

Arm64_32 => "arm64_32",

`

``

27

`+

I386 => "i386",

`

``

28

`+

X86_64 | X86_64_macabi => "x86_64",

`

``

29

`+

}

`

``

30

`+

}

`

``

31

+

20

32

`fn target_abi(arch: Arch) -> &'static str {

`

21

33

`match arch {

`

22

34

`Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "",

`

`@@ -49,11 +61,51 @@ fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> {

`

49

61

`}

`

50

62

`}

`

51

63

``

``

64

`+

fn pre_link_args(os: &'static str, arch: Arch) -> LinkArgs {

`

``

65

`+

let mut args = LinkArgs::new();

`

``

66

+

``

67

`+

let target_abi = target_abi(arch);

`

``

68

+

``

69

`+

let platform_name = match target_abi {

`

``

70

`+

"sim" => format!("{}-simulator", os),

`

``

71

`+

"macabi" => "mac-catalyst".to_string(),

`

``

72

`+

_ => os.to_string(),

`

``

73

`+

};

`

``

74

+

``

75

`+

let platform_version = match os.as_ref() {

`

``

76

`+

"ios" => super::apple_base::ios_lld_platform_version(),

`

``

77

`+

"tvos" => super::apple_base::tvos_lld_platform_version(),

`

``

78

`+

"watchos" => super::apple_base::watchos_lld_platform_version(),

`

``

79

`+

_ => unreachable!(),

`

``

80

`+

};

`

``

81

+

``

82

`+

let arch_str = target_arch_name(arch);

`

``

83

+

``

84

`+

if target_abi != "macabi" {

`

``

85

`+

args.insert(LinkerFlavor::Gcc, vec!["-arch".into(), arch_str.into()]);

`

``

86

`+

}

`

``

87

+

``

88

`+

args.insert(

`

``

89

`+

LinkerFlavor::Lld(LldFlavor::Ld64),

`

``

90

`+

vec![

`

``

91

`+

"-arch".into(),

`

``

92

`+

arch_str.into(),

`

``

93

`+

"-platform_version".into(),

`

``

94

`+

platform_name.into(),

`

``

95

`+

platform_version.clone().into(),

`

``

96

`+

platform_version.into(),

`

``

97

`+

],

`

``

98

`+

);

`

``

99

+

``

100

`+

args

`

``

101

`+

}

`

``

102

+

52

103

`pub fn opts(os: &'static str, arch: Arch) -> TargetOptions {

`

53

104

`TargetOptions {

`

54

105

`abi: target_abi(arch).into(),

`

55

106

`cpu: target_cpu(arch).into(),

`

56

107

`dynamic_linking: false,

`

``

108

`+

pre_link_args: pre_link_args(os, arch),

`

57

109

`link_env_remove: link_env_remove(arch),

`

58

110

`has_thread_local: false,

`

59

111

` ..super::apple_base::opts(os)

`