@@ -135,15 +135,21 @@ getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
135
135
return true ;
136
136
}
137
137
138
- static bool
139
- getAArch64ArchFeaturesFromMcpu (const Driver &D, StringRef Mcpu,
140
- const ArgList &Args,
141
- llvm::AArch64::ExtensionSet &Extensions) {
138
+ static bool getAArch64ArchFeaturesFromMcpu (
139
+ const Driver &D, StringRef Mcpu, const ArgList &Args,
140
+ llvm::AArch64::ExtensionSet &Extensions, std::vector<StringRef> &Features) {
142
141
StringRef CPU;
143
142
std::string McpuLowerCase = Mcpu.lower ();
144
143
if (!DecodeAArch64Mcpu (D, McpuLowerCase, CPU, Extensions))
145
144
return false ;
146
145
146
+ if (Mcpu == " native" ) {
147
+ llvm::StringMap<bool > HostFeatures = llvm::sys::getHostCPUFeatures ();
148
+ for (auto &[Feature, Enabled] : HostFeatures) {
149
+ Features.push_back (Args.MakeArgString ((Enabled ? " +" : " -" ) + Feature));
150
+ }
151
+ }
152
+
147
153
return true ;
148
154
}
149
155
@@ -210,11 +216,11 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
210
216
success =
211
217
getAArch64ArchFeaturesFromMarch (D, A->getValue (), Args, Extensions);
212
218
else if ((A = Args.getLastArg (options::OPT_mcpu_EQ)))
213
- success =
214
- getAArch64ArchFeaturesFromMcpu (D, A-> getValue (), Args, Extensions );
219
+ success = getAArch64ArchFeaturesFromMcpu (D, A-> getValue (), Args, Extensions,
220
+ Features );
215
221
else if (isCPUDeterminedByTriple (Triple))
216
222
success = getAArch64ArchFeaturesFromMcpu (
217
- D, getAArch64TargetCPU (Args, Triple, A), Args, Extensions);
223
+ D, getAArch64TargetCPU (Args, Triple, A), Args, Extensions, Features );
218
224
else
219
225
// Default to 'A' profile if the architecture is not specified.
220
226
success = getAArch64ArchFeaturesFromMarch (D, " armv8-a" , Args, Extensions);
0 commit comments