Skip to content

Commit 57b5f4b

Browse files
committed
[RISCV][Clang] Compute the default target-abi if it's empty.
Every generated IR has a corresponding target-abi value, so encoding a non-empty value would improve the robustness and correctness. Reviewed By: asb, jrtc27, arichardson Differential Revision: https://reviews.llvm.org/D105555
1 parent 3dbccca commit 57b5f4b

File tree

5 files changed

+38
-20
lines changed

5 files changed

+38
-20
lines changed

clang/lib/Basic/Targets/RISCV.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
246246
ISAInfo = std::move(*ParseResult);
247247
}
248248

249+
if (ABI.empty())
250+
ABI = llvm::RISCV::computeDefaultABIFromArch(*ISAInfo).str();
251+
249252
return true;
250253
}
251254

clang/lib/Driver/ToolChains/Arch/RISCV.cpp

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -194,27 +194,11 @@ StringRef riscv::getRISCVABI(const ArgList &Args, const llvm::Triple &Triple) {
194194

195195
auto ParseResult = llvm::RISCVISAInfo::parseArchString(
196196
Arch, /* EnableExperimentalExtension */ true);
197-
if (!ParseResult) {
197+
if (!ParseResult)
198198
// Ignore parsing error, just go 3rd step.
199199
consumeError(ParseResult.takeError());
200-
} else {
201-
auto &ISAInfo = *ParseResult;
202-
bool HasD = ISAInfo->hasExtension("d");
203-
unsigned XLen = ISAInfo->getXLen();
204-
if (XLen == 32) {
205-
bool HasE = ISAInfo->hasExtension("e");
206-
if (HasD)
207-
return "ilp32d";
208-
if (HasE)
209-
return "ilp32e";
210-
return "ilp32";
211-
} else if (XLen == 64) {
212-
if (HasD)
213-
return "lp64d";
214-
return "lp64";
215-
}
216-
llvm_unreachable("unhandled XLen");
217-
}
200+
else
201+
return llvm::RISCV::computeDefaultABIFromArch(**ParseResult);
218202

219203
// 3. Choose a default based on the triple
220204
//
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,28 @@
1+
// RUN: %clang_cc1 -triple riscv32 -emit-llvm -o - %s | FileCheck -check-prefix=EMPTY-ILP32 %s
2+
// RUN: %clang_cc1 -triple riscv32 -emit-llvm -target-feature +f -target-feature +d -o - %s | FileCheck -check-prefix=EMPTY-ILP32D %s
13
// RUN: %clang_cc1 -triple riscv32 -target-abi ilp32 -emit-llvm -o - %s | FileCheck -check-prefix=ILP32 %s
24
// RUN: %clang_cc1 -triple riscv32 -target-feature +f -target-abi ilp32f -emit-llvm -o - %s | FileCheck -check-prefix=ILP32F %s
35
// RUN: %clang_cc1 -triple riscv32 -target-feature +d -target-feature +f -target-abi ilp32d -emit-llvm -o - %s | FileCheck -check-prefix=ILP32D %s
6+
// RUN: %clang_cc1 -triple riscv64 -emit-llvm -o - %s | FileCheck -check-prefix=EMPTY-LP64 %s
7+
// RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-feature +d -emit-llvm -o - %s | FileCheck -check-prefix=EMPTY-LP64D %s
48
// RUN: %clang_cc1 -triple riscv64 -target-abi lp64 -emit-llvm -o - %s | FileCheck -check-prefix=LP64 %s
59
// RUN: %clang_cc1 -triple riscv64 -target-feature +f -target-abi lp64f -emit-llvm -o - %s | FileCheck -check-prefix=LP64F %s
610
// RUN: %clang_cc1 -triple riscv64 -target-feature +d -target-feature +f -target-abi lp64d -emit-llvm -o - %s | FileCheck -check-prefix=LP64D %s
711

12+
// Test expected behavior when giving -target-cpu
13+
// This cc1 test is similar to clang with -march=rv32ifd -mcpu=sifive-e31, default abi is ilp32d
14+
// RUN: %clang_cc1 -triple riscv32 -emit-llvm -target-feature +f -target-feature +d -target-cpu sifive-e31 -o - %s | FileCheck -check-prefix=EMPTY-ILP32D %s
15+
// This cc1 test is similar to clang with -march=rv64i -mcpu=sifive-u74, default abi is lp64
16+
// RUN: %clang_cc1 -triple riscv64 -emit-llvm -o - -target-cpu sifive-u74 %s | FileCheck -check-prefix=EMPTY-LP64 %s
17+
18+
// EMPTY-ILP32: !{{[0-9]+}} = !{i32 1, !"target-abi", !"ilp32"}
19+
// EMPTY-ILP32D: !{{[0-9]+}} = !{i32 1, !"target-abi", !"ilp32d"}
820
// ILP32: !{{[0-9]+}} = !{i32 1, !"target-abi", !"ilp32"}
921
// ILP32F: !{{[0-9]+}} = !{i32 1, !"target-abi", !"ilp32f"}
1022
// ILP32D: !{{[0-9]+}} = !{i32 1, !"target-abi", !"ilp32d"}
1123

24+
// EMPTY-LP64: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64"}
25+
// EMPTY-LP64D: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64d"}
1226
// LP64: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64"}
1327
// LP64F: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64f"}
1428
// LP64D: !{{[0-9]+}} = !{i32 1, !"target-abi", !"lp64d"}

llvm/include/llvm/Support/TargetParser.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
// FIXME: vector is used because that's what clang uses for subtarget feature
1818
// lists, but SmallVector would probably be better
1919
#include "llvm/ADT/Triple.h"
20-
#include "llvm/Support/ARMTargetParser.h"
2120
#include "llvm/Support/AArch64TargetParser.h"
21+
#include "llvm/Support/ARMTargetParser.h"
22+
#include "llvm/Support/RISCVISAInfo.h"
2223
#include <vector>
2324

2425
namespace llvm {
@@ -174,6 +175,7 @@ void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
174175
void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
175176
bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features);
176177
StringRef resolveTuneCPUAlias(StringRef TuneCPU, bool IsRV64);
178+
StringRef computeDefaultABIFromArch(const llvm::RISCVISAInfo &ISAInfo);
177179

178180
} // namespace RISCV
179181

llvm/lib/Support/TargetParser.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,21 @@ bool getCPUFeaturesExceptStdExt(CPUKind Kind,
331331
return true;
332332
}
333333

334+
StringRef computeDefaultABIFromArch(const llvm::RISCVISAInfo &ISAInfo) {
335+
if (ISAInfo.getXLen() == 32) {
336+
if (ISAInfo.hasExtension("d"))
337+
return "ilp32d";
338+
if (ISAInfo.hasExtension("e"))
339+
return "ilp32e";
340+
return "ilp32";
341+
} else if (ISAInfo.getXLen() == 64) {
342+
if (ISAInfo.hasExtension("d"))
343+
return "lp64d";
344+
return "lp64";
345+
}
346+
llvm_unreachable("Invalid XLEN");
347+
}
348+
334349
} // namespace RISCV
335350
} // namespace llvm
336351

0 commit comments

Comments
 (0)