mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
06428d8712
MSVC builds don't need it but everything else does.
95 lines
3.2 KiB
C++
95 lines
3.2 KiB
C++
//===--- ItaniumManglingCanonicalizer.h -------------------------*- 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 defines a class for computing equivalence classes of mangled names
|
|
// given a set of equivalences between name fragments.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_ITANIUMMANGLINGCANONICALIZER_H
|
|
#define LLVM_SUPPORT_ITANIUMMANGLINGCANONICALIZER_H
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
namespace llvm {
|
|
|
|
class StringRef;
|
|
|
|
/// Canonicalizer for mangled names.
|
|
///
|
|
/// This class allows specifying a list of "equivalent" manglings. For example,
|
|
/// you can specify that Ss is equivalent to
|
|
/// NSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEEE
|
|
/// and then manglings that refer to libstdc++'s 'std::string' will be
|
|
/// considered equivalent to manglings that are the same except that they refer
|
|
/// to libc++'s 'std::string'.
|
|
///
|
|
/// This can be used when data (eg, profiling data) is available for a version
|
|
/// of a program built in a different configuration, with correspondingly
|
|
/// different manglings.
|
|
class ItaniumManglingCanonicalizer {
|
|
public:
|
|
ItaniumManglingCanonicalizer();
|
|
ItaniumManglingCanonicalizer(const ItaniumManglingCanonicalizer &) = delete;
|
|
void operator=(const ItaniumManglingCanonicalizer &) = delete;
|
|
~ItaniumManglingCanonicalizer();
|
|
|
|
enum class EquivalenceError {
|
|
Success,
|
|
|
|
/// Both the equivalent manglings have already been used as components of
|
|
/// some other mangling we've looked at. It's too late to add this
|
|
/// equivalence.
|
|
ManglingAlreadyUsed,
|
|
|
|
/// The first equivalent mangling is invalid.
|
|
InvalidFirstMangling,
|
|
|
|
/// The second equivalent mangling is invalid.
|
|
InvalidSecondMangling,
|
|
};
|
|
|
|
enum class FragmentKind {
|
|
/// The mangling fragment is a <name> (or a predefined <substitution>).
|
|
Name,
|
|
/// The mangling fragment is a <type>.
|
|
Type,
|
|
/// The mangling fragment is an <encoding>.
|
|
Encoding,
|
|
};
|
|
|
|
/// Add an equivalence between \p First and \p Second. Both manglings must
|
|
/// live at least as long as the canonicalizer.
|
|
EquivalenceError addEquivalence(FragmentKind Kind, StringRef First,
|
|
StringRef Second);
|
|
|
|
using Key = uintptr_t;
|
|
|
|
/// Form a canonical key for the specified mangling. They key will be the
|
|
/// same for all equivalent manglings, and different for any two
|
|
/// non-equivalent manglings, but is otherwise unspecified.
|
|
///
|
|
/// Returns Key() if (and only if) the mangling is not a valid Itanium C++
|
|
/// ABI mangling.
|
|
///
|
|
/// The string denoted by Mangling must live as long as the canonicalizer.
|
|
Key canonicalize(StringRef Mangling);
|
|
|
|
/// Find a canonical key for the specified mangling, if one has already been
|
|
/// formed. Otherwise returns Key().
|
|
Key lookup(StringRef Mangling);
|
|
|
|
private:
|
|
struct Impl;
|
|
Impl *P;
|
|
};
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_SUPPORT_ITANIUMMANGLINGCANONICALIZER_H
|