Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Compilation Methods SS 2013 - File risc.burg

%{
/* example application of BURG, demonstrates tree cover with patterns */

/* required headers of standard library */
#include <stdio.h>
#include <stdlib.h>

/* datatype of the tree nodes to cover
   (state_label is used internally by BURG) */
typedef struct node *NODEPTR_TYPE;

struct node {
	int op, state_label;
	NODEPTR_TYPE left, right;
};

/* access macros for components of tree nodes as required by BURG */
#define OP_LABEL(p)	((p)->op)
#define STATE_LABEL(p)	((p)->state_label)
#define LEFT_CHILD(p)	((p)->left)
#define RIGHT_CHILD(p)	((p)->right)
#define PANIC		printf
%}

/* declare start symbol for root of cover and valid operators at tree nodes */
%start Stmt
%term iconst=1 var=2 iadd=3 deref=4 assign=5
%%
IConst: iconst			= 1 (0);
         /* use constant as constant, emits no code */
IReg:   iconst			= 2 (1);
         /* load constant into register: move #const, Rn */
IReg:   var			= 3 (2);
         /* load address of variable into register: addr #var, Rn */
IReg:   iadd(IReg, IReg)	= 4 (2);
         /* add contents of two registers: add Ra, Rb, Rsum */
IReg:   iadd(IReg, IConst)	= 5 (2);
         /* add constant to contents of register: add Ra, #const, Rsum */
IReg:   deref(IReg)		= 6 (3);
         /* load value from memory: load Raddr, Rvalue */
Stmt:   assign(IReg, IReg)	= 7 (2);
         /*store value into memory: store Raddr, Rvalue */ 

/* add further tree patterns HERE:

value descriptor: tree fragment	= id number of pattern (cost);

Tree patterns must be numbered continously without gaps: 8, 9, ...
Cost value are taken from a specification of the target processor.
For example, cost values match the expected execution time of the
emitted code in clock cycles. */
%%

#include "utils.c"	/* auxiliary functions, not related to patterns */

int main(void)
{
	/* construct the tree to be covered:
        
           intermediate language code tree for the C sourcecode fragment
           {
              int v[8];
              struct { int x, y; } p;
              p.y = v[7] + 9;
           }
           
                            assign
                           /      \
                     ------        ------
                    /                    \
                iadd                      iadd
               /    \                    /    \
          var p      iconst 4       deref      iconst 9
                                      |
                                    iadd
                                   /    \
                              var v      iconst 28
        */

	NODEPTR_TYPE tree;
	tree = assign(iadd(var, iconst), iadd(deref(iadd(var, iconst)), iconst));

	printf("Tree:\n");
	printtree(tree);	/* output original tree unmodified */
	printf("\n\nCover:\n");
	burm_label(tree);	/* preprocess tree (annotate with relative costs) */
        /* output tree cover with patterns used */
	printcover(tree, 1, 0);
        /* output total cost of all patterns used */
	printf("\nCover cost == %d\n\n", treecost(tree, 1, 0));
	return 0;
}

Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 13.06.2017