The JIT now passes the environment pointer to the main() function when it
[oota-llvm.git] / lib / ExecutionEngine / Interpreter / ExecutionAnnotations.h
1 //===-- ExecutionAnnotations.h ---------------------------------*- C++ -*--===//
2 //
3 // This header file defines annotations used by the execution engine.
4 //
5 //===----------------------------------------------------------------------===//
6
7 #ifndef LLI_EXECUTION_ANNOTATIONS_H
8 #define LLI_EXECUTION_ANNOTATIONS_H
9
10 //===----------------------------------------------------------------------===//
11 // Support for FunctionInfo annotations
12 //===----------------------------------------------------------------------===//
13
14 // This annotation (attached only to Function objects) is used to cache useful
15 // information about the function, including the number of types present in the
16 // function, and the number of values for each type.
17 //
18 // This annotation object is created on demand, and attaches other annotation
19 // objects to the instructions in the function when it's created.
20 //
21 static AnnotationID FunctionInfoAID(
22                     AnnotationManager::getID("Interpreter::FunctionInfo"));
23
24 struct FunctionInfo : public Annotation {
25   FunctionInfo(Function *F);
26   std::vector<unsigned> NumPlaneElements;
27
28   // Create - Factory function to allow FunctionInfo annotations to be
29   // created on demand.
30   //
31   static Annotation *Create(AnnotationID AID, const Annotable *O, void *) {
32     assert(AID == FunctionInfoAID);
33     return new FunctionInfo(cast<Function>((Value*)O));
34   }
35
36 private:
37   unsigned getValueSlot(const Value *V);
38 };
39
40
41 //===----------------------------------------------------------------------===//
42 // Support for the SlotNumber annotation
43 //===----------------------------------------------------------------------===//
44
45 // This annotation (attached only to Argument & Instruction objects) is used to
46 // hold the the slot number for the value in its type plane.
47 //
48 // Entities have this annotation attached to them when the containing
49 // function has it's FunctionInfo created (by the FunctionInfo ctor).
50 //
51 static AnnotationID SlotNumberAID(
52                     AnnotationManager::getID("Interpreter::SlotNumber"));
53
54 struct SlotNumber : public Annotation {
55   unsigned SlotNum;   // Ranges from 0->
56
57   SlotNumber(unsigned sn) : Annotation(SlotNumberAID), 
58                             SlotNum(sn) {}
59 };
60
61
62
63
64 //===----------------------------------------------------------------------===//
65 // Support for the InstNumber annotation
66 //===----------------------------------------------------------------------===//
67
68 // This annotation (attached only to Instruction objects) is used to hold the
69 // instruction number of the instruction, and the slot number for the value in
70 // its type plane.  InstNumber's are used for user interaction, and for
71 // calculating which value slot to store the result of the instruction in.
72 //
73 // Instructions have this annotation attached to them when the containing
74 // function has it's FunctionInfo created (by the FunctionInfo ctor).
75 //
76 struct InstNumber : public SlotNumber {
77   unsigned InstNum;   // Ranges from 1->
78
79   InstNumber(unsigned in, unsigned sn) : SlotNumber(sn), InstNum(in) {}
80 };
81
82
83 //===----------------------------------------------------------------------===//
84 // Support for the Breakpoint annotation
85 //===----------------------------------------------------------------------===//
86
87 static AnnotationID BreakpointAID(
88                     AnnotationManager::getID("Interpreter::Breakpoint"));
89 // Just use an Annotation directly, Breakpoint is currently just a marker
90
91
92 #endif