scc

simple C compiler
git clone git://git.2f30.org/scc
Log | Files | Refs | README | LICENSE

commit 5e5442e6bf058c1f8b7b9674ae008670cdadeae2
parent 4e77e2893bf01a51a32326effbac1f0ef3610cbd
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Thu, 27 Mar 2014 18:49:20 +0100

Add reverse enginnering of the intermediate code of Solid C

I like how this guy did this code, so I want to use it as base
for the intermediate code I am going to write.

Diffstat:
Aopcode.txt | 133+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 133 insertions(+), 0 deletions(-)

diff --git a/opcode.txt b/opcode.txt @@ -0,0 +1,133 @@ +Ax -> automatic variable number x +Tx -> static variable number x +Gx -> global variable with name x +Xx -> global function with name x +Yx -> static function with name x +Lx -> label number x +Px -> parameter number x +Mx -> member number x + +@ -> content of variable +#x -> size of type x (R, I, C, W, N, Z, Q, H, Sx, Ux) +#x -> integer constant of value x +##x -> float constant of value x +#%x -> long constant of value x +" -> begin of string, each element is coded in decimal and comma (better in hexa!!) +a -> take address +:x -> assign of type x ++x -> sum of type x +-x -> substraction of type x +*x -> multiplication of type x +/x -> division of type x +; -> used in post operators (A2++ -> A2 #1 ;+I) +: -> used in pre operators (++A2 -> A2 #1 :+I) +. -> struct field +_x -> sign negation of type x +~x -> logic negation of type x +%x -> modulo of type x +lx -> left shift of type x +rx -> right shift of type x +>x -> greater than of type x +<x -> less than of type x +[x -> less or equal of type x +]x -> greater or equal of type x +=x -> equal of type x +!x -> not equal of type x +&x -> logical and of type x +|x -> logical or of type x +^x -> logical exor of type x +m -> and (last two stack values) +s -> or (last two stack values) +` -> index array (*(val1 + val2)) +:yx -> operation y and assign of type x +:x -> assign of type x +?x -> ternary of type x (cond val1 val2) +cx -> call to function of type x +px -> pass parameter to function of type x +Fx -> x number of parameters passed in a function call +, -> comma operator (last two stack values) +d -> begin of loop +b -> end of loop +j -> jump (next stack value is the label) +yx -> return of type x +ex -> switch of type x +w -> case (next stack value is label and next is value) +n -> no operation (it is used in ! and in for conditions) +E -> no operation (it is used to mark end of function declaration) + +Conversions: +---------- +Sx -> struct number x +Ux -> union number x +Vx -> vector number x +R -> pointer +I -> integer +C -> char +W -> long +N -> unsigned +Z -> unsigned long +Q -> float +H -> double +F -> function + + +xy -> conversion from y to x + + +Examples: +--------- + +int +main() +{ + int i; + float v = 3.0; + + i = i != v; +} + +-> + +Xmain I F E +{ +A1 I +A2 I +A3 Q + A3 ##4130000 QH :Q + A1 A1 QI A3 !Q #1 #0 ?I :I +} + +------------------------------------------- + +struct pepe { + int i, j; + struct p2 { + int k; + } k; +}; + +int +main() +{ + int i; + struct pepe p; + + i += p.i + p.k.k; +} + +-> + +S4 ( +M5 I +) +S1 ( +M2 I +M3 I +M6 S4 +) +Xmain I F E +{ +A7 I +A8 S1 + A7 A8 M2 . A8 M6 . M5 . +I :+I +}