Index: src/label.h |
diff --git a/src/label.h b/src/label.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e77a2afcc19a83b2e7151ce0ecb39c4e5738e7b4 |
--- /dev/null |
+++ b/src/label.h |
@@ -0,0 +1,92 @@ |
+// Copyright 2017 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_LABEL_H_ |
+#define V8_LABEL_H_ |
+ |
+#include "src/base/macros.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+// ----------------------------------------------------------------------------- |
+// Labels represent pc locations; they are typically jump or call targets. |
+// After declaration, a label can be freely used to denote known or (yet) |
+// unknown pc location. Assembler::bind() is used to bind a label to the |
+// current pc. A label can be bound only once. |
+ |
+class Label { |
+ public: |
+ enum Distance { kNear, kFar }; |
+ |
+ INLINE(Label()) { |
+ Unuse(); |
+ UnuseNear(); |
+ } |
+ |
+ INLINE(~Label()) { |
+ DCHECK(!is_linked()); |
+ DCHECK(!is_near_linked()); |
+ } |
+ |
+ INLINE(void Unuse()) { pos_ = 0; } |
+ INLINE(void UnuseNear()) { near_link_pos_ = 0; } |
+ |
+ INLINE(bool is_bound() const) { return pos_ < 0; } |
+ INLINE(bool is_unused() const) { return pos_ == 0 && near_link_pos_ == 0; } |
+ INLINE(bool is_linked() const) { return pos_ > 0; } |
+ INLINE(bool is_near_linked() const) { return near_link_pos_ > 0; } |
+ |
+ // Returns the position of bound or linked labels. Cannot be used |
+ // for unused labels. |
+ int pos() const { |
+ if (pos_ < 0) return -pos_ - 1; |
+ if (pos_ > 0) return pos_ - 1; |
+ UNREACHABLE(); |
+ return 0; |
+ } |
+ |
+ int near_link_pos() const { return near_link_pos_ - 1; } |
+ |
+ private: |
+ // pos_ encodes both the binding state (via its sign) |
+ // and the binding position (via its value) of a label. |
+ // |
+ // pos_ < 0 bound label, pos() returns the jump target position |
+ // pos_ == 0 unused label |
+ // pos_ > 0 linked label, pos() returns the last reference position |
+ int pos_; |
+ |
+ // Behaves like |pos_| in the "> 0" case, but for near jumps to this label. |
+ int near_link_pos_; |
+ |
+ void bind_to(int pos) { |
+ pos_ = -pos - 1; |
+ DCHECK(is_bound()); |
+ } |
+ void link_to(int pos, Distance distance = kFar) { |
+ if (distance == kNear) { |
+ near_link_pos_ = pos + 1; |
+ DCHECK(is_near_linked()); |
+ } else { |
+ pos_ = pos + 1; |
+ DCHECK(is_linked()); |
+ } |
+ } |
+ |
+ friend class Assembler; |
+ friend class Displacement; |
+ friend class RegExpMacroAssemblerIrregexp; |
+ |
+#if V8_TARGET_ARCH_ARM64 |
+ // On ARM64, the Assembler keeps track of pointers to Labels to resolve |
+ // branches to distant targets. Copying labels would confuse the Assembler. |
+ DISALLOW_COPY_AND_ASSIGN(Label); // NOLINT |
+#endif |
+}; |
+ |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_LABEL_H_ |