Files
swift-mirror/lib/IRGen/SwiftTargetInfo.h
Joe Groff 24367fa5d9 Runtime: Have native refcounting entry points ignore negative pointer values on x86-64 and arm64.
The high half of the address space is used by the kernel in these architectures, and it would be useful for us to be able to pack small values into places the ABI otherwise requires a refcountable pointer, such as closures and maybe refcounted existentials.
2017-02-24 16:02:11 -08:00

109 lines
3.7 KiB
C++

//===--- SwiftTargetInfo.h --------------------------------------*- 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 declares the SwiftTargetInfo abstract base class. This class
// provides an interface to target-dependent attributes of interest to Swift.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_SWIFTTARGETINFO_H
#define SWIFT_IRGEN_SWIFTTARGETINFO_H
#include "swift/Basic/LLVM.h"
#include "swift/Basic/ClusteredBitVector.h"
#include "llvm/ADT/Triple.h"
#include "IRGen.h"
namespace swift {
namespace irgen {
class IRGenModule;
class SwiftTargetInfo {
explicit SwiftTargetInfo(llvm::Triple::ObjectFormatType outputObjectFormat,
unsigned numPointerBits);
public:
/// Produces a SwiftTargetInfo object appropriate to the target.
static SwiftTargetInfo get(IRGenModule &IGM);
/// True if the ObjC runtime for the chosen platform supports tagged pointers.
bool hasObjCTaggedPointers() const;
/// True if the ObjC runtime for the chosen platform requires ISA masking.
bool hasISAMasking() const {
return ObjCUseISAMask;
}
/// True if the ObjC runtime for the chosen platform has opaque ISAs. This
/// means that even masking the ISA may not return a pointer value. The ObjC
/// runtime should be used for all accesses to get the ISA from a value.
bool hasOpaqueISAs() const {
return ObjCHasOpaqueISAs;
}
/// The target's object format type.
llvm::Triple::ObjectFormatType OutputObjectFormat;
/// The spare bit mask for pointers. Bits set in this mask are unused by
/// pointers of any alignment.
SpareBitVector PointerSpareBits;
/// The spare bit mask for (ordinary C) thin function pointers.
SpareBitVector FunctionPointerSpareBits;
/// The reserved bit mask for Objective-C pointers. Pointer values with
/// bits from this mask set are reserved by the ObjC runtime and cannot be
/// used for Swift value layout when a reference type may reference ObjC
/// objects.
SpareBitVector ObjCPointerReservedBits;
/// The alignment of heap objects. By default, assume pointer alignment.
Alignment HeapObjectAlignment;
/// The least integer value that can theoretically form a valid pointer.
/// By default, assume that there's an entire page free.
///
/// This excludes addresses in the null page(s) guaranteed to be
/// unmapped by the platform.
///
/// Changes to this must be kept in sync with swift/Runtime/Metadata.h.
uint64_t LeastValidPointerValue;
/// The maximum number of scalars that we allow to be returned directly.
unsigned MaxScalarsForDirectResult = 3;
/// Inline assembly to mark a call to objc_retainAutoreleasedReturnValue.
llvm::StringRef ObjCRetainAutoreleasedReturnValueMarker;
/// Some architectures have specialized objc_msgSend variants.
bool ObjCUseStret = true;
bool ObjCUseFPRet = false;
bool ObjCUseFP2Ret = false;
bool ObjCUseISAMask = false;
bool ObjCHasOpaqueISAs = false;
/// The value stored in a Builtin.once predicate to indicate that an
/// initialization has already happened, if known.
Optional<int64_t> OnceDonePredicateValue = None;
/// True if `swift_retain` and `swift_release` are no-ops when passed
/// "negative" pointer values.
bool SwiftRetainIgnoresNegativeValues = false;
};
}
}
#endif