Bug #6592

test_call_double(DL::TestDL) fails on ARM HardFP

Added by Vit Ondruch almost 2 years ago. Updated 8 months ago.

[ruby-core:45647]
Status:Assigned
Priority:Normal
Assignee:Aaron Patterson
Category:ext
Target version:next minor
ruby -v:ruby 2.0.0dev (2012-06-05 trunk 35922) [armv7hl-linux] Backport:

Description

Hi,

I am observing following test suite error on armv7hl Fedora 17 1:

2) Failure:
testcalldouble(DL::TestDL) [/builddir/build/BUILD/ruby-2.0.0-r35922/test/dl/test_dl2.rb:90]:
Expected |0.1 - 2.1638932342073e-311| (0.1) to be < 0.001.

I was digging a bit deeper and I identified issue in this part of code [2]. I tried a bit to unfold the macros and found, that the issue is because of variadic arguments. If the function prototype is declared without them (novar.disasm), the test passes, if they are in use (variadic.disasm), the test fails. The attached files shows the code with partially unfolded marcos and their disassembly. The atof.disasm contains the disassembly of the atof call if it might be of help.

I am not sure if it might be compiler bug (GCC 4.7) or if it should be fixed in Ruby. Any help appreciated

[1] http://arm.koji.fedoraproject.org/koji/getfile?taskID=904523&name=build.log
[2] https://github.com/ruby/ruby/blob/v1_9_3_195/ext/dl/cfunc.c#L464
[3] https://buildd.debian.org/status/fetch.php?pkg=ruby1.9.1&arch=armhf&ver=1.9.3.194-1&stamp=1338887114

novar.disasm - atof called without variadic arguments (659 Bytes) Vit Ondruch, 06/14/2012 05:12 PM

variadic.disasm - atof called with variadic arguments (699 Bytes) Vit Ondruch, 06/14/2012 05:12 PM

atof.disasm - atof disassembly (695 Bytes) Vit Ondruch, 06/14/2012 05:12 PM

noname (500 Bytes) Anonymous, 06/21/2012 01:53 AM

noname (500 Bytes) Anonymous, 06/22/2012 02:23 AM

History

#1 Updated by Vit Ondruch almost 2 years ago

This might be of reference [1], particularly the 5.4 and 5.5 chapters.

[1] http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

#2 Updated by Motohiro KOSAKI almost 2 years ago

Please confirm you are surely using fiddle (instead of plain DL). ext/dl is broken when the abi require proper function prototype for variadic arguments (e.g. x86_64).

#3 Updated by Vit Ondruch almost 2 years ago

No I am not using Fiddle.

Better to say, it is not up to me what I use. The test is written in such way that it is using DL no matter if libffi is present and if Fiddle might be used.

This is the callstack using GitHub ;)

https://github.com/ruby/ruby/blob/trunk/ext/dl/cfunc.c#L340
https://github.com/ruby/ruby/blob/trunk/ext/dl/lib/dl/func.rb#L55
https://github.com/ruby/ruby/blob/trunk/test/dl/test_dl2.rb#L89

#4 Updated by Anonymous almost 2 years ago

On Thu, Jun 14, 2012 at 09:54:41PM +0900, vo.x (Vit Ondruch) wrote:

Issue #6592 has been updated by vo.x (Vit Ondruch).

No I am not using Fiddle.

Better to say, it is not up to me what I use. The test is written in such way that it is using DL no matter if libffi is present and if Fiddle might be used.

I think we need to delete the CFunc code. The problem with that class
is we cannot tell the return type, so it's impossible to set up a fiddle
wrapper without using DL::CFunc in conjunction with DL::Function.

I'll port these tests to Fiddle in preparation for rm'ing the dl
implementation.

This is the callstack using GitHub ;)

https://github.com/ruby/ruby/blob/trunk/ext/dl/cfunc.c#L340
https://github.com/ruby/ruby/blob/trunk/ext/dl/lib/dl/func.rb#L55
https://github.com/ruby/ruby/blob/trunk/test/dl/test_dl2.rb#L89

Thank you! :-)

--
Aaron Patterson
http://tenderlovemaking.com/

#5 Updated by Vit Ondruch almost 2 years ago

I think we need to delete the CFunc code. The problem with that class
is we cannot tell the return type, so it's impossible to set up a fiddle
wrapper without using DL::CFunc in conjunction with DL::Function.

I'll port these tests to Fiddle in preparation for rm'ing the dl
implementation.

In other words, DL will be removed in 2.0, but this leaves 1.9.3 on ARM with broken functionality? It would be nice to document it somewhere at least, if this is the case. Thank you.

#6 Updated by Anonymous almost 2 years ago

On Thu, Jun 21, 2012 at 02:41:10PM +0900, vo.x (Vit Ondruch) wrote:

Issue #6592 has been updated by vo.x (Vit Ondruch).

I think we need to delete the CFunc code. The problem with that class
is we cannot tell the return type, so it's impossible to set up a fiddle
wrapper without using DL::CFunc in conjunction with DL::Function.

I'll port these tests to Fiddle in preparation for rm'ing the dl
implementation.

In other words, DL will be removed in 2.0, but this leaves 1.9.3 on ARM with broken functionality? It would be nice to document it somewhere at least, if this is the case. Thank you.

Not so much broken, as replaced with Fiddle. I don't think the CFunc
object is intended to be used directly (I couldn't find any usage in the
wild). But yes, if you're using CFunc directly, it will break. :(

--
Aaron Patterson
http://tenderlovemaking.com/

#7 Updated by Eric Hodel almost 2 years ago

  • Category set to ext
  • Assignee set to Aaron Patterson
  • Target version set to 2.0.0

#8 Updated by Yusuke Endoh almost 2 years ago

  • Status changed from Open to Assigned

#9 Updated by Yusuke Endoh about 1 year ago

  • Target version changed from 2.0.0 to next minor

#10 Updated by Zachary Scott 8 months ago

Aaron did you ever port these tests when you were merging bits of DL into Fiddle?

Also available in: Atom PDF