[swift-dev] [Compiler] Help IR gen in targetting MSVC

John McCall 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.

John.

> 
> - 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.
> 
> John.
> 
> >
> > 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...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160426/91c0cc7e/attachment.html>


More information about the swift-dev mailing list