view release on metacpan or search on metacpan
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
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
## `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