Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===-- CodeGen/MachineFrameInfo.h - Abstract Stack Frame Rep. --*- C++ -*-===//
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
// The file defines the MachineFrameInfo class.
10
//
11
//===----------------------------------------------------------------------===//
12
 
13
#ifndef LLVM_CODEGEN_MACHINEFRAMEINFO_H
14
#define LLVM_CODEGEN_MACHINEFRAMEINFO_H
15
 
16
#include "llvm/ADT/SmallVector.h"
17
#include "llvm/CodeGen/Register.h"
18
#include "llvm/CodeGen/TargetFrameLowering.h"
19
#include "llvm/Support/Alignment.h"
20
#include <cassert>
21
#include <vector>
22
 
23
namespace llvm {
24
class raw_ostream;
25
class MachineFunction;
26
class MachineBasicBlock;
27
class BitVector;
28
class AllocaInst;
29
 
30
/// The CalleeSavedInfo class tracks the information need to locate where a
31
/// callee saved register is in the current frame.
32
/// Callee saved reg can also be saved to a different register rather than
33
/// on the stack by setting DstReg instead of FrameIdx.
34
class CalleeSavedInfo {
35
  Register Reg;
36
  union {
37
    int FrameIdx;
38
    unsigned DstReg;
39
  };
40
  /// Flag indicating whether the register is actually restored in the epilog.
41
  /// In most cases, if a register is saved, it is also restored. There are
42
  /// some situations, though, when this is not the case. For example, the
43
  /// LR register on ARM is usually saved, but on exit from the function its
44
  /// saved value may be loaded directly into PC. Since liveness tracking of
45
  /// physical registers treats callee-saved registers are live outside of
46
  /// the function, LR would be treated as live-on-exit, even though in these
47
  /// scenarios it is not. This flag is added to indicate that the saved
48
  /// register described by this object is not restored in the epilog.
49
  /// The long-term solution is to model the liveness of callee-saved registers
50
  /// by implicit uses on the return instructions, however, the required
51
  /// changes in the ARM backend would be quite extensive.
52
  bool Restored = true;
53
  /// Flag indicating whether the register is spilled to stack or another
54
  /// register.
55
  bool SpilledToReg = false;
56
 
57
public:
58
  explicit CalleeSavedInfo(unsigned R, int FI = 0) : Reg(R), FrameIdx(FI) {}
59
 
60
  // Accessors.
61
  Register getReg()                        const { return Reg; }
62
  int getFrameIdx()                        const { return FrameIdx; }
63
  unsigned getDstReg()                     const { return DstReg; }
64
  void setFrameIdx(int FI) {
65
    FrameIdx = FI;
66
    SpilledToReg = false;
67
  }
68
  void setDstReg(Register SpillReg) {
69
    DstReg = SpillReg;
70
    SpilledToReg = true;
71
  }
72
  bool isRestored()                        const { return Restored; }
73
  void setRestored(bool R)                       { Restored = R; }
74
  bool isSpilledToReg()                    const { return SpilledToReg; }
75
};
76
 
77
/// The MachineFrameInfo class represents an abstract stack frame until
78
/// prolog/epilog code is inserted.  This class is key to allowing stack frame
79
/// representation optimizations, such as frame pointer elimination.  It also
80
/// allows more mundane (but still important) optimizations, such as reordering
81
/// of abstract objects on the stack frame.
82
///
83
/// To support this, the class assigns unique integer identifiers to stack
84
/// objects requested clients.  These identifiers are negative integers for
85
/// fixed stack objects (such as arguments passed on the stack) or nonnegative
86
/// for objects that may be reordered.  Instructions which refer to stack
87
/// objects use a special MO_FrameIndex operand to represent these frame
88
/// indexes.
89
///
90
/// Because this class keeps track of all references to the stack frame, it
91
/// knows when a variable sized object is allocated on the stack.  This is the
92
/// sole condition which prevents frame pointer elimination, which is an
93
/// important optimization on register-poor architectures.  Because original
94
/// variable sized alloca's in the source program are the only source of
95
/// variable sized stack objects, it is safe to decide whether there will be
96
/// any variable sized objects before all stack objects are known (for
97
/// example, register allocator spill code never needs variable sized
98
/// objects).
99
///
100
/// When prolog/epilog code emission is performed, the final stack frame is
101
/// built and the machine instructions are modified to refer to the actual
102
/// stack offsets of the object, eliminating all MO_FrameIndex operands from
103
/// the program.
104
///
105
/// Abstract Stack Frame Information
106
class MachineFrameInfo {
107
public:
108
  /// Stack Smashing Protection (SSP) rules require that vulnerable stack
109
  /// allocations are located close the stack protector.
110
  enum SSPLayoutKind {
111
    SSPLK_None,       ///< Did not trigger a stack protector.  No effect on data
112
                      ///< layout.
113
    SSPLK_LargeArray, ///< Array or nested array >= SSP-buffer-size.  Closest
114
                      ///< to the stack protector.
115
    SSPLK_SmallArray, ///< Array or nested array < SSP-buffer-size. 2nd closest
116
                      ///< to the stack protector.
117
    SSPLK_AddrOf      ///< The address of this allocation is exposed and
118
                      ///< triggered protection.  3rd closest to the protector.
119
  };
120
 
121
private:
122
  // Represent a single object allocated on the stack.
123
  struct StackObject {
124
    // The offset of this object from the stack pointer on entry to
125
    // the function.  This field has no meaning for a variable sized element.
126
    int64_t SPOffset;
127
 
128
    // The size of this object on the stack. 0 means a variable sized object,
129
    // ~0ULL means a dead object.
130
    uint64_t Size;
131
 
132
    // The required alignment of this stack slot.
133
    Align Alignment;
134
 
135
    // If true, the value of the stack object is set before
136
    // entering the function and is not modified inside the function. By
137
    // default, fixed objects are immutable unless marked otherwise.
138
    bool isImmutable;
139
 
140
    // If true the stack object is used as spill slot. It
141
    // cannot alias any other memory objects.
142
    bool isSpillSlot;
143
 
144
    /// If true, this stack slot is used to spill a value (could be deopt
145
    /// and/or GC related) over a statepoint. We know that the address of the
146
    /// slot can't alias any LLVM IR value.  This is very similar to a Spill
147
    /// Slot, but is created by statepoint lowering is SelectionDAG, not the
148
    /// register allocator.
149
    bool isStatepointSpillSlot = false;
150
 
151
    /// Identifier for stack memory type analagous to address space. If this is
152
    /// non-0, the meaning is target defined. Offsets cannot be directly
153
    /// compared between objects with different stack IDs. The object may not
154
    /// necessarily reside in the same contiguous memory block as other stack
155
    /// objects. Objects with differing stack IDs should not be merged or
156
    /// replaced substituted for each other.
157
    //
158
    /// It is assumed a target uses consecutive, increasing stack IDs starting
159
    /// from 1.
160
    uint8_t StackID;
161
 
162
    /// If this stack object is originated from an Alloca instruction
163
    /// this value saves the original IR allocation. Can be NULL.
164
    const AllocaInst *Alloca;
165
 
166
    // If true, the object was mapped into the local frame
167
    // block and doesn't need additional handling for allocation beyond that.
168
    bool PreAllocated = false;
169
 
170
    // If true, an LLVM IR value might point to this object.
171
    // Normally, spill slots and fixed-offset objects don't alias IR-accessible
172
    // objects, but there are exceptions (on PowerPC, for example, some byval
173
    // arguments have ABI-prescribed offsets).
174
    bool isAliased;
175
 
176
    /// If true, the object has been zero-extended.
177
    bool isZExt = false;
178
 
179
    /// If true, the object has been sign-extended.
180
    bool isSExt = false;
181
 
182
    uint8_t SSPLayout = SSPLK_None;
183
 
184
    StackObject(uint64_t Size, Align Alignment, int64_t SPOffset,
185
                bool IsImmutable, bool IsSpillSlot, const AllocaInst *Alloca,
186
                bool IsAliased, uint8_t StackID = 0)
187
        : SPOffset(SPOffset), Size(Size), Alignment(Alignment),
188
          isImmutable(IsImmutable), isSpillSlot(IsSpillSlot), StackID(StackID),
189
          Alloca(Alloca), isAliased(IsAliased) {}
190
  };
191
 
192
  /// The alignment of the stack.
193
  Align StackAlignment;
194
 
195
  /// Can the stack be realigned. This can be false if the target does not
196
  /// support stack realignment, or if the user asks us not to realign the
197
  /// stack. In this situation, overaligned allocas are all treated as dynamic
198
  /// allocations and the target must handle them as part of DYNAMIC_STACKALLOC
199
  /// lowering. All non-alloca stack objects have their alignment clamped to the
200
  /// base ABI stack alignment.
201
  /// FIXME: There is room for improvement in this case, in terms of
202
  /// grouping overaligned allocas into a "secondary stack frame" and
203
  /// then only use a single alloca to allocate this frame and only a
204
  /// single virtual register to access it. Currently, without such an
205
  /// optimization, each such alloca gets its own dynamic realignment.
206
  bool StackRealignable;
207
 
208
  /// Whether the function has the \c alignstack attribute.
209
  bool ForcedRealign;
210
 
211
  /// The list of stack objects allocated.
212
  std::vector<StackObject> Objects;
213
 
214
  /// This contains the number of fixed objects contained on
215
  /// the stack.  Because fixed objects are stored at a negative index in the
216
  /// Objects list, this is also the index to the 0th object in the list.
217
  unsigned NumFixedObjects = 0;
218
 
219
  /// This boolean keeps track of whether any variable
220
  /// sized objects have been allocated yet.
221
  bool HasVarSizedObjects = false;
222
 
223
  /// This boolean keeps track of whether there is a call
224
  /// to builtin \@llvm.frameaddress.
225
  bool FrameAddressTaken = false;
226
 
227
  /// This boolean keeps track of whether there is a call
228
  /// to builtin \@llvm.returnaddress.
229
  bool ReturnAddressTaken = false;
230
 
231
  /// This boolean keeps track of whether there is a call
232
  /// to builtin \@llvm.experimental.stackmap.
233
  bool HasStackMap = false;
234
 
235
  /// This boolean keeps track of whether there is a call
236
  /// to builtin \@llvm.experimental.patchpoint.
237
  bool HasPatchPoint = false;
238
 
239
  /// The prolog/epilog code inserter calculates the final stack
240
  /// offsets for all of the fixed size objects, updating the Objects list
241
  /// above.  It then updates StackSize to contain the number of bytes that need
242
  /// to be allocated on entry to the function.
243
  uint64_t StackSize = 0;
244
 
245
  /// The amount that a frame offset needs to be adjusted to
246
  /// have the actual offset from the stack/frame pointer.  The exact usage of
247
  /// this is target-dependent, but it is typically used to adjust between
248
  /// SP-relative and FP-relative offsets.  E.G., if objects are accessed via
249
  /// SP then OffsetAdjustment is zero; if FP is used, OffsetAdjustment is set
250
  /// to the distance between the initial SP and the value in FP.  For many
251
  /// targets, this value is only used when generating debug info (via
252
  /// TargetRegisterInfo::getFrameIndexReference); when generating code, the
253
  /// corresponding adjustments are performed directly.
254
  int OffsetAdjustment = 0;
255
 
256
  /// The prolog/epilog code inserter may process objects that require greater
257
  /// alignment than the default alignment the target provides.
258
  /// To handle this, MaxAlignment is set to the maximum alignment
259
  /// needed by the objects on the current frame.  If this is greater than the
260
  /// native alignment maintained by the compiler, dynamic alignment code will
261
  /// be needed.
262
  ///
263
  Align MaxAlignment;
264
 
265
  /// Set to true if this function adjusts the stack -- e.g.,
266
  /// when calling another function. This is only valid during and after
267
  /// prolog/epilog code insertion.
268
  bool AdjustsStack = false;
269
 
270
  /// Set to true if this function has any function calls.
271
  bool HasCalls = false;
272
 
273
  /// The frame index for the stack protector.
274
  int StackProtectorIdx = -1;
275
 
276
  /// The frame index for the function context. Used for SjLj exceptions.
277
  int FunctionContextIdx = -1;
278
 
279
  /// This contains the size of the largest call frame if the target uses frame
280
  /// setup/destroy pseudo instructions (as defined in the TargetFrameInfo
281
  /// class).  This information is important for frame pointer elimination.
282
  /// It is only valid during and after prolog/epilog code insertion.
283
  unsigned MaxCallFrameSize = ~0u;
284
 
285
  /// The number of bytes of callee saved registers that the target wants to
286
  /// report for the current function in the CodeView S_FRAMEPROC record.
287
  unsigned CVBytesOfCalleeSavedRegisters = 0;
288
 
289
  /// The prolog/epilog code inserter fills in this vector with each
290
  /// callee saved register saved in either the frame or a different
291
  /// register.  Beyond its use by the prolog/ epilog code inserter,
292
  /// this data is used for debug info and exception handling.
293
  std::vector<CalleeSavedInfo> CSInfo;
294
 
295
  /// Has CSInfo been set yet?
296
  bool CSIValid = false;
297
 
298
  /// References to frame indices which are mapped
299
  /// into the local frame allocation block. <FrameIdx, LocalOffset>
300
  SmallVector<std::pair<int, int64_t>, 32> LocalFrameObjects;
301
 
302
  /// Size of the pre-allocated local frame block.
303
  int64_t LocalFrameSize = 0;
304
 
305
  /// Required alignment of the local object blob, which is the strictest
306
  /// alignment of any object in it.
307
  Align LocalFrameMaxAlign;
308
 
309
  /// Whether the local object blob needs to be allocated together. If not,
310
  /// PEI should ignore the isPreAllocated flags on the stack objects and
311
  /// just allocate them normally.
312
  bool UseLocalStackAllocationBlock = false;
313
 
314
  /// True if the function dynamically adjusts the stack pointer through some
315
  /// opaque mechanism like inline assembly or Win32 EH.
316
  bool HasOpaqueSPAdjustment = false;
317
 
318
  /// True if the function contains operations which will lower down to
319
  /// instructions which manipulate the stack pointer.
320
  bool HasCopyImplyingStackAdjustment = false;
321
 
322
  /// True if the function contains a call to the llvm.vastart intrinsic.
323
  bool HasVAStart = false;
324
 
325
  /// True if this is a varargs function that contains a musttail call.
326
  bool HasMustTailInVarArgFunc = false;
327
 
328
  /// True if this function contains a tail call. If so immutable objects like
329
  /// function arguments are no longer so. A tail call *can* override fixed
330
  /// stack objects like arguments so we can't treat them as immutable.
331
  bool HasTailCall = false;
332
 
333
  /// Not null, if shrink-wrapping found a better place for the prologue.
334
  MachineBasicBlock *Save = nullptr;
335
  /// Not null, if shrink-wrapping found a better place for the epilogue.
336
  MachineBasicBlock *Restore = nullptr;
337
 
338
  /// Size of the UnsafeStack Frame
339
  uint64_t UnsafeStackSize = 0;
340
 
341
public:
342
  explicit MachineFrameInfo(Align StackAlignment, bool StackRealignable,
343
                            bool ForcedRealign)
344
      : StackAlignment(StackAlignment),
345
        StackRealignable(StackRealignable), ForcedRealign(ForcedRealign) {}
346
 
347
  MachineFrameInfo(const MachineFrameInfo &) = delete;
348
 
349
  /// Return true if there are any stack objects in this function.
350
  bool hasStackObjects() const { return !Objects.empty(); }
351
 
352
  /// This method may be called any time after instruction
353
  /// selection is complete to determine if the stack frame for this function
354
  /// contains any variable sized objects.
355
  bool hasVarSizedObjects() const { return HasVarSizedObjects; }
356
 
357
  /// Return the index for the stack protector object.
358
  int getStackProtectorIndex() const { return StackProtectorIdx; }
359
  void setStackProtectorIndex(int I) { StackProtectorIdx = I; }
360
  bool hasStackProtectorIndex() const { return StackProtectorIdx != -1; }
361
 
362
  /// Return the index for the function context object.
363
  /// This object is used for SjLj exceptions.
364
  int getFunctionContextIndex() const { return FunctionContextIdx; }
365
  void setFunctionContextIndex(int I) { FunctionContextIdx = I; }
366
  bool hasFunctionContextIndex() const { return FunctionContextIdx != -1; }
367
 
368
  /// This method may be called any time after instruction
369
  /// selection is complete to determine if there is a call to
370
  /// \@llvm.frameaddress in this function.
371
  bool isFrameAddressTaken() const { return FrameAddressTaken; }
372
  void setFrameAddressIsTaken(bool T) { FrameAddressTaken = T; }
373
 
374
  /// This method may be called any time after
375
  /// instruction selection is complete to determine if there is a call to
376
  /// \@llvm.returnaddress in this function.
377
  bool isReturnAddressTaken() const { return ReturnAddressTaken; }
378
  void setReturnAddressIsTaken(bool s) { ReturnAddressTaken = s; }
379
 
380
  /// This method may be called any time after instruction
381
  /// selection is complete to determine if there is a call to builtin
382
  /// \@llvm.experimental.stackmap.
383
  bool hasStackMap() const { return HasStackMap; }
384
  void setHasStackMap(bool s = true) { HasStackMap = s; }
385
 
386
  /// This method may be called any time after instruction
387
  /// selection is complete to determine if there is a call to builtin
388
  /// \@llvm.experimental.patchpoint.
389
  bool hasPatchPoint() const { return HasPatchPoint; }
390
  void setHasPatchPoint(bool s = true) { HasPatchPoint = s; }
391
 
392
  /// Return true if this function requires a split stack prolog, even if it
393
  /// uses no stack space. This is only meaningful for functions where
394
  /// MachineFunction::shouldSplitStack() returns true.
395
  //
396
  // For non-leaf functions we have to allow for the possibility that the call
397
  // is to a non-split function, as in PR37807. This function could also take
398
  // the address of a non-split function. When the linker tries to adjust its
399
  // non-existent prologue, it would fail with an error. Mark the object file so
400
  // that such failures are not errors. See this Go language bug-report
401
  // https://go-review.googlesource.com/c/go/+/148819/
402
  bool needsSplitStackProlog() const {
403
    return getStackSize() != 0 || hasTailCall();
404
  }
405
 
406
  /// Return the minimum frame object index.
407
  int getObjectIndexBegin() const { return -NumFixedObjects; }
408
 
409
  /// Return one past the maximum frame object index.
410
  int getObjectIndexEnd() const { return (int)Objects.size()-NumFixedObjects; }
411
 
412
  /// Return the number of fixed objects.
413
  unsigned getNumFixedObjects() const { return NumFixedObjects; }
414
 
415
  /// Return the number of objects.
416
  unsigned getNumObjects() const { return Objects.size(); }
417
 
418
  /// Map a frame index into the local object block
419
  void mapLocalFrameObject(int ObjectIndex, int64_t Offset) {
420
    LocalFrameObjects.push_back(std::pair<int, int64_t>(ObjectIndex, Offset));
421
    Objects[ObjectIndex + NumFixedObjects].PreAllocated = true;
422
  }
423
 
424
  /// Get the local offset mapping for a for an object.
425
  std::pair<int, int64_t> getLocalFrameObjectMap(int i) const {
426
    assert (i >= 0 && (unsigned)i < LocalFrameObjects.size() &&
427
            "Invalid local object reference!");
428
    return LocalFrameObjects[i];
429
  }
430
 
431
  /// Return the number of objects allocated into the local object block.
432
  int64_t getLocalFrameObjectCount() const { return LocalFrameObjects.size(); }
433
 
434
  /// Set the size of the local object blob.
435
  void setLocalFrameSize(int64_t sz) { LocalFrameSize = sz; }
436
 
437
  /// Get the size of the local object blob.
438
  int64_t getLocalFrameSize() const { return LocalFrameSize; }
439
 
440
  /// Required alignment of the local object blob,
441
  /// which is the strictest alignment of any object in it.
442
  void setLocalFrameMaxAlign(Align Alignment) {
443
    LocalFrameMaxAlign = Alignment;
444
  }
445
 
446
  /// Return the required alignment of the local object blob.
447
  Align getLocalFrameMaxAlign() const { return LocalFrameMaxAlign; }
448
 
449
  /// Get whether the local allocation blob should be allocated together or
450
  /// let PEI allocate the locals in it directly.
451
  bool getUseLocalStackAllocationBlock() const {
452
    return UseLocalStackAllocationBlock;
453
  }
454
 
455
  /// setUseLocalStackAllocationBlock - Set whether the local allocation blob
456
  /// should be allocated together or let PEI allocate the locals in it
457
  /// directly.
458
  void setUseLocalStackAllocationBlock(bool v) {
459
    UseLocalStackAllocationBlock = v;
460
  }
461
 
462
  /// Return true if the object was pre-allocated into the local block.
463
  bool isObjectPreAllocated(int ObjectIdx) const {
464
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
465
           "Invalid Object Idx!");
466
    return Objects[ObjectIdx+NumFixedObjects].PreAllocated;
467
  }
468
 
469
  /// Return the size of the specified object.
470
  int64_t getObjectSize(int ObjectIdx) const {
471
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
472
           "Invalid Object Idx!");
473
    return Objects[ObjectIdx+NumFixedObjects].Size;
474
  }
