aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2013-12-28 17:41:33 +0100
committerDrahflow <drahflow@gmx.de>2013-12-28 17:41:33 +0100
commitd245b90de88b762f65a5007c1776206dc7cd72dc (patch)
tree342e65618ef54cf788a10fd8e64ebd52579a5f25 /elymas
parente57558ebe4635cb0183f94c50f9f61e8603807ff (diff)
Reducing memory footprint
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/sys/opt.ey12
-rw-r--r--elymas/lib/sys/so.ey15
-rw-r--r--elymas/lib/txt.ey6
-rw-r--r--elymas/memdump.ey193
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