123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- SymbolRemappingReader.h - Read symbol remapping file -----*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file contains definitions needed for reading and applying symbol
- // remapping files.
- //
- // Support is provided only for the Itanium C++ name mangling scheme for now.
- //
- // NOTE: If you are making changes to this file format, please remember
- // to document them in the Clang documentation at
- // tools/clang/docs/UsersManual.rst.
- //
- // File format
- // -----------
- //
- // The symbol remappings are written as an ASCII text file. Blank lines and
- // lines starting with a # are ignored. All other lines specify a kind of
- // mangled name fragment, along with two fragments of that kind that should
- // be treated as equivalent, separated by spaces.
- //
- // See http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling for a
- // description of the Itanium name mangling scheme.
- //
- // The accepted fragment kinds are:
- //
- // * name A <name>, such as 6foobar or St3__1
- // * type A <type>, such as Ss or N4llvm9StringRefE
- // * encoding An <encoding> (a complete mangling without the leading _Z)
- //
- // For example:
- //
- // # Ignore int / long differences to treat symbols from 32-bit and 64-bit
- // # builds with differing size_t / ptrdiff_t / intptr_t as equivalent.
- // type i l
- // type j m
- //
- // # Ignore differences between libc++ and libstdc++, and between libstdc++'s
- // # C++98 and C++11 ABIs.
- // name 3std St3__1
- // name 3std St7__cxx11
- //
- // # Remap a function overload to a specialization of a template (including
- // # any local symbols declared within it).
- // encoding N2NS1fEi N2NS1fIiEEvT_
- //
- // # Substitutions must be remapped separately from namespace 'std' for now.
- // name Sa NSt3__19allocatorE
- // name Sb NSt3__112basic_stringE
- // type Ss NSt3__112basic_stringIcSt11char_traitsIcESaE
- // # ...
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_SUPPORT_SYMBOLREMAPPINGREADER_H
- #define LLVM_SUPPORT_SYMBOLREMAPPINGREADER_H
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Support/Error.h"
- #include "llvm/Support/ItaniumManglingCanonicalizer.h"
- namespace llvm {
- class MemoryBuffer;
- class SymbolRemappingParseError : public ErrorInfo<SymbolRemappingParseError> {
- public:
- SymbolRemappingParseError(StringRef File, int64_t Line, const Twine &Message)
- : File(File), Line(Line), Message(Message.str()) {}
- void log(llvm::raw_ostream &OS) const override {
- OS << File << ':' << Line << ": " << Message;
- }
- std::error_code convertToErrorCode() const override {
- return llvm::inconvertibleErrorCode();
- }
- StringRef getFileName() const { return File; }
- int64_t getLineNum() const { return Line; }
- StringRef getMessage() const { return Message; }
- static char ID;
- private:
- std::string File;
- int64_t Line;
- std::string Message;
- };
- /// Reader for symbol remapping files.
- ///
- /// Remaps the symbol names in profile data to match those in the program
- /// according to a set of rules specified in a given file.
- class SymbolRemappingReader {
- public:
- /// Read remappings from the given buffer, which must live as long as
- /// the remapper.
- Error read(MemoryBuffer &B);
- /// A Key represents an equivalence class of symbol names.
- using Key = uintptr_t;
- /// Construct a key for the given symbol, or return an existing one if an
- /// equivalent name has already been inserted. The symbol name must live
- /// as long as the remapper.
- ///
- /// The result will be Key() if the name cannot be remapped (typically
- /// because it is not a valid mangled name).
- Key insert(StringRef FunctionName) {
- return Canonicalizer.canonicalize(FunctionName);
- }
- /// Map the given symbol name into the key for the corresponding equivalence
- /// class.
- ///
- /// The result will typically be Key() if no equivalent symbol has been
- /// inserted, but this is not guaranteed: a Key different from all keys ever
- /// returned by \c insert may be returned instead.
- Key lookup(StringRef FunctionName) {
- return Canonicalizer.lookup(FunctionName);
- }
- private:
- ItaniumManglingCanonicalizer Canonicalizer;
- };
- } // end namespace llvm
- #endif // LLVM_SUPPORT_SYMBOLREMAPPINGREADER_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|