[clang] [llvm] [RISCV][FMV] Support target_clones (PR #85786)

Craig Topper via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 8 18:03:18 PDT 2024


================
@@ -14156,6 +14157,84 @@ CodeGenFunction::EmitAArch64CpuSupports(ArrayRef<StringRef> FeaturesStrs) {
   return Result;
 }
 
+llvm::SmallVector<llvm::Value *>
+CodeGenFunction::EmitRISCVExtSupports(ArrayRef<StringRef> FeaturesStrs) {
+  auto BaseExtReqs = llvm::RISCV::getBaseExtensionKey(FeaturesStrs);
+  auto IMACompatibleExtReqs =
+      llvm::RISCV::getIMACompatibleExtensionKey(FeaturesStrs);
+
+  // check whether all FeatureStrs are available for hwprobe.
+  llvm::SmallVector<StringRef> UnsupportByHwprobe;
+  llvm::StringSet<> ImpliedExtBySupportExt;
+  for (unsigned Idx = 0; Idx < FeaturesStrs.size(); Idx++) {
+    if (BaseExtReqs[Idx] == 0 && IMACompatibleExtReqs[Idx] == 0)
+      UnsupportByHwprobe.push_back(FeaturesStrs[Idx]);
+    else
+      ImpliedExtBySupportExt.insert(FeaturesStrs[Idx].str());
+  }
+
+  // Repeatly find ImpliedExts until no longer found new.
+  bool Changed = true;
+  while (Changed) {
+    unsigned Size = ImpliedExtBySupportExt.size();
+    for (auto Ext : ImpliedExtBySupportExt.keys()) {
+      auto ImpliedExts = llvm::RISCV::getImpliedExts(Ext);
+      for (auto ImpliedExt : ImpliedExts)
+        ImpliedExtBySupportExt.insert(ImpliedExt);
+    }
+    if (Size == ImpliedExtBySupportExt.size())
+      Changed = false;
+  }
+
+  // FIXME: Could hwprobe guarantee that the hardware will support the Implied
+  // extension?
+  for (unsigned Idx = 0; Idx < UnsupportByHwprobe.size(); Idx++) {
+    if (!llvm::is_contained(ImpliedExtBySupportExt, UnsupportByHwprobe[Idx]))
+      CGM.getDiags().Report(diag::err_extension_unsupport_riscv_hwprobe)
+          << UnsupportByHwprobe[Idx];
+  }
+
+  StructType *structType =
----------------
topperc wrote:

Variable name should be capitalized

https://github.com/llvm/llvm-project/pull/85786


More information about the cfe-commits mailing list