Affix

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

dyncall/test/call_suite/CMakeLists.txt
dyncall/test/call_suite/Makefile.embedded
dyncall/test/call_suite/Makefile.generic
dyncall/test/call_suite/Nmakefile
dyncall/test/call_suite/README.txt
dyncall/test/call_suite/cases.c
dyncall/test/call_suite/cases.h
dyncall/test/call_suite/cases.txt
dyncall/test/call_suite/config.lua
dyncall/test/call_suite/design.txt
dyncall/test/call_suite/globals.c
dyncall/test/call_suite/globals.h
dyncall/test/call_suite/main.c
dyncall/test/call_suite/mk-cases.lua
dyncall/test/call_suite/mkfile
dyncall/test/call_suite/rand-sig.lua
dyncall/test/call_suite_aggrs/CMakeLists.txt
dyncall/test/call_suite_aggrs/Makefile.embedded
dyncall/test/call_suite_aggrs/Makefile.generic
dyncall/test/call_suite_aggrs/Nmakefile
dyncall/test/call_suite_aggrs/README.txt
dyncall/test/call_suite_aggrs/cases.c
dyncall/test/call_suite_aggrs/cases.h
dyncall/test/call_suite_aggrs/cases.txt
dyncall/test/call_suite_aggrs/config.lua
dyncall/test/call_suite_aggrs/design.txt
dyncall/test/call_suite_aggrs/globals.c
dyncall/test/call_suite_aggrs/globals.h
dyncall/test/call_suite_aggrs/main.c
dyncall/test/call_suite_aggrs/mk-cases.lua
dyncall/test/call_suite_aggrs/mkfile
dyncall/test/call_suite_aggrs/nonemptyaggrs.h
dyncall/test/call_suite_aggrs/nonemptyaggrs.txt
dyncall/test/call_suite_aggrs/rand-sig.lua
dyncall/test/callback_plain/CMakeLists.txt
dyncall/test/callback_plain/Makefile.embedded
dyncall/test/callback_plain/Makefile.generic
dyncall/test/callback_plain/Nmakefile

MANIFEST  view on Meta::CPAN

dyncall/test/callback_suite/Makefile.embedded
dyncall/test/callback_suite/Makefile.generic
dyncall/test/callback_suite/Nmakefile
dyncall/test/callback_suite/README.txt
dyncall/test/callback_suite/cases.c
dyncall/test/callback_suite/cases.h
dyncall/test/callback_suite/cases.txt
dyncall/test/callback_suite/config-random.lua
dyncall/test/callback_suite/config-stress1.lua
dyncall/test/callback_suite/config.lua
dyncall/test/callback_suite/globals.c
dyncall/test/callback_suite/globals.h
dyncall/test/callback_suite/main.c
dyncall/test/callback_suite/make-signatures.lua
dyncall/test/callback_suite/mk-cases.lua
dyncall/test/callback_suite/mkfile
dyncall/test/callback_suite/stress1.txt
dyncall/test/callback_suite_aggrs/CMakeLists.txt
dyncall/test/callback_suite_aggrs/Makefile.embedded
dyncall/test/callback_suite_aggrs/Makefile.generic
dyncall/test/callback_suite_aggrs/Nmakefile
dyncall/test/callback_suite_aggrs/README.txt
dyncall/test/callback_suite_aggrs/cases.c
dyncall/test/callback_suite_aggrs/cases.h
dyncall/test/callback_suite_aggrs/cases.txt
dyncall/test/callback_suite_aggrs/config.lua
dyncall/test/callback_suite_aggrs/design.txt
dyncall/test/callback_suite_aggrs/globals.c
dyncall/test/callback_suite_aggrs/globals.h
dyncall/test/callback_suite_aggrs/main.c
dyncall/test/callback_suite_aggrs/mk-cases.lua
dyncall/test/callback_suite_aggrs/mkfile
dyncall/test/callback_suite_aggrs/nonemptyaggrs.h
dyncall/test/callback_suite_aggrs/nonemptyaggrs.txt
dyncall/test/callback_suite_aggrs/rand-sig.lua
dyncall/test/callf/CMakeLists.txt
dyncall/test/callf/Makefile.embedded
dyncall/test/callf/Makefile.generic
dyncall/test/callf/Nmakefile

README.md  view on Meta::CPAN


## `pin( ... )`

```perl
my $errno;
pin( $errno, 'libc', 'errno', Int );
print $errno;
$errno = 0;
```

