Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | //===- GenericSSAContext.h --------------------------------------*- C++ -*-===// |
2 | // |
||
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
4 | // See https://llvm.org/LICENSE.txt for license information. |
||
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
6 | // |
||
7 | //===----------------------------------------------------------------------===// |
||
8 | /// \file |
||
9 | /// |
||
10 | /// This file defines the little GenericSSAContext<X> template class |
||
11 | /// that can be used to implement IR analyses as templates. |
||
12 | /// Specializing these templates allows the analyses to be used over |
||
13 | /// both LLVM IR and Machine IR. |
||
14 | /// |
||
15 | //===----------------------------------------------------------------------===// |
||
16 | |||
17 | #ifndef LLVM_ADT_GENERICSSACONTEXT_H |
||
18 | #define LLVM_ADT_GENERICSSACONTEXT_H |
||
19 | |||
20 | #include "llvm/Support/Printable.h" |
||
21 | |||
22 | namespace llvm { |
||
23 | |||
24 | template <typename _FunctionT> class GenericSSAContext { |
||
25 | public: |
||
26 | // Specializations should provide the following types that are similar to how |
||
27 | // LLVM IR is structured: |
||
28 | |||
29 | // The smallest unit of the IR is a ValueT. The SSA context uses a ValueRefT, |
||
30 | // which is a pointer to a ValueT, since Machine IR does not have the |
||
31 | // equivalent of a ValueT. |
||
32 | // |
||
33 | // using ValueRefT = ... |
||
34 | |||
35 | // An InstT is a subclass of ValueT that itself defines one or more ValueT |
||
36 | // objects. |
||
37 | // |
||
38 | // using InstT = ... must be a subclass of Value |
||
39 | |||
40 | // A BlockT is a sequence of InstT, and forms a node of the CFG. It |
||
41 | // has global methods predecessors() and successors() that return |
||
42 | // the list of incoming CFG edges and outgoing CFG edges |
||
43 | // respectively. |
||
44 | // |
||
45 | // using BlockT = ... |
||
46 | |||
47 | // A FunctionT represents a CFG along with arguments and return values. It is |
||
48 | // the smallest complete unit of code in a Module. |
||
49 | // |
||
50 | // The compiler produces an error here if this class is implicitly |
||
51 | // specialized due to an instantiation. An explicit specialization |
||
52 | // of this template needs to be added before the instantiation point |
||
53 | // indicated by the compiler. |
||
54 | using FunctionT = typename _FunctionT::invalidTemplateInstanceError; |
||
55 | |||
56 | // Every FunctionT has a unique BlockT marked as its entry. |
||
57 | // |
||
58 | // static BlockT* getEntryBlock(FunctionT &F); |
||
59 | |||
60 | // Initialize the SSA context with information about the FunctionT being |
||
61 | // processed. |
||
62 | // |
||
63 | // void setFunction(FunctionT &function); |
||
64 | // FunctionT* getFunction() const; |
||
65 | |||
66 | // Methods to print various objects. |
||
67 | // |
||
68 | // Printable print(BlockT *block) const; |
||
69 | // Printable print(InstructionT *inst) const; |
||
70 | // Printable print(ValueRefT value) const; |
||
71 | }; |
||
72 | } // namespace llvm |
||
73 | |||
74 | #endif // LLVM_ADT_GENERICSSACONTEXT_H |