//===-- ASanStackFrameLayout.cpp - helper for AddressSanitizer ------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Definition of ComputeASanStackFrameLayout (see ASanStackFrameLayout.h). // //===----------------------------------------------------------------------===// #include "llvm/Transforms/Utils/ASanStackFrameLayout.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> namespace llvm { // We sort the stack variables by alignment (largest first) to minimize // unnecessary large gaps due to alignment. // It is tempting to also sort variables by size so that larger variables // have larger redzones at both ends. But reordering will make report analysis // harder, especially when temporary unnamed variables are present. // So, until we can provide more information (type, line number, etc) // for the stack variables we avoid reordering them too much. static inline bool CompareVars(const ASanStackVariableDescription &a, const ASanStackVariableDescription &b) { … } // We also force minimal alignment for all vars to kMinAlignment so that vars // with e.g. alignment 1 and alignment 16 do not get reordered by CompareVars. static const uint64_t kMinAlignment = …; // We want to add a full redzone after every variable. // The larger the variable Size the larger is the redzone. // The resulting frame size is a multiple of Alignment. static uint64_t VarAndRedzoneSize(uint64_t Size, uint64_t Granularity, uint64_t Alignment) { … } ASanStackFrameLayout ComputeASanStackFrameLayout(SmallVectorImpl<ASanStackVariableDescription> &Vars, uint64_t Granularity, uint64_t MinHeaderSize) { … } SmallString<64> ComputeASanStackFrameDescription( const SmallVectorImpl<ASanStackVariableDescription> &Vars) { … } SmallVector<uint8_t, 64> GetShadowBytes(const SmallVectorImpl<ASanStackVariableDescription> &Vars, const ASanStackFrameLayout &Layout) { … } SmallVector<uint8_t, 64> GetShadowBytesAfterScope( const SmallVectorImpl<ASanStackVariableDescription> &Vars, const ASanStackFrameLayout &Layout) { … } } // llvm namespace