diff options
| author | Drahflow <drahflow@gmx.de> | 2013-10-04 13:19:23 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-10-04 13:19:23 +0200 |
| commit | 00feca5e1e9bd4e1625a76fc548b06f05a0e88f8 (patch) | |
| tree | d883026cc982758757236dd25ec449f378920e4f /elymas | |
| parent | ef3ff192922d1b3a51ee85de64c210f0e8101271 (diff) | |
Better argument type handling for SOs
Diffstat (limited to 'elymas')
| -rw-r--r-- | elymas/lib/sys/so.ey | 48 |
1 files changed, 38 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 |
