mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Rename the flag which protects from escaped allocas, which may come from bugs in user code or in the compiler. Also, dont assert if the protection is not enabled.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@163807 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -62,10 +62,15 @@ DisableColoring("no-stack-coloring",
|
|||||||
cl::init(false), cl::Hidden,
|
cl::init(false), cl::Hidden,
|
||||||
cl::desc("Disable stack coloring"));
|
cl::desc("Disable stack coloring"));
|
||||||
|
|
||||||
|
|
||||||
|
/// The user may write code that uses allocas outside of the declared lifetime
|
||||||
|
/// zone. This can happen when the user returns a reference to a local
|
||||||
|
/// data-structure. We can detect these cases and decide not to optimize the
|
||||||
|
/// code. If this flag is enabled, we try to save the user.
|
||||||
static cl::opt<bool>
|
static cl::opt<bool>
|
||||||
CheckEscapedAllocas("stack-coloring-check-escaped",
|
ProtectFromEscapedAllocas("protect-from-escaped-allocas",
|
||||||
cl::init(true), cl::Hidden,
|
cl::init(true), cl::Hidden,
|
||||||
cl::desc("Look for allocas which escaped the lifetime region"));
|
cl::desc("Do not optimize lifetime zones that are broken"));
|
||||||
|
|
||||||
STATISTIC(NumMarkerSeen, "Number of lifetime markers found.");
|
STATISTIC(NumMarkerSeen, "Number of lifetime markers found.");
|
||||||
STATISTIC(StackSpaceSaved, "Number of bytes saved due to merging slots.");
|
STATISTIC(StackSpaceSaved, "Number of bytes saved due to merging slots.");
|
||||||
@@ -536,13 +541,15 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
|
|||||||
// In a debug build, check that the instruction that we are modifying is
|
// In a debug build, check that the instruction that we are modifying is
|
||||||
// inside the expected live range. If the instruction is not inside
|
// inside the expected live range. If the instruction is not inside
|
||||||
// the calculated range then it means that the alloca usage moved
|
// the calculated range then it means that the alloca usage moved
|
||||||
// outside of the lifetime markers.
|
// outside of the lifetime markers, or that the user has a bug.
|
||||||
// NOTE: Alloca address calculations which happen outside the lifetime
|
// NOTE: Alloca address calculations which happen outside the lifetime
|
||||||
// zone are are okay, despite the fact that we don't have a good way
|
// zone are are okay, despite the fact that we don't have a good way
|
||||||
// for validating all of the usages of the calculation.
|
// for validating all of the usages of the calculation.
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
bool TouchesMemory = I->mayLoad() || I->mayStore();
|
bool TouchesMemory = I->mayLoad() || I->mayStore();
|
||||||
if (!I->isDebugValue() && TouchesMemory) {
|
// If we *don't* protect the user from escaped allocas, don't bother
|
||||||
|
// validating the instructions.
|
||||||
|
if (!I->isDebugValue() && TouchesMemory && ProtectFromEscapedAllocas) {
|
||||||
SlotIndex Index = Indexes->getInstructionIndex(I);
|
SlotIndex Index = Indexes->getInstructionIndex(I);
|
||||||
LiveInterval *Interval = Intervals[FromSlot];
|
LiveInterval *Interval = Intervals[FromSlot];
|
||||||
assert(Interval->find(Index) != Interval->end() &&
|
assert(Interval->find(Index) != Interval->end() &&
|
||||||
@@ -685,7 +692,7 @@ bool StackColoring::runOnMachineFunction(MachineFunction &Func) {
|
|||||||
|
|
||||||
// Search for allocas which are used outside of the declared lifetime
|
// Search for allocas which are used outside of the declared lifetime
|
||||||
// markers.
|
// markers.
|
||||||
if (CheckEscapedAllocas)
|
if (ProtectFromEscapedAllocas)
|
||||||
removeInvalidSlotRanges();
|
removeInvalidSlotRanges();
|
||||||
|
|
||||||
// Maps old slots to new slots.
|
// Maps old slots to new slots.
|
||||||
|
Reference in New Issue
Block a user