Issues in Code Generation

18
Issues in Code Generation CPSC 388 Ellen Walker Hiram College

description

Issues in Code Generation. CPSC 388 Ellen Walker Hiram College. Address Calculation. Variables Look up the “address” in the symbol table Arrays & Structures Look up base address, compute and add offset Pointers Generate code for indirect reference. - PowerPoint PPT Presentation

Transcript of Issues in Code Generation

Page 1: Issues in Code Generation

Issues in Code Generation

CPSC 388Ellen WalkerHiram College

Page 2: Issues in Code Generation

Address Calculation

• Variables – Look up the “address” in the symbol table

• Arrays & Structures– Look up base address, compute and add offset

• Pointers– Generate code for indirect reference

Page 3: Issues in Code Generation

Address Calculation Tools in 3-Address Code

• Operators from C– &x address of x– *x value contained in location x

• Addressing Modes– None data as before (x)– Address address of data (&x)– Indirect pointer to data (*x)

Page 4: Issues in Code Generation

3-Address Example: x=A[i]

Assume: int A[i], sizeof(int) = 2Allow the operator t = a[x] (array ref op)

t1 = i * 2 compute indext2 = &A + t1 compute array addrt3 = *t2 get the valuex = t3 assign to x

Page 5: Issues in Code Generation

Address Calculation Tools in PCode

• IND x– Add x to top of stack, use result as an address of item to push onto the stack

• IXA x– Calculate address as (top)*x+(top-1), push address onto stack

Page 6: Issues in Code Generation

Pcode Example: x=A[i]

Assume: int A[i], sizeof(int) = 2

LDA x load address of x (for later

LDA A load address of A

LOD i load value of i

IXA 2 calculate (&A+2*i)

IND 0 Load item at that address

STO store it in x

Page 7: Issues in Code Generation

Pcode Generation for Arrays

• Add subscript ([]) operation to syntax tree (OpKind = subs)

• Add a parameter (isAddr) to the code generation function: – false return the value of the expression

– true return the address of the expression

• You get C-style multi-D arrays for free (arrays of arrays…)

Page 8: Issues in Code Generation

New Case in GenCode

case ‘[]’: //Array indexcout << “LDA “ << t->first-

>name;Gen_code(t->first->next, false);cout << “IXA sizeof(“ << t-

>first->name << “)”;

if (!isAddr) cout << “IND 0”break;

Page 9: Issues in Code Generation

Revised to allow Multi-dimensional Arrays

case ‘[]’: //Array index //push addressgen_code(t->first, true); //push indexgen_code(t->first->next, false);

cout << “IXA sizeof(“ << t->first->name << “)”;

if (!isAddr) cout << “IND 0”break;

Page 10: Issues in Code Generation

Write Pcode for ...

• A[i+1] = 2*A[i]• x = A[y][z]

• Assume: – double A – sizeof(double) =4– sizeof (double *) = 1

Page 11: Issues in Code Generation

Class/Struct References

• Address of element is base + offset• Base is address of class• Offset is sum of sizes of all elements previous (offset of 1st item is 0)

• Pointer can be treated as struct with base 0, offset = pointer value!

Page 12: Issues in Code Generation

Address computation

• Assume sizeof int=2, sizeof double=4– class st{ int A1, double A2, double A3};

– St x;

• Addresses:– &(x.A1) = &x– &(x.A2) = &x + 2– &(x.A3) = &x + 6

Page 13: Issues in Code Generation

Offset computation

• Add function: field_offset(st,field) returns the integer offset of field from the beginning of st

• Computing the address of x.j– t1 = &x + field_offset (x,j) (3 addr)

– LDA x; LOD field_offset(x,j); IXA 1 (Pcode)

Page 14: Issues in Code Generation

Example (pointer & class)

class tN{int val;class tN *left; class tN *right; };

tN *p;

p = p->right;

Page 15: Issues in Code Generation

Pcode (p = p->right)

• LDA p //for storing result

• LOD p //push p (an address)

• IND fieldoffset(tN,right); //*(p + offset)

• STN // store in p

Page 16: Issues in Code Generation

Generating Control Code

• All control statements can be constructed from IF and WHILE

• Two additional instructions are needed– FJP jump if false conditional jump

– UJP jump unconditional jump

• Need to be able to generate and assign labels to statements

Page 17: Issues in Code Generation

Code for IF

• if <E> <S1> else <S2> • In pcode:

– Code to compute and push E– FJP Label1– Code to execute S1– UJP Label 2– Label1: code to execute S2– Label2:

Page 18: Issues in Code Generation

Code for While

• while <E> <S1>• In pcode:

– Label1: Code to compute and push E

– FJP Label2– Code to execute S1– UJP Label 1– Label2: