Merge pull request #66 from ppizarro/master
authorAnthony Green <green@moxielogic.com>
Fri, 28 Feb 2014 05:56:27 +0000 (00:56 -0500)
committerAnthony Green <green@moxielogic.com>
Fri, 28 Feb 2014 05:58:30 +0000 (00:58 -0500)
BlackFin fixes - Fatal error when calling a function defined in a shared library from within the function called by FFI

ChangeLog
src/bfin/ffi.c
src/bfin/sysv.S

index be8a3a7..f212d3a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-28  Paulo Pizarro  <paulo.pizarro@gmail.com>
+
+       * src/bfin/sysv.S: Calling functions in shared libraries requires
+       considering the GOT.
+
 2014-02-28  Josh Triplett  <josh@joshtriplett.org>
 
        * src/x86/ffi64.c (classify_argument): Handle case where
index 0beccc1..22a2acd 100644 (file)
@@ -1,5 +1,6 @@
 /* -----------------------------------------------------------------------
-   ffi.c - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
+   ffi.c - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
+                                                          Paulo Pizarro <paulo.pizarro@gmail.com>
 
    Blackfin Foreign Function Interface
 
index f1f8762..f4278be 100644 (file)
@@ -1,5 +1,6 @@
 /* -----------------------------------------------------------------------
-   sysv.S - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
+   sysv.S - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>,
+                                Paulo Pizarro <paulo.pizarro@gmail.com>
 
    Blackfin Foreign Function Interface
 
        .func ffi_call_SYSV
 
        /*
-       cif->bytes      = R0    (fp+8)
-       &ecif                   = R1    (fp+12)
-       ffi_prep_args   = R2    (fp+16)
-       ret_type                = stack (fp+20)
-       ecif.rvalue             = stack (fp+24)
-       fn                              = stack (fp+28)
-                                         got   (fp+32)
-    There is room for improvement here (we can use temporary registers
+         cif->bytes    = R0    (fp+8)
+         &ecif         = R1    (fp+12)
+         ffi_prep_args = R2    (fp+16)
+         ret_type      = stack (fp+20)
+         ecif.rvalue   = stack (fp+24)
+         fn            = stack (fp+28)
+                           got (fp+32)
+
+        There is room for improvement here (we can use temporary registers
         instead of saving the values in the memory)
-       REGS:
-               P5 => Stack pointer (function arguments)
-               R5 => cif->bytes
-               R4 => ret->type
-
-               FP-20 = P3
-               FP-16 = SP (parameters area)
-               FP-12 = SP (temp)
-               FP-08 = function return part 1 [R0]
-               FP-04 = function return part 2 [R1]
+        REGS:
+        P5 => Stack pointer (function arguments)
+        R5 => cif->bytes
+        R4 => ret->type
+
+        FP-20 = P3
+        FP-16 = SP (parameters area)
+        FP-12 = SP (temp)
+        FP-08 = function return part 1 [R0]
+        FP-04 = function return part 2 [R1]
        */
 
 _ffi_call_SYSV: