blob: 78f6f1d505eedfafef101fdb594d66f098ce267f [file] [log] [blame]
//===--- JumpDest.h - Jump Destination Representation -----------*- 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
//
//===----------------------------------------------------------------------===//
//
// Types relating to branch destinations.
//
//===----------------------------------------------------------------------===//
#ifndef JUMPDEST_H
#define JUMPDEST_H
#include "swift/SIL/SILLocation.h"
#include "llvm/Support/Compiler.h"
#include "Cleanup.h"
namespace swift {
class SILBasicBlock;
class CaseStmt;
namespace Lowering {
/// The destination of a direct jump. Swift currently does not
/// support indirect branches or goto, so the jump mechanism only
/// needs to worry about branches out of scopes, not into them.
class LLVM_LIBRARY_VISIBILITY JumpDest {
SILBasicBlock *Block = nullptr;
CleanupsDepth Depth = CleanupsDepth::invalid();
CleanupLocation CleanupLoc;
public:
JumpDest(CleanupLocation L) : CleanupLoc(L) {}
JumpDest(SILBasicBlock *block, CleanupsDepth depth, CleanupLocation l)
: Block(block), Depth(depth), CleanupLoc(l) {}
SILBasicBlock *getBlock() const { return Block; }
SILBasicBlock *takeBlock() {
auto *BB = Block;
Block = nullptr;
return BB;
}
CleanupsDepth getDepth() const { return Depth; }
CleanupLocation getCleanupLocation() const { return CleanupLoc; }
JumpDest translate(CleanupsDepth NewDepth) && {
JumpDest NewValue(Block, NewDepth, CleanupLoc);
Block = nullptr;
Depth = CleanupsDepth::invalid();
// Null location.
CleanupLoc = CleanupLocation::get(ArtificialUnreachableLocation());
return NewValue;
}
bool isValid() const { return Block != nullptr; }
static JumpDest invalid() {
return JumpDest(CleanupLocation((Expr*) nullptr));
}
};
} // end namespace Lowering
} // end namespace swift
#endif