Files
swift-mirror/lib/IRGen/ConformanceDescription.h
Yuta Saito 43a25e89b7 [Wasm][IRGen] Add initial support for absolute function pointer
On some Harvard architectures like WebAssembly that allow sliding code
and data address space offsets independently, it's impossible to make
direct relative reference to code from data because the relative offset
between them is not representable.
Use absolute function references instead of relative ones on such targets.
2022-03-30 08:12:23 +00:00

79 lines
2.5 KiB
C++

//===--- ConformanceDescription.h - Conformance record ----------*- 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 the ConformanceDescription type, which records a
// conformance which needs to be emitted.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_IRGEN_CONFORMANCEDESCRIPTION_H
#define SWIFT_IRGEN_CONFORMANCEDESCRIPTION_H
namespace llvm {
class Constant;
}
namespace swift {
class SILWitnessTable;
namespace irgen {
/// The description of a protocol conformance, including its witness table
/// and any additional information needed to produce the protocol conformance
/// descriptor.
class ConformanceDescription {
public:
/// The conformance itself.
RootProtocolConformance *conformance;
/// The witness table.
SILWitnessTable *wtable;
/// The witness table pattern, which is also a complete witness table
/// when \c requiresSpecialization is \c false.
llvm::Constant *pattern;
/// The size of the witness table.
const uint16_t witnessTableSize;
/// The private size of the witness table, allocated
const uint16_t witnessTablePrivateSize;
/// Whether this witness table requires runtime specialization.
const unsigned requiresSpecialization : 1;
/// The instantiation function, to be run at the end of witness table
/// instantiation.
llvm::Function *instantiationFn = nullptr;
/// The resilient witnesses, if any.
SmallVector<llvm::Constant *, 4> resilientWitnesses;
ConformanceDescription(RootProtocolConformance *conformance,
SILWitnessTable *wtable,
llvm::Constant *pattern,
uint16_t witnessTableSize,
uint16_t witnessTablePrivateSize,
bool requiresSpecialization)
: conformance(conformance), wtable(wtable), pattern(pattern),
witnessTableSize(witnessTableSize),
witnessTablePrivateSize(witnessTablePrivateSize),
requiresSpecialization(requiresSpecialization)
{
}
};
} // end namespace irgen
} // end namespace swift
#endif