> On Oct 24, 2017, at 8:32 AM, Sam Ding via swift-dev <swift-dev@swift.org> 
> wrote:
> 
> Hi,
> 
> It is found that "for" loop iterate and "enum" does not work on s390x.
> Here is a sample code:
> enum IntKey : Int {
> case a = 3
> case b = 4 // Implicitly 4
> case c = 1
> }
> for ( a1, a2) in [(IntKey.a, 1)] {
> print ("+++++ test \n")
> }
> 
> The for loop inifinitly iterates on s390x. Note that it works fine if 
> replacing the enum with normal tuple in the above code.
> When debugging this code, after one iteration, the logic gets a "nil" in 
> "IndexingIterator.next()" as follows:
> ....
> frame #0: 0x000003fffd5b4088 
> libswiftCore.so`IndexingIterator.next(self=0x000003fffffff460) at 
> Collection.swift:411
> 408 @inline(__always)
> 409 public mutating func next() -> Elements.Element? {
> 410 if _position == _elements.endIndex {
> -> 411 return nil
> 412 }
> 413 let element = _elements[_position]
> ..
> Then comes "Enum.cpp:211" (swift::swift_storeEnumTagSinglePayload) and no 
> difference on both s390x and x86_64.
> However, It continues goes into the loop body on s390x, and terminates on 
> x86_64, respectively.
> 
> Have anyones know well this implementation and give us a hint for the 
> problems?
> 
> Thanks,
> 

At a binary level, Swift is going to represent the result of the next() 
operation as an value of the element type wrapped in an Optional, `(IntKey, 
Int)?`, and the compiler is going to recognize that it can represent the `nil` 
case by using unused representations of IntKey. Our code for doing enum layout 
was originally written in a very little-endian-centric way, and if s390x is 
big-endian, there's a possibility that the code in IRGen or the runtime that 
encodes the `nil` result is not correct, or that the runtime and IRGen do not 
agree on the representation of `nil`. That could lead to the infinite loop 
you're seeing.

-Joe
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to