mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 15:10:33 +00:00
6a40504406
This is a fix for PR27842. An IR-level implementation of stack coloring tailored to work with SafeStack. It is a bit weaker than the MI implementation in that it does not the "lifetime start at first access" logic. This can be improved in the future. This patch also replaces the naive implementation of stack frame layout with a greedy algorithm that can split existing stack slots and even fit small objects inside the alignment padding of other objects. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274162 91177308-0d34-0410-b5e6-96231b3b80d8
69 lines
2.1 KiB
C++
69 lines
2.1 KiB
C++
//===-- SafeStackLayout.h - SafeStack frame layout -------------*- C++ -*--===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
|
|
#define LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
|
|
|
|
#include "SafeStackColoring.h"
|
|
|
|
namespace llvm {
|
|
namespace safestack {
|
|
|
|
/// Compute the layout of an unsafe stack frame.
|
|
class StackLayout {
|
|
unsigned MaxAlignment;
|
|
|
|
struct StackRegion {
|
|
unsigned Start;
|
|
unsigned End;
|
|
StackColoring::LiveRange Range;
|
|
StackRegion(unsigned Start, unsigned End,
|
|
const StackColoring::LiveRange &Range)
|
|
: Start(Start), End(End), Range(Range) {}
|
|
};
|
|
/// The list of current stack regions, sorted by StackRegion::Start.
|
|
SmallVector<StackRegion, 16> Regions;
|
|
|
|
struct StackObject {
|
|
const Value *Handle;
|
|
unsigned Size, Alignment;
|
|
StackColoring::LiveRange Range;
|
|
};
|
|
SmallVector<StackObject, 8> StackObjects;
|
|
|
|
DenseMap<const Value *, unsigned> ObjectOffsets;
|
|
|
|
void layoutObject(StackObject &Obj);
|
|
|
|
public:
|
|
StackLayout(unsigned StackAlignment) : MaxAlignment(StackAlignment) {}
|
|
/// Add an object to the stack frame. Value pointer is opaque and used as a
|
|
/// handle to retrieve the object's offset in the frame later.
|
|
void addObject(const Value *V, unsigned Size, unsigned Alignment,
|
|
const StackColoring::LiveRange &Range);
|
|
|
|
/// Run the layout computation for all previously added objects.
|
|
void computeLayout();
|
|
|
|
/// Returns the offset to the object start in the stack frame.
|
|
unsigned getObjectOffset(const Value *V) { return ObjectOffsets[V]; }
|
|
|
|
/// Returns the size of the entire frame.
|
|
unsigned getFrameSize() { return Regions.empty() ? 0 : Regions.back().End; }
|
|
|
|
/// Returns the alignment of the frame.
|
|
unsigned getFrameAlignment() { return MaxAlignment; }
|
|
void print(raw_ostream &OS);
|
|
};
|
|
|
|
} // namespace safestack
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
|