[swift-dev] Builtin.loadRaw
Sam Ding
samding at ca.ibm.com
Fri Sep 29 10:08:40 CDT 2017
Hi Slava & Joe,
Thank you for the response.
The failed test case is "generic instantiation" of KeyPath.swift. Here is
details of log:
[ RUN ] key paths.key path generic instantiation
stdout>>> check failed
at /home/wk/sw4/swift/test/stdlib/KeyPath.swift, line 193
stdout>>> expected: Swift.ReferenceWritableKeyPath<a.S<Swift.Int>,
Swift.Int> (of type Swift.ReferenceWritableKeyPath<a.S<Swift.Int>,
Swift.Int>)
stdout>>> actual: Swift.ReferenceWritableKeyPath<a.S<Swift.Int>,
Swift.Int> (of type Swift.ReferenceWritableKeyPath<a.S<Swift.Int>,
Swift.Int>)
stdout>>> check failed
at /home/wk/sw4/swift/test/stdlib/KeyPath.swift, line 197
stdout>>> expected: Swift.ReferenceWritableKeyPath<a.S<Swift.String>,
Swift.Int> (of type Swift.ReferenceWritableKeyPath<a.S<Swift.String>,
Swift.Int>)
stdout>>> actual: Swift.ReferenceWritableKeyPath<a.S<Swift.String>,
Swift.Int> (of type Swift.ReferenceWritableKeyPath<a.S<Swift.String>,
Swift.Int>)
stdout>>> check failed
at /home/wk/sw4/swift/test/stdlib/KeyPath.swift, line 201
stdout>>> expected:
Swift.ReferenceWritableKeyPath<a.S<StdlibUnittest.LifetimeTracked>,
Swift.Int> (of type
Swift.ReferenceWritableKeyPath<a.S<StdlibUnittest.LifetimeTracked>,
Swift.Int>)
stdout>>> actual:
Swift.ReferenceWritableKeyPath<a.S<StdlibUnittest.LifetimeTracked>,
Swift.Int> (of type
Swift.ReferenceWritableKeyPath<a.S<StdlibUnittest.LifetimeTracked>,
Swift.Int>)
[ FAIL ] key paths.key path generic instantiation
Other test cases of KeyPath.siwft are all passed.
It is found that the failure reason is @stdlib/public/core/KeyPath.swift
85 if aComponent.header.endOfReferencePrefix
86 != bComponent.header.endOfReferencePrefix
87 || aComponent.value != bComponent.value // this
is true on s390x, aComponent.value="struct(0)",
bComponent.value="struct(48)"
88 || aType != bType {
89 return false
90 }
Then tracing to:
2094 func tryToResolveOffset() {
2095 if header.payload ==
RawKeyPathComponent.Header.unresolvedFieldOffsetPayload {
2096 // Look up offset in type metadata. The value in the
pattern is the
2097 // offset within the metadata object.
2098 let metadataPtr = unsafeBitCast(base, to:
UnsafeRawPointer.self)
2099 let offsetOfOffset = patternBuffer.pop(UInt32.self)
2100 print("+++++++++++ int_offsetOfOffset=\(Int(offsetOfOffset))\n")
2101 var offset = metadataPtr.load(fromByteOffset: Int
(offsetOfOffset), // given the same input parameters
(offsetOfOfferset=56),
2102 as:
UInt32.self) // different
"offset" (0 on s390x, and 48 on x86_64)
2103 // Rewrite the header for a resolved offset.
Then it comes Builtin.loadRaw of UnsafeRawPointer.swift.gyb
As My lldb and gdb do not stop @ emitBuiltinLoadRaw(),
I inserted a "printf" in the fucntion, but it does not print out anything.
Yes, I think it maybe related to alignment or endianness, so we need to
find the source code of LoadRaw.
Thanks,
Sam Ding,
Linux on z Systems Open Source Ecosystem
IBM Toronto Lab,
email: samding at ca.ibm.com
phone: (905)413-2947
From: Slava Pestov <spestov at apple.com>
To: Sam Ding <samding at ca.ibm.com>
Cc: swift-dev <swift-dev at swift.org>
Date: 09/28/2017 05:24 PM
Subject: Re: [swift-dev] Builtin.loadRaw
Sent by: spestov at apple.com
Hi Sam,
The builtin is defined in lib/SILGen/SILGenBuiltin.cpp, look for the
function named emitBuiltinLoadRaw().
However I suspect the problem in this case is not that the builtin is
implemented incorrectly (it eventually lowers to an LLVM load instruction)
but that something further upstream is going wrong, perhaps with alignment
or endianness.
Can you tell us which unit tests are failing specifically?
Slava
On Sep 28, 2017, at 2:16 PM, Sam Ding via swift-dev <
swift-dev at swift.org> wrote:
I am testing a test case "KeyPath.swift" on s390x for v4.0 . It is
found that " Builtin.loadRaw" as the below of
"stdlib/public/core/UnsafeRawPointer.swift.gyb" returns a different
value than that on x86-64.
@_inlineable
public func load<T>(fromByteOffset offset: Int = 0, as type:
T.Type) -> T {
_debugPrecondition(0 == (UInt(bitPattern: self + offset)
& (UInt(MemoryLayout<T>.alignment) - 1)),
"load from misaligned raw pointer")
return Builtin.loadRaw((self + offset)._rawValue) // return a
different value on s390x vs x86-64
}
My debugger (lldb) does not guide me to the detailed of "
Builtin.loadRaw". Searching "loadRaw" and finding
swift/include/swift/AST/Builtins.def:BUILTIN_SIL_OPERATION
(LoadRaw, "loadRaw", Special)
But I could not find the definition of this "LoadRaw" from the whole
swift v4.
Can anyone give me a hint where its implementation is?
Thanks,
Sam Ding,
Linux on z Systems Open Source Ecosystem
IBM Toronto Lab,
email: samding at ca.ibm.com
phone: (905)413-2947
_______________________________________________
swift-dev mailing list
swift-dev at swift.org
https://lists.swift.org/mailman/listinfo/swift-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20170929/fcb903f6/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: graycol.gif
Type: image/gif
Size: 105 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20170929/fcb903f6/attachment.gif>
More information about the swift-dev
mailing list