[swift-evolution] [swift-dev] [Compiler] Help IR gen in targetting MSVC
rjmccall at apple.com
Tue Apr 26 15:24:41 CDT 2016
> On Apr 26, 2016, at 1:03 PM, Sangjin Han <tinysun.net at gmail.com> wrote:
> The problem can be solved by modifying that code. Thanks you. I thought that code will affect only to the CLong type not Int.
It changes what 'long' gets imported as. If there's a Windows API defined using 'long' (rather than some more meaningful typedef like 'size_t'), it's important for it to be imported as Int32 rather than Int, since 'long' is always 32 bits under MSVC.
> But I meet another problem to fix it. I couldn't find the conditional method to distinct x86_64-*-windows-msvc with x86_64-*-windows-cygnus in Swift source.
> "#if os(Windows)" can not distinct MSVC from Cygwin.
> Should I add new condition 'env()' for the environment?
That is an excellent question.
My understanding / memory is that, as far as their programming interfaces goes, Cygwin and MSVC are very, very different environments. Maybe it's useful to have a condition that's true for both environments — although I'm not sure why it would — but I don't think it deserves to be as prominent as os(Windows). So my gut reaction is that, rather than adding a #env, we ought to just reserve os(Windows) for MSVC compatibility and make a new os(Cygwin) for Cygwin.
This needs to be raised on swift-evolution, though. CC'ing that list.
> - Han Sangjin
> 2016-04-26 14:39 GMT+09:00 John McCall <rjmccall at apple.com <mailto:rjmccall at apple.com>>:
> > On Apr 25, 2016, at 7:54 PM, Sangjin Han via swift-dev <swift-dev at swift.org <mailto:swift-dev at swift.org>> wrote:
> > Hi all,
> > I found a bug in my port for MSVC and Cygwin.
> > The C function swift_stdlib_readLine_stdin() is mapped to 'Int' type in Swift, but it generates i32 in LLVM if I specify the target as MSVC. If I give the target as Cygwin, it generates i64.
> > With the target options, the Cygwin ported swiftc.exe has the same output.
> > I know that the one of the differences between MSVC and Cygwin is the size of 'long' type. But I don't know even if it is related to this problem.
> > I don't know where to I start with.
> The problem is probably the unconditional line
> public typealias CLong = Int
> in CTypes.swift. That is generally true for Unix platforms (LP32 / LP64) but not MSVC (LLP64).
> You will need to conditionalize that line.
> > BEGIN OF tt.swift ---
> > import SwiftShims
> > var linePtr: UnsafeMutablePointer<CChar>? = nil
> > var readBytes = swift_stdlib_readLine_stdin(&linePtr)
> > print(readBytes)
> > END OF tt.swift -----
> > C:\temp>swiftc -emit-ir tt.swift -target x86_64-pc-windows-msvc | findstr stdlib
> > %4 = call i32 @swift_stdlib_readLine_stdin(i8** bitcast (%Sq* @_Tv2tt7linePtrGSqGSpVs4Int8__ to i8**))
> > declare i32 @swift_stdlib_readLine_stdin(i8**) #0
> > C:\temp>swiftc -emit-ir tt.swift -target x86_64-unknown-windows-cygnus | findstr stdlib
> > %4 = call i64 @swift_stdlib_readLine_stdin(i8** bitcast (%Sq* @_Tv2tt7linePtrGSqGSpVs4Int8__ to i8**))
> > declare i64 @swift_stdlib_readLine_stdin(i8**) #0
> > - Han Sangjin
> > _______________________________________________
> > swift-dev mailing list
> > swift-dev at swift.org <mailto:swift-dev at swift.org>
> > https://lists.swift.org/mailman/listinfo/swift-dev <https://lists.swift.org/mailman/listinfo/swift-dev>
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the swift-evolution