blob: aa137239a4684e0d9ad5abff69da3eb59badbc9d [file] [log] [blame]
//===--- Temporary.h - A temporary allocation -------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines the Temporary and TemporarySet classes.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_TEMPORARY_H
#define SWIFT_IRGEN_TEMPORARY_H
#include "Address.h"
#include "swift/SIL/SILType.h"
#include <vector>
namespace swift {
namespace irgen {
class IRGenFunction;
/// A temporary allocation.
class Temporary {
public:
StackAddress Addr;
SILType Type;
void destroy(IRGenFunction &IGF) const;
};
class TemporarySet {
std::vector<Temporary> Stack;
bool HasBeenCleared = false;
public:
TemporarySet() = default;
TemporarySet(TemporarySet &&) = default;
TemporarySet &operator=(TemporarySet &&) = default;
// Make this move-only to reduce chances of double-destroys. We can't
// get too strict with this, though, because we may need to destroy
// the same set of temporaries along multiple control-flow paths.
TemporarySet(const TemporarySet &) = delete;
TemporarySet &operator=(const TemporarySet &) = delete;
void add(Temporary temp) {
Stack.push_back(temp);
}
/// Destroy all the temporaries.
void destroyAll(IRGenFunction &IGF) const;
/// Remove all the temporaries from this set. This does not destroy
/// the temporaries.
void clear() {
assert(!HasBeenCleared && "already cleared");
HasBeenCleared = true;
Stack.clear();
}
/// Has clear() been called on this set?
bool hasBeenCleared() const {
return HasBeenCleared;
}
};
} // end namespace irgen
} // end namespace swift
#endif