5 #include "src/regexp/regexp-macro-assembler-tracer.h" 7 #include "src/ast/ast.h" 8 #include "src/objects-inl.h" 13 RegExpMacroAssemblerTracer::RegExpMacroAssemblerTracer(
14 Isolate* isolate, RegExpMacroAssembler* assembler)
15 : RegExpMacroAssembler(isolate, assembler->zone()), assembler_(assembler) {
16 IrregexpImplementation type = assembler->Implementation();
18 const char* impl_names[] = {
"IA32",
"ARM",
"ARM64",
"MIPS",
"S390",
19 "PPC",
"X64",
"X87",
"Bytecode"};
20 PrintF(
"RegExpMacroAssembler%s();\n", impl_names[type]);
23 RegExpMacroAssemblerTracer::~RegExpMacroAssemblerTracer() =
default;
25 void RegExpMacroAssemblerTracer::AbortedCodeGeneration() {
26 PrintF(
" AbortedCodeGeneration\n");
27 assembler_->AbortedCodeGeneration();
33 static int LabelToInt(Label* label) {
34 return static_cast<int>(
reinterpret_cast<intptr_t
>(label));
38 void RegExpMacroAssemblerTracer::Bind(Label* label) {
39 PrintF(
"label[%08x]: (Bind)\n", LabelToInt(label));
40 assembler_->Bind(label);
44 void RegExpMacroAssemblerTracer::AdvanceCurrentPosition(
int by) {
45 PrintF(
" AdvanceCurrentPosition(by=%d);\n", by);
46 assembler_->AdvanceCurrentPosition(by);
50 void RegExpMacroAssemblerTracer::CheckGreedyLoop(Label* label) {
51 PrintF(
" CheckGreedyLoop(label[%08x]);\n\n", LabelToInt(label));
52 assembler_->CheckGreedyLoop(label);
56 void RegExpMacroAssemblerTracer::PopCurrentPosition() {
57 PrintF(
" PopCurrentPosition();\n");
58 assembler_->PopCurrentPosition();
62 void RegExpMacroAssemblerTracer::PushCurrentPosition() {
63 PrintF(
" PushCurrentPosition();\n");
64 assembler_->PushCurrentPosition();
68 void RegExpMacroAssemblerTracer::Backtrack() {
69 PrintF(
" Backtrack();\n");
70 assembler_->Backtrack();
74 void RegExpMacroAssemblerTracer::GoTo(Label* label) {
75 PrintF(
" GoTo(label[%08x]);\n\n", LabelToInt(label));
76 assembler_->GoTo(label);
80 void RegExpMacroAssemblerTracer::PushBacktrack(Label* label) {
81 PrintF(
" PushBacktrack(label[%08x]);\n", LabelToInt(label));
82 assembler_->PushBacktrack(label);
86 bool RegExpMacroAssemblerTracer::Succeed() {
87 bool restart = assembler_->Succeed();
88 PrintF(
" Succeed();%s\n", restart ?
" [restart for global match]" :
"");
93 void RegExpMacroAssemblerTracer::Fail() {
99 void RegExpMacroAssemblerTracer::PopRegister(
int register_index) {
100 PrintF(
" PopRegister(register=%d);\n", register_index);
101 assembler_->PopRegister(register_index);
105 void RegExpMacroAssemblerTracer::PushRegister(
107 StackCheckFlag check_stack_limit) {
108 PrintF(
" PushRegister(register=%d, %s);\n",
110 check_stack_limit ?
"check stack limit" :
"");
111 assembler_->PushRegister(register_index, check_stack_limit);
115 void RegExpMacroAssemblerTracer::AdvanceRegister(
int reg,
int by) {
116 PrintF(
" AdvanceRegister(register=%d, by=%d);\n", reg, by);
117 assembler_->AdvanceRegister(reg, by);
121 void RegExpMacroAssemblerTracer::SetCurrentPositionFromEnd(
int by) {
122 PrintF(
" SetCurrentPositionFromEnd(by=%d);\n", by);
123 assembler_->SetCurrentPositionFromEnd(by);
127 void RegExpMacroAssemblerTracer::SetRegister(
int register_index,
int to) {
128 PrintF(
" SetRegister(register=%d, to=%d);\n", register_index, to);
129 assembler_->SetRegister(register_index, to);
133 void RegExpMacroAssemblerTracer::WriteCurrentPositionToRegister(
int reg,
135 PrintF(
" WriteCurrentPositionToRegister(register=%d,cp_offset=%d);\n",
138 assembler_->WriteCurrentPositionToRegister(reg, cp_offset);
142 void RegExpMacroAssemblerTracer::ClearRegisters(
int reg_from,
int reg_to) {
143 PrintF(
" ClearRegister(from=%d, to=%d);\n", reg_from, reg_to);
144 assembler_->ClearRegisters(reg_from, reg_to);
148 void RegExpMacroAssemblerTracer::ReadCurrentPositionFromRegister(
int reg) {
149 PrintF(
" ReadCurrentPositionFromRegister(register=%d);\n", reg);
150 assembler_->ReadCurrentPositionFromRegister(reg);
154 void RegExpMacroAssemblerTracer::WriteStackPointerToRegister(
int reg) {
155 PrintF(
" WriteStackPointerToRegister(register=%d);\n", reg);
156 assembler_->WriteStackPointerToRegister(reg);
160 void RegExpMacroAssemblerTracer::ReadStackPointerFromRegister(
int reg) {
161 PrintF(
" ReadStackPointerFromRegister(register=%d);\n", reg);
162 assembler_->ReadStackPointerFromRegister(reg);
166 void RegExpMacroAssemblerTracer::LoadCurrentCharacter(
int cp_offset,
167 Label* on_end_of_input,
170 const char* check_msg = check_bounds ?
"" :
" (unchecked)";
171 PrintF(
" LoadCurrentCharacter(cp_offset=%d, label[%08x]%s (%d chars));\n",
173 LabelToInt(on_end_of_input),
176 assembler_->LoadCurrentCharacter(cp_offset,
187 const char* operator*() {
188 if (character_ >=
' ' && character_ <=
'~') {
190 buffer_[1] =
static_cast<char>(character_);
205 void RegExpMacroAssemblerTracer::CheckCharacterLT(uc16 limit,
Label* on_less) {
207 PrintF(
" CheckCharacterLT(c=0x%04x%s, label[%08x]);\n",
210 LabelToInt(on_less));
211 assembler_->CheckCharacterLT(limit, on_less);
215 void RegExpMacroAssemblerTracer::CheckCharacterGT(uc16 limit,
217 PrintablePrinter printable(limit);
218 PrintF(
" CheckCharacterGT(c=0x%04x%s, label[%08x]);\n",
221 LabelToInt(on_greater));
222 assembler_->CheckCharacterGT(limit, on_greater);
226 void RegExpMacroAssemblerTracer::CheckCharacter(
unsigned c, Label* on_equal) {
227 PrintablePrinter printable(c);
228 PrintF(
" CheckCharacter(c=0x%04x%s, label[%08x]);\n",
231 LabelToInt(on_equal));
232 assembler_->CheckCharacter(c, on_equal);
236 void RegExpMacroAssemblerTracer::CheckAtStart(Label* on_at_start) {
237 PrintF(
" CheckAtStart(label[%08x]);\n", LabelToInt(on_at_start));
238 assembler_->CheckAtStart(on_at_start);
242 void RegExpMacroAssemblerTracer::CheckNotAtStart(
int cp_offset,
243 Label* on_not_at_start) {
244 PrintF(
" CheckNotAtStart(cp_offset=%d, label[%08x]);\n", cp_offset,
245 LabelToInt(on_not_at_start));
246 assembler_->CheckNotAtStart(cp_offset, on_not_at_start);
250 void RegExpMacroAssemblerTracer::CheckNotCharacter(
unsigned c,
251 Label* on_not_equal) {
252 PrintablePrinter printable(c);
253 PrintF(
" CheckNotCharacter(c=0x%04x%s, label[%08x]);\n",
256 LabelToInt(on_not_equal));
257 assembler_->CheckNotCharacter(c, on_not_equal);
261 void RegExpMacroAssemblerTracer::CheckCharacterAfterAnd(
265 PrintablePrinter printable(c);
266 PrintF(
" CheckCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
270 LabelToInt(on_equal));
271 assembler_->CheckCharacterAfterAnd(c, mask, on_equal);
275 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterAnd(
278 Label* on_not_equal) {
279 PrintablePrinter printable(c);
280 PrintF(
" CheckNotCharacterAfterAnd(c=0x%04x%s, mask=0x%04x, label[%08x]);\n",
284 LabelToInt(on_not_equal));
285 assembler_->CheckNotCharacterAfterAnd(c, mask, on_not_equal);
289 void RegExpMacroAssemblerTracer::CheckNotCharacterAfterMinusAnd(
293 Label* on_not_equal) {
294 PrintF(
" CheckNotCharacterAfterMinusAnd(c=0x%04x, minus=%04x, mask=0x%04x, " 299 LabelToInt(on_not_equal));
300 assembler_->CheckNotCharacterAfterMinusAnd(c, minus, mask, on_not_equal);
304 void RegExpMacroAssemblerTracer::CheckCharacterInRange(
307 Label* on_not_in_range) {
308 PrintablePrinter printable_from(from);
309 PrintablePrinter printable_to(to);
310 PrintF(
" CheckCharacterInRange(from=0x%04x%s, to=0x%04x%s, label[%08x]);\n",
315 LabelToInt(on_not_in_range));
316 assembler_->CheckCharacterInRange(from, to, on_not_in_range);
320 void RegExpMacroAssemblerTracer::CheckCharacterNotInRange(
323 Label* on_in_range) {
324 PrintablePrinter printable_from(from);
325 PrintablePrinter printable_to(to);
327 " CheckCharacterNotInRange(from=0x%04x%s," " to=%04x%s, label[%08x]);\n",
332 LabelToInt(on_in_range));
333 assembler_->CheckCharacterNotInRange(from, to, on_in_range);
337 void RegExpMacroAssemblerTracer::CheckBitInTable(
338 Handle<ByteArray> table, Label* on_bit_set) {
339 PrintF(
" CheckBitInTable(label[%08x] ", LabelToInt(on_bit_set));
340 for (
int i = 0;
i < kTableSize;
i++) {
341 PrintF(
"%c", table->get(
i) != 0 ?
'X' :
'.');
342 if (
i % 32 == 31 &&
i != kTableMask) {
347 assembler_->CheckBitInTable(table, on_bit_set);
351 void RegExpMacroAssemblerTracer::CheckNotBackReference(
int start_reg,
353 Label* on_no_match) {
354 PrintF(
" CheckNotBackReference(register=%d, %s, label[%08x]);\n", start_reg,
355 read_backward ?
"backward" :
"forward", LabelToInt(on_no_match));
356 assembler_->CheckNotBackReference(start_reg, read_backward, on_no_match);
360 void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase(
361 int start_reg,
bool read_backward,
bool unicode, Label* on_no_match) {
362 PrintF(
" CheckNotBackReferenceIgnoreCase(register=%d, %s %s, label[%08x]);\n",
363 start_reg, read_backward ?
"backward" :
"forward",
364 unicode ?
"unicode" :
"non-unicode", LabelToInt(on_no_match));
365 assembler_->CheckNotBackReferenceIgnoreCase(start_reg, read_backward, unicode,
370 void RegExpMacroAssemblerTracer::CheckPosition(
int cp_offset,
371 Label* on_outside_input) {
372 PrintF(
" CheckPosition(cp_offset=%d, label[%08x]);\n", cp_offset,
373 LabelToInt(on_outside_input));
374 assembler_->CheckPosition(cp_offset, on_outside_input);
378 bool RegExpMacroAssemblerTracer::CheckSpecialCharacterClass(
380 Label* on_no_match) {
381 bool supported = assembler_->CheckSpecialCharacterClass(type,
383 PrintF(
" CheckSpecialCharacterClass(type='%c', label[%08x]): %s;\n",
385 LabelToInt(on_no_match),
386 supported ?
"true" :
"false");
391 void RegExpMacroAssemblerTracer::IfRegisterLT(
int register_index,
392 int comparand, Label* if_lt) {
393 PrintF(
" IfRegisterLT(register=%d, number=%d, label[%08x]);\n",
394 register_index, comparand, LabelToInt(if_lt));
395 assembler_->IfRegisterLT(register_index, comparand, if_lt);
399 void RegExpMacroAssemblerTracer::IfRegisterEqPos(
int register_index,
401 PrintF(
" IfRegisterEqPos(register=%d, label[%08x]);\n",
402 register_index, LabelToInt(if_eq));
403 assembler_->IfRegisterEqPos(register_index, if_eq);
407 void RegExpMacroAssemblerTracer::IfRegisterGE(
int register_index,
408 int comparand, Label* if_ge) {
409 PrintF(
" IfRegisterGE(register=%d, number=%d, label[%08x]);\n",
410 register_index, comparand, LabelToInt(if_ge));
411 assembler_->IfRegisterGE(register_index, comparand, if_ge);
415 RegExpMacroAssembler::IrregexpImplementation
416 RegExpMacroAssemblerTracer::Implementation() {
417 return assembler_->Implementation();
421 Handle<HeapObject> RegExpMacroAssemblerTracer::GetCode(Handle<String> source) {
422 PrintF(
" GetCode(%s);\n", source->ToCString().get());
423 return assembler_->GetCode(source);