@@ -14,7 +14,7 @@ use llvm;
14
14
use rustc:: session:: Session ;
15
15
use rustc:: session:: config:: PrintRequest ;
16
16
use libc:: c_int;
17
- use std:: ffi:: { CStr , CString } ;
17
+ use std:: ffi:: CString ;
18
18
19
19
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
20
20
use std:: sync:: Once ;
@@ -79,57 +79,61 @@ unsafe fn configure_llvm(sess: &Session) {
79
79
// detection code will walk past the end of the feature array,
80
80
// leading to crashes.
81
81
82
- const ARM_WHITELIST : & ' static [ & ' static str ] = & [ "neon\0 " , "v7\0 " , "vfp2\0 " , "vfp3\0 " , "vfp4\0 " ] ;
82
+ const ARM_WHITELIST : & ' static [ & ' static str ] = & [ "neon" , "v7" , "vfp2" , "vfp3" , "vfp4" ] ;
83
83
84
- const AARCH64_WHITELIST : & ' static [ & ' static str ] = & [ "neon\0 " , "v7\0 " ] ;
84
+ const AARCH64_WHITELIST : & ' static [ & ' static str ] = & [ "neon" , "v7" ] ;
85
85
86
- const X86_WHITELIST : & ' static [ & ' static str ] = & [ "avx\0 " , "avx2\0 " , "bmi\0 " , "bmi2\0 " , "sse\0 " ,
87
- "sse2\0 " , "sse3\0 " , "sse4.1\0 " , "sse4.2\0 " ,
88
- "ssse3\0 " , "tbm\0 " , "lzcnt\0 " , "popcnt\0 " ,
89
- "sse4a\0 " , "rdrnd\0 " , "rdseed\0 " , "fma\0 " ,
90
- "xsave\0 " , "xsaveopt\0 " , "xsavec\0 " ,
91
- "xsaves\0 " , "aes\0 " ,
92
- "avx512bw\0 " , "avx512cd\0 " ,
93
- "avx512dq\0 " , "avx512er\0 " ,
94
- "avx512f\0 " , "avx512ifma\0 " ,
95
- "avx512pf\0 " , "avx512vbmi\0 " ,
96
- "avx512vl\0 " , "avx512vpopcntdq\0 " ,
97
- "mmx\0 " , "fxsr\0 " ] ;
86
+ const X86_WHITELIST : & ' static [ & ' static str ] = & [ "avx" , "avx2" , "bmi" , "bmi2" , "sse" ,
87
+ "sse2" , "sse3" , "sse4.1" , "sse4.2" ,
88
+ "ssse3" , "tbm" , "lzcnt" , "popcnt" ,
89
+ "sse4a" , "rdrnd" , "rdseed" , "fma" ,
90
+ "xsave" , "xsaveopt" , "xsavec" ,
91
+ "xsaves" , "aes" , "pclmulqdq ",
92
+ "avx512bw" , "avx512cd" ,
93
+ "avx512dq" , "avx512er" ,
94
+ "avx512f" , "avx512ifma" ,
95
+ "avx512pf" , "avx512vbmi" ,
96
+ "avx512vl" , "avx512vpopcntdq" ,
97
+ "mmx" , "fxsr" ] ;
98
98
99
- const HEXAGON_WHITELIST : & ' static [ & ' static str ] = & [ "hvx\0 " , "hvx-double\0 " ] ;
99
+ const HEXAGON_WHITELIST : & ' static [ & ' static str ] = & [ "hvx" , "hvx-double" ] ;
100
100
101
- const POWERPC_WHITELIST : & ' static [ & ' static str ] = & [ "altivec\0 " ,
102
- "power8-altivec\0 " , "power9-altivec\0 " ,
103
- "power8-vector\0 " , "power9-vector\0 " ,
104
- "vsx\0 " ] ;
101
+ const POWERPC_WHITELIST : & ' static [ & ' static str ] = & [ "altivec" ,
102
+ "power8-altivec" , "power9-altivec" ,
103
+ "power8-vector" , "power9-vector" ,
104
+ "vsx" ] ;
105
105
106
- const MIPS_WHITELIST : & ' static [ & ' static str ] = & [ "msa\0 " ] ;
106
+ const MIPS_WHITELIST : & ' static [ & ' static str ] = & [ "msa" ] ;
107
+
108
+ pub fn to_llvm_feature ( s : & str ) -> & str {
109
+ match s {
110
+ "pclmulqdq" => "pclmul" ,
111
+ s => s,
112
+ }
113
+ }
107
114
108
115
pub fn target_features ( sess : & Session ) -> Vec < Symbol > {
109
- let whitelist = target_feature_whitelist ( sess) ;
110
116
let target_machine = create_target_machine ( sess) ;
111
- let mut features = Vec :: new ( ) ;
112
- for feat in whitelist {
113
- if unsafe { llvm:: LLVMRustHasFeature ( target_machine, feat. as_ptr ( ) ) } {
114
- features. push ( Symbol :: intern ( feat. to_str ( ) . unwrap ( ) ) ) ;
115
- }
116
- }
117
- features
117
+ target_feature_whitelist ( sess)
118
+ . iter ( )
119
+ . filter ( |feature| {
120
+ let llvm_feature = to_llvm_feature ( feature) ;
121
+ let cstr = CString :: new ( llvm_feature) . unwrap ( ) ;
122
+ unsafe { llvm:: LLVMRustHasFeature ( target_machine, cstr. as_ptr ( ) ) }
123
+ } )
124
+ . map ( |feature| Symbol :: intern ( feature) ) . collect ( )
118
125
}
119
126
120
- pub fn target_feature_whitelist ( sess : & Session ) -> Vec < & CStr > {
121
- let whitelist = match & * sess. target . target . arch {
127
+ pub fn target_feature_whitelist ( sess : & Session ) -> & ' static [ & ' static str ] {
128
+ match & * sess. target . target . arch {
122
129
"arm" => ARM_WHITELIST ,
123
130
"aarch64" => AARCH64_WHITELIST ,
124
131
"x86" | "x86_64" => X86_WHITELIST ,
125
132
"hexagon" => HEXAGON_WHITELIST ,
126
133
"mips" | "mips64" => MIPS_WHITELIST ,
127
134
"powerpc" | "powerpc64" => POWERPC_WHITELIST ,
128
135
_ => & [ ] ,
129
- } ;
130
- whitelist. iter ( ) . map ( |m| {
131
- CStr :: from_bytes_with_nul ( m. as_bytes ( ) ) . unwrap ( )
132
- } ) . collect ( )
136
+ }
133
137
}
134
138
135
139
pub fn print_version ( ) {
0 commit comments