diff options
author | Vitaly Buka <vitalybuka@google.com> | 2016-10-18 23:29:52 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2016-10-18 23:29:52 +0000 |
commit | 5910a92560244efd7ce386c3220cc0a07c04121c (patch) | |
tree | 85cebfdfc29b6002acb30a6b128b2f53600140aa /llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp | |
parent | d88e52012bd8e73f06621658b33cecb7ffa150a6 (diff) | |
download | bcm5719-llvm-5910a92560244efd7ce386c3220cc0a07c04121c.tar.gz bcm5719-llvm-5910a92560244efd7ce386c3220cc0a07c04121c.zip |
[asan] Simplify calculation of stack frame layout extraction calculation of stack description into separate function.
Reviewers: eugenis
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D25754
llvm-svn: 284547
Diffstat (limited to 'llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp b/llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp index dc226b2e2cc..86d7ce87745 100644 --- a/llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp +++ b/llvm/lib/Transforms/Utils/ASanStackFrameLayout.cpp @@ -61,9 +61,6 @@ ComputeASanStackFrameLayout(SmallVectorImpl<ASanStackVariableDescription> &Vars, Vars[i].Alignment = std::max(Vars[i].Alignment, kMinAlignment); std::stable_sort(Vars.begin(), Vars.end(), CompareVars); - SmallString<2048> StackDescriptionStorage; - raw_svector_ostream StackDescription(StackDescriptionStorage); - StackDescription << NumVars; ASanStackFrameLayout Layout; Layout.Granularity = Granularity; @@ -76,34 +73,42 @@ ComputeASanStackFrameLayout(SmallVectorImpl<ASanStackVariableDescription> &Vars, size_t Alignment = std::max(Granularity, Vars[i].Alignment); (void)Alignment; // Used only in asserts. size_t Size = Vars[i].Size; - std::string Name = Vars[i].Name; assert((Alignment & (Alignment - 1)) == 0); assert(Layout.FrameAlignment >= Alignment); assert((Offset % Alignment) == 0); assert(Size > 0); - assert(Vars[i].LifetimeSize <= Size); - if (Vars[i].Line) { - Name += ":"; - Name += std::to_string(Vars[i].Line); - } - StackDescription << " " << Offset << " " << Size << " " << Name.size() - << " " << Name; size_t NextAlignment = IsLast ? Granularity : std::max(Granularity, Vars[i + 1].Alignment); - size_t SizeWithRedzone = VarAndRedzoneSize(Vars[i].Size, NextAlignment); + size_t SizeWithRedzone = VarAndRedzoneSize(Size, NextAlignment); Vars[i].Offset = Offset; Offset += SizeWithRedzone; } if (Offset % MinHeaderSize) { Offset += MinHeaderSize - (Offset % MinHeaderSize); } - Layout.DescriptionString = StackDescription.str(); Layout.FrameSize = Offset; assert((Layout.FrameSize % MinHeaderSize) == 0); - return Layout; } +SmallString<64> ComputeASanStackFrameDescription( + const SmallVectorImpl<ASanStackVariableDescription> &Vars) { + SmallString<2048> StackDescriptionStorage; + raw_svector_ostream StackDescription(StackDescriptionStorage); + StackDescription << Vars.size(); + + for (const auto &Var : Vars) { + std::string Name = Var.Name; + if (Var.Line) { + Name += ":"; + Name += std::to_string(Var.Line); + } + StackDescription << " " << Var.Offset << " " << Var.Size << " " + << Name.size() << " " << Name; + } + return StackDescription.str(); +} + SmallVector<uint8_t, 64> GetShadowBytes(const SmallVectorImpl<ASanStackVariableDescription> &Vars, const ASanStackFrameLayout &Layout) { @@ -130,6 +135,7 @@ SmallVector<uint8_t, 64> GetShadowBytesAfterScope( const size_t Granularity = Layout.Granularity; for (const auto &Var : Vars) { + assert(Var.LifetimeSize <= Var.Size); const size_t LifetimeShadowSize = (Var.LifetimeSize + Granularity - 1) / Granularity; const size_t Offset = Var.Offset / Granularity; |