475
 
476
  /// Change the size of the specified stack object.
477
  void setObjectSize(int ObjectIdx, int64_t Size) {
478
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
479
           "Invalid Object Idx!");
480
    Objects[ObjectIdx+NumFixedObjects].Size = Size;
481
  }
482
 
483
  /// Return the alignment of the specified stack object.
484
  Align getObjectAlign(int ObjectIdx) const {
485
    assert(unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
486
           "Invalid Object Idx!");
487
    return Objects[ObjectIdx + NumFixedObjects].Alignment;
488
  }
489
 
490
  /// Should this stack ID be considered in MaxAlignment.
491
  bool contributesToMaxAlignment(uint8_t StackID) {
492
    return StackID == TargetStackID::Default ||
493
           StackID == TargetStackID::ScalableVector;
494
  }
495
 
496
  /// setObjectAlignment - Change the alignment of the specified stack object.
497
  void setObjectAlignment(int ObjectIdx, Align Alignment) {
498
    assert(unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
499
           "Invalid Object Idx!");
500
    Objects[ObjectIdx + NumFixedObjects].Alignment = Alignment;
501
 
502
    // Only ensure max alignment for the default and scalable vector stack.
503
    uint8_t StackID = getStackID(ObjectIdx);
504
    if (contributesToMaxAlignment(StackID))
505
      ensureMaxAlignment(Alignment);
506
  }
