| Index: src/IceTargetLowering.h
|
| diff --git a/src/IceTargetLowering.h b/src/IceTargetLowering.h
|
| index c875b26a0d9dfd155de0a794fb83bfab695116eb..682b426dd924751037c7859d07eb8ddda747b7e9 100644
|
| --- a/src/IceTargetLowering.h
|
| +++ b/src/IceTargetLowering.h
|
| @@ -165,6 +165,10 @@ public:
|
| virtual bool hasFramePointer() const { return false; }
|
| virtual SizeT getFrameOrStackReg() const = 0;
|
| virtual size_t typeWidthInBytesOnStack(Type Ty) const = 0;
|
| + // The base 2 logarithm of the width in bytes of the smallest stack slot.
|
| + virtual size_t minStackSlotSizeLog2() const = 0;
|
| + virtual size_t maxStackSlotSizeLog2() const = 0;
|
| +
|
| bool hasComputedFrame() const { return HasComputedFrame; }
|
| // Returns true if this function calls a function that has the
|
| // "returns twice" attribute.
|
| @@ -259,10 +263,55 @@ protected:
|
| // to keep liveness analysis consistent.
|
| void inferTwoAddress();
|
|
|
| + // Make a pass over the Cfg to determine which variables need stack slots
|
| + // and place them in a sorted list (SortedSpilledVariables). Among those,
|
| + // vars, classify the spill variables as local to the basic block vs
|
| + // global (multi-block) in order to compute the parameters GlobalsSize
|
| + // and SpillAreaSizeBytes (represents locals or general vars if the
|
| + // coalescing of locals is disallowed) along with alignments required
|
| + // for variables in each area. We rely on accurate VMetadata in order to
|
| + // classify a variable as global vs local (otherwise the variable is
|
| + // conservatively global). The in-args should be initialized to 0.
|
| + //
|
| + // This is only a pre-pass and the actual stack slot assignment is
|
| + // handled separately.
|
| + //
|
| + // There may be target-specific Variable types, which will be handled
|
| + // by TargetVarHook. If the TargetVarHook returns true, then the variable
|
| + // is skipped and not considered with the rest of the spilled variables.
|
| + void getVarStackSlotParams(VarList &SortedSpilledVariables,
|
| + llvm::SmallBitVector &RegsUsed,
|
| + size_t *GlobalsSize, size_t *SpillAreaSizeBytes,
|
| + uint32_t *SpillAreaAlignmentBytes,
|
| + uint32_t *LocalsSlotsAlignmentBytes,
|
| + std::function<bool(Variable *)> TargetVarHook);
|
| +
|
| + // Make a pass through the SortedSpilledVariables and actually assign
|
| + // stack slots. SpillAreaStart takes into account stack alignment
|
| + // padding and stack space used for preserved registers.
|
| + // This matches the scheme in getVarStackSlotParams, where there may
|
| + // be a separate multi-block global var spill area and a local var
|
| + // spill area.
|
| + void assignVarStackSlots(VarList &SortedSpilledVariables,
|
| + size_t SpillAreaStart, size_t SpillAreaSizeBytes,
|
| + size_t GlobalsAndSubsequentPaddingSize,
|
| + bool UsesFramePointer);
|
| +
|
| + // Sort the variables in Source based on required alignment.
|
| + // The variables with the largest alignment need are placed in the front
|
| + // of the Dest list.
|
| + void sortVarsByAlignment(VarList &Dest, const VarList &Source) const;
|
| +
|
| // Make a call to an external helper function.
|
| InstCall *makeHelperCall(const IceString &Name, Variable *Dest,
|
| SizeT MaxSrcs);
|
|
|
| + void
|
| + _bundle_lock(InstBundleLock::Option BundleOption = InstBundleLock::Opt_None) {
|
| + Context.insert(InstBundleLock::create(Func, BundleOption));
|
| + }
|
| + void _bundle_unlock() { Context.insert(InstBundleUnlock::create(Func)); }
|
| +
|
| Cfg *Func;
|
| GlobalContext *Ctx;
|
| bool HasComputedFrame;
|
|
|