diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp index 2853881780aa8..269f2e24bdf6b 100644 --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMCTargetDesc.cpp @@ -89,7 +89,22 @@ static MCSubtargetInfo *createRISCVMCSubtargetInfo(const Triple &TT, if (CPU.empty() || CPU == "generic") CPU = TT.isArch64Bit() ? "generic-rv64" : "generic-rv32"; - return createRISCVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); + MCSubtargetInfo *X = + createRISCVMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS); + + // If the CPU is "help" fill in 64 or 32 bit feature so we can pass + // RISCVFeatures::validate. + // FIXME: Why does llvm-mc still expect a source file with -mcpu=help? + if (CPU == "help") { + llvm::FeatureBitset Features = X->getFeatureBits(); + if (TT.isArch64Bit()) + Features.set(RISCV::Feature64Bit); + else + Features.set(RISCV::Feature32Bit); + X->setFeatureBits(Features); + } + + return X; } static MCInstPrinter *createRISCVMCInstPrinter(const Triple &T,