mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-10 22:46:25 +00:00
[ASan] Minor fixes to dynamic allocas handling:
* Don't instrument promotable dynamic allocas: We already have a test that checks that promotable dynamic allocas are ignored, as well as static promotable allocas. Make sure this test will still pass if/when we enable dynamic alloca instrumentation by default. * Handle lifetime intrinsics before handling dynamic allocas: lifetime intrinsics may refer to dynamic allocas, so we need to emit instrumentation before these dynamic allocas would be replaced. Differential Revision: http://reviews.llvm.org/D12704 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@251045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ffd4b26c0e
commit
bf8252829f
@ -840,8 +840,7 @@ bool AddressSanitizer::isInterestingAlloca(AllocaInst &AI) {
|
|||||||
getAllocaSizeInBytes(&AI) > 0 &&
|
getAllocaSizeInBytes(&AI) > 0 &&
|
||||||
// We are only interested in allocas not promotable to registers.
|
// We are only interested in allocas not promotable to registers.
|
||||||
// Promotable allocas are common under -O0.
|
// Promotable allocas are common under -O0.
|
||||||
(!ClSkipPromotableAllocas || !isAllocaPromotable(&AI) ||
|
(!ClSkipPromotableAllocas || !isAllocaPromotable(&AI)));
|
||||||
isDynamicAlloca(AI)));
|
|
||||||
|
|
||||||
ProcessedAllocas[&AI] = IsInteresting;
|
ProcessedAllocas[&AI] = IsInteresting;
|
||||||
return IsInteresting;
|
return IsInteresting;
|
||||||
@ -1799,6 +1798,16 @@ void FunctionStackPoisoner::createDynamicAllocasInitStorage() {
|
|||||||
void FunctionStackPoisoner::poisonStack() {
|
void FunctionStackPoisoner::poisonStack() {
|
||||||
assert(AllocaVec.size() > 0 || DynamicAllocaVec.size() > 0);
|
assert(AllocaVec.size() > 0 || DynamicAllocaVec.size() > 0);
|
||||||
|
|
||||||
|
// Insert poison calls for lifetime intrinsics for alloca.
|
||||||
|
bool HavePoisonedAllocas = false;
|
||||||
|
for (const auto &APC : AllocaPoisonCallVec) {
|
||||||
|
assert(APC.InsBefore);
|
||||||
|
assert(APC.AI);
|
||||||
|
IRBuilder<> IRB(APC.InsBefore);
|
||||||
|
poisonAlloca(APC.AI, APC.Size, IRB, APC.DoPoison);
|
||||||
|
HavePoisonedAllocas |= APC.DoPoison;
|
||||||
|
}
|
||||||
|
|
||||||
if (ClInstrumentAllocas && DynamicAllocaVec.size() > 0) {
|
if (ClInstrumentAllocas && DynamicAllocaVec.size() > 0) {
|
||||||
// Handle dynamic allocas.
|
// Handle dynamic allocas.
|
||||||
createDynamicAllocasInitStorage();
|
createDynamicAllocasInitStorage();
|
||||||
@ -1906,16 +1915,6 @@ void FunctionStackPoisoner::poisonStack() {
|
|||||||
DoDynamicAlloca ? createAllocaForLayout(IRB, L, true) : StaticAlloca;
|
DoDynamicAlloca ? createAllocaForLayout(IRB, L, true) : StaticAlloca;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Insert poison calls for lifetime intrinsics for alloca.
|
|
||||||
bool HavePoisonedAllocas = false;
|
|
||||||
for (const auto &APC : AllocaPoisonCallVec) {
|
|
||||||
assert(APC.InsBefore);
|
|
||||||
assert(APC.AI);
|
|
||||||
IRBuilder<> IRB(APC.InsBefore);
|
|
||||||
poisonAlloca(APC.AI, APC.Size, IRB, APC.DoPoison);
|
|
||||||
HavePoisonedAllocas |= APC.DoPoison;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace Alloca instructions with base+offset.
|
// Replace Alloca instructions with base+offset.
|
||||||
for (const auto &Desc : SVD) {
|
for (const auto &Desc : SVD) {
|
||||||
AllocaInst *AI = Desc.AI;
|
AllocaInst *AI = Desc.AI;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
; breaks debug info.
|
; breaks debug info.
|
||||||
|
|
||||||
; RUN: opt < %s -asan -asan-module -S | FileCheck %s
|
; RUN: opt < %s -asan -asan-module -S | FileCheck %s
|
||||||
|
; RUN: opt < %s -asan -asan-module -asan-instrument-allocas=1 -S | FileCheck %s
|
||||||
|
|
||||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
target triple = "x86_64-apple-macosx10.10.0"
|
target triple = "x86_64-apple-macosx10.10.0"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user