507
 
508
  /// Return the underlying Alloca of the specified
509
  /// stack object if it exists. Returns 0 if none exists.
510
  const AllocaInst* getObjectAllocation(int ObjectIdx) const {
511
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
512
           "Invalid Object Idx!");
513
    return Objects[ObjectIdx+NumFixedObjects].Alloca;
514
  }
515
 
516
  /// Remove the underlying Alloca of the specified stack object if it
517
  /// exists. This generally should not be used and is for reduction tooling.
518
  void clearObjectAllocation(int ObjectIdx) {
519
    assert(unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
520
           "Invalid Object Idx!");
521
    Objects[ObjectIdx + NumFixedObjects].Alloca = nullptr;
522
  }
523
 
524
  /// Return the assigned stack offset of the specified object
525
  /// from the incoming stack pointer.
526
  int64_t getObjectOffset(int ObjectIdx) const {
527
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
528
           "Invalid Object Idx!");
529
    assert(!isDeadObjectIndex(ObjectIdx) &&
530
           "Getting frame offset for a dead object?");
531
    return Objects[ObjectIdx+NumFixedObjects].SPOffset;
532
  }
533
 
534
  bool isObjectZExt(int ObjectIdx) const {
535
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
536
           "Invalid Object Idx!");
537
    return Objects[ObjectIdx+NumFixedObjects].isZExt;
