Skip to content

Commit 7c57847

Browse files
zakk0610zmodem
authored andcommitted
[RISCV] Check the target-abi module flag matches the option
Reviewers: lenary, asb Reviewed By: lenary Tags: #llvm Differential Revision: https://reviews.llvm.org/D72768 (cherry picked from commit 1256d68)
1 parent 01fd650 commit 7c57847

File tree

5 files changed

+79
-12
lines changed

5 files changed

+79
-12
lines changed

llvm/lib/Target/RISCV/RISCVTargetMachine.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "RISCVTargetObjectFile.h"
1616
#include "RISCVTargetTransformInfo.h"
1717
#include "TargetInfo/RISCVTargetInfo.h"
18+
#include "Utils/RISCVBaseInfo.h"
1819
#include "llvm/ADT/STLExtras.h"
1920
#include "llvm/Analysis/TargetTransformInfo.h"
2021
#include "llvm/CodeGen/GlobalISel/IRTranslator.h"
@@ -89,8 +90,17 @@ RISCVTargetMachine::getSubtargetImpl(const Function &F) const {
8990
// creation will depend on the TM and the code generation flags on the
9091
// function that reside in TargetOptions.
9192
resetTargetOptions(F);
92-
I = std::make_unique<RISCVSubtarget>(TargetTriple, CPU, FS,
93-
Options.MCOptions.getABIName(), *this);
93+
auto ABIName = Options.MCOptions.getABIName();
94+
if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
95+
F.getParent()->getModuleFlag("target-abi"))) {
96+
auto TargetABI = RISCVABI::getTargetABI(ABIName);
97+
if (TargetABI != RISCVABI::ABI_Unknown &&
98+
ModuleTargetABI->getString() != ABIName) {
99+
report_fatal_error("-target-abi option != target-abi module flag");
100+
}
101+
ABIName = ModuleTargetABI->getString();
102+
}
103+
I = std::make_unique<RISCVSubtarget>(TargetTriple, CPU, FS, ABIName, *this);
94104
}
95105
return I.get();
96106
}

llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,7 @@ namespace RISCVSysReg {
1212
namespace RISCVABI {
1313
ABI computeTargetABI(const Triple &TT, FeatureBitset FeatureBits,
1414
StringRef ABIName) {
15-
auto TargetABI = StringSwitch<ABI>(ABIName)
16-
.Case("ilp32", ABI_ILP32)
17-
.Case("ilp32f", ABI_ILP32F)
18-
.Case("ilp32d", ABI_ILP32D)
19-
.Case("ilp32e", ABI_ILP32E)
20-
.Case("lp64", ABI_LP64)
21-
.Case("lp64f", ABI_LP64F)
22-
.Case("lp64d", ABI_LP64D)
23-
.Default(ABI_Unknown);
24-
15+
auto TargetABI = getTargetABI(ABIName);
2516
bool IsRV64 = TT.isArch64Bit();
2617
bool IsRV32E = FeatureBits[RISCV::FeatureRV32E];
2718

@@ -58,6 +49,19 @@ ABI computeTargetABI(const Triple &TT, FeatureBitset FeatureBits,
5849
return ABI_ILP32;
5950
}
6051

52+
ABI getTargetABI(StringRef ABIName) {
53+
auto TargetABI = StringSwitch<ABI>(ABIName)
54+
.Case("ilp32", ABI_ILP32)
55+
.Case("ilp32f", ABI_ILP32F)
56+
.Case("ilp32d", ABI_ILP32D)
57+
.Case("ilp32e", ABI_ILP32E)
58+
.Case("lp64", ABI_LP64)
59+
.Case("lp64f", ABI_LP64F)
60+
.Case("lp64d", ABI_LP64D)
61+
.Default(ABI_Unknown);
62+
return TargetABI;
63+
}
64+
6165
// To avoid the BP value clobbered by a function call, we need to choose a
6266
// callee saved register to save the value. RV32E only has X8 and X9 as callee
6367
// saved registers and X8 will be used as fp. So we choose X9 as bp.

llvm/lib/Target/RISCV/Utils/RISCVBaseInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,8 @@ enum ABI {
202202
ABI computeTargetABI(const Triple &TT, FeatureBitset FeatureBits,
203203
StringRef ABIName);
204204

205+
ABI getTargetABI(StringRef ABIName);
206+
205207
// Returns the register used to hold the stack pointer after realignment.
206208
Register getBPReg();
207209

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
; RUN: llc -mtriple=riscv32 < %s 2>&1 \
2+
; RUN: | FileCheck -check-prefix=DEFAULT %s
3+
; RUN: llc -mtriple=riscv32 -target-abi ilp32 < %s 2>&1 \
4+
; RUN: | FileCheck -check-prefix=RV32IF-ILP32 %s
5+
; RUN: not llc -mtriple=riscv32 -target-abi ilp32f < %s 2>&1 \
6+
; RUN: | FileCheck -check-prefix=RV32IF-ILP32F %s
7+
; RUN: llc -mtriple=riscv32 -filetype=obj < %s | llvm-readelf -h - | FileCheck -check-prefixes=FLAGS %s
8+
9+
; RV32IF-ILP32F: -target-abi option != target-abi module flag
10+
11+
; FLAGS: Flags: 0x0
12+
13+
define float @foo(i32 %a) nounwind #0 {
14+
; DEFAULT: # %bb.0:
15+
; DEFAULT: fmv.x.w a0, ft0
16+
; RV32IF-ILP32: # %bb.0:
17+
; RV32IF-ILP32: fmv.x.w a0, ft0
18+
%conv = sitofp i32 %a to float
19+
ret float %conv
20+
}
21+
22+
attributes #0 = { "target-features"="+f"}
23+
!llvm.module.flags = !{!0}
24+
!0 = !{i32 1, !"target-abi", !"ilp32"}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
; RUN: llc -mtriple=riscv32 < %s 2>&1 \
2+
; RUN: | FileCheck -check-prefix=DEFAULT %s
3+
; RUN: not llc -mtriple=riscv32 -target-abi ilp32 < %s 2>&1 \
4+
; RUN: | FileCheck -check-prefix=RV32IF-ILP32 %s
5+
; RUN: llc -mtriple=riscv32 -target-abi ilp32f < %s 2>&1 \
6+
; RUN: | FileCheck -check-prefix=RV32IF-ILP32F %s
7+
; RUN: llc -mtriple=riscv32 -filetype=obj < %s | llvm-readelf -h - | FileCheck -check-prefixes=FLAGS %s
8+
9+
; RV32IF-ILP32: -target-abi option != target-abi module flag
10+
11+
; FLAGS: Flags: 0x0
12+
; // this should be "Flags :0x2, single-float ABI", it will be fixed later.
13+
14+
define float @foo(i32 %a) nounwind #0 {
15+
; DEFAULT: # %bb.0:
16+
; DEFAULT-NEXT: fcvt.s.w fa0, a0
17+
; DEFAULT-NEXT: ret
18+
; RV32IF-ILP32F: # %bb.0:
19+
; RV32IF-ILP32F: fcvt.s.w fa0, a0
20+
; RV32IF-ILP32F: ret
21+
%conv = sitofp i32 %a to float
22+
ret float %conv
23+
}
24+
25+
attributes #0 = { "target-features"="+f"}
26+
!llvm.module.flags = !{!0}
27+
!0 = !{i32 1, !"target-abi", !"ilp32f"}

0 commit comments

Comments
 (0)