issues in code generation

18
Issues in Code Generation CPSC 388 Ellen Walker Hiram College

Upload: zada

Post on 06-Jan-2016

96 views

Category:

Documents


0 download

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

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: