LLVM 22.0.0git
ARMSubtarget.cpp
Go to the documentation of this file.
1//===-- ARMSubtarget.cpp - ARM Subtarget Information ----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements the ARM specific subclass of TargetSubtargetInfo.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ARM.h"
14
15#include "ARMCallLowering.h"
16#include "ARMFrameLowering.h"
17#include "ARMInstrInfo.h"
18#include "ARMLegalizerInfo.h"
19#include "ARMRegisterBankInfo.h"
20#include "ARMSubtarget.h"
21#include "ARMTargetMachine.h"
23#include "Thumb1FrameLowering.h"
24#include "Thumb1InstrInfo.h"
25#include "Thumb2InstrInfo.h"
26#include "llvm/ADT/StringRef.h"
27#include "llvm/ADT/Twine.h"
31#include "llvm/IR/Function.h"
32#include "llvm/IR/GlobalValue.h"
33#include "llvm/MC/MCAsmInfo.h"
40
41using namespace llvm;
42
43#define DEBUG_TYPE "arm-subtarget"
44
45#define GET_SUBTARGETINFO_TARGET_DESC
46#define GET_SUBTARGETINFO_CTOR
47#include "ARMGenSubtargetInfo.inc"
48
49static cl::opt<bool>
50UseFusedMulOps("arm-use-mulops",
51 cl::init(true), cl::Hidden);
52
53enum ITMode {
56};
57
58static cl::opt<ITMode>
59 IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT),
60 cl::values(clEnumValN(DefaultIT, "arm-default-it",
61 "Generate any type of IT block"),
62 clEnumValN(RestrictedIT, "arm-restrict-it",
63 "Disallow complex IT blocks")));
64
65/// ForceFastISel - Use the fast-isel, even for subtargets where it is not
66/// currently supported (for testing only).
67static cl::opt<bool>
68ForceFastISel("arm-force-fast-isel",
69 cl::init(false), cl::Hidden);
70
71/// initializeSubtargetDependencies - Initializes using a CPU and feature string
72/// so that we can use initializer lists for subtarget initialization.
74 StringRef FS) {
75 initSubtargetFeatures(CPU, FS);
76 return *this;
77}
78
79ARMFrameLowering *ARMSubtarget::initializeFrameLowering(StringRef CPU,
80 StringRef FS) {
82 if (STI.isThumb1Only())
83 return (ARMFrameLowering *)new Thumb1FrameLowering(STI);
84
85 return new ARMFrameLowering(STI);
86}
87
88ARMSubtarget::ARMSubtarget(const Triple &TT, const std::string &CPU,
89 const std::string &FS,
90 const ARMBaseTargetMachine &TM, bool IsLittle,
91 bool MinSize)
92 : ARMGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),
93 UseMulOps(UseFusedMulOps), CPUString(CPU), OptMinSize(MinSize),
94 IsLittle(IsLittle), TargetTriple(TT), Options(TM.Options), TM(TM),
95 FrameLowering(initializeFrameLowering(CPU, FS)),
96 // At this point initializeSubtargetDependencies has been called so
97 // we can query directly.
98 InstrInfo(isThumb1Only()
99 ? (ARMBaseInstrInfo *)new Thumb1InstrInfo(*this)
100 : !isThumb()
101 ? (ARMBaseInstrInfo *)new ARMInstrInfo(*this)
102 : (ARMBaseInstrInfo *)new Thumb2InstrInfo(*this)),
103 TLInfo(TM, *this) {
104
105 CallLoweringInfo.reset(new ARMCallLowering(*getTargetLowering()));
106 Legalizer.reset(new ARMLegalizerInfo(*this));
107
108 auto *RBI = new ARMRegisterBankInfo(*getRegisterInfo());
109
110 // FIXME: At this point, we can't rely on Subtarget having RBI.
111 // It's awkward to mix passing RBI and the Subtarget; should we pass
112 // TII/TRI as well?
113 InstSelector.reset(createARMInstructionSelector(TM, *this, *RBI));
114
115 RegBankInfo.reset(RBI);
116}
117
119 return CallLoweringInfo.get();
120}
121
123 return InstSelector.get();
124}
125
127 return Legalizer.get();
128}
129
131 return RegBankInfo.get();
132}
133
135 // We don't currently suppport Thumb, but Windows requires Thumb.
136 return hasV6Ops() && hasARMOps() && !isTargetWindows();
137}
138
139void ARMSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
140 if (CPUString.empty()) {
141 CPUString = "generic";
142
143 if (isTargetDarwin()) {
145 ARM::ArchKind AK = ARM::parseArch(ArchName);
146 if (AK == ARM::ArchKind::ARMV7S)
147 // Default to the Swift CPU when targeting armv7s/thumbv7s.
148 CPUString = "swift";
149 else if (AK == ARM::ArchKind::ARMV7K)
150 // Default to the Cortex-a7 CPU when targeting armv7k/thumbv7k.
151 // ARMv7k does not use SjLj exception handling.
152 CPUString = "cortex-a7";
153 }
154 }
155
156 // Insert the architecture feature derived from the target triple into the
157 // feature string. This is important for setting features that are implied
158 // based on the architecture version.
159 std::string ArchFS = ARM_MC::ParseARMTriple(TargetTriple, CPUString);
160 if (!FS.empty()) {
161 if (!ArchFS.empty())
162 ArchFS = (Twine(ArchFS) + "," + FS).str();
163 else
164 ArchFS = std::string(FS);
165 }
166 ParseSubtargetFeatures(CPUString, /*TuneCPU*/ CPUString, ArchFS);
167
168 // FIXME: This used enable V6T2 support implicitly for Thumb2 mode.
169 // Assert this for now to make the change obvious.
170 assert(hasV6T2Ops() || !hasThumb2());
171
172 if (genExecuteOnly()) {
173 // Execute only support for >= v8-M Baseline requires movt support
174 if (hasV8MBaselineOps())
175 NoMovt = false;
176 if (!hasV6MOps())
177 report_fatal_error("Cannot generate execute-only code for this target");
178 }
179
180 // Keep a pointer to static instruction cost data for the specified CPU.
181 SchedModel = getSchedModelForCPU(CPUString);
182
183 // Initialize scheduling itinerary for the specified CPU.
184 InstrItins = getInstrItineraryForCPU(CPUString);
185
186 // FIXME: this is invalid for WindowsCE
187 if (isTargetWindows())
188 NoARM = true;
189
190 if (TM.isAAPCS_ABI())
192 if (TM.isAAPCS16_ABI())
193 stackAlignment = Align(16);
194
195 // FIXME: Completely disable sibcall for Thumb1 since ThumbRegisterInfo::
196 // emitEpilogue is not ready for them. Thumb tail calls also use t2B, as
197 // the Thumb1 16-bit unconditional branch doesn't have sufficient relocation
198 // support in the assembler and linker to be used. This would need to be
199 // fixed to fully support tail calls in Thumb1.
200 //
201 // For ARMv8-M, we /do/ implement tail calls. Doing this is tricky for v8-M
202 // baseline, since the LDM/POP instruction on Thumb doesn't take LR. This
203 // means if we need to reload LR, it takes extra instructions, which outweighs
204 // the value of the tail call; but here we don't know yet whether LR is going
205 // to be used. We take the optimistic approach of generating the tail call and
206 // perhaps taking a hit if we need to restore the LR.
207
208 // Thumb1 PIC calls to external symbols use BX, so they can be tail calls,
209 // but we need to make sure there are enough registers; the only valid
210 // registers are the 4 used for parameters. We don't currently do this
211 // case.
212
213 SupportsTailCall = !isThumb1Only() || hasV8MBaselineOps();
214
215 switch (IT) {
216 case DefaultIT:
217 RestrictIT = false;
218 break;
219 case RestrictedIT:
220 RestrictIT = true;
221 break;
222 }
223
224 // NEON f32 ops are non-IEEE 754 compliant. Darwin is ok with it by default.
225 const FeatureBitset &Bits = getFeatureBits();
226 if ((Bits[ARM::ProcA5] || Bits[ARM::ProcA8]) && // Where this matters
228 HasNEONForFP = true;
229
230 if (isRWPI())
231 ReserveR9 = true;
232
233 // If MVEVectorCostFactor is still 0 (has not been set to anything else), default it to 2
234 if (MVEVectorCostFactor == 0)
236
237 // FIXME: Teach TableGen to deal with these instead of doing it manually here.
238 switch (ARMProcFamily) {
239 case Others:
240 case CortexA5:
241 break;
242 case CortexA7:
244 break;
245 case CortexA8:
247 break;
248 case CortexA9:
251 break;
252 case CortexA12:
253 break;
254 case CortexA15:
258 break;
259 case CortexA17:
260 case CortexA32:
261 case CortexA35:
262 case CortexA53:
263 case CortexA55:
264 case CortexA57:
265 case CortexA72:
266 case CortexA73:
267 case CortexA75:
268 case CortexA76:
269 case CortexA77:
270 case CortexA78:
271 case CortexA78AE:
272 case CortexA78C:
273 case CortexA510:
274 case CortexA710:
275 case CortexR4:
276 case CortexR5:
277 case CortexR7:
278 case CortexM3:
279 case CortexM55:
280 case CortexM7:
281 case CortexM85:
282 case CortexR52:
283 case CortexR52plus:
284 case CortexX1:
285 case CortexX1C:
286 break;
287 case Exynos:
290 if (!isThumb())
292 break;
293 case Kryo:
294 break;
295 case Krait:
297 break;
298 case NeoverseV1:
299 break;
300 case Swift:
305 break;
306 }
307}
308
310 return TM.getRelocationModel() == Reloc::ROPI ||
312}
314 return TM.getRelocationModel() == Reloc::RWPI ||
316}
317
319 if (!TM.shouldAssumeDSOLocal(GV))
320 return true;
321
322 // 32 bit macho has no relocation for a-b if a is undefined, even if b is in
323 // the section that is being relocated. This means we have to use o load even
324 // for GVs that are known to be local to the dso.
327 return true;
328
329 return false;
330}
331
333 return isTargetELF() && TM.isPositionIndependent() && !GV->isDSOLocal();
334}
335
338}
339
341 // The MachineScheduler can increase register usage, so we use more high
342 // registers and end up with more T2 instructions that cannot be converted to
343 // T1 instructions. At least until we do better at converting to thumb1
344 // instructions, on cortex-m at Oz where we are size-paranoid, don't use the
345 // Machine scheduler, relying on the DAG register pressure scheduler instead.
346 if (isMClass() && hasMinSize())
347 return false;
348 // Enable the MachineScheduler before register allocation for subtargets
349 // with the use-misched feature.
350 return useMachineScheduler();
351}
352
354 // Enable SubRegLiveness for MVE to better optimize s subregs for mqpr regs
355 // and q subregs for qqqqpr regs.
356 return hasMVEIntegerOps();
357}
358
360 // Enable the MachinePipeliner before register allocation for subtargets
361 // with the use-mipipeliner feature.
362 return getSchedModel().hasInstrSchedModel() && useMachinePipeliner();
363}
364
365bool ARMSubtarget::useDFAforSMS() const { return false; }
366
367// This overrides the PostRAScheduler bit in the SchedModel for any CPU.
370 return false;
371 if (disablePostRAScheduler())
372 return false;
373 // Thumb1 cores will generally not benefit from post-ra scheduling
374 return !isThumb1Only();
375}
376
379 return false;
380 if (disablePostRAScheduler())
381 return false;
382 return !isThumb1Only();
383}
384
386 // For general targets, the prologue can grow when VFPs are allocated with
387 // stride 4 (more vpush instructions). But WatchOS uses a compact unwind
388 // format which it's more important to get right.
389 return isTargetWatchABI() ||
390 (useWideStrideVFP() && !OptMinSize);
391}
392
394 // NOTE Windows on ARM needs to use mov.w/mov.t pairs to materialise 32-bit
395 // immediates as it is inherently position independent, and may be out of
396 // range otherwise.
397 return !NoMovt && hasV8MBaselineOps() &&
398 (isTargetWindows() || !OptMinSize || genExecuteOnly());
399}
400
402 // Enable fast-isel for any target, for testing only.
403 if (ForceFastISel)
404 return true;
405
406 // Limit fast-isel to the targets that are or have been tested.
407 if (!hasV6Ops())
408 return false;
409
410 // Thumb2 support on iOS; ARM support on iOS and Linux.
411 return TM.Options.EnableFastISel && ((isTargetMachO() && !isThumb1Only()) ||
412 (isTargetLinux() && !isThumb()));
413}
414
416 // The GPR register class has multiple possible allocation orders, with
417 // tradeoffs preferred by different sub-architectures and optimisation goals.
418 // The allocation orders are:
419 // 0: (the default tablegen order, not used)
420 // 1: r14, r0-r13
421 // 2: r0-r7
422 // 3: r0-r7, r12, lr, r8-r11
423 // Note that the register allocator will change this order so that
424 // callee-saved registers are used later, as they require extra work in the
425 // prologue/epilogue (though we sometimes override that).
426
427 // For thumb1-only targets, only the low registers are allocatable.
428 if (isThumb1Only())
429 return 2;
430
431 // Allocate low registers first, so we can select more 16-bit instructions.
432 // We also (in ignoreCSRForAllocationOrder) override the default behaviour
433 // with regards to callee-saved registers, because pushing extra registers is
434 // much cheaper (in terms of code size) than using high registers. After
435 // that, we allocate r12 (doesn't need to be saved), lr (saving it means we
436 // can return with the pop, don't need an extra "bx lr") and then the rest of
437 // the high registers.
438 if (isThumb2() && MF.getFunction().hasMinSize())
439 return 3;
440
441 // Otherwise, allocate in the default order, using LR first because saving it
442 // allows a shorter epilogue sequence.
443 return 1;
444}
445
447 MCRegister PhysReg) const {
448 // To minimize code size in Thumb2, we prefer the usage of low regs (lower
449 // cost per use) so we can use narrow encoding. By default, caller-saved
450 // registers (e.g. lr, r12) are always allocated first, regardless of
451 // their cost per use. When optForMinSize, we prefer the low regs even if
452 // they are CSR because usually push/pop can be folded into existing ones.
453 return isThumb2() && MF.getFunction().hasMinSize() &&
454 ARM::GPRRegClass.contains(PhysReg);
455}
456
459 const Function &F = MF.getFunction();
460 const MachineFrameInfo &MFI = MF.getFrameInfo();
461
462 // Thumb1 always splits the pushes at R7, because the Thumb1 push instruction
463 // cannot use high registers except for lr.
464 if (isThumb1Only())
465 return SplitR7;
466
467 // If R7 is the frame pointer, we must split at R7 to ensure that the
468 // previous frame pointer (R7) and return address (LR) are adjacent on the
469 // stack, to form a valid frame record.
470 if (getFramePointerReg() == ARM::R7 &&
472 return SplitR7;
473
474 // Returns SplitR11WindowsSEH when the stack pointer needs to be
475 // restored from the frame pointer r11 + an offset and Windows CFI is enabled.
476 // This stack unwinding cannot be expressed with SEH unwind opcodes when done
477 // with a single push, making it necessary to split the push into r4-r10, and
478 // another containing r11+lr.
479 if (MF.getTarget().getMCAsmInfo()->usesWindowsCFI() &&
480 F.needsUnwindTableEntry() &&
481 (MFI.hasVarSizedObjects() || getRegisterInfo()->hasStackRealignment(MF)))
482 return SplitR11WindowsSEH;
483
484 // Returns SplitR11AAPCSSignRA when the frame pointer is R11, requiring R11
485 // and LR to be adjacent on the stack, and branch signing is enabled,
486 // requiring R12 to be on the stack.
488 getFramePointerReg() == ARM::R11 &&
490 return SplitR11AAPCSSignRA;
491 return NoSplit;
492}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isThumb(const MCSubtargetInfo &STI)
This file describes how to lower LLVM calls to machine code calls.
This file declares the targeting of the Machinelegalizer class for ARM.
This file declares the targeting of the RegisterBankInfo class for ARM.
static cl::opt< bool > UseFusedMulOps("arm-use-mulops", cl::init(true), cl::Hidden)
static cl::opt< bool > ForceFastISel("arm-force-fast-isel", cl::init(false), cl::Hidden)
ForceFastISel - Use the fast-isel, even for subtargets where it is not currently supported (for testi...
static cl::opt< ITMode > IT(cl::desc("IT block support"), cl::Hidden, cl::init(DefaultIT), cl::values(clEnumValN(DefaultIT, "arm-default-it", "Generate any type of IT block"), clEnumValN(RestrictedIT, "arm-restrict-it", "Disallow complex IT blocks")))
ITMode
@ RestrictedIT
@ DefaultIT
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
Definition: CommandLine.h:687
static LVOptions Options
Definition: LVOptions.cpp:25
#define F(x, y, z)
Definition: MD5.cpp:55
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
This class provides the information for the target register banks.
bool useFastISel() const
True if fast-isel is used.
bool isTargetMachO() const
Definition: ARMSubtarget.h:346
bool useMovt() const
bool enablePostRAScheduler() const override
True for some subtargets at > -O0.
ARMLdStMultipleTiming LdStMultipleTiming
What kind of timing do load multiple/store multiple have (double issue, single issue etc).
Definition: ARMSubtarget.h:168
ARMSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const ARMBaseTargetMachine &TM, bool IsLittle, bool MinSize=false)
This constructor initializes the data members to match that of the specified triple.
bool hasARMOps() const
Definition: ARMSubtarget.h:298
unsigned getGPRAllocationOrder(const MachineFunction &MF) const
const RegisterBankInfo * getRegBankInfo() const override
unsigned MaxInterleaveFactor
Definition: ARMSubtarget.h:161
const ARMBaseTargetMachine & TM
Definition: ARMSubtarget.h:201
bool isThumb1Only() const
Definition: ARMSubtarget.h:375
ARMProcFamilyEnum ARMProcFamily
ARMProcFamily - ARM processor family: Cortex-A8, Cortex-A9, and others.
Definition: ARMSubtarget.h:133
bool isThumb2() const
Definition: ARMSubtarget.h:376
bool useDFAforSMS() const override
MCPhysReg getFramePointerReg() const
Definition: ARMSubtarget.h:385
bool isTargetWindows() const
Definition: ARMSubtarget.h:342
bool enableSubRegLiveness() const override
Check whether this subtarget wants to use subregister liveness.
bool isGVIndirectSymbol(const GlobalValue *GV) const
True if the GV will be accessed via an indirect symbol.
unsigned MVEVectorCostFactor
The cost factor for MVE instructions, representing the multiple beats an.
Definition: ARMSubtarget.h:180
const ARMTargetLowering * getTargetLowering() const override
Definition: ARMSubtarget.h:239
MCSchedModel SchedModel
SchedModel - Processor specific instruction costs.
Definition: ARMSubtarget.h:193
std::string CPUString
CPUString - String name of used CPU.
Definition: ARMSubtarget.h:159
unsigned getMispredictionPenalty() const
unsigned PreferBranchLogAlignment
What alignment is preferred for loop bodies and functions, in log2(bytes).
Definition: ARMSubtarget.h:175
Triple TargetTriple
TargetTriple - What processor and OS we're targeting.
Definition: ARMSubtarget.h:190
bool enableMachineScheduler() const override
Returns true if machine scheduler should be enabled.
bool isTargetDarwin() const
Definition: ARMSubtarget.h:335
const ARMBaseRegisterInfo * getRegisterInfo() const override
Definition: ARMSubtarget.h:247
InstrItineraryData InstrItins
Selected instruction itineraries (one entry per itinerary class.)
Definition: ARMSubtarget.h:196
bool useStride4VFPs() const
bool OptMinSize
OptMinSize - True if we're optimising for minimum code size, equal to the function attribute.
Definition: ARMSubtarget.h:184
bool RestrictIT
RestrictIT - If true, the subtarget disallows generation of complex IT blocks.
Definition: ARMSubtarget.h:152
bool ignoreCSRForAllocationOrder(const MachineFunction &MF, MCRegister PhysReg) const override
bool isROPI() const
Align stackAlignment
stackAlignment - The minimum alignment known to hold of the stack frame on entry to the function and ...
Definition: ARMSubtarget.h:156
unsigned PartialUpdateClearance
Clearance before partial register updates (in number of instructions)
Definition: ARMSubtarget.h:164
bool enableMachinePipeliner() const override
Returns true if machine pipeliner should be enabled.
bool enablePostRAMachineScheduler() const override
True for some subtargets at > -O0.
InstructionSelector * getInstructionSelector() const override
bool isXRaySupported() const override
const CallLowering * getCallLowering() const override
enum PushPopSplitVariation getPushPopSplitVariation(const MachineFunction &MF) const
bool hasMinSize() const
Definition: ARMSubtarget.h:374
ARMSubtarget & initializeSubtargetDependencies(StringRef CPU, StringRef FS)
initializeSubtargetDependencies - Initializes using a CPU and feature string so that we can use initi...
PushPopSplitVariation
How the push and pop instructions of callee saved general-purpose registers should be split.
Definition: ARMSubtarget.h:86
@ SplitR11WindowsSEH
When the stack frame size is not known (because of variable-sized objects or realignment),...
Definition: ARMSubtarget.h:111
@ SplitR7
R7 and LR must be adjacent, because R7 is the frame pointer, and must point to a frame record consist...
Definition: ARMSubtarget.h:102
@ SplitR11AAPCSSignRA
When generating AAPCS-compilant frame chains, R11 is the frame pointer, and must be pushed adjacent t...
Definition: ARMSubtarget.h:123
@ NoSplit
All GPRs can be pushed in a single instruction.
Definition: ARMSubtarget.h:90
bool isGVInGOT(const GlobalValue *GV) const
Returns the constant pool modifier needed to access the GV.
bool isTargetWatchABI() const
Definition: ARMSubtarget.h:338
const TargetOptions & Options
Options passed via command line that could influence the target.
Definition: ARMSubtarget.h:199
@ DoubleIssueCheckUnalignedAccess
Can load/store 2 registers/cycle, but needs an extra cycle if the access is not 64-bit aligned.
Definition: ARMSubtarget.h:76
@ DoubleIssue
Can load/store 2 registers/cycle.
Definition: ARMSubtarget.h:73
@ SingleIssuePlusExtras
Can load/store 1 register/cycle, but needs an extra cycle for address computation and potentially als...
Definition: ARMSubtarget.h:81
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
bool useMachinePipeliner() const
Definition: ARMSubtarget.h:373
bool useMachineScheduler() const
Definition: ARMSubtarget.h:372
bool isRWPI() const
const LegalizerInfo * getLegalizerInfo() const override
bool isTargetLinux() const
Definition: ARMSubtarget.h:340
bool isMClass() const
Definition: ARMSubtarget.h:377
bool SupportsTailCall
SupportsTailCall - True if the OS supports tail call.
Definition: ARMSubtarget.h:148
int PreISelOperandLatencyAdjustment
The adjustment that we need to apply to get the operand latency from the operand cycle returned by th...
Definition: ARMSubtarget.h:172
bool isTargetELF() const
Definition: ARMSubtarget.h:345
Container class for subtarget features.
bool hasMinSize() const
Optimize this function for minimum size (-Oz).
Definition: Function.h:703
bool isDSOLocal() const
Definition: GlobalValue.h:307
bool isDeclarationForLinker() const
Definition: GlobalValue.h:625
bool hasCommonLinkage() const
Definition: GlobalValue.h:534
bool usesWindowsCFI() const
Definition: MCAsmInfo.h:652
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Holds all the information related to register banks.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
bool isPositionIndependent() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
bool shouldAssumeDSOLocal(const GlobalValue *GV) const
TargetOptions Options
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
unsigned UnsafeFPMath
UnsafeFPMath - This flag is enabled when the -enable-unsafe-fp-math flag is specified on the command ...
LLVM_ABI bool FramePointerIsReserved(const MachineFunction &MF) const
FramePointerIsReserved - This returns true if the frame pointer must always either point to a new fra...
unsigned EnableFastISel
EnableFastISel - This flag enables fast-path instruction selection which trades away generated code q...
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:47
LLVM_ABI StringRef getArchName() const
Get the architecture (first) component of the triple.
Definition: Triple.cpp:1376
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
std::string ParseARMTriple(const Triple &TT, StringRef CPU)
LLVM_ABI ArchKind parseArch(StringRef Arch)
@ Swift
Calling convention for Swift.
Definition: CallingConv.h:69
@ ROPI_RWPI
Definition: CodeGen.h:25
@ FS
Definition: X86.h:214
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
Definition: CommandLine.h:712
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
InstructionSelector * createARMInstructionSelector(const ARMBaseTargetMachine &TM, const ARMSubtarget &STI, const ARMRegisterBankInfo &RBI)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
unsigned MispredictPenalty
Definition: MCSchedule.h:311