538
  }
539
 
540
  void setObjectZExt(int ObjectIdx, bool IsZExt) {
541
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
542
           "Invalid Object Idx!");
543
    Objects[ObjectIdx+NumFixedObjects].isZExt = IsZExt;
544
  }
545
 
546
  bool isObjectSExt(int ObjectIdx) const {
547
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
548
           "Invalid Object Idx!");
549
    return Objects[ObjectIdx+NumFixedObjects].isSExt;
550
  }
551
 
552
  void setObjectSExt(int ObjectIdx, bool IsSExt) {
553
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
554
           "Invalid Object Idx!");
555
    Objects[ObjectIdx+NumFixedObjects].isSExt = IsSExt;
556
  }
557
 
558
  /// Set the stack frame offset of the specified object. The
559
  /// offset is relative to the stack pointer on entry to the function.
560
  void setObjectOffset(int ObjectIdx, int64_t SPOffset) {
561
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
562
           "Invalid Object Idx!");
563
    assert(!isDeadObjectIndex(ObjectIdx) &&
564
           "Setting frame offset for a dead object?");
565
    Objects[ObjectIdx+NumFixedObjects].SPOffset = SPOffset;
566
  }
567
 
568
  SSPLayoutKind getObjectSSPLayout(int ObjectIdx) const {
569
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
570
           "Invalid Object Idx!");
