MaskRay created this revision. MaskRay added reviewers: jfb, gribozavr, nand, RKSimon. Herald added subscribers: llvm-commits, cfe-commits, dexonsmith, mgorny. Herald added projects: clang, LLVM.
The Blocks runtime provide a header named Block.h. It is generally preferable to avoid name collision with system headers (reducing reliance on -isystem order, friendly when navigating files in an editor, etc). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D74934 Files: clang/lib/AST/CMakeLists.txt clang/lib/AST/Interp/AllocatedBlock.cpp clang/lib/AST/Interp/AllocatedBlock.h clang/lib/AST/Interp/Block.cpp clang/lib/AST/Interp/Block.h clang/lib/AST/Interp/Pointer.cpp clang/lib/AST/Interp/Pointer.h llvm/utils/gn/secondary/clang/lib/AST/BUILD.gn
Index: llvm/utils/gn/secondary/clang/lib/AST/BUILD.gn =================================================================== --- llvm/utils/gn/secondary/clang/lib/AST/BUILD.gn +++ llvm/utils/gn/secondary/clang/lib/AST/BUILD.gn @@ -81,7 +81,7 @@ "ExternalASTSource.cpp", "FormatString.cpp", "InheritViz.cpp", - "Interp/Block.cpp", + "Interp/AllocatedBlock.cpp", "Interp/ByteCodeEmitter.cpp", "Interp/ByteCodeExprGen.cpp", "Interp/ByteCodeGenError.cpp", Index: clang/lib/AST/Interp/Pointer.h =================================================================== --- clang/lib/AST/Interp/Pointer.h +++ clang/lib/AST/Interp/Pointer.h @@ -13,12 +13,12 @@ #ifndef LLVM_CLANG_AST_INTERP_POINTER_H #define LLVM_CLANG_AST_INTERP_POINTER_H -#include "Block.h" +#include "AllocatedBlock.h" #include "Descriptor.h" +#include "clang/AST/ComparisonCategories.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" Index: clang/lib/AST/Interp/Pointer.cpp =================================================================== --- clang/lib/AST/Interp/Pointer.cpp +++ clang/lib/AST/Interp/Pointer.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// #include "Pointer.h" -#include "Block.h" +#include "AllocatedBlock.h" #include "Function.h" #include "PrimType.h" Index: clang/lib/AST/Interp/Block.h =================================================================== --- /dev/null +++ clang/lib/AST/Interp/Block.h @@ -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 Index: clang/lib/AST/Interp/AllocatedBlock.cpp =================================================================== --- clang/lib/AST/Interp/AllocatedBlock.cpp +++ clang/lib/AST/Interp/AllocatedBlock.cpp @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -#include "Block.h" +#include "AllocatedBlock.h" #include "Pointer.h" using namespace clang; Index: clang/lib/AST/CMakeLists.txt =================================================================== --- clang/lib/AST/CMakeLists.txt +++ clang/lib/AST/CMakeLists.txt @@ -55,7 +55,7 @@ ExternalASTSource.cpp FormatString.cpp InheritViz.cpp - Interp/Block.cpp + Interp/AllocatedBlock.cpp Interp/ByteCodeEmitter.cpp Interp/ByteCodeExprGen.cpp Interp/ByteCodeGenError.cpp
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits