diff options
| author | Drahflow <drahflow@gmx.de> | 2013-12-28 17:41:33 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-12-28 17:41:33 +0100 |
| commit | d245b90de88b762f65a5007c1776206dc7cd72dc (patch) | |
| tree | 342e65618ef54cf788a10fd8e64ebd52579a5f25 /elymas | |
| parent | e57558ebe4635cb0183f94c50f9f61e8603807ff (diff) | |
Reducing memory footprint
Diffstat (limited to 'elymas')
| -rw-r--r-- | elymas/lib/sys/opt.ey | 12 | ||||
| -rw-r--r-- | elymas/lib/sys/so.ey | 15 | ||||
| -rw-r--r-- | elymas/lib/txt.ey | 6 | ||||
| -rw-r--r-- | elymas/memdump.ey | 193 |
4 files changed, 216 insertions, 10 deletions
diff --git a/elymas/lib/sys/opt.ey b/elymas/lib/sys/opt.ey index 7e90457..8f54e1e 100644 --- a/elymas/lib/sys/opt.ey +++ b/elymas/lib/sys/opt.ey @@ -15,7 +15,7 @@ 8 /r15 :subqImm8Reg /r14 /r15 :movqRegMem /r14 /rsi :movqRegReg - 8 /rdi :movqImmReg + 0 /rdi :movqImmReg # this should match arbitrary INITIALSCOPESIZE, hence 0 0 /rax :movqImmReg /rax :callqReg /rax /r14 :movqRegReg @@ -694,7 +694,13 @@ [ ] ==newOpcodes { newOpcodes -01 cat =newOpcodes }' /emitOpcodes deffst [ ] ==newReferences - { newReferences [ -102 ] cat =newReferences }' /emitReference deffst + { ==ref + [ + { ref 105553116266496 lt } { } # HEAPBASE # FIXME: use a global constant + { ref 123145302310912 ge } { } # %700000000000 + { 1 } { newReferences [ ref ] cat =newReferences } + ] conds + }' /emitReference deffst # [ :ud2 ] emitOpcodes # enable for further development @@ -705,7 +711,7 @@ 8 /r15 :subqImm8Reg /r14 /r15 :movqRegMem /r14 /rsi :movqRegReg - 8 /rdi :movqImmReg + 2 /rdi :movqImmReg # FIXME: this should use INITIALSCOPESIZE ::internalAllocateScope /rax :movqImmReg /rax :callqReg /rax /r14 :movqRegReg diff --git a/elymas/lib/sys/so.ey b/elymas/lib/sys/so.ey index 1a0d367..0b68250 100644 --- a/elymas/lib/sys/so.ey +++ b/elymas/lib/sys/so.ey @@ -832,17 +832,16 @@ # Elf64_Xword sh_entsize; /* Size of entries, if section has table */ s .entsize uint64 } each } each - ] metaSections { .data cat } each ==fileData + ] ==fileHeaders - fileData len str .alloc ==buffer - 0 fileData len range { ==i i fileData * i buffer =[] } each - - buffer out .writeall + 0 ==fileOffset + [ fileHeaders metaSections { .data } each ] { ==data + fileOffset data len add =fileOffset + data str .fromArray out .writeall + } each 1 ==:WRITE - buffer len ==fileOffset - allocSections { ==section section .dataOffset fileOffset sub str .alloc out .writeall section .dataOffset section .dataSize add =fileOffset @@ -862,4 +861,6 @@ } /freeze deffd > /so sys .defv +{ "disabled to free the memory" die } /freeze sys .deff + # vim: syn=elymas diff --git a/elymas/lib/txt.ey b/elymas/lib/txt.ey index faae0ce..01bd495 100644 --- a/elymas/lib/txt.ey +++ b/elymas/lib/txt.ey @@ -27,6 +27,12 @@ { _ { [ -01 10 math .base reverse "0123456789" each ] str .fromArray } { -- "0" } ? * } [ 0 ] [ "" ] ' /u deffd + + # 0 -> positive integer (or zero) + # 0 <- hexadecimal representation as string + { + _ { [ -01 16 math .base reverse "0123456789ABCDEF" each ] str .fromArray } { -- "0" } ? * + } [ 0 ] [ "" ] ' /hu deffd > /produce defvd > /txt defvd diff --git a/elymas/memdump.ey b/elymas/memdump.ey new file mode 100644 index 0000000..e0f8a48 --- /dev/null +++ b/elymas/memdump.ey @@ -0,0 +1,193 @@ +txt .consume .|hu "%" deffd + +%400000000000 ==:MARKBASE +%500000000000 ==:BLOCKBASE +%600000000000 ==:HEAPBASE +%100000000000 ==:ELFBASE + +< + sys .asm .ops ":" via + sys .asm "::" via + + [ # ==addr + 8 /r15 :subqImm8Reg + /r15 :popqMem + + /rax :popqReg + 8 /rax /rax :movqMemDisp8Reg # this should be a boxed integer + /rax :pushqMem # load data to stack + ::internalAllocateInteger /rax :movqImmReg + /rax :callqReg + 8 /rax :popqMemDisp8 # store data to integer object + /rax :pushqReg + + /r15 :pushqMem + 8 /r15 :addqImm8Reg + :retn + ] [ ] sys .asm .createFunction +> -- /peek64 deffd + +sys .linux "+" via + +< + "shared" +ORDONLY 0 +open ==fd + fd +fstat -- # TODO: handle errors + .size ==s + ELFBASE s +PROTREAD +MAPPRIVATE fd 0 +mmap ELFBASE eq assert +> -- + +ELFBASE 32 add peek64 _ dump ==phdr +ELFBASE 56 add peek64 65536 mod _ dump ==phdrCount + +[ + phdrCount { + ELFBASE phdr add peek64 %100000000 mod 1 eq { # LOAD program header + < + ELFBASE phdr add 8 add peek64 ==fileStart + ELFBASE phdr add 16 add peek64 ==memoryStart + ELFBASE phdr add 32 add peek64 memoryStart add ==memoryEnd + > + } rep + phdr %38 add =phdr + } rep +] _ ==memoryLayout + +{ =*f _ =*a len ==maxI 0 ==i + { + i maxI lt { i a f } { 0 } ? * + } { i 1 add =i } loop +} /eachWhile deffd + +{ ==addr + memoryLayout { ==m + [ + { addr m .memoryStart lt } { 1 } + { addr m .memoryEnd ge } { 1 } + { 1 } { + addr m .memoryStart sub m .fileStart add ELFBASE add peek64 + 0 # loop done + } + ] conds + } eachWhile +} /peekElf64 deffst + +HEAPBASE peekElf64 %2E00000000000248 eq assert + +sys .asm .|programStart sys .asm .rawCodeAddress { add peekElf64 }_ =*peekProgramStart +2 peekProgramStart _ dump ==initialRsp +12 peekProgramStart _ dump ==initialR15 +32 peekProgramStart HEAPBASE add _ dump ==HEAPEND +78 peekProgramStart _ dump ==initialR14 + +< + HEAPEND HEAPBASE sub 16 div 8 div str .alloc _ str .zero ==objectSeen + { + HEAPBASE sub 16 div _ objectSeen str .bitTest -01 + objectSeen str .bitSet + } +> -- /seen deffst + + +1 neg ==indent +{ ==addr ==header + indent { " " sys .out .writeall } rep + header sys .out .writeall + " " sys .out .writeall + addr txt .produce .hu sys .out .writeall + "\n" sys .out .writeall +} /out deffst + +{ ==addr ==header ==type + indent { " " sys .out .writeall } rep + header sys .out .writeall + " " sys .out .writeall + addr txt .produce .hu sys .out .writeall + " " sys .out .writeall + type sys .out .writeall + "\n" sys .out .writeall +} /out2 deffst + +{ ==addr + indent 1 add =indent + [ + { addr HEAPBASE lt } { "--<low>---" addr out } + { addr HEAPEND ge } { "--<high>--" addr out } + { addr seen } { "--<seen>--" addr out } + { 1 } { + { "----------" addr out2 } ":" deffst + addr peekElf64 %1000000000000000 div + [ + { :integer } + { :string + addr 16 add peekElf64 "len:" -01 out + addr 24 add peekElf64 256 math .base str .fromArray 0 out + } + { :scope + addr peekElf64 %00000000FFFFFFFF band _ "len:" -01 out 8 div 1 -01 range { + 8 mul addr add peekElf64 dumpElf + } each + } + { :name_table + addr 8 add peekElf64 _ "fill:" -01 out 16 div 1 -01 range { + 16 mul addr add peekElf64 dumpElf + } each + } + { :extension_area + addr peekElf64 %00000000FFFFFFFF band _ "len:" -01 out 8 div 1 -01 range { + 8 mul addr add peekElf64 dumpElf + } each + } + { :function + addr 8 add peekElf64 dumpElf + addr 16 add peekElf64 dumpElf + addr 24 add peekElf64 dumpElf + } + { :function_code + addr 16 add peekElf64 %FFFF band %B848 eq + addr 26 add peekElf64 %FFFF band %E0FF eq and + { + addr 18 add peekElf64 16 sub dumpElf + } { + addr 8 add peekElf64 _ "oplen:" -01 out ==oplen + addr peekElf64 %00000000FFFFFFFF band _ "len:" -01 out 8 div 2 oplen 8 div add -01 range { + 8 mul addr add peekElf64 dumpElf + } each + } ? * + } + { :array + addr peekElf64 %00000000FFFFFFFF band _ "len:" -01 out 8 div 1 -01 range { + 8 mul addr add peekElf64 dumpElf + } each + } + { :function_type + addr peekElf64 %00000000FFFFFFFF band _ "len:" -01 out 8 div 1 -01 range { + 8 mul addr add peekElf64 dumpElf + } each + } + { :errornous_9 } + { :errornous_A } + { :errornous_B } + { :errornous_C } + { :errornous_D } + { :errornous_E } + { :errornous_F } + ] * * + } + ] conds + indent 1 sub =indent +} /dumpElf deffst + +"=== From current scope ===\n" sys .out .writeall +initialR14 dumpElf +"=== From current data stack ===\n" sys .out .writeall +{ initialRsp %FFFF band } { + initialRsp peekElf64 dumpElf + initialRsp 8 add =initialRsp +} loop +"=== From current call stack ===\n" sys .out .writeall +{ initialR15 %FFFF band } { + initialR15 peekElf64 dumpElf + initialR15 8 add =initialRsp +} loop + +# vim: syn=elymas |