571
    return (SSPLayoutKind)Objects[ObjectIdx+NumFixedObjects].SSPLayout;
572
  }
573
 
574
  void setObjectSSPLayout(int ObjectIdx, SSPLayoutKind Kind) {
575
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
576
           "Invalid Object Idx!");
577
    assert(!isDeadObjectIndex(ObjectIdx) &&
578
           "Setting SSP layout for a dead object?");
579
    Objects[ObjectIdx+NumFixedObjects].SSPLayout = Kind;
580
  }
581
 
582
  /// Return the number of bytes that must be allocated to hold
583
  /// all of the fixed size frame objects.  This is only valid after
584
  /// Prolog/Epilog code insertion has finalized the stack frame layout.
585
  uint64_t getStackSize() const { return StackSize; }
586
 
587
  /// Set the size of the stack.
588
  void setStackSize(uint64_t Size) { StackSize = Size; }
589
 
590
  /// Estimate and return the size of the stack frame.
591
  uint64_t estimateStackSize(const MachineFunction &MF) const;
592
 
593
  /// Return the correction for frame offsets.
594
  int getOffsetAdjustment() const { return OffsetAdjustment; }
595
 
596
  /// Set the correction for frame offsets.
597
  void setOffsetAdjustment(int Adj) { OffsetAdjustment = Adj; }
