17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved.
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// found in the LICENSE file.
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef V8_COMPILER_SOURCE_POSITION_H_
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define V8_COMPILER_SOURCE_POSITION_H_
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/assembler.h"
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "src/compiler/node-aux-data.h"
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace v8 {
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace internal {
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnamespace compiler {
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// Encapsulates encoding and decoding of sources positions from which Nodes
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org// originated.
17ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SourcePosition FINAL {
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  explicit SourcePosition(int raw = kUnknownPosition) : raw_(raw) {}
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static SourcePosition Unknown() { return SourcePosition(kUnknownPosition); }
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  bool IsUnknown() const { return raw() == kUnknownPosition; }
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static SourcePosition Invalid() { return SourcePosition(kInvalidPosition); }
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  bool IsInvalid() const { return raw() == kInvalidPosition; }
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int raw() const { return raw_; }
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static const int kInvalidPosition = -2;
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  static const int kUnknownPosition = RelocInfo::kNoPosition;
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  STATIC_ASSERT(kInvalidPosition != kUnknownPosition);
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  int raw_;
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orginline bool operator==(const SourcePosition& lhs, const SourcePosition& rhs) {
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return lhs.raw() == rhs.raw();
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orginline bool operator!=(const SourcePosition& lhs, const SourcePosition& rhs) {
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  return !(lhs == rhs);
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
46ada3a6017e603965f87fa34f6e2fa60379e8d697machenbach@chromium.orgclass SourcePositionTable FINAL {
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org public:
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  class Scope {
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   public:
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Scope(SourcePositionTable* source_positions, SourcePosition position)
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        : source_positions_(source_positions),
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          prev_position_(source_positions->current_position_) {
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Init(position);
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    Scope(SourcePositionTable* source_positions, Node* node)
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        : source_positions_(source_positions),
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          prev_position_(source_positions->current_position_) {
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      Init(source_positions_->GetSourcePosition(node));
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    ~Scope() { source_positions_->current_position_ = prev_position_; }
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   private:
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    void Init(SourcePosition position) {
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (!position.IsUnknown() || prev_position_.IsInvalid()) {
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        source_positions_->current_position_ = position;
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    }
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    SourcePositionTable* source_positions_;
707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    SourcePosition prev_position_;
717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    DISALLOW_COPY_AND_ASSIGN(Scope);
727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  };
737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  explicit SourcePositionTable(Graph* graph);
757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  ~SourcePositionTable() {
767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    if (decorator_ != NULL) RemoveDecorator();
777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  }
787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void AddDecorator();
807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  void RemoveDecorator();
817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SourcePosition GetSourcePosition(Node* node);
837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org private:
857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  class Decorator;
867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Graph* graph_;
887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  Decorator* decorator_;
897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  SourcePosition current_position_;
907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  NodeAuxData<SourcePosition> table_;
917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org  DISALLOW_COPY_AND_ASSIGN(SourcePositionTable);
937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace compiler
967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace internal
977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}  // namespace v8
987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
100