================ @@ -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 ---------------- xen0n wrote:
```suggestion // Fallback to the triple-implied ABI if ABI name is specified but ``` 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