598
 
599
  /// Return the alignment in bytes that this function must be aligned to,
600
  /// which is greater than the default stack alignment provided by the target.
601
  Align getMaxAlign() const { return MaxAlignment; }
602
 
603
  /// Make sure the function is at least Align bytes aligned.
604
  void ensureMaxAlignment(Align Alignment);
605
 
606
  /// Return true if this function adjusts the stack -- e.g.,
607
  /// when calling another function. This is only valid during and after
608
  /// prolog/epilog code insertion.
609
  bool adjustsStack() const { return AdjustsStack; }
610
  void setAdjustsStack(bool V) { AdjustsStack = V; }
611
 
612
  /// Return true if the current function has any function calls.
613
  bool hasCalls() const { return HasCalls; }
614
  void setHasCalls(bool V) { HasCalls = V; }
615
 
616
  /// Returns true if the function contains opaque dynamic stack adjustments.
617
  bool hasOpaqueSPAdjustment() const { return HasOpaqueSPAdjustment; }
618
  void setHasOpaqueSPAdjustment(bool B) { HasOpaqueSPAdjustment = B; }
619
 
620
  /// Returns true if the function contains operations which will lower down to
621
  /// instructions which manipulate the stack pointer.
622
  bool hasCopyImplyingStackAdjustment() const {
623
    return HasCopyImplyingStackAdjustment;
624
  }
625
  void setHasCopyImplyingStackAdjustment(bool B) {
626
    HasCopyImplyingStackAdjustment = B;
627
  }
628
 
629
  /// Returns true if the function calls the llvm.va_start intrinsic.
630
  bool hasVAStart() const { return HasVAStart; }
631
  void setHasVAStart(bool B) { HasVAStart = B; }
632
 
