[llvm-branch-commits] [LoongArch] Refactor LoongArchABI::computeTargetABI (PR #92223)
WÁNG Xuěruì via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed May 15 02:24:24 PDT 2024
================
@@ -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
More information about the llvm-branch-commits
mailing list