41 if (Size <= 4) Res = 16;
42 else if (Size <= 16) Res = 32;
43 else if (Size <= 128) Res = Size + 32;
44 else if (Size <= 512) Res = Size + 64;
45 else if (Size <= 4096) Res = Size + 128;
46 else Res = Size + 256;
52 size_t Granularity,
size_t MinHeaderSize,
54 assert(Granularity >= 8 && Granularity <= 64 &&
55 (Granularity & (Granularity - 1)) == 0);
56 assert(MinHeaderSize >= 16 && (MinHeaderSize & (MinHeaderSize - 1)) == 0 &&
57 MinHeaderSize >= Granularity);
58 size_t NumVars = Vars.
size();
60 for (
size_t i = 0; i < NumVars; i++)
61 Vars[i].Alignment = std::max(Vars[i].Alignment,
kMinAlignment);
66 StackDescription << NumVars;
70 size_t Offset = std::max(std::max(MinHeaderSize, Granularity),
72 assert((Offset % Granularity) == 0);
74 for (
size_t i = 0; i < NumVars; i++) {
75 bool IsLast = i == NumVars - 1;
76 size_t Alignment = std::max(Granularity, Vars[i].Alignment);
78 size_t Size = Vars[i].Size;
79 const char *
Name = Vars[i].Name;
80 assert((Alignment & (Alignment - 1)) == 0);
82 assert((Offset % Alignment) == 0);
84 StackDescription <<
" " << Offset <<
" " << Size <<
" " << strlen(Name)
86 size_t NextAlignment = IsLast ? Granularity
87 : std::max(Granularity, Vars[i + 1].Alignment);
89 SB.
insert(SB.
end(), Size / Granularity, 0);
90 if (Size % Granularity)
92 SB.
insert(SB.
end(), (SizeWithRedzone - Size) / Granularity,
95 Vars[i].Offset = Offset;
96 Offset += SizeWithRedzone;
98 if (Offset % MinHeaderSize) {
99 size_t ExtraRedzone = MinHeaderSize - (Offset % MinHeaderSize);
100 SB.
insert(SB.
end(), ExtraRedzone / Granularity,
102 Offset += ExtraRedzone;
106 assert((Layout->
FrameSize % MinHeaderSize) == 0);
static const int kAsanStackMidRedzoneMagic
A raw_ostream that writes to an SmallVector or SmallString.
static const int kAsanStackLeftRedzoneMagic
SmallVector< uint8_t, 64 > ShadowBytes
static bool CompareVars(const ASanStackVariableDescription &a, const ASanStackVariableDescription &b)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
SmallString< 64 > DescriptionString
static const int kAsanStackRightRedzoneMagic
static size_t VarAndRedzoneSize(size_t Size, size_t Alignment)
iterator insert(iterator I, T &&Elt)
uint64_t RoundUpToAlignment(uint64_t Value, uint64_t Align)
Returns the next integer (mod 2**64) that is greater than or equal to Value and is a multiple of Alig...
StringRef str()
Flushes the stream contents to the target vector and return a StringRef for the vector contents...
static const size_t kMinAlignment
void ComputeASanStackFrameLayout(SmallVectorImpl< ASanStackVariableDescription > &Vars, size_t Granularity, size_t MinHeaderSize, ASanStackFrameLayout *Layout)