633
  /// Returns true if the function is variadic and contains a musttail call.
634
  bool hasMustTailInVarArgFunc() const { return HasMustTailInVarArgFunc; }
635
  void setHasMustTailInVarArgFunc(bool B) { HasMustTailInVarArgFunc = B; }
636
 
637
  /// Returns true if the function contains a tail call.
638
  bool hasTailCall() const { return HasTailCall; }
639
  void setHasTailCall(bool V = true) { HasTailCall = V; }
640
 
641
  /// Computes the maximum size of a callframe and the AdjustsStack property.
642
  /// This only works for targets defining
643
  /// TargetInstrInfo::getCallFrameSetupOpcode(), getCallFrameDestroyOpcode(),
644
  /// and getFrameSize().
645
  /// This is usually computed by the prologue epilogue inserter but some
646
  /// targets may call this to compute it earlier.
647
  void computeMaxCallFrameSize(const MachineFunction &MF);
648
 
649
  /// Return the maximum size of a call frame that must be
650
  /// allocated for an outgoing function call.  This is only available if
651
  /// CallFrameSetup/Destroy pseudo instructions are used by the target, and
652
  /// then only during or after prolog/epilog code insertion.
653
  ///
654
  unsigned getMaxCallFrameSize() const {
655
    // TODO: Enable this assert when targets are fixed.
656
    //assert(isMaxCallFrameSizeComputed() && "MaxCallFrameSize not computed yet");
657
    if (!isMaxCallFrameSizeComputed())
658
      return 0;
659
    return MaxCallFrameSize;
660
  }
661
  bool isMaxCallFrameSizeComputed() const {
662
    return MaxCallFrameSize != ~0u;
663
  }
664
  void setMaxCallFrameSize(unsigned S) { MaxCallFrameSize = S; }
665
 
666
  /// Returns how many bytes of callee-saved registers the target pushed in the
667
  /// prologue. Only used for debug info.
668
  unsigned getCVBytesOfCalleeSavedRegisters() const {
669
    return CVBytesOfCalleeSavedRegisters;
670
  }
671
  void setCVBytesOfCalleeSavedRegisters(unsigned S) {
672
    CVBytesOfCalleeSavedRegisters = S;
673
  }
674
 
675
  /// Create a new object at a fixed location on the stack.
676
  /// All fixed objects should be created before other objects are created for
677
  /// efficiency. By default, fixed objects are not pointed to by LLVM IR
678
  /// values. This returns an index with a negative value.
679
  int CreateFixedObject(uint64_t Size, int64_t SPOffset, bool IsImmutable,
680
                        bool isAliased = false);
681
 
682
  /// Create a spill slot at a fixed location on the stack.
683
  /// Returns an index with a negative value.
684
  int CreateFixedSpillStackObject(uint64_t Size, int64_t SPOffset,
685
                                  bool IsImmutable = false);
686
 
687
  /// Returns true if the specified index corresponds to a fixed stack object.
688
  bool isFixedObjectIndex(int ObjectIdx) const {
689
    return ObjectIdx < 0 && (ObjectIdx >= -(int)NumFixedObjects);
690
  }
691
 
692
  /// Returns true if the specified index corresponds
693
  /// to an object that might be pointed to by an LLVM IR value.
694
  bool isAliasedObjectIndex(int ObjectIdx) const {
695
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
696
           "Invalid Object Idx!");
697
    return Objects[ObjectIdx+NumFixedObjects].isAliased;
698
  }
699
 
700
  /// Returns true if the specified index corresponds to an immutable object.
701
  bool isImmutableObjectIndex(int ObjectIdx) const {
702
    // Tail calling functions can clobber their function arguments.
703
    if (HasTailCall)
704
      return false;
705
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
706
           "Invalid Object Idx!");
707
    return Objects[ObjectIdx+NumFixedObjects].isImmutable;
708
  }
709
 
710
  /// Marks the immutability of an object.
711
  void setIsImmutableObjectIndex(int ObjectIdx, bool IsImmutable) {
712
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
713
           "Invalid Object Idx!");
714
    Objects[ObjectIdx+NumFixedObjects].isImmutable = IsImmutable;
715
  }
716
 
717
  /// Returns true if the specified index corresponds to a spill slot.
718
  bool isSpillSlotObjectIndex(int ObjectIdx) const {
719
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
720
           "Invalid Object Idx!");
721
    return Objects[ObjectIdx+NumFixedObjects].isSpillSlot;
722
  }
723
 
724
  bool isStatepointSpillSlotObjectIndex(int ObjectIdx) const {
725
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
726
           "Invalid Object Idx!");
727
    return Objects[ObjectIdx+NumFixedObjects].isStatepointSpillSlot;
728
  }
729
 
730
  /// \see StackID
731
  uint8_t getStackID(int ObjectIdx) const {
732
    return Objects[ObjectIdx+NumFixedObjects].StackID;
733
  }
