mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
79 lines
2.0 KiB
C++
79 lines
2.0 KiB
C++
//===--- 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
|