- //===- SSAContext.h ---------------------------------------------*- 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 
- // 
- //===----------------------------------------------------------------------===// 
- /// \file 
- /// 
- /// This file declares a specialization of the GenericSSAContext<X> 
- /// class template for LLVM IR. 
- /// 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_IR_SSACONTEXT_H 
- #define LLVM_IR_SSACONTEXT_H 
-   
- #include "llvm/ADT/GenericSSAContext.h" 
- #include "llvm/IR/BasicBlock.h" 
- #include "llvm/IR/ModuleSlotTracker.h" 
- #include "llvm/Support/Printable.h" 
-   
- #include <memory> 
-   
- namespace llvm { 
- class BasicBlock; 
- class Function; 
- class Instruction; 
- class Value; 
- template <typename> class SmallVectorImpl; 
- template <typename, bool> class DominatorTreeBase; 
-   
- inline auto instrs(const BasicBlock &BB) { 
-   return llvm::make_range(BB.begin(), BB.end()); 
- } 
-   
- template <> class GenericSSAContext<Function> { 
-   Function *F; 
-   
- public: 
-   using BlockT = BasicBlock; 
-   using FunctionT = Function; 
-   using InstructionT = Instruction; 
-   using ValueRefT = Value *; 
-   using ConstValueRefT = const Value *; 
-   static Value *ValueRefNull; 
-   using DominatorTreeT = DominatorTreeBase<BlockT, false>; 
-   
-   void setFunction(Function &Fn); 
-   Function *getFunction() const { return F; } 
-   
-   static BasicBlock *getEntryBlock(Function &F); 
-   static const BasicBlock *getEntryBlock(const Function &F); 
-   
-   static void appendBlockDefs(SmallVectorImpl<Value *> &defs, 
-                               BasicBlock &block); 
-   static void appendBlockDefs(SmallVectorImpl<const Value *> &defs, 
-                               const BasicBlock &block); 
-   
-   static void appendBlockTerms(SmallVectorImpl<Instruction *> &terms, 
-                                BasicBlock &block); 
-   static void appendBlockTerms(SmallVectorImpl<const Instruction *> &terms, 
-                                const BasicBlock &block); 
-   
-   static bool comesBefore(const Instruction *lhs, const Instruction *rhs); 
-   static bool isConstantValuePhi(const Instruction &Instr); 
-   const BasicBlock *getDefBlock(const Value *value) const; 
-   
-   Printable print(const BasicBlock *Block) const; 
-   Printable print(const Instruction *Inst) const; 
-   Printable print(const Value *Value) const; 
- }; 
-   
- using SSAContext = GenericSSAContext<Function>; 
-   
- } // namespace llvm 
-   
- #endif // LLVM_IR_SSACONTEXT_H 
-