1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_RUNTIME_VERIFIER_INSTRUCTION_FLAGS_H_
18 #define ART_RUNTIME_VERIFIER_INSTRUCTION_FLAGS_H_
19 
20 #include <stdint.h>
21 #include <string>
22 
23 #include "base/logging.h"
24 
25 namespace art {
26 namespace verifier {
27 
28 class InstructionFlags {
29  public:
InstructionFlags()30   InstructionFlags() : length_(0), flags_(0) {}
31 
SetLengthInCodeUnits(size_t length)32   void SetLengthInCodeUnits(size_t length) {
33     DCHECK_LT(length, 65536u);
34     length_ = length;
35   }
GetLengthInCodeUnits()36   size_t GetLengthInCodeUnits() {
37     return length_;
38   }
IsOpcode()39   bool IsOpcode() const {
40     return length_ != 0;
41   }
42 
SetInTry()43   void SetInTry() {
44     flags_ |= 1 << kInTry;
45   }
ClearInTry()46   void ClearInTry() {
47     flags_ &= ~(1 << kInTry);
48   }
IsInTry()49   bool IsInTry() const {
50     return (flags_ & (1 << kInTry)) != 0;
51   }
52 
SetBranchTarget()53   void SetBranchTarget() {
54     flags_ |= 1 << kBranchTarget;
55   }
ClearBranchTarget()56   void ClearBranchTarget() {
57     flags_ &= ~(1 << kBranchTarget);
58   }
IsBranchTarget()59   bool IsBranchTarget() const {
60     return (flags_ & (1 << kBranchTarget)) != 0;
61   }
SetCompileTimeInfoPoint()62   void SetCompileTimeInfoPoint() {
63     flags_ |= 1 << kCompileTimeInfoPoint;
64   }
ClearCompileTimeInfoPoint()65   void ClearCompileTimeInfoPoint() {
66     flags_ &= ~(1 << kCompileTimeInfoPoint);
67   }
IsCompileTimeInfoPoint()68   bool IsCompileTimeInfoPoint() const {
69     return (flags_ & (1 << kCompileTimeInfoPoint)) != 0;
70   }
71 
SetVisited()72   void SetVisited() {
73     flags_ |= 1 << kVisited;
74   }
ClearVisited()75   void ClearVisited() {
76     flags_ &= ~(1 << kVisited);
77   }
IsVisited()78   bool IsVisited() const {
79     return (flags_ & (1 << kVisited)) != 0;
80   }
81 
SetChanged()82   void SetChanged() {
83     flags_ |= 1 << kChanged;
84   }
ClearChanged()85   void ClearChanged() {
86     flags_ &= ~(1 << kChanged);
87   }
IsChanged()88   bool IsChanged() const {
89     return (flags_ & (1 << kChanged)) != 0;
90   }
91 
IsVisitedOrChanged()92   bool IsVisitedOrChanged() const {
93     return IsVisited() || IsChanged();
94   }
95 
SetReturn()96   void SetReturn() {
97     flags_ |= 1 << kReturn;
98   }
ClearReturn()99   void ClearReturn() {
100     flags_ &= ~(1 << kReturn);
101   }
IsReturn()102   bool IsReturn() const {
103     return (flags_ & (1 << kReturn)) != 0;
104   }
105 
SetCompileTimeInfoPointAndReturn()106   void SetCompileTimeInfoPointAndReturn() {
107     SetCompileTimeInfoPoint();
108     SetReturn();
109   }
110 
111   std::string ToString() const;
112 
113  private:
114   enum {
115     // The instruction has been visited and unless IsChanged() verified.
116     kVisited = 0,
117     // Register type information flowing into the instruction changed and so the instruction must be
118     // reprocessed.
119     kChanged = 1,
120     // Instruction is contained within a try region.
121     kInTry = 2,
122     // Instruction is the target of a branch (ie the start of a basic block).
123     kBranchTarget = 3,
124     // Location of interest to the compiler for GC maps and verifier based method sharpening.
125     kCompileTimeInfoPoint = 4,
126     // A return instruction.
127     kReturn = 5,
128   };
129 
130   // Size of instruction in code units.
131   uint16_t length_;
132   uint8_t flags_;
133 };
134 
135 }  // namespace verifier
136 }  // namespace art
137 
138 #endif  // ART_RUNTIME_VERIFIER_INSTRUCTION_FLAGS_H_
139