// Copyright 2019 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_CCTEST_DISASM_REGEX_HELPER_H_ #define V8_CCTEST_DISASM_REGEX_HELPER_H_ #include <iostream> #include <map> #include <regex> // NOLINT(build/c++11) #include <vector> #include "src/base/logging.h" #include "src/base/macros.h" namespace v8 { namespace internal { // This class provides methods for regular expression matching with an extra // feature of user defined named capture groups which are alive across // regex search calls. // // The main use case for the class is to test multiple-line assembly // output with an ability to express dataflow or dependencies by allowing single // definition / multiple use symbols. When processing output lines and trying to // match them against the set of patterns a user can define a named group - a // symbol - and a regex for matching it. If the regex with the definitions is // matched then whenever this symbol appears again (no redefinitions though) in // the following patterns the parser will replace the symbol reference in the // pattern by an actual literal value matched during processing symbol // definition. This effectively checks that all of the output lines have // the same literal for the described symbol. To track the symbols this class // implements a simple single-definition symbol table. // // Example: Lets consider a case when we want to test that the assembly // output consists of two instructions - a load and a store; we also want // to check that the loaded value is used as store value for the store, // like here: // // ldr x3, [x4] // str x3, [x5] // // Using special syntax for symbol definitions and uses one could write the // following regex making sure that the load register is used by the store: // // 'ldr <<NamedReg:x[0-9]+>>, [x[0-9]+]' // 'str <<NamedReg>>, [x[0-9]+]' // // See 'ProcessPattern' for more details. class RegexParser { … }; bool CheckDisassemblyRegexPatterns( const char* function_name, const std::vector<std::string>& patterns_array); } // namespace internal } // namespace v8 #endif // V8_CCTEST_DISASM_REGEX_HELPER_H_