Skip to content

Commit 874a02f

Browse files
authored
ARM: Move ABI helpers from Subtarget to TargetMachine (#144680)
These are module level concepts, and attaching them to the function level subtarget is confusing. Similarly these other helpers that only operate on the triple should also be removed from the subtarget.
1 parent bc8908a commit 874a02f

File tree

9 files changed

+57
-42
lines changed

9 files changed

+57
-42
lines changed

llvm/lib/Target/ARM/ARMAsmPrinter.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ ARMAsmPrinter::ARMAsmPrinter(TargetMachine &TM,
5454
: AsmPrinter(TM, std::move(Streamer), ID), Subtarget(nullptr), AFI(nullptr),
5555
MCP(nullptr), InConstantPool(false), OptimizationGoals(-1) {}
5656

57+
const ARMBaseTargetMachine &ARMAsmPrinter::getTM() const {
58+
return static_cast<const ARMBaseTargetMachine &>(TM);
59+
}
60+
5761
void ARMAsmPrinter::emitFunctionBodyEnd() {
5862
// Make sure to terminate any constant pools that were at the end
5963
// of the function.
@@ -750,7 +754,7 @@ void ARMAsmPrinter::emitAttributes() {
750754
ATS.emitAttribute(ARMBuildAttrs::ABI_align_preserved, 1);
751755

752756
// Hard float. Use both S and D registers and conform to AAPCS-VFP.
753-
if (STI.isAAPCS_ABI() && TM.Options.FloatABIType == FloatABI::Hard)
757+
if (getTM().isAAPCS_ABI() && TM.Options.FloatABIType == FloatABI::Hard)
754758
ATS.emitAttribute(ARMBuildAttrs::ABI_VFP_args, ARMBuildAttrs::HardFPAAPCS);
755759

756760
// FIXME: To support emitting this build attribute as GCC does, the

llvm/lib/Target/ARM/ARMAsmPrinter.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ class LLVM_LIBRARY_VISIBILITY ARMAsmPrinter : public AsmPrinter {
7676
return "ARM Assembly Printer";
7777
}
7878

79+
const ARMBaseTargetMachine &getTM() const;
80+
7981
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O);
8082

8183
void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override;

llvm/lib/Target/ARM/ARMFastISel.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "ARMISelLowering.h"
2121
#include "ARMMachineFunctionInfo.h"
2222
#include "ARMSubtarget.h"
23+
#include "ARMTargetMachine.h"
2324
#include "MCTargetDesc/ARMAddressingModes.h"
2425
#include "MCTargetDesc/ARMBaseInfo.h"
2526
#include "Utils/ARMBaseInfo.h"
@@ -134,9 +135,9 @@ class ARMFastISel final : public FastISel {
134135
/// make the right decision when generating code for different targets.
135136
const ARMSubtarget *Subtarget;
136137
Module &M;
137-
const TargetMachine &TM;
138-
const TargetInstrInfo &TII;
139-
const TargetLowering &TLI;
138+
const ARMBaseInstrInfo &TII;
139+
const ARMTargetLowering &TLI;
140+
const ARMBaseTargetMachine &TM;
140141
ARMFunctionInfo *AFI;
141142

142143
// Convenience variables to avoid some queries.
@@ -149,8 +150,8 @@ class ARMFastISel final : public FastISel {
149150
: FastISel(funcInfo, libInfo),
150151
Subtarget(&funcInfo.MF->getSubtarget<ARMSubtarget>()),
151152
M(const_cast<Module &>(*funcInfo.Fn->getParent())),
152-
TM(funcInfo.MF->getTarget()), TII(*Subtarget->getInstrInfo()),
153-
TLI(*Subtarget->getTargetLowering()) {
153+
TII(*Subtarget->getInstrInfo()), TLI(*Subtarget->getTargetLowering()),
154+
TM(TLI.getTM()) {
154155
AFI = funcInfo.MF->getInfo<ARMFunctionInfo>();
155156
isThumb2 = AFI->isThumbFunction();
156157
Context = &funcInfo.Fn->getContext();
@@ -1893,7 +1894,7 @@ CCAssignFn *ARMFastISel::CCAssignFnForCall(CallingConv::ID CC,
18931894
report_fatal_error("Unsupported calling convention");
18941895
case CallingConv::Fast:
18951896
if (Subtarget->hasVFP2Base() && !isVarArg) {
1896-
if (!Subtarget->isAAPCS_ABI())
1897+
if (!TM.isAAPCS_ABI())
18971898
return (Return ? RetFastCC_ARM_APCS : FastCC_ARM_APCS);
18981899
// For AAPCS ABI targets, just use VFP variant of the calling convention.
18991900
return (Return ? RetCC_ARM_AAPCS_VFP : CC_ARM_AAPCS_VFP);
@@ -1902,7 +1903,7 @@ CCAssignFn *ARMFastISel::CCAssignFnForCall(CallingConv::ID CC,
19021903
case CallingConv::C:
19031904
case CallingConv::CXX_FAST_TLS:
19041905
// Use target triple & subtarget features to do actual dispatch.
1905-
if (Subtarget->isAAPCS_ABI()) {
1906+
if (TM.isAAPCS_ABI()) {
19061907
if (Subtarget->hasFPRegs() &&
19071908
TM.Options.FloatABIType == FloatABI::Hard && !isVarArg)
19081909
return (Return ? RetCC_ARM_AAPCS_VFP: CC_ARM_AAPCS_VFP);

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -499,9 +499,16 @@ void ARMTargetLowering::addMVEVectorTypes(bool HasMVEFP) {
499499
setOperationAction(ISD::TRUNCATE, MVT::v16i16, Custom);
500500
}
501501

502-
ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
502+
const ARMBaseTargetMachine &ARMTargetLowering::getTM() const {
503+
return static_cast<const ARMBaseTargetMachine &>(getTargetMachine());
504+
}
505+
506+
ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM_,
503507
const ARMSubtarget &STI)
504-
: TargetLowering(TM), Subtarget(&STI) {
508+
: TargetLowering(TM_), Subtarget(&STI) {
509+
510+
const auto &TM = static_cast<const ARMBaseTargetMachine &>(TM_);
511+
505512
RegInfo = Subtarget->getRegisterInfo();
506513
Itins = Subtarget->getInstrItineraryData();
507514

@@ -591,7 +598,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
591598
}
592599

593600
// RTLIB
594-
if (Subtarget->isAAPCS_ABI() &&
601+
if (TM.isAAPCS_ABI() &&
595602
(Subtarget->isTargetAEABI() || Subtarget->isTargetGNUAEABI() ||
596603
Subtarget->isTargetMuslAEABI() || Subtarget->isTargetAndroid())) {
597604
// clang-format off
@@ -716,7 +723,7 @@ ARMTargetLowering::ARMTargetLowering(const TargetMachine &TM,
716723
// non-watchos platforms, but are needed for some targets which use a
717724
// hard-float calling convention by default.
718725
if (!Subtarget->isTargetWatchABI()) {
719-
if (Subtarget->isAAPCS_ABI()) {
726+
if (TM.isAAPCS_ABI()) {
720727
setLibcallCallingConv(RTLIB::FPROUND_F32_F16, CallingConv::ARM_AAPCS);
721728
setLibcallCallingConv(RTLIB::FPROUND_F64_F16, CallingConv::ARM_AAPCS);
722729
setLibcallCallingConv(RTLIB::FPEXT_F16_F32, CallingConv::ARM_AAPCS);
@@ -2070,7 +2077,7 @@ ARMTargetLowering::getEffectiveCallingConv(CallingConv::ID CC,
20702077
return isVarArg ? CallingConv::ARM_AAPCS : CallingConv::ARM_AAPCS_VFP;
20712078
case CallingConv::C:
20722079
case CallingConv::Tail:
2073-
if (!Subtarget->isAAPCS_ABI())
2080+
if (!getTM().isAAPCS_ABI())
20742081
return CallingConv::ARM_APCS;
20752082
else if (Subtarget->hasFPRegs() && !Subtarget->isThumb1Only() &&
20762083
getTargetMachine().Options.FloatABIType == FloatABI::Hard &&
@@ -2080,12 +2087,12 @@ ARMTargetLowering::getEffectiveCallingConv(CallingConv::ID CC,
20802087
return CallingConv::ARM_AAPCS;
20812088
case CallingConv::Fast:
20822089
case CallingConv::CXX_FAST_TLS:
2083-
if (!Subtarget->isAAPCS_ABI()) {
2090+
if (!getTM().isAAPCS_ABI()) {
20842091
if (Subtarget->hasVFP2Base() && !Subtarget->isThumb1Only() && !isVarArg)
20852092
return CallingConv::Fast;
20862093
return CallingConv::ARM_APCS;
2087-
} else if (Subtarget->hasVFP2Base() &&
2088-
!Subtarget->isThumb1Only() && !isVarArg)
2094+
} else if (Subtarget->hasVFP2Base() && !Subtarget->isThumb1Only() &&
2095+
!isVarArg)
20892096
return CallingConv::ARM_AAPCS_VFP;
20902097
else
20912098
return CallingConv::ARM_AAPCS;
@@ -3273,7 +3280,7 @@ ARMTargetLowering::LowerReturn(SDValue Chain, CallingConv::ID CallConv,
32733280
SDValue Arg = OutVals[realRVLocIdx];
32743281
bool ReturnF16 = false;
32753282

3276-
if (Subtarget->hasFullFP16() && Subtarget->isTargetHardFloat()) {
3283+
if (Subtarget->hasFullFP16() && getTM().isTargetHardFloat()) {
32773284
// Half-precision return values can be returned like this:
32783285
//
32793286
// t11 f16 = fadd ...
@@ -9937,7 +9944,7 @@ SDValue ARMTargetLowering::LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const {
99379944
auto &DL = DAG.getDataLayout();
99389945

99399946
ArgListTy Args;
9940-
bool ShouldUseSRet = Subtarget->isAPCS_ABI();
9947+
bool ShouldUseSRet = getTM().isAPCS_ABI();
99419948
SDValue SRet;
99429949
if (ShouldUseSRet) {
99439950
// Create stack object for sret.

llvm/lib/Target/ARM/ARMISelLowering.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
namespace llvm {
3636

37+
class ARMBaseTargetMachine;
3738
class ARMSubtarget;
3839
class DataLayout;
3940
class FastISel;
@@ -414,6 +415,8 @@ class VectorType;
414415
explicit ARMTargetLowering(const TargetMachine &TM,
415416
const ARMSubtarget &STI);
416417

418+
const ARMBaseTargetMachine &getTM() const;
419+
417420
unsigned getJumpTableEncoding() const override;
418421
bool useSoftFloat() const override;
419422

llvm/lib/Target/ARM/ARMSubtarget.cpp

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,9 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
201201
if (isTargetWindows())
202202
NoARM = true;
203203

204-
if (isAAPCS_ABI())
204+
if (TM.isAAPCS_ABI())
205205
stackAlignment = Align(8);
206-
if (isTargetNaCl() || isAAPCS16_ABI())
206+
if (isTargetNaCl() || TM.isAAPCS16_ABI())
207207
stackAlignment = Align(16);
208208

209209
// FIXME: Completely disable sibcall for Thumb1 since ThumbRegisterInfo::
@@ -320,22 +320,6 @@ void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
320320
}
321321
}
322322

323-
bool ARMSubtarget::isTargetHardFloat() const { return TM.isTargetHardFloat(); }
324-
325-
bool ARMSubtarget::isAPCS_ABI() const {
326-
assert(TM.TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
327-
return TM.TargetABI == ARMBaseTargetMachine::ARM_ABI_APCS;
328-
}
329-
bool ARMSubtarget::isAAPCS_ABI() const {
330-
assert(TM.TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
331-
return TM.TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS ||
332-
TM.TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS16;
333-
}
334-
bool ARMSubtarget::isAAPCS16_ABI() const {
335-
assert(TM.TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
336-
return TM.TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS16;
337-
}
338-
339323
bool ARMSubtarget::isROPI() const {
340324
return TM.getRelocationModel() == Reloc::ROPI ||
341325
TM.getRelocationModel() == Reloc::ROPI_RWPI;

llvm/lib/Target/ARM/ARMSubtarget.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -360,8 +360,6 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
360360
return TargetTriple.isTargetEHABICompatible();
361361
}
362362

363-
bool isTargetHardFloat() const;
364-
365363
bool isReadTPSoft() const {
366364
return !(isReadTPTPIDRURW() || isReadTPTPIDRURO() || isReadTPTPIDRPRW());
367365
}
@@ -370,10 +368,6 @@ class ARMSubtarget : public ARMGenSubtargetInfo {
370368

371369
bool isXRaySupported() const override;
372370

373-
bool isAPCS_ABI() const;
374-
bool isAAPCS_ABI() const;
375-
bool isAAPCS16_ABI() const;
376-
377371
bool isROPI() const;
378372
bool isRWPI() const;
379373

llvm/lib/Target/ARM/ARMTargetMachine.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,22 @@ ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT,
271271

272272
ARMBaseTargetMachine::~ARMBaseTargetMachine() = default;
273273

274+
bool ARMBaseTargetMachine::isAPCS_ABI() const {
275+
assert(TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
276+
return TargetABI == ARMBaseTargetMachine::ARM_ABI_APCS;
277+
}
278+
279+
bool ARMBaseTargetMachine::isAAPCS_ABI() const {
280+
assert(TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
281+
return TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS ||
282+
TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS16;
283+
}
284+
285+
bool ARMBaseTargetMachine::isAAPCS16_ABI() const {
286+
assert(TargetABI != ARMBaseTargetMachine::ARM_ABI_UNKNOWN);
287+
return TargetABI == ARMBaseTargetMachine::ARM_ABI_AAPCS16;
288+
}
289+
274290
MachineFunctionInfo *ARMBaseTargetMachine::createMachineFunctionInfo(
275291
BumpPtrAllocator &Allocator, const Function &F,
276292
const TargetSubtargetInfo *STI) const {

llvm/lib/Target/ARM/ARMTargetMachine.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ class ARMBaseTargetMachine : public CodeGenTargetMachineImpl {
6666
return TLOF.get();
6767
}
6868

69+
bool isAPCS_ABI() const;
70+
bool isAAPCS_ABI() const;
71+
bool isAAPCS16_ABI() const;
72+
6973
bool isTargetHardFloat() const {
7074
return TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
7175
TargetTriple.getEnvironment() == Triple::GNUEABIHFT64 ||

0 commit comments

Comments
 (0)