diff --git a/llvm/test/MC/AsmParser/native.s b/llvm/test/MC/AsmParser/native.s new file mode 100644 index 0000000000000..4da5b3717913f --- /dev/null +++ b/llvm/test/MC/AsmParser/native.s @@ -0,0 +1,4 @@ +# RUN: llvm-mc -filetype=obj -o %t -mcpu=native %s 2> %t.stderr +# RUN: FileCheck --allow-empty %s < %t.stderr + +# CHECK-NOT: {{.+}} diff --git a/llvm/tools/llvm-mc/llvm-mc.cpp b/llvm/tools/llvm-mc/llvm-mc.cpp index 136cd69526a3c..372004b3d5fd4 100644 --- a/llvm/tools/llvm-mc/llvm-mc.cpp +++ b/llvm/tools/llvm-mc/llvm-mc.cpp @@ -459,14 +459,23 @@ int main(int argc, char **argv) { MAI->setCommentColumn(CommentColumn); // Package up features to be passed to target/subtarget + SubtargetFeatures Features; std::string FeaturesStr; - if (MAttrs.size()) { - SubtargetFeatures Features; - for (unsigned i = 0; i != MAttrs.size(); ++i) - Features.AddFeature(MAttrs[i]); - FeaturesStr = Features.getString(); + + // Replace -mcpu=native with Host CPU and features. + if (MCPU == "native") { + MCPU = std::string(llvm::sys::getHostCPUName()); + + llvm::StringMap TargetFeatures = llvm::sys::getHostCPUFeatures(); + for (auto const &[FeatureName, IsSupported] : TargetFeatures) + Features.AddFeature(FeatureName, IsSupported); } + // Handle features passed to target/subtarget. + for (unsigned i = 0; i != MAttrs.size(); ++i) + Features.AddFeature(MAttrs[i]); + FeaturesStr = Features.getString(); + std::unique_ptr STI( TheTarget->createMCSubtargetInfo(TheTriple, MCPU, FeaturesStr)); assert(STI && "Unable to create subtarget info!");