aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-10-04 13:19:23 +0200
committerDrahflow <drahflow@gmx.de>2013-10-04 13:19:23 +0200
commit00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 (patch)
treed883026cc982758757236dd25ec449f378920e4f
parentef3ff192922d1b3a51ee85de64c210f0e8101271 (diff)
Better argument type handling for SOs
-rw-r--r--elymas/lib/sys/so.ey48
-rw-r--r--examples/working-loaded/sharedObject.test4
2 files changed, 42 insertions, 10 deletions
diff --git a/elymas/lib/sys/so.ey b/elymas/lib/sys/so.ey
index 15bd751..d40e5ef 100644
--- a/elymas/lib/sys/so.ey
+++ b/elymas/lib/sys/so.ey
@@ -332,22 +332,50 @@
# "--------------------------------" dump
} /loadFile deffd
- # resolves a C function taking only pointer and integer arguments
- # 0 -> number of arguments
+ # resolves a C function
+ # 0 -> argument specification string
+ # "iis" == foo(int, int, char *)
+ # i: integer argument (of any width), also used for general pointers
+ # s: string argument (pointer to string content passed)
# 1 -> name of symbol
# the resulting function will take as many arguments as specified and return a single integer
{ ==args ==name
- [ /rdi /rsi /rdx /rcx /r8 /r9 ] =*:availableRegisters
+ [ /rdi /rsi /rdx /rcx /r8 /r9 ] =*:availableIntegerRegisters
+ 0 ==nextIntegerRegister
[
+ args { ==t [
+ { t 0 "i" * eq }' {
+ nextIntegerRegister availableIntegerRegisters ==reg
+ nextIntegerRegister 1 add =nextIntegerRegister
+
+ [
+ reg :popqReg
+ 63 reg :btrqImm8Reg
+ [ 8 reg reg :movqMemDisp8Reg ] len :jcRel8
+ 8 reg reg :movqMemDisp8Reg
+ ]
+ }
+ { t 0 "s" * eq }' {
+ nextIntegerRegister availableIntegerRegisters ==reg
+ nextIntegerRegister 1 add =nextIntegerRegister
+
+ [
+ reg :popqReg
+ 24 reg :addqImm8Reg
+ ]
+ }
+ { 1 }' {
+ t dump
+ "unknown argument semantics argument" die
+ }
+ ] conds } each
+ ] ==argumentLoaders
+
+ [
/rbx :popqReg
- 0 args range reverse { availableRegisters ==reg
- reg :popqReg
- 63 reg :btrqImm8Reg
- [ 8 reg reg :movqMemDisp8Reg ] len :jcRel8
- 8 reg reg :movqMemDisp8Reg
- } each
+ argumentLoaders reverse { _ len dearray } each
symbols name . .value /rax :movqImmReg
/rax :callqReg
@@ -380,7 +408,7 @@
/rbx :pushqReg
:retn
] [ ] ::createFunction
- } /resolveIntegerFunction deffd
+ } /resolveFunction deffd
> /so sys .defv
# vim: syn=elymas
diff --git a/examples/working-loaded/sharedObject.test b/examples/working-loaded/sharedObject.test
new file mode 100644
index 0000000..c28b7f1
--- /dev/null
+++ b/examples/working-loaded/sharedObject.test
@@ -0,0 +1,4 @@
+"lib/sys/so.ey" include
+"/lib/x86_64-linux-gnu/libc.so.6" sys .so .loadFile
+ 1 "Hello World\n" 12
+"write" "isi" sys .so .resolveFunction * dump