1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
//===--- 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/TargetParser/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;
}
bool canUseSwiftAsyncContextAddrIntrinsic() const {
return UsableSwiftAsyncContextAddrIntrinsic;
}
/// 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;
/// These bits, if set, indicate that a Builtin.BridgeObject value is holding
/// an Objective-C object.
SpareBitVector IsObjCPointerBit;
/// 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;
/// Poison sentinel value recognized by LLDB as a former reference to a
/// potentially deinitialized object. It uses no spare bits and cannot point
/// to readable memory.
uint64_t ReferencePoisonDebugValue;
/// 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.
std::optional<int64_t> OnceDonePredicateValue = std::nullopt;
/// True if `swift_retain` and `swift_release` are no-ops when passed
/// "negative" pointer values.
bool SwiftRetainIgnoresNegativeValues = false;
bool UsableSwiftAsyncContextAddrIntrinsic = false;
};
}
}
#endif
|