mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user