From 00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 Mon Sep 17 00:00:00 2001 From: Drahflow Date: Fri, 4 Oct 2013 13:19:23 +0200 Subject: Better argument type handling for SOs --- elymas/lib/sys/so.ey | 48 ++++++++++++++++++++++++------- examples/working-loaded/sharedObject.test | 4 +++ 2 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 examples/working-loaded/sharedObject.test 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 -- cgit v1.2.3