Presentation is loading. Please wait.

Presentation is loading. Please wait.

Code Generation How to produce intermediate or target code.

Similar presentations


Presentation on theme: "Code Generation How to produce intermediate or target code."— Presentation transcript:

1 Code Generation How to produce intermediate or target code

2 2301373Code Generation2 Outline  Intermediate code Three-address code P-code  Code generation techniques Using attribute grammar Tree traversal Macro expansion  Address Calculation  Code generation for control statements  Code generation for logical expressions

3 2301373Code Generation3 Intermediate Code  Intermediate representation for programs  Why intermediate code Reduce amount of work if optimization is done for intermediate code Easy for retargeting compilers  Forms of intermediate code Abstract syntax tree Linearization of abstract syntax tree

4 2301373Code Generation4 Three-address code: Form of Instructions  x = y op z x, y, and z are addresses of  Variables (perhaps temporaries)  Locations in programs y and z must be differed from x  Operators can be: Arithmetic operators (3-address) Relational operators (3-address) Conditional operators (2-address)  If_false … goto … Jump (1-address) Input/Output Halt  Labels can be assigned to a location

5 2301373Code Generation5 Example of 3-address Code read (x); if x>0 then {fact:=1; repeat {fact:=fact*x; x:=x-1; } until x==0; write(fact); } read x t1=x>0 if_false t1 goto L1 fact=1 label L2 t2=fact*x fact=t2 t3=x-1 x=t3 t4=x==0 if_false t4 goto L2 write fact label L1 halt

6 2301373Code Generation6 P-Code  Code for a hypothetical stack machine  For Pascal compilers  No variable name is required  Instructions Load stack Arithmetic and relational operators Jumps  Operations are performed on topmost values on stack  0-address or 1-address instructions

7 2301373Code Generation7 P-code Instruction  Load: push stack Load value Load address Load constant  Store: save top of stack in memory Destructive store Nondestructive store  Arithmetic operations Add Subtract Multiply  Compare Greater Less equal  Label  Jump Unconditional jump Conditional jump  I/O Read write  Stop

8 2301373Code Generation8 Example of P-code read (x); if x>0 then {fact:=1; repeat {fact:=fact*x; x:=x-1; } until x==0; write(fact); } loada x read loadv x loadc 0 greater jumpONfalse L1 loada fact loadc 1 store label L2 loada fact loadv fact loadv x mult store loada x loadv x loadc 1 sub store loadv x loadc 0 equ jumpF L2 loadv fact write label L1 stop

9 2301373Code Generation9 Code Generation Using Synthesizes Attributes  An attribute is created for the sequence of characters representing generated code.  An attribute grammar is written to generate the intermediate/target code.  The value of the attribute is passed from child nodes upto their parent node to construct a larger chunk of code

10 2301373Code Generation10 Attribute Grammar for P-code Grammar Rules exp 1 -> id = exp 2 exp -> aexp aexp 1 - >aexp 2 + factor aexp -> factor factor -> ( exp ) factor -> num factor -> id Semantic Rules exp 1.code =“loada” || id.strval ++ exp 2.code ++ ”stn” exp.code = aexp.code aexp 1.code = aexp 2.code ++ factor.code ++ “add” aexp.code = factor.code factor.code = exp.code factor.code = “loadc ” || num.strval factor.code = “loadv ” || id.strval

11 2301373Code Generation11 Generating P-Code:Example exp = id exp aexp factor + () aexp factor + num id num loada x loadv x loadc 3 adi stn loadc 4 adi loadc 4 loada x loadv x loadc 3 adi stn loadv x loadc 3 adi loadv x loadc 3 loadv x loadc 3 adi loada x loadv x loadc 3 adi stn loada x loadv x loadc 3 adi stn loada x loadv x loadc 3 adi stn loadc 4 adi

12 2301373Code Generation12 Attribute Grammar for 3-address Code Grammar Rules exp 1 -> id = exp 2 exp -> aexp aexp 1 - >aexp 2 +fac tor aexp -> factor factor -> ( exp ) factor -> num factor -> id Semantic Rules exp 1.name = exp 2.name; exp 1.code=exp 2.code++id.strval ||”=“||exp 2.name exp.name = aexp.name; exp.code = aexp.code exp 1.name = newtemp(); aexp 1.code=aexp 2.code++facto r.code++ aexp 1.name||”=“||aexp 2.name||”+“||factor.name aexp.name=factor.name;aexp.c ode=factor.code factor.name =exp.name; factor.code = exp.code factor.name = num.strval; factor.code = “” factor.name = id.strval; factor.code = “”

