diff options
author | Kostya Serebryany <kcc@google.com> | 2012-12-04 06:14:01 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2012-12-04 06:14:01 +0000 |
commit | 6c55412ea4b39103a3a5764d49ddfdf50e066d56 (patch) | |
tree | 688ccd6bfe2b772b66682305d708c96b1f4af0e6 /lib/Transforms | |
parent | 69b1e71a3bee0cf1aba8e2f72e7a7d104cae76a0 (diff) |
[asan] add experimental -asan-realign-stack option (true by default, which does not change the current behavior)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169216 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Instrumentation/AddressSanitizer.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 92a678c34e..f095cff33c 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -115,6 +115,8 @@ static cl::opt<bool> ClInitializers("asan-initialization-order", cl::desc("Handle C++ initializer order"), cl::Hidden, cl::init(false)); static cl::opt<bool> ClMemIntrin("asan-memintrin", cl::desc("Handle memset/memcpy/memmove"), cl::Hidden, cl::init(true)); +static cl::opt<bool> ClRealignStack("asan-realign-stack", + cl::desc("Realign stack to 32"), cl::Hidden, cl::init(true)); static cl::opt<std::string> ClBlacklistFile("asan-blacklist", cl::desc("File containing the list of objects to ignore " "during instrumentation"), cl::Hidden); @@ -1159,6 +1161,7 @@ bool AddressSanitizer::poisonStackInFunction(Function &F) { // Filter out Alloca instructions we want (and can) handle. // Collect Ret instructions. + unsigned ResultAlignment = 1 << MappingScale(); for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) { BasicBlock &BB = *FI; @@ -1174,7 +1177,7 @@ bool AddressSanitizer::poisonStackInFunction(Function &F) { if (AI->isArrayAllocation()) continue; if (!AI->isStaticAlloca()) continue; if (!AI->getAllocatedType()->isSized()) continue; - if (AI->getAlignment() > RedzoneSize()) continue; + ResultAlignment = std::max(ResultAlignment, AI->getAlignment()); AllocaVec.push_back(AI); uint64_t AlignedSize = getAlignedAllocaSize(AI); TotalSize += AlignedSize; @@ -1195,7 +1198,9 @@ bool AddressSanitizer::poisonStackInFunction(Function &F) { Type *ByteArrayTy = ArrayType::get(IRB.getInt8Ty(), LocalStackSize); AllocaInst *MyAlloca = new AllocaInst(ByteArrayTy, "MyAlloca", InsBefore); - MyAlloca->setAlignment(RedzoneSize()); + if (ClRealignStack && ResultAlignment < RedzoneSize()) + ResultAlignment = RedzoneSize(); + MyAlloca->setAlignment(ResultAlignment); assert(MyAlloca->isStaticAlloca()); Value *OrigStackBase = IRB.CreatePointerCast(MyAlloca, IntptrTy); Value *LocalStackBase = OrigStackBase; |