734
 
735
  /// \see StackID
736
  void setStackID(int ObjectIdx, uint8_t ID) {
737
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
738
           "Invalid Object Idx!");
739
    Objects[ObjectIdx+NumFixedObjects].StackID = ID;
740
    // If ID > 0, MaxAlignment may now be overly conservative.
741
    // If ID == 0, MaxAlignment will need to be updated separately.
742
  }
743
 
744
  /// Returns true if the specified index corresponds to a dead object.
745
  bool isDeadObjectIndex(int ObjectIdx) const {
746
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
747
           "Invalid Object Idx!");
748
    return Objects[ObjectIdx+NumFixedObjects].Size == ~0ULL;
749
  }
750
 
751
  /// Returns true if the specified index corresponds to a variable sized
752
  /// object.
753
  bool isVariableSizedObjectIndex(int ObjectIdx) const {
754
    assert(unsigned(ObjectIdx + NumFixedObjects) < Objects.size() &&
755
           "Invalid Object Idx!");
756
    return Objects[ObjectIdx + NumFixedObjects].Size == 0;
757
  }
758
 
759
  void markAsStatepointSpillSlotObjectIndex(int ObjectIdx) {
760
    assert(unsigned(ObjectIdx+NumFixedObjects) < Objects.size() &&
761
           "Invalid Object Idx!");
762
    Objects[ObjectIdx+NumFixedObjects].isStatepointSpillSlot = true;
763
    assert(isStatepointSpillSlotObjectIndex(ObjectIdx) && "inconsistent");
764
  }
765
 
766
  /// Create a new statically sized stack object, returning
767
  /// a nonnegative identifier to represent it.
768
  int CreateStackObject(uint64_t Size, Align Alignment, bool isSpillSlot,
769
                        const AllocaInst *Alloca = nullptr, uint8_t ID = 0);
770
 
771
  /// Create a new statically sized stack object that represents a spill slot,
772
  /// returning a nonnegative identifier to represent it.
773
  int CreateSpillStackObject(uint64_t Size, Align Alignment);
774
 
775
  /// Remove or mark dead a statically sized stack object.
776
  void RemoveStackObject(int ObjectIdx) {
777
    // Mark it dead.
778
    Objects[ObjectIdx+NumFixedObjects].Size = ~0ULL;
779
  }
780
 
781
  /// Notify the MachineFrameInfo object that a variable sized object has been
782
  /// created.  This must be created whenever a variable sized object is
783
  /// created, whether or not the index returned is actually used.
784
  int CreateVariableSizedObject(Align Alignment, const AllocaInst *Alloca);
785
 
786
  /// Returns a reference to call saved info vector for the current function.
787
  const std::vector<CalleeSavedInfo> &getCalleeSavedInfo() const {
788
    return CSInfo;
789
  }
790
  /// \copydoc getCalleeSavedInfo()
791
  std::vector<CalleeSavedInfo> &getCalleeSavedInfo() { return CSInfo; }
792
 
793
  /// Used by prolog/epilog inserter to set the function's callee saved
794
  /// information.
795
  void setCalleeSavedInfo(std::vector<CalleeSavedInfo> CSI) {
796
    CSInfo = std::move(CSI);
797
  }
798
 
799
  /// Has the callee saved info been calculated yet?
800
  bool isCalleeSavedInfoValid() const { return CSIValid; }
801
 
802
  void setCalleeSavedInfoValid(bool v) { CSIValid = v; }
803
 
804
  MachineBasicBlock *getSavePoint() const { return Save; }
805
  void setSavePoint(MachineBasicBlock *NewSave) { Save = NewSave; }
806
  MachineBasicBlock *getRestorePoint() const { return Restore; }
807
  void setRestorePoint(MachineBasicBlock *NewRestore) { Restore = NewRestore; }
808
 
809
  uint64_t getUnsafeStackSize() const { return UnsafeStackSize; }
810
  void setUnsafeStackSize(uint64_t Size) { UnsafeStackSize = Size; }
811
 
812
  /// Return a set of physical registers that are pristine.
813
  ///
814
  /// Pristine registers hold a value that is useless to the current function,
815
  /// but that must be preserved - they are callee saved registers that are not
816
  /// saved.
817
  ///
818
  /// Before the PrologueEpilogueInserter has placed the CSR spill code, this
819
  /// method always returns an empty set.
820
  BitVector getPristineRegs(const MachineFunction &MF) const;
821
 
822
  /// Used by the MachineFunction printer to print information about
823
  /// stack objects. Implemented in MachineFunction.cpp.
824
  void print(const MachineFunction &MF, raw_ostream &OS) const;
825
 
826
  /// dump - Print the function to stderr.
827
  void dump(const MachineFunction &MF) const;
828
};
829
 
830
} // End llvm namespace
831
 
832
#endif