Files
swift-mirror/stdlib/public/runtime/Private.h
David Farler cd65a8e0b0 Template metadata structures
- Add RuntimeTarget template This will allow for converting between
  metadata structures for native host and remote target architectures.

- Create InProcess and External templates for stored pointers

Add a few more types to abstract pointer access in the runtime
structures but keep native in-process pointer access the same as that
with a plain old pointer type.

There is now a notion of a "stored pointer", which is just the raw value
of the pointer, and the actual pointer type, which is used for loads.
Decoupling these allows us to fork the behavior when looking at metadata
in an external process, but keep things the same for the in-process
case.

There are two basic "runtime targets" that you can use to work with
metadata:

InProcess: Defines the pointer to be trivially a T* and stored as a
uintptr_t. A Metadata * is exactly as it was before, but defined via
AbstractMetadata<InProcess>.

External: A template that requires a target to specify its pointer size.

ExternalPointer: An opaque pointer in another address space that can't
(and shouldn't) be indirected with operator* or operator->.  The memory
reader will fetch the data explicitly.
2016-03-02 21:25:04 -08:00

144 lines
4.9 KiB
C++

//===--- Private.h - Private runtime declarations ---------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// Private declarations of the Swift runtime.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_RUNTIME_PRIVATE_H
#define SWIFT_RUNTIME_PRIVATE_H
#include "swift/Basic/Demangle.h"
#include "swift/Runtime/Config.h"
#include "swift/Runtime/Metadata.h"
#include "llvm/Support/Compiler.h"
namespace swift {
#if SWIFT_HAS_ISA_MASKING
SWIFT_RUNTIME_EXPORT
extern "C" uintptr_t swift_isaMask;
#endif
#if SWIFT_OBJC_INTEROP
bool objectConformsToObjCProtocol(const void *theObject,
const ProtocolDescriptor *theProtocol);
bool classConformsToObjCProtocol(const void *theClass,
const ProtocolDescriptor *theProtocol);
#endif
extern "C" LLVM_LIBRARY_VISIBILITY LLVM_ATTRIBUTE_NORETURN
void _swift_abortRetainUnowned(const void *object);
/// Is the given value a valid alignment mask?
static inline bool isAlignmentMask(size_t mask) {
// mask == xyz01111...
// mask+1 == xyz10000...
// mask&(mask+1) == xyz00000...
// So this is nonzero if and only if there any bits set
// other than an arbitrarily long sequence of low bits.
return (mask & (mask + 1)) == 0;
}
/// Return the class of an object which is known to be an allocated
/// heap object.
static inline const ClassMetadata *_swift_getClassOfAllocated(const void *object) {
// Load the isa field.
uintptr_t bits = *reinterpret_cast<const uintptr_t*>(object);
#if SWIFT_HAS_ISA_MASKING
// Apply the mask.
bits &= swift_isaMask;
#endif
// The result is a class pointer.
return reinterpret_cast<const ClassMetadata *>(bits);
}
/// Is the given value an Objective-C tagged pointer?
static inline bool isObjCTaggedPointer(const void *object) {
#if SWIFT_OBJC_INTEROP
return (((uintptr_t) object) & heap_object_abi::ObjCReservedBitsMask);
#else
assert(!(((uintptr_t) object) & heap_object_abi::ObjCReservedBitsMask));
return false;
#endif
}
static inline bool isObjCTaggedPointerOrNull(const void *object) {
return object == nullptr || isObjCTaggedPointer(object);
}
LLVM_LIBRARY_VISIBILITY
const ClassMetadata *_swift_getClass(const void *object);
static inline
const ClassMetadata *_swift_getSuperclass(const ClassMetadata *theClass) {
return theClass->SuperClass;
}
LLVM_LIBRARY_VISIBILITY
bool usesNativeSwiftReferenceCounting(const ClassMetadata *theClass);
/// Get the superclass pointer value used for Swift root classes.
/// Note that this function may return a nullptr on non-objc platforms,
/// where there is no common root class. rdar://problem/18987058
const ClassMetadata *getRootSuperclass();
/// Check if a class has a formal superclass in the AST.
static inline
bool classHasSuperclass(const ClassMetadata *c) {
return (c->SuperClass && c->SuperClass != getRootSuperclass());
}
/// Replace entries of a freshly-instantiated value witness table with more
/// efficient common implementations where applicable.
///
/// For instance, if the value witness table represents a POD type, this will
/// insert POD value witnesses into the table. The vwtable's flags must have
/// been initialized before calling this function.
///
/// Returns true if common value witnesses were used, false otherwise.
void installCommonValueWitnesses(ValueWitnessTable *vwtable);
const Metadata *
_matchMetadataByMangledTypeName(const llvm::StringRef metadataNameRef,
const Metadata *metadata,
const NominalTypeDescriptor *ntd);
const Metadata *
_searchConformancesByMangledTypeName(const llvm::StringRef typeName);
#if SWIFT_OBJC_INTEROP
Demangle::NodePointer _swift_buildDemanglingForMetadata(const Metadata *type);
#endif
#if defined(__CYGWIN__)
struct dl_phdr_info {
void *dlpi_addr;
const char *dlpi_name;
};
int _swift_dl_iterate_phdr(int (*Callback)(struct dl_phdr_info *info,
size_t size, void *data),
void *data);
uint8_t *_swift_getSectionDataPE(void *handle, const char *sectionName,
unsigned long *sectionSize);
void _swift_once_f(uintptr_t *predicate, void *context,
void (*function)(void *));
#endif
} // end namespace swift
#endif /* SWIFT_RUNTIME_PRIVATE_H */