[clang] [llvm] [ARM] Emit an error when the hard-float ABI is enabled but can't be used. (PR #111334)

Chris Copeland via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 1 13:47:06 PST 2025


================
@@ -311,11 +311,15 @@ ARMBaseTargetMachine::getSubtargetImpl(const Function &F) const {
     // function that reside in TargetOptions.
     resetTargetOptions(F);
     I = std::make_unique<ARMSubtarget>(TargetTriple, CPU, FS, *this, isLittle,
-                                        F.hasMinSize());
+                                       F.hasMinSize());
 
     if (!I->isThumb() && !I->hasARMOps())
       F.getContext().emitError("Function '" + F.getName() + "' uses ARM "
           "instructions, but the target does not support ARM mode execution.");
+
+    if (I->isTargetHardFloat() && !I->hasFPRegs())
+      F.getContext().emitError("The hard-float ABI is enabled, but the target "
+                               "lacks floating-point registers.");
----------------
chrisnc wrote:

Ah, I remember now where I got stuck on this before. I need to obtain this property on the `ARMSubtarget` rather than the `ARMBaseTargetMachine`, but neither of them expose `Options` publicly, and `ARMSubtarget` just invokes `isTargetHardFloat` on its `TM` member, without accounting for its own `Options`, even though they are copied from the `ARMBaseTargetMachine` when the subtarget is created.

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


More information about the llvm-commits mailing list