mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
933a42da48
Summary: This transforms the Itanium demangler into a generic reusable library that can be used to build, traverse, and transform Itanium mangled name trees. This is in preparation for adding a canonicalizing demangler, which cannot live in the Demangle library for layering reasons. In order to keep the diffs simpler, this patch moves more code to the new header than is strictly necessary: in particular, all of the printLeft / printRight implementations can be moved to the implementation file. (And indeed we could make them non-virtual now if we wished, and remove the vptr from Node.) All nodes are now included in the Kind enumeration, rather than omitting some of the Expr nodes, and the three different floating-point literal node types now have distinct Kind values. As a proof of concept for the visitation / matching mechanism, this patch implements a Node dumping facility on top of it, replacing the prior mechanism that produced the pretty-printed output rather than a tree dump. Sample dump output: FunctionEncoding( NameType("int"), NameWithTemplateArgs( NestedName( NameWithTemplateArgs( NameType("A"), TemplateArgs( {NameType("B")})), NameType("f")), TemplateArgs( {NameType("int")})), {}, <null>, QualConst, FunctionRefQual::FrefQualLValue) As a next step, it would make sense to move the LLVM high-level interface to the demangler (the itaniumDemangler function and ItaniumPartialDemangler class) into the Support library, and implement them in terms of the Demangle library. This would allow the libc++abi demangler implementation to be an identical copy of the llvm Demangle library, and would allow the LLVM implementation to reuse LLVM components such as llvm::BumpPtrAllocator, but we'll need to decide how to coordinate that with the MS ABI demangler, so I'm not doing that in this patch. No functionality change intended other than the behavior of dump(). Reviewers: erik.pilkington, zturner, chandlerc, dlj Subscribers: aheejin, llvm-commits Differential Revision: https://reviews.llvm.org/D50930 llvm-svn: 340203
94 lines
2.8 KiB
C++
94 lines
2.8 KiB
C++
//===--- Compiler.h ---------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//
|
|
// This file contains a variety of feature test macros copied from
|
|
// include/llvm/Support/Compiler.h so that LLVMDemangle does not need to take
|
|
// a dependency on LLVMSupport.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_DEMANGLE_COMPILER_H
|
|
#define LLVM_DEMANGLE_COMPILER_H
|
|
|
|
#ifdef _MSC_VER
|
|
// snprintf is implemented in VS 2015
|
|
#if _MSC_VER < 1900
|
|
#define snprintf _snprintf_s
|
|
#endif
|
|
#endif
|
|
|
|
#ifndef __has_feature
|
|
#define __has_feature(x) 0
|
|
#endif
|
|
|
|
#ifndef __has_cpp_attribute
|
|
#define __has_cpp_attribute(x) 0
|
|
#endif
|
|
|
|
#ifndef __has_attribute
|
|
#define __has_attribute(x) 0
|
|
#endif
|
|
|
|
#ifndef __has_builtin
|
|
#define __has_builtin(x) 0
|
|
#endif
|
|
|
|
#ifndef LLVM_GNUC_PREREQ
|
|
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__)
|
|
#define LLVM_GNUC_PREREQ(maj, min, patch) \
|
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) + __GNUC_PATCHLEVEL__ >= \
|
|
((maj) << 20) + ((min) << 10) + (patch))
|
|
#elif defined(__GNUC__) && defined(__GNUC_MINOR__)
|
|
#define LLVM_GNUC_PREREQ(maj, min, patch) \
|
|
((__GNUC__ << 20) + (__GNUC_MINOR__ << 10) >= ((maj) << 20) + ((min) << 10))
|
|
#else
|
|
#define LLVM_GNUC_PREREQ(maj, min, patch) 0
|
|
#endif
|
|
#endif
|
|
|
|
#if __has_attribute(used) || LLVM_GNUC_PREREQ(3, 1, 0)
|
|
#define LLVM_ATTRIBUTE_USED __attribute__((__used__))
|
|
#else
|
|
#define LLVM_ATTRIBUTE_USED
|
|
#endif
|
|
|
|
#if __has_builtin(__builtin_unreachable) || LLVM_GNUC_PREREQ(4, 5, 0)
|
|
#define LLVM_BUILTIN_UNREACHABLE __builtin_unreachable()
|
|
#elif defined(_MSC_VER)
|
|
#define LLVM_BUILTIN_UNREACHABLE __assume(false)
|
|
#endif
|
|
|
|
#if __has_attribute(noinline) || LLVM_GNUC_PREREQ(3, 4, 0)
|
|
#define LLVM_ATTRIBUTE_NOINLINE __attribute__((noinline))
|
|
#elif defined(_MSC_VER)
|
|
#define LLVM_ATTRIBUTE_NOINLINE __declspec(noinline)
|
|
#else
|
|
#define LLVM_ATTRIBUTE_NOINLINE
|
|
#endif
|
|
|
|
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
|
#define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE LLVM_ATTRIBUTE_USED
|
|
#else
|
|
#define LLVM_DUMP_METHOD LLVM_ATTRIBUTE_NOINLINE
|
|
#endif
|
|
|
|
#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough)
|
|
#define LLVM_FALLTHROUGH [[fallthrough]]
|
|
#elif __has_cpp_attribute(gnu::fallthrough)
|
|
#define LLVM_FALLTHROUGH [[gnu::fallthrough]]
|
|
#elif !__cplusplus
|
|
// Workaround for llvm.org/PR23435, since clang 3.6 and below emit a spurious
|
|
// error when __has_cpp_attribute is given a scoped attribute in C mode.
|
|
#define LLVM_FALLTHROUGH
|
|
#elif __has_cpp_attribute(clang::fallthrough)
|
|
#define LLVM_FALLTHROUGH [[clang::fallthrough]]
|
|
#else
|
|
#define LLVM_FALLTHROUGH
|
|
#endif
|
|
|
|
#endif
|