LCOV - code coverage report
Current view: top level - src/regexp - regexp-macro-assembler-tracer.cc (source / functions) Hit Total Coverage
Test: app.info Lines: 1 202 0.5 %
Date: 2019-04-17 Functions: 1 45 2.2 %

          Line data    Source code
       1             : // Copyright 2012 the V8 project authors. All rights reserved.
       2             : // Use of this source code is governed by a BSD-style license that can be
       3             : // found in the LICENSE file.
       4             : 
       5             : #include "src/regexp/regexp-macro-assembler-tracer.h"
       6             : 
       7             : #include "src/ast/ast.h"
       8             : #include "src/objects-inl.h"
       9             : 
      10             : namespace v8 {
      11             : namespace internal {
      12             : 
      13           0 : RegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer(
      14             :     Isolate* isolate, RegExpMacroAssembler* assembler)
      15           0 :     : RegExpMacroAssembler(isolate, assembler->zone()), assembler_(assembler) {
      16           0 :   IrregexpImplementation type = assembler->Implementation();
      17             :   DCHECK_LT(type, 9);
      18             :   const char* impl_names[] = {"IA32", "ARM", "ARM64", "MIPS",    "S390",
      19           0 :                               "PPC",  "X64", "X87",   "Bytecode"};
      20           0 :   PrintF("RegExpMacroAssembler%s();\n", impl_names[type]);
      21           0 : }
      22             : 
      23             : RegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() = default;
      24             : 
      25           0 : void RegExpMacroAssemblerTracer::AbortedCodeGeneration() {
      26           0 :   PrintF(" AbortedCodeGeneration\n");
      27           0 :   assembler_->AbortedCodeGeneration();
      28           0 : }
      29             : 
      30             : 
      31             : // This is used for printing out debugging information.  It makes an integer
      32             : // that is closely related to the address of an object.
      33             : static int LabelToInt(Label* label) {
      34           0 :   return static_cast<int>(reinterpret_cast<intptr_t>(label));
      35             : }
      36             : 
      37             : 
      38           0 : void RegExpMacroAssemblerTracer::Bind(Label* label) {
      39           0 :   PrintF("label[%08x]: (Bind)\n", LabelToInt(label));
      40           0 :   assembler_->Bind(label);
      41           0 : }
      42             : 
      43             : 
      44           0 : void RegExpMacroAssemblerTracer::AdvanceCurrentPosition(int by) {
      45           0 :   PrintF(" AdvanceCurrentPosition(by=%d);\n", by);
      46           0 :   assembler_->AdvanceCurrentPosition(by);
      47           0 : }
      48             : 
      49             : 
      50           0 : void RegExpMacroAssemblerTracer::CheckGreedyLoop(Label* label) {
      51           0 :   PrintF(" CheckGreedyLoop(label[%08x]);\n\n", LabelToInt(label));
      52           0 :   assembler_->CheckGreedyLoop(label);
      53           0 : }
      54             : 
      55             : 
      56           0 : void RegExpMacroAssemblerTracer::PopCurrentPosition() {
      57           0 :   PrintF(" PopCurrentPosition();\n");
      58           0 :   assembler_->PopCurrentPosition();
      59           0 : }
      60             : 
      61             : 
      62           0 : void RegExpMacroAssemblerTracer::PushCurrentPosition() {
      63           0 :   PrintF(" PushCurrentPosition();\n");
      64           0 :   assembler_->PushCurrentPosition();
      65           0 : }
      66             : 
      67             : 
      68           0 : void RegExpMacroAssemblerTracer::Backtrack() {
      69           0 :   PrintF(" Backtrack();\n");
      70           0 :   assembler_->Backtrack();
      71           0 : }
      72             : 
      73             : 
      74           0 : void RegExpMacroAssemblerTracer::GoTo(Label* label) {
      75           0 :   PrintF(" GoTo(label[%08x]);\n\n", LabelToInt(label));
      76           0 :   assembler_->GoTo(label);
      77           0 : }
      78             : 
      79             : 
      80           0 : void RegExpMacroAssemblerTracer::PushBacktrack(Label* label) {
      81           0 :   PrintF(" PushBacktrack(label[%08x]);\n", LabelToInt(label));
      82           0 :   assembler_->PushBacktrack(label);
      83           0 : }
      84             : 
      85             : 
      86           0 : bool RegExpMacroAssemblerTracer::Succeed() {
      87           0 :   bool restart = assembler_->Succeed();
      88           0 :   PrintF(" Succeed();%s\n", restart ? " [restart for global match]" : "");
      89           0 :   return restart;
      90             : }
      91             : 
      92             : 
      93           0 : void RegExpMacroAssemblerTracer::Fail() {
      94           0 :   PrintF(" Fail();");
      95           0 :   assembler_->Fail();
      96           0 : }
      97             : 
      98             : 
      99           0 : void RegExpMacroAssemblerTracer::PopRegister(int register_index) {
     100           0 :   PrintF(" PopRegister(register=%d);\n", register_index);
     101           0 :   assembler_->PopRegister(register_index);
     102           0 : }
     103             : 
     104             : 
     105           0 : void RegExpMacroAssemblerTracer::PushRegister(
     106             :     int register_index,
     107             :     StackCheckFlag check_stack_limit) {
     108           0 :   PrintF(" PushRegister(register=%d, %s);\n",
     109             :          register_index,
     110           0 :          check_stack_limit ? "check stack limit" : "");
     111           0 :   assembler_->PushRegister(register_index, check_stack_limit);
     112           0 : }
     113             : 
     114             : 
     115           0 : void RegExpMacroAssemblerTracer::AdvanceRegister(int reg, int by) {
     116           0 :   PrintF(" AdvanceRegister(register=%d, by=%d);\n", reg, by);
     117           0 :   assembler_->AdvanceRegister(reg, by);
     118           0 : }
     119             : 
     120             : 
     121           0 : void RegExpMacroAssemblerTracer::SetCurrentPositionFromEnd(int by) {
     122           0 :   PrintF(" SetCurrentPositionFromEnd(by=%d);\n", by);
     123           0 :   assembler_->SetCurrentPositionFromEnd(by);
     124           0 : }
     125             : 
     126             : 
     127           0 : void RegExpMacroAssemblerTracer::SetRegister(int register_index, int to) {
     128           0 :   PrintF(" SetRegister(register=%d, to=%d);\n", register_index, to);
     129           0 :   assembler_->SetRegister(register_index, to);
     130           0 : }
     131             : 
     132             : 
     133           0 : void RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(int reg,
     134             :                                                                 int cp_offset) {
     135             :   PrintF(" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n",
     136             :          reg,
     137           0 :          cp_offset);
     138           0 :   assembler_->WriteCurrentPositionToRegister(reg, cp_offset);
     139           0 : }
     140             : 
     141             : 
     142           0 : void RegExpMacroAssemblerTracer::ClearRegisters(int reg_from, int reg_to) {
     143           0 :   PrintF(" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to);
     144           0 :   assembler_->ClearRegisters(reg_from, reg_to);
     145           0 : }
     146             : 
     147             : 
     148           0 : void RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(int reg) {
     149           0 :   PrintF(" ReadCurrentPositionFromRegister(register=%d);\n", reg);
     150           0 :   assembler_->ReadCurrentPositionFromRegister(reg);
     151           0 : }
     152             : 
     153             : 
     154           0 : void RegExpMacroAssemblerTracer::WriteStackPointerToRegister(int reg) {
     155           0 :   PrintF(" WriteStackPointerToRegister(register=%d);\n", reg);
     156           0 :   assembler_->WriteStackPointerToRegister(reg);
     157           0 : }
     158             : 
     159             : 
     160           0 : void RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(int reg) {
     161           0 :   PrintF(" ReadStackPointerFromRegister(register=%d);\n", reg);
     162           0 :   assembler_->ReadStackPointerFromRegister(reg);
     163           0 : }
     164             : 
     165             : 
     166           0 : void RegExpMacroAssemblerTracer::LoadCurrentCharacter(int cp_offset,
     167             :                                                       Label* on_end_of_input,
     168             :                                                       bool check_bounds,
     169             :                                                       int characters) {
     170           0 :   const char* check_msg = check_bounds ? "" : " (unchecked)";
     171             :   PrintF(" LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars));\n",
     172             :          cp_offset,
     173             :          LabelToInt(on_end_of_input),
     174             :          check_msg,
     175           0 :          characters);
     176           0 :   assembler_->LoadCurrentCharacter(cp_offset,
     177             :                                    on_end_of_input,
     178             :                                    check_bounds,
     179           0 :                                    characters);
     180           0 : }
     181             : 
     182             : 
     183             : class PrintablePrinter {
     184             :  public:
     185           0 :   explicit PrintablePrinter(uc16 character) : character_(character) { }
     186             : 
     187             :   const char* operator*() {
     188           0 :     if (character_ >= ' ' && character_ <= '~') {
     189           0 :       buffer_[0] = '(';
     190           0 :       buffer_[1] = static_cast<char>(character_);
     191           0 :       buffer_[2] = ')';
     192           0 :       buffer_[3] = '\0';
     193             :     } else {
     194           0 :       buffer_[0] = '\0';
     195             :     }
     196             :     return &buffer_[0];
     197             :   }
     198             : 
     199             :  private:
     200             :   uc16 character_;
     201             :   char buffer_[4];
     202             : };
     203             : 
     204             : 
     205           0 : void RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit, Label* on_less) {
     206             :   PrintablePrinter printable(limit);
     207           0 :   PrintF(" CheckCharacterLT(c=0x%04x%s, label[%08x]);\n",
     208             :          limit,
     209             :          *printable,
     210           0 :          LabelToInt(on_less));
     211           0 :   assembler_->CheckCharacterLT(limit, on_less);
     212           0 : }
     213             : 
     214             : 
     215           0 : void RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit,
     216             :                                                   Label* on_greater) {
     217             :   PrintablePrinter printable(limit);
     218           0 :   PrintF(" CheckCharacterGT(c=0x%04x%s, label[%08x]);\n",
     219             :          limit,
     220             :          *printable,
     221           0 :          LabelToInt(on_greater));
     222           0 :   assembler_->CheckCharacterGT(limit, on_greater);
     223           0 : }
     224             : 
     225             : 
     226           0 : void RegExpMacroAssemblerTracer::CheckCharacter(unsigned c, Label* on_equal) {
     227             :   PrintablePrinter printable(c);
     228             :   PrintF(" CheckCharacter(c=0x%04x%s, label[%08x]);\n",
     229             :          c,
     230             :          *printable,
     231           0 :          LabelToInt(on_equal));
     232           0 :   assembler_->CheckCharacter(c, on_equal);
     233           0 : }
     234             : 
     235             : 
     236           0 : void RegExpMacroAssemblerTracer::CheckAtStart(Label* on_at_start) {
     237           0 :   PrintF(" CheckAtStart(label[%08x]);\n", LabelToInt(on_at_start));
     238           0 :   assembler_->CheckAtStart(on_at_start);
     239           0 : }
     240             : 
     241             : 
     242           0 : void RegExpMacroAssemblerTracer::CheckNotAtStart(int cp_offset,
     243             :                                                  Label* on_not_at_start) {
     244             :   PrintF(" CheckNotAtStart(cp_offset=%d, label[%08x]);\n", cp_offset,
     245           0 :          LabelToInt(on_not_at_start));
     246           0 :   assembler_->CheckNotAtStart(cp_offset, on_not_at_start);
     247           0 : }
     248             : 
     249             : 
     250           0 : void RegExpMacroAssemblerTracer::CheckNotCharacter(unsigned c,
     251             :                                                    Label* on_not_equal) {
     252             :   PrintablePrinter printable(c);
     253             :   PrintF(" CheckNotCharacter(c=0x%04x%s, label[%08x]);\n",
     254             :          c,
     255             :          *printable,
     256           0 :          LabelToInt(on_not_equal));
     257           0 :   assembler_->CheckNotCharacter(c, on_not_equal);
     258           0 : }
     259             : 
     260             : 
     261           0 : void RegExpMacroAssemblerTracer::CheckCharacterAfterAnd(
     262             :     unsigned c,
     263             :     unsigned mask,
     264             :     Label* on_equal) {
     265             :   PrintablePrinter printable(c);
     266             :   PrintF(" CheckCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
     267             :          c,
     268             :          *printable,
     269             :          mask,
     270           0 :          LabelToInt(on_equal));
     271           0 :   assembler_->CheckCharacterAfterAnd(c, mask, on_equal);
     272           0 : }
     273             : 
     274             : 
     275           0 : void RegExpMacroAssemblerTracer::CheckNotCharacterAfterAnd(
     276             :     unsigned c,
     277             :     unsigned mask,
     278             :     Label* on_not_equal) {
     279             :   PrintablePrinter printable(c);
     280             :   PrintF(" CheckNotCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
     281             :          c,
     282             :          *printable,
     283             :          mask,
     284           0 :          LabelToInt(on_not_equal));
     285           0 :   assembler_->CheckNotCharacterAfterAnd(c, mask, on_not_equal);
     286           0 : }
     287             : 
     288             : 
     289           0 : void RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusAnd(
     290             :     uc16 c,
     291             :     uc16 minus,
     292             :     uc16 mask,
     293             :     Label* on_not_equal) {
     294           0 :   PrintF(" CheckNotCharacterAfterMinusAnd(c=0x%04x, minus=%04x, mask=0x%04x, "
     295             :              "label[%08x]);\n",
     296             :          c,
     297             :          minus,
     298             :          mask,
     299           0 :          LabelToInt(on_not_equal));
     300           0 :   assembler_->CheckNotCharacterAfterMinusAnd(c, minus, mask, on_not_equal);
     301           0 : }
     302             : 
     303             : 
     304           0 : void RegExpMacroAssemblerTracer::CheckCharacterInRange(
     305             :     uc16 from,
     306             :     uc16 to,
     307             :     Label* on_not_in_range) {
     308             :   PrintablePrinter printable_from(from);
     309             :   PrintablePrinter printable_to(to);
     310           0 :   PrintF(" CheckCharacterInRange(from=0x%04x%s, to=0x%04x%s, label[%08x]);\n",
     311             :          from,
     312             :          *printable_from,
     313             :          to,
     314             :          *printable_to,
     315           0 :          LabelToInt(on_not_in_range));
     316           0 :   assembler_->CheckCharacterInRange(from, to, on_not_in_range);
     317           0 : }
     318             : 
     319             : 
     320           0 : void RegExpMacroAssemblerTracer::CheckCharacterNotInRange(
     321             :     uc16 from,
     322             :     uc16 to,
     323             :     Label* on_in_range) {
     324             :   PrintablePrinter printable_from(from);
     325             :   PrintablePrinter printable_to(to);
     326           0 :   PrintF(
     327             :       " CheckCharacterNotInRange(from=0x%04x%s," " to=%04x%s, label[%08x]);\n",
     328             :       from,
     329             :       *printable_from,
     330             :       to,
     331             :       *printable_to,
     332           0 :       LabelToInt(on_in_range));
     333           0 :   assembler_->CheckCharacterNotInRange(from, to, on_in_range);
     334           0 : }
     335             : 
     336             : 
     337           0 : void RegExpMacroAssemblerTracer::CheckBitInTable(
     338             :     Handle<ByteArray> table, Label* on_bit_set) {
     339           0 :   PrintF(" CheckBitInTable(label[%08x] ", LabelToInt(on_bit_set));
     340           0 :   for (int i = 0; i < kTableSize; i++) {
     341           0 :     PrintF("%c", table->get(i) != 0 ? 'X' : '.');
     342           0 :     if (i % 32 == 31 && i != kTableMask) {
     343           0 :       PrintF("\n                                 ");
     344             :     }
     345             :   }
     346           0 :   PrintF(");\n");
     347           0 :   assembler_->CheckBitInTable(table, on_bit_set);
     348           0 : }
     349             : 
     350             : 
     351           0 : void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg,
     352             :                                                        bool read_backward,
     353             :                                                        Label* on_no_match) {
     354           0 :   PrintF(" CheckNotBackReference(register=%d, %s, label[%08x]);\n", start_reg,
     355           0 :          read_backward ? "backward" : "forward", LabelToInt(on_no_match));
     356           0 :   assembler_->CheckNotBackReference(start_reg, read_backward, on_no_match);
     357           0 : }
     358             : 
     359             : 
     360           0 : void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase(
     361             :     int start_reg, bool read_backward, bool unicode, Label* on_no_match) {
     362           0 :   PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, %s %s, label[%08x]);\n",
     363             :          start_reg, read_backward ? "backward" : "forward",
     364           0 :          unicode ? "unicode" : "non-unicode", LabelToInt(on_no_match));
     365           0 :   assembler_->CheckNotBackReferenceIgnoreCase(start_reg, read_backward, unicode,
     366           0 :                                               on_no_match);
     367           0 : }
     368             : 
     369             : 
     370           0 : void RegExpMacroAssemblerTracer::CheckPosition(int cp_offset,
     371             :                                                Label* on_outside_input) {
     372             :   PrintF(" CheckPosition(cp_offset=%d, label[%08x]);\n", cp_offset,
     373           0 :          LabelToInt(on_outside_input));
     374           0 :   assembler_->CheckPosition(cp_offset, on_outside_input);
     375           0 : }
     376             : 
     377             : 
     378           0 : bool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass(
     379             :     uc16 type,
     380             :     Label* on_no_match) {
     381           0 :   bool supported = assembler_->CheckSpecialCharacterClass(type,
     382           0 :                                                           on_no_match);
     383           0 :   PrintF(" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n",
     384             :          type,
     385             :          LabelToInt(on_no_match),
     386           0 :          supported ? "true" : "false");
     387           0 :   return supported;
     388             : }
     389             : 
     390             : 
     391           0 : void RegExpMacroAssemblerTracer::IfRegisterLT(int register_index,
     392             :                                               int comparand, Label* if_lt) {
     393             :   PrintF(" IfRegisterLT(register=%d, number=%d, label[%08x]);\n",
     394           0 :          register_index, comparand, LabelToInt(if_lt));
     395           0 :   assembler_->IfRegisterLT(register_index, comparand, if_lt);
     396           0 : }
     397             : 
     398             : 
     399           0 : void RegExpMacroAssemblerTracer::IfRegisterEqPos(int register_index,
     400             :                                                  Label* if_eq) {
     401             :   PrintF(" IfRegisterEqPos(register=%d, label[%08x]);\n",
     402           0 :          register_index, LabelToInt(if_eq));
     403           0 :   assembler_->IfRegisterEqPos(register_index, if_eq);
     404           0 : }
     405             : 
     406             : 
     407           0 : void RegExpMacroAssemblerTracer::IfRegisterGE(int register_index,
     408             :                                               int comparand, Label* if_ge) {
     409             :   PrintF(" IfRegisterGE(register=%d, number=%d, label[%08x]);\n",
     410           0 :          register_index, comparand, LabelToInt(if_ge));
     411           0 :   assembler_->IfRegisterGE(register_index, comparand, if_ge);
     412           0 : }
     413             : 
     414             : 
     415             : RegExpMacroAssembler::IrregexpImplementation
     416           0 :     RegExpMacroAssemblerTracer::Implementation() {
     417           0 :   return assembler_->Implementation();
     418             : }
     419             : 
     420             : 
     421           0 : Handle<HeapObject> RegExpMacroAssemblerTracer::GetCode(Handle<String> source) {
     422           0 :   PrintF(" GetCode(%s);\n", source->ToCString().get());
     423           0 :   return assembler_->GetCode(source);
     424             : }
     425             : 
     426             : }  // namespace internal
     427      121996 : }  // namespace v8

Generated by: LCOV version 1.10