13 2301373Code Generation13 Generating 3-address Code:Example exp = id exp aexp factor + () aexp factor + num id num x 4 x t1 t1=x+3 3 t1 t1=x+3 t1 t1=x+3 x=t1 t1 t1=x+3 x=t1 t1 t1=x+3 x=t1 t2 t1=x+3 x=t1 t2=t1+4 t2 t1=x+3 x=t1 t2=t1+4 4

14 2301373Code Generation14 Practical Code Generation: Tree Traversal procedure genCode ( t : node ) { if ( t is not null) then {generate code to prepare for code of left child; genCode (left child of t ); generate code to prepare for code of right child; genCode (right child of t ); generate code to implement the action of t ; }

15 2301373Code Generation15 Practical Code Generation for P-code gencode ( T : Tree ) { if ( T is not null) { switch ( T. type ) case plusnode : { gencode ( T. lchild ); gencode ( T. rchild ); emitCode(“add”); } case asgnnode : { emitcode( “loada”, T. strval ); gencode ( T.r child ); emitcode (“stn”); } case constnode : { emitcode (“loadc”, t. strval ); } case idnode : { emitcode (“loadv”, t. strval ); } default : { emitcode (“error”); } }

16 2301373Code Generation16 Macaro Expansion  From intermediate code to target code  Example: 3-address code: x=y+n P code: loada x loadv y loadc n adi sto

17 2301373Code Generation17 Address Calculation  Addressing operations  Array references  Record structure references

18 2301373Code Generation18 Addressing Operations 3-address code address of x  &x indirect address (content pointed by x)  *x P-code address of x  loada x indirect load  ind x  (load *(top+ x)) indexed address  ixa x  (load top*x+(top-1))

19 2301373Code Generation19 Array References 3-address code  x=a[i] t1=i*elesize(a) t2=&a+t1 x=*t2  a[i]=x t1=i*elesize(a) t2=&a+t1 *t2=x P-code  x=a[i] loada x loada a loadv i ixa elesize(a) ind 0 sto  a[i]=x loada a loadv i ixa elesize(a) loadv x sto Find offset Find address Find offset Find address Find content

20 2301373Code Generation20 More Complex Array References 3-address code  a[i+1]=a[j+2]+3 t1=j+2 t2=t1*elesize(a) t3=&a+t2 t4=*t3 t5=t4+3 t6=i+1 t7=t6*elesize(a) t8=&a+t7 *t8=t5 P code  a[i+1]=a[j+2]+3 loada a loadv i loadc 1 adi ixa elesize(a) loada a loadv j loadc 2 adi ixa elesize(a) ind 0 loadc 3 adi sto t4=a[t1] a[t6]=t5t1=a[j+2] t2=&a[i+1] a[t6]=t5 t4=a[t1] t2=&a[i+1] t1=a[j+2]

21 2301373Code Generation21 Structure References typedef struct rec {int i; char c; int j; } Entry; Entry x; 3-address code  Address of a field t1=&x+offset(x,j)  Content of a field t1=&x+offset(x,j) t2=*t1 P code  Address of a field loada x loadc offset(x.j) ixa 1  Content of a field loada x ind offset(x.j) x.i x.j x.c base address of x Offset of x.j Offset of x.c

22 2301373Code Generation22 Code Generation for Control Statements  If Statements  While Statements  Logical Expressions

23 2301373Code Generation23 Code Generation for If-Statements IF ( E ) S1 ELSE S2  3-address code <code evaluating E and assigning to t1> if_false t1 goto L1 goto L2 label L1 label L2  P code jumpF L1 jump L2 label L1 label L2

24 2301373Code Generation24 Code Generation for While-Statements WHILE ( E ) S  3-address code label L1 <code evaluating E and assigning to t1> if_false t1 goto L2 goto L1 label L2  P code label L1 jumpF L2 jump L1 label L2

25 2301373Code Generation25 Generating Labels  Forward jump Label must be generated before defining the label  For intermediate code Generate label at the jump instruction Store the label until the actual location is found  For target code (assembly) Leave the destination address in the jump instruction When the destination address is found, go back and fill the address (backpatching) Short jump or long jump?  Leave space enough for long jump  If only short jump is required, the extra space is filled with nop. label L1 jumpF L2 jump L1 label L2

26 2301373Code Generation26 Code Generation for Logical Expressions  Data types and operators Use Boolean data type and operators if included in the target/intermediate language Use integer 0/1 and bitwise opeartors  Short-circuit evaluation IF a AND b THEN S  If a is false, the whole exp is false there is no need to evaluate b IF a OR b THEN S  If a is true, the whole exp is true there is no need to evaluate b  Intermediate code for IF a AND b THEN S if_false a goto L1 if_false b goto L1 Label L1  Intermediate code for IF a OR b THEN S if_false a goto L1 goto L2 Label L1 if_false b goto L3 Label L2 Label L3


Download ppt "Code Generation How to produce intermediate or target code."

Similar presentations


Ads by Google