Variables exported by a library - also names "global" or "extern" variables -
can be accessed using `pin( ... )`. The above example code applies magic to
`$error` that binds it to the integer variable named "errno" as exported by
the [libc](https://metacpan.org/pod/libc) library.

Expected parameters include:

- `$var`

    Perl scalar that will be bound to the exported variable.

dyncall/buildsys/cmake/Modules/UseLATEX.cmake  view on Meta::CPAN

    SET(auxclean_target ${LATEX_TARGET}_auxclean)
  ELSE (LATEX_MANGLE_TARGET_NAMES)
    SET(dvi_target      dvi)
    SET(pdf_target      pdf)
    SET(ps_target       ps)
    SET(safepdf_target  safepdf)
    SET(html_target     html)
    SET(auxclean_target auxclean)
  ENDIF (LATEX_MANGLE_TARGET_NAMES)

  # For each directory in LATEX_IMAGE_DIRS, glob all the image files and
  # place them in LATEX_IMAGES.
  FOREACH(dir ${LATEX_IMAGE_DIRS})
    FOREACH(extension ${LATEX_IMAGE_EXTENSIONS})
      FILE(GLOB files ${CMAKE_CURRENT_SOURCE_DIR}/${dir}/*${extension})
      FOREACH(file ${files})
        GET_FILENAME_COMPONENT(filename ${file} NAME)
        SET(LATEX_IMAGES ${LATEX_IMAGES} ${dir}/${filename})
      ENDFOREACH(file)
    ENDFOREACH(extension)
  ENDFOREACH(dir)

dyncall/buildsys/mk/pcc.mk  view on Meta::CPAN

#@@@ add -g option or similar
#@@@.endif
CPPFLAGS = -D__Plan9__ -D__${objtype}__
CFLAGS   = -D__Plan9__ -D__${objtype}__ -I$TOP/dyncall -I$TOP/dyncallback -c
#CXXFLAGS = $CXXFLAGS -D__Plan9__
#ASFLAGS  = -D__Plan9__

# @@@ used to convert GAS sources
#        /^$/d                                                               # Remove empty lines.
#        /^#.*/d                                                             # Remove comments.
#        s/^\.(globl|intel_syntax|file|section).*//                          # Remove some GAS directives.
#        s/(.*):/TEXT \1(SB), $0/g                                           # Reformat function names.
#        s/%//g                                                              # Remove % register prefixes.
#        /^[  ]+/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/    # Convert everything to uppercase.
#        s/([A-Z]+)[  ]*E(..)[,   ]*E(..)/\1L \3, \2/                        # Convert 32bit instructions with 2 register operands.
#        s/([A-Z]+)[  ]*E(..)[,   ]*([0-9]+)/\1L $\3, \2/                    # Convert 32bit instructions with register and constant as
#        s/([A-Z]+)[  ]*E(..)[,   ]*\[E(..)\+([0-9]+)\]/\1L \4(\3), \2/      # Convert 32bit instructions with register and address as 
#        s/([A-Z]+)[  ]*E(..)[,   ]*\[E(..)\]/\1L 0(\3), \2/                 # Convert 32bit instructions with register and address as 
#        s/(CALL)[    ]*E(..)[    ]*$/\1 \2/                                 # Convert CALL instructions.
#        s/(CALL)[    ]*\[E(..)\+([0-9]+)\]/\1 \3(\2)/                       # Convert CALL instructions with addressing mode.
#        s/([A-Z]+)[  ]*E(..)[    ]*$/\1L \2/                                # Convert 32bit instructions with register operand.

dyncall/configure  view on Meta::CPAN

## Neither specifying this per source (e.g. via .section .note.GNU-stack,"",...), nor
## per toolchain flags (e.g. as' --noexecstack) turned out to be portable across our
## supported platforms, toolchains, and different versions of the latter (some even
## producing the opposite result).
## Find needed build flags by running a few tests; use default if none result in "rw-".
#
#RWXTESTPREFIX="rwxtest" # @@@ put this maybe all in Makefile.generic? out of source builds?
#for s in S s ; do (
#  cd "$BLDTOP"
#  # asm test file, with main and _main for portability.
#  (echo '.text';(echo '.globl main';echo 'main:') | sed 'p;s/m/_m/') > $RWXTESTPREFIX.$s
#
#  # Check var to be used, which depends on inference rules of this platform. E.g. ASFLAGS is only common on GNU, and
#  # on some other platforms only CFLAGS is the only one used, others use AFLAGS with cc and thus need -Wa,... Check
#  # makes use of the config written so far, so use '+=' to not overwrite vars.
#  for f in "" "ASFLAGS+=-Wa,--noexecstack" "ACFLAGS+=-Wa,--noexecstack" "AFLAGS+=--noexecstack" "AFLAGS+=-Wa,--noexecstack" "CFLAGS+=-Wa,--noexecstack"; do
#    # dummy makefile triggering inference rules, reflecting dyncall's build
#    make -f - <<MAKEFILE
#include $C
#$f
## Force dependency via .o, to avoid .[sS].out rules that might be set - also set command as not all platforms set .o.out

dyncall/doc/manual/callconvs/callconv_mips32.tex  view on Meta::CPAN

Name                                   & Alias                & Brief description\\
\hline
{\bf \$0}                              & {\bf \$zero}         & hardware zero, scratch \\
{\bf \$1}                              & {\bf \$at}           & assembler temporary, scratch \\
{\bf \$2-\$3}                          & {\bf \$v0-\$v1}      & integer results, scratch \\
{\bf \$4-\$11}                         & {\bf \$a0-\$a7}      & integer arguments, or double precision float arguments, scratch \\
{\bf \$12-\$15,\$24}                   & {\bf \$t4-\$t7,\$t8} & integer temporaries, scratch \\
{\bf \$25}                             & {\bf \$t9}           & integer temporary, address of callee for PIC calls (by convention), scratch \\
{\bf \$16-\$23}                        & {\bf \$s0-\$s7}      & preserve \\
{\bf \$26,\$27}                        & {\bf \$kt0,\$kt1}    & reserved for kernel \\
{\bf \$28}                             & {\bf \$gp}           & global pointer, preserve \\
{\bf \$29}                             & {\bf \$sp}           & stack pointer, preserve \\
{\bf \$30}                             & {\bf \$s8/\$fp}      & frame pointer (some assemblers name it \$fp), preserve \\
{\bf \$31}                             & {\bf \$ra}           & return address, preserve \\
{\bf hi, lo}                           &                      & multiply/divide special registers \\
{\bf \$f0,\$f2}                        &                      & float results, scratch \\
{\bf \$f1,\$f3,\$f4-\$f11,\$f20-\$f23} &                      & float temporaries, scratch \\
{\bf \$f12-\$f19}                      &                      & single precision float arguments, scratch \\
\end{tabular*}
\caption{Register usage on MIPS32 EABI calling convention}
\end{table}

dyncall/doc/manual/callconvs/callconv_mips32.tex  view on Meta::CPAN

Name                         & Alias                & Brief description\\
\hline                                                             
{\bf \$0}                    & {\bf \$zero}         & hardware zero \\
{\bf \$1}                    & {\bf \$at}           & assembler temporary \\
{\bf \$2-\$3}                & {\bf \$v0-\$v1}      & return value (only integer on hard-float targets), scratch \\
{\bf \$4-\$7}                & {\bf \$a0-\$a3}      & first arguments (only integer on hard-float targets), scratch\\
{\bf \$8-\$15,\$24}          & {\bf \$t0-\$t7,\$t8} & temporaries, scratch \\
{\bf \$25}                   & {\bf \$t9}           & temporary, holds address of called function for PIC calls (by convention) \\
{\bf \$16-\$23}              & {\bf \$s0-\$s7}      & preserved \\
{\bf \$26,\$27}              & {\bf \$k0,\$k1}      & reserved for kernel \\
{\bf \$28}                   & {\bf \$gp}           & global pointer, preserved by caller \\
{\bf \$29}                   & {\bf \$sp}           & stack pointer, preserve \\
{\bf \$30}                   & {\bf \$s8/\$fp}      & frame pointer (some assemblers name it \$fp), preserve \\
{\bf \$31}                   & {\bf \$ra}           & return address, preserve \\
{\bf hi, lo}                 &                      & multiply/divide special registers \\
{\bf \$f0-\$f3}              &                      & only on hard-float targets: float return value, scratch \\
{\bf \$f4-\$f11,\$f16-\$f19} &                      & only on hard-float targets: float temporaries, scratch \\
{\bf \$f12-\$f15}            &                      & only on hard-float targets: first floating point arguments, scratch \\
{\bf \$f20-\$f31}            &                      & only on hard-float targets: preserved \\
\end{tabular*}
\caption{Register usage on MIPS O32 calling convention}

dyncall/doc/manual/callconvs/callconv_mips64.tex  view on Meta::CPAN

Name                       & Alias                & Brief description\\
\hline
{\bf \$0}                  & {\bf \$zero}         & hardware zero \\
{\bf \$1}                  & {\bf \$at}           & assembler temporary, scratch \\
{\bf \$2-\$3}              & {\bf \$v0-\$v1}      & return value (only integers on hard-float targets), scratch \\
{\bf \$4-\$11}             & {\bf \$a0-\$a7}      & first arguments (only integers on hard-float targets), scratch \\
{\bf \$12-\$15,\$24}       & {\bf \$t4-\$t7,\$t8} & temporaries, scratch \\
{\bf \$25}                 & {\bf \$t9}           & temporary, address callee for all PIC calls (by convention), scratch \\
{\bf \$16-\$23}            & {\bf \$s0-\$s7}      & preserve \\
{\bf \$26,\$27}            & {\bf \$kt0,\$kt1}    & reserved for kernel \\
{\bf \$28}                 & {\bf \$gp}           & global pointer, preserve \\
{\bf \$29}                 & {\bf \$sp}           & stack pointer, preserve \\
{\bf \$30}                 & {\bf \$s8}           & frame pointer, preserve \\
{\bf \$31}                 & {\bf \$ra}           & return address, preserve \\
{\bf hi, lo}               &                      & multiply/divide special registers \\
{\bf \$f0,\$f2}            &                      & only on hard-float targets: float return values, scratch \\
{\bf \$f1,\$f3,\$f4-\$f11} &                      & only on hard-float targets: float temporaries, scratch \\
{\bf \$f12-\$f19}          &                      & only on hard-float targets: float arguments, scratch \\
{\bf \$f20-\$f23}          &                      & only on hard-float targets: float temporaries, scratch \\
{\bf \$f24-\$f31}          &                      & only on hard-float targets: preserved \\
\end{tabular*}

dyncall/doc/manual/callconvs/callconv_sparc32.tex  view on Meta::CPAN

\paragraph{\product{dyncall} support}

\product{dyncall} fully supports the SPARC 32-bit instruction set (V7 and V8), for calls and callbacks.

\subsubsection{SPARC (32-bit) Calling Convention}

\paragraph{Register usage}

\begin{itemize}
\item 32 single floating point registers (f0-f31, usable as 8 quad precision q0,q4,q8,...,q28, 16 double precision d0,d2,d4,...,d30)
\item 32 32-bit integer/pointer registers out of a bigger (vendor/model dependent) number that are accessible at a time (8 are global ones (g*), whereas the remaining 24 form a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones)
\item calling a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore)
\end{itemize}

\begin{table}[h]
\begin{tabular*}{0.95\textwidth}{lll}
Name                          & Alias                          & Brief description\\
\hline
{\bf \%g0}                    & \%r0                           & Read-only, hardwired to 0 \\
{\bf \%g1-\%g7}               & \%r1-\%r7                      & Global \\
{\bf \%o0,\%o1 and \%i0,\%i1} & \%r8,\%r9 and \%r24,\%r25      & Output and input argument registers, return value \\

dyncall/doc/manual/callconvs/callconv_sparc64.tex  view on Meta::CPAN

There are two proposals, one from Sun and one from Hal, which disagree on how to handle some aspects of this calling convention.\\

\paragraph{\product{dyncall} support}

\product{dyncall} fully supports the SPARC 64-bit instruction set (V9), for calls and callbacks.

\subsubsection{SPARC (64-bit) Calling Convention}

\begin{itemize}
\item 32 double precision floating point registers (d0,d2,d4,...,d62, usable as 16 quad precision ones q0,q4,q8,...q60, and also first half of them are usable as 32 single precision registers f0-f31)
\item 32 64-bit integer/pointer registers out of a bigger (vendor/model dependent) number that are accessible at a time (8 are global ones (g*), whereas the remaining 24 form a register window with 8 input (i*), 8 output (o*) and 8 local (l*) ones)
\item calling a function shifts the register window, the old output registers become the new input registers (old local and input ones are not accessible anymore)
\item stack and frame pointer are offset by a BIAS of 2047 (see official doc for reasons)
\end{itemize}

\begin{table}[h]
\begin{tabular*}{0.95\textwidth}{lll}
Name                          & Alias                          & Brief description\\
\hline
{\bf \%g0}                    & \%r0                           & Read-only, hardwired to 0 \\
{\bf \%g1-\%g7}               & \%r1-\%r7                      & Global \\

dyncall/doc/manual/manual_motivation.tex  view on Meta::CPAN

\begin{lstlisting}[label=cfuncall,caption=C function call,language=C]
extern void f(int x, double y,float z);
void caller()
{
  f(1,2.0,3.0f);
}
\end{lstlisting}


\begin{lstlisting}[label=x86asm,caption=Assembly X86 32-bit function call,language={[x86masm]Assembler}]
.global f         ; external symbol 'f'
caller:
  push  40400000H ; 3.0f (32 bit float)
                  ; 2.0  (64 bit float)
  push  40000000H ;          low  DWORD
  push  0H        ;          high DWORD 
  push  1H        ; 1    (32 bit integer)
  call  f         ; call 'f'
  add   esp, 16   ; cleanup stack
\end{lstlisting}

dyncall/doc/manual/manual_tex4ht.cfg  view on Meta::CPAN

\Configure{TITLE+}{Index}

% Clear default header, define our custom one. Using @HEAD will make this be used on all pages generated.
% @@@Ideally, this wouldn't be a copy&paste of the website's header, here. Such
% thing should be done in the website build, and this here a generic header
% (however, style is kinda needed).
\Configure{@HEAD}{}
\Configure{@HEAD}{\HCode{<meta http-equiv="content-type" content="text/html; charset=utf-8"/>\Hnewline}}
\Configure{@HEAD}{\HCode{<meta name="resource-type" content="document"/>\Hnewline}}
\Configure{@HEAD}{\HCode{<meta name="keywords"      content="C, function, dynamic, call, calling, convention, VM, abstraction, closure"/>\Hnewline}}
\Configure{@HEAD}{\HCode{<meta name="distribution"  content="global"/>\Hnewline}}
% should this really rely on online content (dyncall's .css) even for an offline build? @@@ also, we need a relative path here, so this complicates things further
\Configure{@HEAD}{\HCode{<link rel="stylesheet" href="/data/main.css" type="text/css" media="all"/>\Hnewline}}

% Image path prefix can be set here...
%\Configure{IMG}
%{\ht:special{t4ht=<img src="}}
%{\ht:special{t4ht=" alt="}}
%{" }
%{\ht:special{t4ht=" }}
%{\ht:special{t4ht=/>}}

dyncall/dyncall/dyncall_call_arm32_thumb_apple.s  view on Meta::CPAN

   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/


.text
.thumb
.code 16 
.globl _dcCall_arm32_thumb

/* Main dyncall call. */
.thumb_func
_dcCall_arm32_thumb:

	/* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */
	push	{r4-r7, r14}	   	/* Frame ptr, permanent registers, link register -> save area on stack. */
	mov		r7, r13	/* Set frame ptr. */

	/* Call. */

dyncall/dyncall/dyncall_call_arm32_thumb_gas.s  view on Meta::CPAN

   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/


.text
#if !defined(__thumb2__)
.code 16	/* THUMB mode */
#endif

.globl dcCall_arm32_thumb

/* Main dyncall call. */
.thumb_func
dcCall_arm32_thumb:

	/* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */
	/* Code below is not using high registers, so not storing them in prolog, which is more involved with thumb, anyways. */
	push	{r4-r7, r14}	/* Frame ptr, permanent registers, link register -> save area on stack. */
	mov		r7, r13		/* Set frame ptr. */
	sub		r13, #4		/* Realign stack to 8 bytes (b/c we stored 5 regs = 20b). */

dyncall/dyncall/dyncall_call_mips_eabi_gas.s  view on Meta::CPAN


/*//////////////////////////////////////////////////////////////////////

	dyncall_call_mips_eabi_gas.s

	MIPS 32bit family of processors.
	2008-01-03

//////////////////////////////////////////////////////////////////////*/
.text
.globl dcCall_mips_eabi

dcCall_mips_eabi:
	/* $4 target function */
	/* $5 register data */
	/* $6 stack size */
	/* $7 stack data */
	addiu	$sp,$sp,-16
	sw	$16,8($sp)
	sw	$31,4($sp)
	sw	$fp,0($sp)

dyncall/dyncall/dyncall_call_mips_n32.S  view on Meta::CPAN

   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

	.section .mdebug.abiN32
	.previous
	.abicalls
	.text
	.align  2
	.globl  dcCall_mips_n32
	.ent    dcCall_mips_n32
dcCall_mips_n32:

	/* Stack-frame prolog */

	.frame  $fp,64,$31   /* vars=16, regs=3/0, args=0, extra=16 */
	.mask   0xd0000000,-8
	.fmask  0x00000000,0
	subu    $sp,$sp,64
	sd      $31,48($sp)  /* save return address register (ra) */
	sd      $30,40($sp)  /* save frame pointer register (fp) */
	sd      $28,32($sp)  /* save global pointer register (gp) */
	move    $fp,$sp


	/* arguments: */

	/* $4 target function */
	/* $5 register data */
	/* $6 stack size */
	/* $7 stack data */
	

dyncall/dyncall/dyncall_call_mips_n64.S  view on Meta::CPAN

   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

	.section .mdebug.abi64
	.previous
	.abicalls
	.text
	.align  2
	.globl  dcCall_mips_n64
	.ent    dcCall_mips_n64
dcCall_mips_n64:

	/* Stack-frame prolog */

	# .frame  $fp,64,$31   /* vars=16, regs=3/0, args=0, extra=16 */
	# .mask   0xd0000000,-8
	# .fmask  0x00000000,0
	dsubu   $sp,$sp,64
	sd      $31,48($sp)  /* save return address register (ra) */
	sd      $30,40($sp)  /* save frame pointer register (fp) */
	sd      $28,32($sp)  /* save global pointer register (gp) */
	move    $fp,$sp


	/* arguments: */

	/* $4 target function */
	/* $5 register data */
	/* $6 stack size */
	/* $7 stack data */
	

dyncall/dyncall/dyncall_call_mips_o32.S  view on Meta::CPAN

	/* $6   stack size (guaranteed to be >= 16b and multiple of 8b) */
	/* $7   stack data */



	.section .mdebug.abi32
	.previous
	.abicalls
	.text
	.align  2
	.globl  dcCall_mips_o32
	.ent    dcCall_mips_o32
	.type   dcCall_mips_o32, @function
dcCall_mips_o32:
	.frame  $fp,40,$31      /* vars=8, regs=2/0, args=16, gp=8 */
	.mask   0xc0000000,-4
	.fmask  0x00000000,0
	.set    noreorder
	
	addiu   $sp, $sp, -8
	sw      $31, 4($sp)     /* save link register */

dyncall/dyncall/dyncall_call_sparc.s  view on Meta::CPAN

%sp or  %o6: stack pointer, always 8 (or 16?)-byte aligned.
%fp or  %i6: frame pointer.
%i0 and %o0: integer and pointer return values.
%i7 and %o7: return address. (caller puts return address to %o7, callee uses %i7)
%f0 and %f1: return value (float).
%i0..%i5:    input argument registers 
%o0..%o5:    output argument registers
%g0:         always zero, writes to it have no effect.

Register Mappings:
r0-7    -> globals
r8-15   -> outs
r16-r23 -> locals
r24-r31 -> ins

*/

REGSIZE        =  4
ALIGN          = 16
CALLVM_size    = 12
CALLVM_dataoff = 16

.text
.global dcCall_sparc
dcCall_sparc:

/* Basic Prolog: supports up to 6 arguments. */

	/* o0-1: callvm,target */
	or   %o0, %g0, %o3             /* %o3: callvm */
	or   %o1, %g0, %o0             /* %o0: target */
	ld  [%o3+CALLVM_size], %o1     /* %o1: size */
	add  %o3, CALLVM_dataoff, %o2  /* %o2: data */
	/*o0-2:target,size,data*/

dyncall/dyncall/dyncall_call_sparc64.s  view on Meta::CPAN

   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/


/* NOTE: %sp/%fp for v9 are offset, using them needs a "BIAS" of 2047 */
BIAS = 2047

.text
.global dcCall_v9
	/* dcCall_sparc64( DCCallVM* , void * target ) */ 
        /*                 o0          o1              */
dcCall_v9:
	or      %o0, %g0, %o3  /* o3: callvm   */
	or      %o1, %g0, %o0  /* o0: target   */
	ldx     [%o3+24], %o1  /* o1: mVecSize */
	add     %o3, 32,  %o2  /* o2: stack    */
	/* Compute a matching stack size (approximate): o3 = align(o1+136,16) */

	add     %o1, (16+1+6)*8+15, %o3

dyncall/dyncall/dyncall_call_sparc64.s  view on Meta::CPAN

%sp  or  %o6 : stack pointer, always 8 (or 16?)-byte aligned.
%fp  or  %i6 : frame pointer.
%i0  and %o0 : integer and pointer return values.
%i7  and %o7 : return address. (caller puts return address to %o7, callee uses %i7)
%fp0 and %fp1: return value (float).
%i0..%i5     : input argument registers 
%o0..%o5     : output argument registers
%g0          : always zero, writes to it have no effect.

Register Mappings:
r0-7    -> globals
r8-15   -> outs
r16-r23 -> locals
r24-r31 -> ins

Integer Register Overview Table:
ID   Class   Name   Description
------------------------------------------------------------------------------
0   globals   g0    always zero, writes to it have no effect
1             g1
2             g2
3             g3
4             g4
5             g5
6             g6
7             g7
8   out       o0    [int/ptr] arg 0 and return
9             o1              arg 1
10            o2              arg 2

dyncall/dyncall/dyncall_call_x86_nasm.asm  view on Meta::CPAN

    BITS 32
    section .text

;///////////////////////////////////////////////////////////////////////
; CSYM macro
;///////////////////////////////////////////////////////////////////////

%ifdef BUILD_OS_windows

%macro EXPORT_C 1
  global _%1
_%1:
%endmacro

%else

%macro EXPORT_C 1
  global %1
%1:
%endmacro

%endif

; -----------------------------------------------------------------------------
; Calling Convention x86 standard C
; - all arguments are on the stack
; - caller cleans up stack
;

dyncall/dyncallback/dyncall_callback_arm32_arm_apple.s  view on Meta::CPAN

   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/


.text
.code 32	/* ARM mode */

.globl _dcCallbackThunkEntry
.align 4
/* sizes */
DCThunk_size    =   8
DCArgs_size     =  24
DCCallback_size =  20
DCValue_size    =   8

/* struct DCCallback offsets and size */
CTX_thunk       =   0
CTX_handler     =  12

dyncall/dyncallback/dyncall_callback_arm32_arm_gas.S  view on Meta::CPAN

   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

#include "../dyncall/dyncall_macros.h"

.text
.code 32	/* ARM mode */

.globl dcCallbackThunkEntry

/* sizes */
/* DCThunk_size    =   8 */
/* DCArgs_size     =  24 */ /* for EABI/ATPCS/... */
/* DCArgs_size     =  96 */ /* for armhf          */
/* DCCallback_size =  20 */
DCValue_size    =   8

/* struct DCCallback offsets and size */
/* CTX_thunk       =   0 */

dyncall/dyncallback/dyncall_callback_mips_eabi_gas.s  view on Meta::CPAN


*/

/* input:
	$t4    -> thunk
	$t4+20 -> cb handler
	$t4+24 -> userdata
*/

.text
.globl dcCallbackThunkEntry
.ent   dcCallbackThunkEntry

/* Called by thunk - thunk stores pointer to DCCallback in $12 ($t4), and */
/* pointer to called function in $25 ($t9, required for PIC)              */
dcCallbackThunkEntry:
	.set    noreorder

	/* Prolog. */
	/* Frame size of 88b comes from following: */
	/*   DCargs(fregs:32 + iregs:32 + regcounts:4 + stackptr:4) + retval:8 + ra:4 (+ pad:4) */

dyncall/dyncallback/dyncall_callback_mips_n32.S  view on Meta::CPAN

   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

*/

	.section .mdebug.abiN32
	.previous
	.abicalls
	.text
	.align  2
	.globl dcCallbackThunkEntry
	.ent   dcCallbackThunkEntry
dcCallbackThunkEntry:

	.end dcCallbackThunkEntry

dyncall/dyncallback/dyncall_callback_mips_n64.S  view on Meta::CPAN

SP_LR     = SP_SP-8
SP_RVAL   = SP_SP-16
SP_ARG_SP = SP_SP-24
SP_ARG_RC = SP_SP-32

	.section .mdebug.abi64
	.previous
	.abicalls
	.text
	.align  2
	.globl dcCallbackThunkEntry
	.ent   dcCallbackThunkEntry
dcCallbackThunkEntry:
	.set    noreorder

	/* Prolog. */
	daddiu $sp, $sp, -SP_SP   /* open frame */
	sd     $ra, SP_LR($sp)    /* save link register */

	.frame $fp,SP_SP,$31  /* specify our frame: fp,size,lr; creates virt $fp */
	                      /* code below doesn't use $fp though, as n/a with -O1 */

dyncall/dyncallback/dyncall_callback_mips_o32.S  view on Meta::CPAN

		$t4    -> thunk
		$t4+20 -> cb handler
		$t4+24 -> userdata
	*/

	.section .mdebug.abi32
	.previous
	.abicalls
	.text
	.align  2
	.globl dcCallbackThunkEntry
	.ent   dcCallbackThunkEntry
	.type  dcCallbackThunkEntry, @function

/* Called by thunk - thunk stores pointer to DCCallback in $12 ($t4), and */
/* pointer to called function in $25 ($t9, required for PIC)              */
dcCallbackThunkEntry:
	.set    noreorder

	/* Prolog. Just store the minimum, return address, spill area.     */
	/* Frame size of 56b comes from following areas (each 8b aligned): */

dyncall/dyncallback/dyncall_callback_ppc32_apple.s  view on Meta::CPAN

DCA_SP     = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS
DCA_ICOUNT = DCA_SP + 4
DCA_FCOUNT = DCA_ICOUNT + 4

iregfile = ARGS_OFFSET+DCA_IARRAY
fregfile = ARGS_OFFSET+DCA_FARRAY
save_sp  = ARGS_OFFSET+DCA_SP
icount   = ARGS_OFFSET+DCA_ICOUNT
fcount   = ARGS_OFFSET+DCA_FCOUNT

.globl _dcCallbackThunkEntry

/* 
  Thunk entry:
  r2 = DCCallback*
*/
_dcCallbackThunkEntry:

	mflr    r0
	stw     r0, 8(r1)             /* store return address */
	addi    r12,r1, PAR_OFFSET    /* temporary r12 = parameter area on callers stack frame */

dyncall/dyncallback/dyncall_callback_sparc32.s  view on Meta::CPAN


*/

/* input:
	$i0    -> thunk
	$i0+24 -> cb handler
	$i0+28 -> userdata
*/

.text
.globl dcCallbackThunkEntry

/* Called by thunk - thunk stores pointer to DCCallback */
/* in %g1, and pointer to called function in %g2        */
dcCallbackThunkEntry:

	/* Prolog. */
	/* Frame size of 104b comes from needing storage space for the following: */
	/*   req_reg_save_area:64 + spill:24 + dcargs:4 + retval:8 + pad:4 */
	/* Spill area could theoretically be only 16b, b/c cbHandler function has */
 	/* 4 arguments, but let's be conservative. */ /* cbHandler function might decide to spill (6x4b) @@@ testcode, or rely on 8byte return space in parent stack */

dyncall/dyncallback/dyncall_callback_sparc64.s  view on Meta::CPAN

/* input:
	$i0    -> thunk
	$i0+56 -> cb handler
	$i0+64 -> userdata
*/

/* NOTE: %sp/%fp for v9 are offset, using them needs a "BIAS" of 2047 */
BIAS = 2047

.text
.globl dcCallbackThunkEntry

/* Called by thunk - thunk stores pointer to DCCallback */
/* in %g1, and pointer to called function in %g2        */
dcCallbackThunkEntry:

	/* Prolog. */
	/* Frame size of 336b comes from needing storage space for the following: */
	/*   req_reg_save_area:128 + spill:48 + dcargs:144 + retval:8 + pad:8 */
	/* Spill area could theoretically be only 32b, b/c cbHandler function has */
 	/* 4 arguments, but let's be conservative. */

dyncall/dynload/README.txt  view on Meta::CPAN

3. Section symbols.

4. Register symbols.

5. Global symbols that have been reduced to local scope via a mapfile.

6. For each input file that supplied local symbols, a STT_FILE symbol
   giving the name of the input file is put in the symbol table, 
   followed by the symbols in question.

7. The global symbols immediately follow the local symbols in the
   symbol table. Local and global symbols are always kept separate
   in this manner, and cannot be mixed together.


Dynamic symbol table handling seem to be different among platforms.
Due to System V ABI, one get access to the dynamic symbol table through
the DT_HASH entry in "DYNAMIC" Program Header.

It does not work on x86 on a x86_64 linux 2.6 machine.

A closer look to the binaries in /usr/lib32 revealed, there are differences:

dyncall/dynload/README.txt  view on Meta::CPAN

OS supported prelinking:

linux has prelink
irix has quickstart
solaris has crle

sparc uses STT_REGISTER:
  STT_REGISTER is
    The Sparc architecture has a concept known as a "register symbol". These
    symbols are used to validate symbol/register usage, and can also be
    used to initialize global registers. Other architectures don't use these.







References:
[1] Levin, R. John: Linkers & Loader
[2] System V ABI



( run in 1.091 second using v1.01-cache-2.11-cpan-49f99fa48dc )