mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
When a declaration has a structural opaque return type like: func foo() -> Bar<some P> then to mangle that return type `Bar<some P>`, we have to mangle the `some P` part by referencing its defining declaration `foo()`, which in turn includes its return type `Bar<some P>` again (this time using a special mangling for `some P` that prevents infinite recursion). Since we mangle `Bar<some P>` once as part of mangling the declaration, and we register substitutions for bound generic types when they're complete, we end up registering the substitution for `Bar<some P>` twice, once as the return type of the declaration name, and again as the actual type. This would be fine, except that the mangler doesn't check for key collisions, and it picks substitution indexes based on the number of entries in its hash map, so the duplicated substitution ends up corrupting the substitution sequence, causing the mangler to produce an invalid mangled name. Fixing that exposes us to another problem in the remangler: the AST mangler keys substitutions by type identity, but the remangler uses the value of the demangled nodes to recognize substitutions. The mangling for `Bar<current declaration's opaque return type>` can appear multiple times in a demangled tree, but referring to different declarations' opaque return types, and the remangler would reconstruct an incorrect mangled name when this happens. To avoid this, change the way the demangler represents `OpaqueReturnType` nodes so that they contain a backreference to the declaration they represent, so that substitutions involving different declarations' opaque return types don't get confused.
360 lines
10 KiB
C++
360 lines
10 KiB
C++
//===--- DemangleNodes.def - Demangling Tree Metaprogramming ----*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines macros useful for macro-metaprogramming with nodes in
|
|
// the demangling tree.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
/// NODE(ID)
|
|
/// The node's enumerator value is Node::Kind::ID.
|
|
|
|
/// CONTEXT_NODE(ID)
|
|
/// Nodes that can serve as contexts for other entities.
|
|
#ifndef CONTEXT_NODE
|
|
#define CONTEXT_NODE(ID) NODE(ID)
|
|
#endif
|
|
|
|
CONTEXT_NODE(Allocator)
|
|
CONTEXT_NODE(AnonymousContext)
|
|
NODE(AnyProtocolConformanceList)
|
|
NODE(ArgumentTuple)
|
|
NODE(AssociatedType)
|
|
NODE(AssociatedTypeRef)
|
|
NODE(AssociatedTypeMetadataAccessor)
|
|
NODE(DefaultAssociatedTypeMetadataAccessor)
|
|
NODE(AssociatedTypeWitnessTableAccessor)
|
|
NODE(BaseWitnessTableAccessor)
|
|
NODE(AutoClosureType)
|
|
NODE(BoundGenericClass)
|
|
NODE(BoundGenericEnum)
|
|
NODE(BoundGenericStructure)
|
|
NODE(BoundGenericProtocol)
|
|
NODE(BoundGenericOtherNominalType)
|
|
NODE(BoundGenericTypeAlias)
|
|
NODE(BoundGenericFunction)
|
|
NODE(BuiltinTypeName)
|
|
NODE(CFunctionPointer)
|
|
NODE(ClangType)
|
|
CONTEXT_NODE(Class)
|
|
NODE(ClassMetadataBaseOffset)
|
|
NODE(ConcreteProtocolConformance)
|
|
CONTEXT_NODE(Constructor)
|
|
NODE(CoroutineContinuationPrototype)
|
|
CONTEXT_NODE(Deallocator)
|
|
NODE(DeclContext)
|
|
CONTEXT_NODE(DefaultArgumentInitializer)
|
|
NODE(DependentAssociatedConformance)
|
|
NODE(DependentAssociatedTypeRef)
|
|
NODE(DependentGenericConformanceRequirement)
|
|
NODE(DependentGenericParamCount)
|
|
NODE(DependentGenericParamType)
|
|
NODE(DependentGenericSameTypeRequirement)
|
|
NODE(DependentGenericSameShapeRequirement)
|
|
NODE(DependentGenericLayoutRequirement)
|
|
NODE(DependentGenericSignature)
|
|
NODE(DependentGenericType)
|
|
NODE(DependentMemberType)
|
|
NODE(DependentPseudogenericSignature)
|
|
NODE(DependentProtocolConformanceRoot)
|
|
NODE(DependentProtocolConformanceInherited)
|
|
NODE(DependentProtocolConformanceAssociated)
|
|
CONTEXT_NODE(Destructor)
|
|
CONTEXT_NODE(DidSet)
|
|
NODE(Directness)
|
|
NODE(DistributedThunk)
|
|
NODE(DistributedAccessor)
|
|
NODE(DynamicAttribute)
|
|
NODE(DirectMethodReferenceAttribute)
|
|
NODE(DynamicSelf)
|
|
NODE(DynamicallyReplaceableFunctionImpl)
|
|
NODE(DynamicallyReplaceableFunctionKey)
|
|
NODE(DynamicallyReplaceableFunctionVar)
|
|
CONTEXT_NODE(Enum)
|
|
NODE(EnumCase)
|
|
NODE(ErrorType)
|
|
NODE(EscapingAutoClosureType)
|
|
NODE(NoEscapeFunctionType)
|
|
NODE(ConcurrentFunctionType)
|
|
NODE(GlobalActorFunctionType)
|
|
NODE(DifferentiableFunctionType)
|
|
NODE(ExistentialMetatype)
|
|
CONTEXT_NODE(ExplicitClosure)
|
|
CONTEXT_NODE(Extension)
|
|
NODE(FieldOffset)
|
|
NODE(FullTypeMetadata)
|
|
CONTEXT_NODE(Function)
|
|
NODE(FunctionSignatureSpecialization)
|
|
NODE(FunctionSignatureSpecializationParam)
|
|
NODE(FunctionSignatureSpecializationReturn)
|
|
NODE(FunctionSignatureSpecializationParamKind)
|
|
NODE(FunctionSignatureSpecializationParamPayload)
|
|
NODE(FunctionType)
|
|
NODE(ConstrainedExistential)
|
|
NODE(ConstrainedExistentialRequirementList)
|
|
NODE(ConstrainedExistentialSelf)
|
|
NODE(GenericPartialSpecialization)
|
|
NODE(GenericPartialSpecializationNotReAbstracted)
|
|
NODE(GenericProtocolWitnessTable)
|
|
NODE(GenericProtocolWitnessTableInstantiationFunction)
|
|
NODE(ResilientProtocolWitnessTable)
|
|
NODE(GenericSpecialization)
|
|
NODE(GenericSpecializationNotReAbstracted)
|
|
NODE(GenericSpecializationInResilienceDomain)
|
|
NODE(GenericSpecializationParam)
|
|
NODE(GenericSpecializationPrespecialized)
|
|
NODE(InlinedGenericFunction)
|
|
NODE(GenericTypeMetadataPattern)
|
|
CONTEXT_NODE(Getter)
|
|
NODE(Global)
|
|
CONTEXT_NODE(GlobalGetter)
|
|
NODE(Identifier)
|
|
NODE(Index)
|
|
CONTEXT_NODE(IVarInitializer)
|
|
CONTEXT_NODE(IVarDestroyer)
|
|
NODE(ImplEscaping)
|
|
NODE(ImplConvention)
|
|
NODE(ImplDifferentiabilityKind)
|
|
NODE(ImplParameterResultDifferentiability)
|
|
NODE(ImplFunctionAttribute)
|
|
NODE(ImplFunctionConvention)
|
|
NODE(ImplFunctionConventionName)
|
|
NODE(ImplFunctionType)
|
|
NODE(ImplInvocationSubstitutions)
|
|
CONTEXT_NODE(ImplicitClosure)
|
|
NODE(ImplParameter)
|
|
NODE(ImplPatternSubstitutions)
|
|
NODE(ImplResult)
|
|
NODE(ImplYield)
|
|
NODE(ImplErrorResult)
|
|
NODE(InOut)
|
|
NODE(InfixOperator)
|
|
CONTEXT_NODE(Initializer)
|
|
NODE(Isolated)
|
|
NODE(KeyPathGetterThunkHelper)
|
|
NODE(KeyPathSetterThunkHelper)
|
|
NODE(KeyPathEqualsThunkHelper)
|
|
NODE(KeyPathHashThunkHelper)
|
|
NODE(LazyProtocolWitnessTableAccessor)
|
|
NODE(LazyProtocolWitnessTableCacheVariable)
|
|
NODE(LocalDeclName)
|
|
NODE(Macro)
|
|
CONTEXT_NODE(MaterializeForSet)
|
|
NODE(MergedFunction)
|
|
NODE(Metatype)
|
|
NODE(MetatypeRepresentation)
|
|
NODE(Metaclass)
|
|
NODE(MethodLookupFunction)
|
|
NODE(ObjCMetadataUpdateFunction)
|
|
NODE(ObjCResilientClassStub)
|
|
NODE(FullObjCResilientClassStub)
|
|
CONTEXT_NODE(ModifyAccessor)
|
|
CONTEXT_NODE(Module)
|
|
CONTEXT_NODE(NativeOwningAddressor)
|
|
CONTEXT_NODE(NativeOwningMutableAddressor)
|
|
CONTEXT_NODE(NativePinningAddressor)
|
|
CONTEXT_NODE(NativePinningMutableAddressor)
|
|
NODE(NominalTypeDescriptor)
|
|
NODE(NominalTypeDescriptorRecord)
|
|
NODE(NonObjCAttribute)
|
|
NODE(Number)
|
|
NODE(ObjCAsyncCompletionHandlerImpl)
|
|
NODE(PredefinedObjCAsyncCompletionHandlerImpl)
|
|
NODE(ObjCAttribute)
|
|
NODE(ObjCBlock)
|
|
NODE(EscapingObjCBlock)
|
|
CONTEXT_NODE(OtherNominalType)
|
|
CONTEXT_NODE(OwningAddressor)
|
|
CONTEXT_NODE(OwningMutableAddressor)
|
|
NODE(PartialApplyForwarder)
|
|
NODE(PartialApplyObjCForwarder)
|
|
NODE(PostfixOperator)
|
|
NODE(PrefixOperator)
|
|
NODE(PrivateDeclName)
|
|
NODE(PropertyDescriptor)
|
|
CONTEXT_NODE(PropertyWrapperBackingInitializer)
|
|
CONTEXT_NODE(PropertyWrapperInitFromProjectedValue)
|
|
CONTEXT_NODE(Protocol)
|
|
CONTEXT_NODE(ProtocolSymbolicReference)
|
|
NODE(ProtocolConformance)
|
|
NODE(ProtocolConformanceRefInTypeModule)
|
|
NODE(ProtocolConformanceRefInProtocolModule)
|
|
NODE(ProtocolConformanceRefInOtherModule)
|
|
NODE(ProtocolDescriptor)
|
|
NODE(ProtocolDescriptorRecord)
|
|
NODE(ProtocolConformanceDescriptor)
|
|
NODE(ProtocolConformanceDescriptorRecord)
|
|
NODE(ProtocolList)
|
|
NODE(ProtocolListWithClass)
|
|
NODE(ProtocolListWithAnyObject)
|
|
NODE(ProtocolSelfConformanceDescriptor)
|
|
NODE(ProtocolSelfConformanceWitness)
|
|
NODE(ProtocolSelfConformanceWitnessTable)
|
|
NODE(ProtocolWitness)
|
|
NODE(ProtocolWitnessTable)
|
|
NODE(ProtocolWitnessTableAccessor)
|
|
NODE(ProtocolWitnessTablePattern)
|
|
NODE(ReabstractionThunk)
|
|
NODE(ReabstractionThunkHelper)
|
|
NODE(ReabstractionThunkHelperWithSelf)
|
|
NODE(ReabstractionThunkHelperWithGlobalActor)
|
|
CONTEXT_NODE(ReadAccessor)
|
|
NODE(RelatedEntityDeclName)
|
|
NODE(RetroactiveConformance)
|
|
NODE(ReturnType)
|
|
NODE(Shared)
|
|
NODE(Owned)
|
|
NODE(SILBoxType)
|
|
NODE(SILBoxTypeWithLayout)
|
|
NODE(SILBoxLayout)
|
|
NODE(SILBoxMutableField)
|
|
NODE(SILBoxImmutableField)
|
|
CONTEXT_NODE(Setter)
|
|
NODE(SpecializationPassID)
|
|
NODE(IsSerialized)
|
|
CONTEXT_NODE(Static)
|
|
CONTEXT_NODE(Structure)
|
|
CONTEXT_NODE(Subscript)
|
|
NODE(Suffix)
|
|
NODE(ThinFunctionType)
|
|
NODE(Tuple)
|
|
NODE(TupleElement)
|
|
NODE(TupleElementName)
|
|
NODE(Pack)
|
|
NODE(PackExpansion)
|
|
NODE(Type)
|
|
CONTEXT_NODE(TypeSymbolicReference)
|
|
CONTEXT_NODE(TypeAlias)
|
|
NODE(TypeList)
|
|
NODE(TypeMangling)
|
|
NODE(TypeMetadata)
|
|
NODE(TypeMetadataAccessFunction)
|
|
NODE(TypeMetadataCompletionFunction)
|
|
NODE(TypeMetadataInstantiationCache)
|
|
NODE(TypeMetadataInstantiationFunction)
|
|
NODE(TypeMetadataSingletonInitializationCache)
|
|
NODE(TypeMetadataDemanglingCache)
|
|
NODE(TypeMetadataLazyCache)
|
|
NODE(UncurriedFunctionType)
|
|
NODE(UnknownIndex)
|
|
#define REF_STORAGE(Name, ...) NODE(Name)
|
|
#include "swift/AST/ReferenceStorage.def"
|
|
CONTEXT_NODE(UnsafeAddressor)
|
|
CONTEXT_NODE(UnsafeMutableAddressor)
|
|
NODE(ValueWitness)
|
|
NODE(ValueWitnessTable)
|
|
CONTEXT_NODE(Variable)
|
|
NODE(VTableThunk)
|
|
NODE(VTableAttribute) // note: old mangling only
|
|
CONTEXT_NODE(WillSet)
|
|
NODE(ReflectionMetadataBuiltinDescriptor)
|
|
NODE(ReflectionMetadataFieldDescriptor)
|
|
NODE(ReflectionMetadataAssocTypeDescriptor)
|
|
NODE(ReflectionMetadataSuperclassDescriptor)
|
|
NODE(GenericTypeParamDecl)
|
|
NODE(CurryThunk)
|
|
NODE(DispatchThunk)
|
|
NODE(MethodDescriptor)
|
|
NODE(ProtocolRequirementsBaseDescriptor)
|
|
NODE(AssociatedConformanceDescriptor)
|
|
NODE(DefaultAssociatedConformanceAccessor)
|
|
NODE(BaseConformanceDescriptor)
|
|
NODE(AssociatedTypeDescriptor)
|
|
NODE(AsyncAnnotation)
|
|
NODE(ThrowsAnnotation)
|
|
NODE(EmptyList)
|
|
NODE(FirstElementMarker)
|
|
NODE(VariadicMarker)
|
|
NODE(OutlinedBridgedMethod)
|
|
NODE(OutlinedCopy)
|
|
NODE(OutlinedConsume)
|
|
NODE(OutlinedRetain)
|
|
NODE(OutlinedRelease)
|
|
NODE(OutlinedInitializeWithTake)
|
|
NODE(OutlinedInitializeWithCopy)
|
|
NODE(OutlinedAssignWithTake)
|
|
NODE(OutlinedAssignWithCopy)
|
|
NODE(OutlinedDestroy)
|
|
NODE(OutlinedVariable)
|
|
NODE(OutlinedReadOnlyObject)
|
|
NODE(AssocTypePath)
|
|
NODE(LabelList)
|
|
NODE(ModuleDescriptor)
|
|
NODE(ExtensionDescriptor)
|
|
NODE(AnonymousDescriptor)
|
|
NODE(AssociatedTypeGenericParamRef)
|
|
NODE(SugaredOptional)
|
|
NODE(SugaredArray)
|
|
NODE(SugaredDictionary)
|
|
NODE(SugaredParen)
|
|
|
|
// Added in Swift 5.1
|
|
NODE(AccessorFunctionReference)
|
|
NODE(OpaqueType)
|
|
NODE(OpaqueTypeDescriptorSymbolicReference)
|
|
NODE(OpaqueTypeDescriptor)
|
|
NODE(OpaqueTypeDescriptorRecord)
|
|
NODE(OpaqueTypeDescriptorAccessor)
|
|
NODE(OpaqueTypeDescriptorAccessorImpl)
|
|
NODE(OpaqueTypeDescriptorAccessorKey)
|
|
NODE(OpaqueTypeDescriptorAccessorVar)
|
|
NODE(OpaqueReturnType)
|
|
CONTEXT_NODE(OpaqueReturnTypeOf)
|
|
|
|
// Added in Swift 5.4
|
|
NODE(CanonicalSpecializedGenericMetaclass)
|
|
NODE(CanonicalSpecializedGenericTypeMetadataAccessFunction)
|
|
NODE(MetadataInstantiationCache)
|
|
NODE(NoncanonicalSpecializedGenericTypeMetadata)
|
|
NODE(NoncanonicalSpecializedGenericTypeMetadataCache)
|
|
NODE(GlobalVariableOnceFunction)
|
|
NODE(GlobalVariableOnceToken)
|
|
NODE(GlobalVariableOnceDeclList)
|
|
NODE(CanonicalPrespecializedGenericTypeCachingOnceToken)
|
|
|
|
// Added in Swift 5.5
|
|
NODE(AsyncFunctionPointer)
|
|
CONTEXT_NODE(AutoDiffFunction)
|
|
NODE(AutoDiffFunctionKind)
|
|
NODE(AutoDiffSelfReorderingReabstractionThunk)
|
|
NODE(AutoDiffSubsetParametersThunk)
|
|
NODE(AutoDiffDerivativeVTableThunk)
|
|
NODE(DifferentiabilityWitness)
|
|
NODE(NoDerivative)
|
|
NODE(IndexSubset)
|
|
NODE(AsyncAwaitResumePartialFunction)
|
|
NODE(AsyncSuspendResumePartialFunction)
|
|
|
|
// Added in Swift 5.6
|
|
NODE(AccessibleFunctionRecord)
|
|
NODE(CompileTimeConst)
|
|
|
|
// Added in Swift 5.7
|
|
NODE(BackDeploymentThunk)
|
|
NODE(BackDeploymentFallback)
|
|
NODE(ExtendedExistentialTypeShape)
|
|
NODE(Uniquable)
|
|
NODE(UniqueExtendedExistentialTypeShapeSymbolicReference)
|
|
NODE(NonUniqueExtendedExistentialTypeShapeSymbolicReference)
|
|
NODE(SymbolicExtendedExistentialType)
|
|
|
|
// Added in Swift 5.8
|
|
NODE(MetatypeParamsRemoved)
|
|
NODE(HasSymbolQuery)
|
|
NODE(RuntimeDiscoverableAttributeRecord)
|
|
CONTEXT_NODE(RuntimeAttributeGenerator)
|
|
NODE(OpaqueReturnTypeIndex)
|
|
NODE(OpaqueReturnTypeParent)
|
|
|
|
#undef CONTEXT_NODE
|
|
#undef NODE
|