@@ -135,15 +135,21 @@ getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
135135 return true ;
136136}
137137
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) {
142141 StringRef CPU;
143142 std::string McpuLowerCase = Mcpu.lower ();
144143 if (!DecodeAArch64Mcpu (D, McpuLowerCase, CPU, Extensions))
145144 return false ;
146145
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+
147153 return true ;
148154}
149155
@@ -210,11 +216,11 @@ void aarch64::getAArch64TargetFeatures(const Driver &D,
210216 success =
211217 getAArch64ArchFeaturesFromMarch (D, A->getValue (), Args, Extensions);
212218 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 );
215221 else if (isCPUDeterminedByTriple (Triple))
216222 success = getAArch64ArchFeaturesFromMcpu (
217- D, getAArch64TargetCPU (Args, Triple, A), Args, Extensions);
223+ D, getAArch64TargetCPU (Args, Triple, A), Args, Extensions, Features );
218224 else
219225 // Default to 'A' profile if the architecture is not specified.
220226 success = getAArch64ArchFeaturesFromMarch (D, " armv8-a" , Args, Extensions);
0 commit comments