SwiftCompilerSources: rework bridging

Introduce two modes of bridging:
* inline mode: this is basically how it worked so far. Using full C++ interop which allows bridging functions to be inlined.
* pure mode: bridging functions are not inlined but compiled in a cpp file. This allows to reduce the C++ interop requirements to a minimum. No std/llvm/swift headers are imported.

This change requires a major refactoring of bridging sources. The implementation of bridging functions go to two separate files: SILBridgingImpl.h and OptimizerBridgingImpl.h.
Depending on the mode, those files are either included in the corresponding header files (inline mode), or included in the c++ file (pure mode).

The mode can be selected with the BRIDGING_MODE cmake variable. By default it is set to the inline mode (= existing behavior). The pure mode is only selected in certain configurations to work around C++ interop issues:
* In debug builds, to workaround a problem with LLDB's `po` command (rdar://115770255).
* On windows to workaround a build problem.
This commit is contained in:
Erik Eckstein
2023-10-06 20:19:24 +02:00
parent a86b7ccfe4
commit 2dbd6cc56b
52 changed files with 3374 additions and 2335 deletions

View File

@@ -23,19 +23,15 @@ public struct SourceLoc {
self.locationInFile = locationInFile
}
public init?(bridged: swift.SourceLoc) {
public init?(bridged: BridgedSourceLoc) {
guard bridged.isValid() else {
return nil
}
#if $NewCxxMethodSafetyHeuristics
self.locationInFile = bridged.getOpaquePointerValue().assumingMemoryBound(to: UInt8.self)
#else
self.locationInFile = bridged.__getOpaquePointerValueUnsafe().assumingMemoryBound(to: UInt8.self)
#endif
self.locationInFile = bridged.opaquePointer!
}
public var bridged: swift.SourceLoc {
.init(llvm.SMLoc.getFromPointer(locationInFile))
public var bridged: BridgedSourceLoc {
.init(opaquePointer: locationInFile)
}
}
@@ -46,40 +42,24 @@ extension SourceLoc {
}
extension Optional where Wrapped == SourceLoc {
public var bridged: swift.SourceLoc {
public var bridged: BridgedSourceLoc {
self?.bridged ?? .init()
}
}
public struct CharSourceRange {
private let start: SourceLoc
private let byteLength: UInt32
public let start: SourceLoc
public let byteLength: UInt32
public init(start: SourceLoc, byteLength: UInt32) {
self.start = start
self.byteLength = byteLength
}
public init?(bridged: swift.CharSourceRange) {
#if $NewCxxMethodSafetyHeuristics
guard let start = SourceLoc(bridged: bridged.getStart()) else {
public init?(bridgedStart: BridgedSourceLoc, byteLength: UInt32) {
guard let start = SourceLoc(bridged: bridgedStart) else {
return nil
}
#else
guard let start = SourceLoc(bridged: bridged.__getStartUnsafe()) else {
return nil
}
#endif
self.init(start: start, byteLength: bridged.getByteLength())
}
public var bridged: swift.CharSourceRange {
.init(start.bridged, byteLength)
}
}
extension Optional where Wrapped == CharSourceRange {
public var bridged: swift.CharSourceRange {
self?.bridged ?? .init(.init(), 0)
self.init(start: start, byteLength: byteLength)
}
}