================ @@ -52,63 +53,129 @@ static ABI checkABIStandardized(ABI Abi) { return Abi; } -ABI computeTargetABI(const Triple &TT, StringRef ABIName) { - ABI ArgProvidedABI = getTargetABI(ABIName); +static ABI getTripleABI(const Triple &TT) { bool Is64Bit = TT.isArch64Bit(); ABI TripleABI; - - // Figure out the ABI explicitly requested via the triple's environment type. switch (TT.getEnvironment()) { case llvm::Triple::EnvironmentType::GNUSF: - TripleABI = Is64Bit ? LoongArchABI::ABI_LP64S : LoongArchABI::ABI_ILP32S; + TripleABI = Is64Bit ? ABI_LP64S : ABI_ILP32S; break; case llvm::Triple::EnvironmentType::GNUF32: - TripleABI = Is64Bit ? LoongArchABI::ABI_LP64F : LoongArchABI::ABI_ILP32F; + TripleABI = Is64Bit ? ABI_LP64F : ABI_ILP32F; break; - // Let the fallback case behave like {ILP32,LP64}D. case llvm::Triple::EnvironmentType::GNUF64: default: - TripleABI = Is64Bit ? LoongArchABI::ABI_LP64D : LoongArchABI::ABI_ILP32D; + TripleABI = Is64Bit ? ABI_LP64D : ABI_ILP32D; break; } + return TripleABI; +} + +ABI computeTargetABI(const Triple &TT, const FeatureBitset &FeatureBits, + StringRef ABIName) { + bool Is64Bit = TT.isArch64Bit(); + ABI ArgProvidedABI = getTargetABI(ABIName); + ABI TripleABI = getTripleABI(TT); + + auto GetFeatureABI = [=]() { + if (FeatureBits[LoongArch::FeatureBasicD]) + return Is64Bit ? ABI_LP64D : ABI_ILP32D; + if (FeatureBits[LoongArch::FeatureBasicF]) + return Is64Bit ? ABI_LP64F : ABI_ILP32F; + return Is64Bit ? ABI_LP64S : ABI_ILP32S; + }; + auto IsValidABI = [=](ABI Abi) { + switch (Abi) { + default: + return false; + case ABI_ILP32S: + return !Is64Bit; + case ABI_ILP32F: + return !Is64Bit && FeatureBits[LoongArch::FeatureBasicF]; + case ABI_ILP32D: + return !Is64Bit && FeatureBits[LoongArch::FeatureBasicD]; + case ABI_LP64S: + return Is64Bit; + case ABI_LP64F: + return Is64Bit && FeatureBits[LoongArch::FeatureBasicF]; + case ABI_LP64D: + return Is64Bit && FeatureBits[LoongArch::FeatureBasicD]; + } + }; + + // 1. If the '-target-abi' is valid, use it. + if (IsValidABI(ArgProvidedABI)) { + if (TT.hasEnvironment() && ArgProvidedABI != TripleABI) + errs() + << "warning: triple-implied ABI conflicts with provided target-abi '" + << ABIName << "', using target-abi\n"; + return checkABIStandardized(ArgProvidedABI); + } + + // 2. If the triple-implied ABI is valid, use it. + if (IsValidABI(TripleABI)) { + // If not specifie target-abi, use the valid triple-implied ABI. + if (ABIName.empty()) + return checkABIStandardized(TripleABI); - switch (ArgProvidedABI) { - case LoongArchABI::ABI_Unknown: - // Fallback to the triple-implied ABI if ABI name is not specified or - // invalid. - if (!ABIName.empty()) + switch (ArgProvidedABI) { + case ABI_Unknown: + // Fallback to the triple-implied ABI if ABI name is specified and + // invalid. errs() << "'" << ABIName << "' is not a recognized ABI for this target, ignoring and using " "triple-implied ABI\n"; - return checkABIStandardized(TripleABI); - - case LoongArchABI::ABI_ILP32S: - case LoongArchABI::ABI_ILP32F: - case LoongArchABI::ABI_ILP32D: - if (Is64Bit) { - errs() << "32-bit ABIs are not supported for 64-bit targets, ignoring " - "target-abi and using triple-implied ABI\n"; return checkABIStandardized(TripleABI); + case ABI_ILP32S: + case ABI_ILP32F: + case ABI_ILP32D: + if (Is64Bit) { + errs() << "32-bit ABIs are not supported for 64-bit targets, ignoring " + "target-abi and using triple-implied ABI\n"; + return checkABIStandardized(TripleABI); + } + break; + case ABI_LP64S: + case ABI_LP64F: + case ABI_LP64D: + if (!Is64Bit) { + errs() << "64-bit ABIs are not supported for 32-bit targets, ignoring " + "target-abi and using triple-implied ABI\n"; + return checkABIStandardized(TripleABI); + } + break; } - break; - case LoongArchABI::ABI_LP64S: - case LoongArchABI::ABI_LP64F: - case LoongArchABI::ABI_LP64D: - if (!Is64Bit) { - errs() << "64-bit ABIs are not supported for 32-bit targets, ignoring " - "target-abi and using triple-implied ABI\n"; - return checkABIStandardized(TripleABI); + switch (ArgProvidedABI) { + case ABI_ILP32F: + case ABI_LP64F: + errs() << "'" << ABIName + << "' ABI can't be used for a target that doesn't support the 'F' " + "instruction set, ignoring target-abi and using triple-implied " + "ABI\n"; + break; + case ABI_ILP32D: + case ABI_LP64D: + errs() << "'" << ABIName + << "' ABI can't be used for a target that doesn't support the 'D' " + "instruction set, ignoring target-abi and using triple-implied " + "ABI\n"; + break; + default: + llvm_unreachable(""); } - break; + return checkABIStandardized(TripleABI); } - if (!ABIName.empty() && TT.hasEnvironment() && ArgProvidedABI != TripleABI) - errs() << "warning: triple-implied ABI conflicts with provided target-abi '" - << ABIName << "', using target-abi\n"; - - return checkABIStandardized(ArgProvidedABI); + // 3. Parse the 'feature-abi', and use it. + if (ABIName.empty()) + errs() << "The triple-implied ABI is invalid, ignoring triple-implied ABI " ---------------- xen0n wrote:
```suggestion errs() << "warning: the triple-implied ABI is invalid, ignoring " ``` https://github.com/llvm/llvm-project/pull/92223 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits