summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/Interp/Block.h
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST/Interp/Block.h')
-rw-r--r--clang/lib/AST/Interp/Block.h140
1 files changed, 0 insertions, 140 deletions
diff --git a/clang/lib/AST/Interp/Block.h b/clang/lib/AST/Interp/Block.h
deleted file mode 100644
index 97fb9a3ca09..00000000000
--- a/clang/lib/AST/Interp/Block.h
+++ /dev/null
@@ -1,140 +0,0 @@
-//===--- Block.h - Allocated blocks for the interpreter ---------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Defines the classes describing allocated blocks.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_AST_INTERP_BLOCK_H
-#define LLVM_CLANG_AST_INTERP_BLOCK_H
-
-#include "Descriptor.h"
-#include "clang/AST/Decl.h"
-#include "clang/AST/DeclCXX.h"
-#include "clang/AST/Expr.h"
-#include "clang/AST/ComparisonCategories.h"
-#include "llvm/ADT/PointerUnion.h"
-#include "llvm/Support/raw_ostream.h"
-
-namespace clang {
-namespace interp {
-class Block;
-class DeadBlock;
-class Context;
-class InterpState;
-class Pointer;
-class Function;
-enum PrimType : unsigned;
-
-/// A memory block, either on the stack or in the heap.
-///
-/// The storage described by the block immediately follows it in memory.
-class Block {
-public:
- // Creates a new block.
- Block(const llvm::Optional<unsigned> &DeclID, Descriptor *Desc,
- bool IsStatic = false, bool IsExtern = false)
- : DeclID(DeclID), IsStatic(IsStatic), IsExtern(IsExtern), Desc(Desc) {}
-
- Block(Descriptor *Desc, bool IsStatic = false, bool IsExtern = false)
- : DeclID((unsigned)-1), IsStatic(IsStatic), IsExtern(IsExtern),
- Desc(Desc) {}
-
- /// Returns the block's descriptor.
- Descriptor *getDescriptor() const { return Desc; }
- /// Checks if the block has any live pointers.
- bool hasPointers() const { return Pointers; }
- /// Checks if the block is extern.
- bool isExtern() const { return IsExtern; }
- /// Checks if the block has static storage duration.
- bool isStatic() const { return IsStatic; }
- /// Checks if the block is temporary.
- bool isTemporary() const { return Desc->IsTemporary; }
- /// Returns the size of the block.
- InterpSize getSize() const { return Desc->getAllocSize(); }
- /// Returns the declaration ID.
- llvm::Optional<unsigned> getDeclID() const { return DeclID; }
-
- /// Returns a pointer to the stored data.
- char *data() { return reinterpret_cast<char *>(this + 1); }
-
- /// Returns a view over the data.
- template <typename T>
- T &deref() { return *reinterpret_cast<T *>(data()); }
-
- /// Invokes the constructor.
- void invokeCtor() {
- std::memset(data(), 0, getSize());
- if (Desc->CtorFn)
- Desc->CtorFn(this, data(), Desc->IsConst, Desc->IsMutable,
- /*isActive=*/true, Desc);
- }
-
-protected:
- friend class Pointer;
- friend class DeadBlock;
- friend class InterpState;
-
- Block(Descriptor *Desc, bool IsExtern, bool IsStatic, bool IsDead)
- : IsStatic(IsStatic), IsExtern(IsExtern), IsDead(true), Desc(Desc) {}
-
- // Deletes a dead block at the end of its lifetime.
- void cleanup();
-
- // Pointer chain management.
- void addPointer(Pointer *P);
- void removePointer(Pointer *P);
- void movePointer(Pointer *From, Pointer *To);
-
- /// Start of the chain of pointers.
- Pointer *Pointers = nullptr;
- /// Unique identifier of the declaration.
- llvm::Optional<unsigned> DeclID;
- /// Flag indicating if the block has static storage duration.
- bool IsStatic = false;
- /// Flag indicating if the block is an extern.
- bool IsExtern = false;
- /// Flag indicating if the pointer is dead.
- bool IsDead = false;
- /// Pointer to the stack slot descriptor.
- Descriptor *Desc;
-};
-
-/// Descriptor for a dead block.
-///
-/// Dead blocks are chained in a double-linked list to deallocate them
-/// whenever pointers become dead.
-class DeadBlock {
-public:
- /// Copies the block.
- DeadBlock(DeadBlock *&Root, Block *Blk);
-
- /// Returns a pointer to the stored data.
- char *data() { return B.data(); }
-
-private:
- friend class Block;
- friend class InterpState;
-
- void free();
-
- /// Root pointer of the list.
- DeadBlock *&Root;
- /// Previous block in the list.
- DeadBlock *Prev;
- /// Next block in the list.
- DeadBlock *Next;
-
- /// Actual block storing data and tracking pointers.
- Block B;
-};
-
-} // namespace interp
-} // namespace clang
-
-#endif
OpenPOWER on IntegriCloud