LLVM 19.0.0git
SafeStackLayout.h
Go to the documentation of this file.
1//===- SafeStackLayout.h - SafeStack frame layout --------------*- 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#ifndef LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
10#define LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
11
12#include "llvm/ADT/DenseMap.h"
15
16namespace llvm {
17
18class raw_ostream;
19class Value;
20
21namespace safestack {
22
23/// Compute the layout of an unsafe stack frame.
25 Align MaxAlignment;
26
27 struct StackRegion {
28 unsigned Start;
29 unsigned End;
31
32 StackRegion(unsigned Start, unsigned End,
33 const StackLifetime::LiveRange &Range)
34 : Start(Start), End(End), Range(Range) {}
35 };
36
37 /// The list of current stack regions, sorted by StackRegion::Start.
39
40 struct StackObject {
41 const Value *Handle;
42 unsigned Size;
43 Align Alignment;
45 };
46
47 SmallVector<StackObject, 8> StackObjects;
48
50 DenseMap<const Value *, Align> ObjectAlignments;
51
52 void layoutObject(StackObject &Obj);
53
54public:
55 StackLayout(Align StackAlignment) : MaxAlignment(StackAlignment) {}
56
57 /// Add an object to the stack frame. Value pointer is opaque and used as a
58 /// handle to retrieve the object's offset in the frame later.
59 void addObject(const Value *V, unsigned Size, Align Alignment,
60 const StackLifetime::LiveRange &Range);
61
62 /// Run the layout computation for all previously added objects.
63 void computeLayout();
64
65 /// Returns the offset to the object start in the stack frame.
66 unsigned getObjectOffset(const Value *V) { return ObjectOffsets[V]; }
67
68 /// Returns the alignment of the object
69 Align getObjectAlignment(const Value *V) { return ObjectAlignments[V]; }
70
71 /// Returns the size of the entire frame.
72 unsigned getFrameSize() { return Regions.empty() ? 0 : Regions.back().End; }
73
74 /// Returns the alignment of the frame.
75 Align getFrameAlignment() { return MaxAlignment; }
76
77 void print(raw_ostream &OS);
78};
79
80} // end namespace safestack
81
82} // end namespace llvm
83
84#endif // LLVM_LIB_CODEGEN_SAFESTACKLAYOUT_H
This file defines the DenseMap class.
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
raw_pwrite_stream & OS
This file defines the SmallVector class.
bool empty() const
Definition: SmallVector.h:94
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
This class represents a set of interesting instructions where an alloca is live.
Definition: StackLifetime.h:63
LLVM Value Representation.
Definition: Value.h:74
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
Compute the layout of an unsafe stack frame.
unsigned getFrameSize()
Returns the size of the entire frame.
void computeLayout()
Run the layout computation for all previously added objects.
Align getObjectAlignment(const Value *V)
Returns the alignment of the object.
unsigned getObjectOffset(const Value *V)
Returns the offset to the object start in the stack frame.
Align getFrameAlignment()
Returns the alignment of the frame.
void print(raw_ostream &OS)
StackLayout(Align StackAlignment)
void addObject(const Value *V, unsigned Size, Align Alignment, const StackLifetime::LiveRange &Range)
Add an object to the stack frame.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39