[GHC] #7621: Cross-build for QNX ARM smashes stack when using FunPtr wrappers

GHC cvs-ghc at haskell.org
Mon Feb 11 02:43:11 CET 2013


#7621: Cross-build for QNX ARM smashes stack when using FunPtr wrappers
-------------------------------------------------+--------------------------
    Reporter:  singpolyma                        |       Owner:               
        Type:  bug                               |      Status:  new          
    Priority:  normal                            |   Milestone:  7.8.1        
   Component:  Compiler (FFI)                    |     Version:  7.7          
    Keywords:  qnx unregisterised cross-compile  |          Os:  QNX          
Architecture:  arm                               |     Failure:  Runtime crash
  Difficulty:  Unknown                           |    Testcase:               
   Blockedby:                                    |    Blocking:  7610         
     Related:                                    |  
-------------------------------------------------+--------------------------

Comment(by psycotica0):

 I've looked into this, and have decided that whether or not GHC is
 correct, libffi is definitely worong.

 The following code works under arm-linux-gnueabi and native, but not under
 qnx:
 {{{

 #include <stdio.h>
 #include <ffi.h>

 /* Acts like puts with the file given at time of enclosure. */
 void puts_binding(ffi_cif *cif, unsigned int *ret, void* args[],
                 FILE *stream)
         {
                 *ret = fputs(*(char **)args[0], stream);
                 }

                 int main()
         {
                 ffi_cif cif;
                 ffi_type *args[1];
                 ffi_closure *closure;

                 int (*bound_puts)(char *);
                 int rc;

                 /* Allocate closure and bound_puts */
                         closure = ffi_closure_alloc(sizeof(ffi_closure),
 &bound_puts);

                 if (closure)
                         {
                                 /* Initialize the argument info vectors */
                                         args[0] = &ffi_type_pointer;

                                 /* Initialize the cif */
                                         if (ffi_prep_cif(&cif,
 FFI_DEFAULT_ABI, 1,
                                         // if (ffi_prep_cif(&cif, FFI_VFP,
 1,
                                         // if (ffi_prep_cif(&cif,
 FFI_SYSV, 1,
 &ffi_type_uint, args) == FFI_OK)
                                         {
                                                 /* Initialize the closure,
 setting stream to stdout */
                                                         if
 (ffi_prep_closure_loc(closure, &cif, puts_binding,
 stdout, bound_puts) == FFI_OK)
                                                         {
                                                                 rc =
 bound_puts("Hello World!");
                                                                 /* rc now
 holds the result of the call to fputs */
                                                                         }
                                                 }
                                 }

                 /* Deallocate both closure, and bound_puts */
                         ffi_closure_free(closure);

                 return 0;
                 }
 }}}

 The formatting's a little off, because I cut and paste it from the libffi
 documentation.
 So, that crashes stacks when built with gcc and run on qnx.

 I looked into libffi some and found that the problem seems to be in two
 calls of `__clear_cache`, which are meant to clear arm's instruction and
 data caches, since it's doing tricky stuff in there.
 They appear to be causing trouble, though...

 Seems like this person
 [http://community.qnx.com/sf/discussion/do/listPosts/projects.bazaar/discussion.bazaar.topc8096
 was having the same trouble with Python on QNX]

 `__clear_cache` appears to be Linux syscall thing on ARM for this, and
 while the code is building on QNX, maybe it works differently there, or is
 broken?

 Either way, I think I'll have to work on this with the FFI people unless
 any of you know what's up.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7621#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list