Esempio n. 1
0
static void freeexp (FuncState *fs, expdesc *e) {
  if (e->k == VNONRELOC)
    freereg(fs, e->u.s.info);
}
Esempio n. 2
0
/*
 * Executes a program.
 */
PUBLIC int sys_execve(const char *filename, const char **argv, const char **envp)
{
	int i;                /* Loop index.          */
	struct inode *inode;  /* File inode.          */
	struct region *reg;   /* Process region.      */
	addr_t entry;         /* Program entry point. */
	addr_t sp;            /* User stack pointer.  */
	char *name;           /* File name.           */
	char stack[ARG_MAX];  /* Stack size.          */

	/* Get file name. */
	if ((name = getname(filename)) == NULL)
		return (curr_proc->errno);

	/* Build arguments before freeing user memory. */
	kmemset(stack, 0, ARG_MAX);
	if (!(sp = buildargs(stack, ARG_MAX, argv, envp)))
	{
		putname(name);
		return (curr_proc->errno);
	}

	/* Get file's inode. */
	if ((inode = inode_name(name)) == NULL)
	{
		putname(name);
		return (curr_proc->errno);
	}

	/* Not a regular file. */
	if (!S_ISREG(inode->mode))
	{
		putname(name);
		inode_put(inode);
		return (-EACCES);
	}

	/* Not allowed. */
	if (!permission(inode->mode, inode->uid, inode->gid, curr_proc, MAY_EXEC, 0))
	{
		putname(name);
		inode_put(inode);
		return (-EACCES);
	}

	/* Close file descriptors. */
	for (i = 0; i < OPEN_MAX; i++)
	{
		if (curr_proc->close & (1 << i))
			do_close(i);
	}

	/* Detach process memory regions. */
	for (i = 0; i < NR_PREGIONS; i++)
		detachreg(curr_proc, &curr_proc->pregs[i]);
	
	/* Reset signal handlers. */
	curr_proc->restorer = NULL;
	for (i = 0; i < NR_SIGNALS; i++)
	{
		if (curr_proc->handlers[i] != SIG_DFL)
		{
			if (curr_proc->handlers[i] != SIG_IGN)
				curr_proc->handlers[i] = SIG_DFL;
		}
	}
	
	/* Load executable. */
	if (!(entry = load_elf32(inode)))
		goto die0;

	/* Attach stack region. */
	if ((reg = allocreg(S_IRUSR | S_IWUSR, PAGE_SIZE, REGION_DOWNWARDS)) == NULL)
		goto die0;
	if (attachreg(curr_proc, STACK(curr_proc), USTACK_ADDR - 1, reg))
		goto die1;
	unlockreg(reg);

	/* Attach heap region. */
	if ((reg = allocreg(S_IRUSR | S_IWUSR, PAGE_SIZE, REGION_UPWARDS)) == NULL)
		goto die0;
	if (attachreg(curr_proc, HEAP(curr_proc), UHEAP_ADDR, reg))
		goto die1;
	unlockreg(reg);
	
	inode_put(inode);
	putname(name);

	kmemcpy((void *)(USTACK_ADDR - ARG_MAX), stack, ARG_MAX);
	
	user_mode(entry, sp);
	
	/* Will not return. */
	return (0);

die1:
	unlockreg(reg);
	freereg(reg);
die0:
	inode_put(inode);
	putname(name);
	die(((SIGSEGV & 0xff) << 16) | (1 << 9));
	return (-1);
}
Esempio n. 3
0
/*
 * Loads an ELF 32 executable.
 */
PRIVATE addr_t load_elf32(struct inode *inode)
{
	int i;                  /* Loop index.                    */
	addr_t addr;            /* Region address.                */
	addr_t entry;           /* Program entry point.           */
	struct elf32_fhdr *elf; /* ELF file header.               */
	struct elf32_phdr *seg; /* ELF Program header.            */
	block_t blk;            /* Working block number.          */
	buffer_t header;        /* File headers block buffer.     */
	struct region *reg;     /* Working memory region.         */
	struct pregion *preg;   /* Working process memory region. */
	
	blk = block_map(inode, 0, 0);
	
	/* Empty file. */
	if (blk == BLOCK_NULL)
	{
		curr_proc->errno = -ENOEXEC;
		return (0);
	}
	
	/* Read ELF file header. */
	header = bread(inode->dev, blk);
	elf = buffer_data(header);
	
	/* Bad ELF file. */
	if (!is_elf(elf))
	{
		brelse(header);
		curr_proc->errno = -ENOEXEC;
		return (0);
	}
	
	/* Bad ELF file. */
	if (elf->e_phoff + elf->e_phnum*elf->e_phentsize > BLOCK_SIZE)
	{
		brelse(header);
		curr_proc->errno = -ENOEXEC;
		return (0);
	}
	
	seg = (struct elf32_phdr *)((char *)buffer_data(header) + elf->e_phoff);
	
	/* Load segments. */
	for (i = 0; i < elf->e_phnum; i++)
	{
		/* Not loadable. */
		if (seg[i].p_type != PT_LOAD)
			continue;
		
		/* Broken executable. */
		if (seg[i].p_filesz > seg[i].p_memsz)
		{
			kprintf("broken executable");
			
			brelse(header);
			curr_proc->errno = -ENOEXEC;
			return (0);
		}
		
		addr = ALIGN(seg[i].p_vaddr, seg[i].p_align);
		
		/* Text section. */
		if (!(seg[i].p_flags ^ (PF_R | PF_X)))
		{
			preg = TEXT(curr_proc);
			reg = allocreg(S_IRUSR | S_IXUSR, seg[i].p_memsz, 0);
		}
		
		/* Data section. */
		else
		{
			preg = DATA(curr_proc);
			reg = allocreg(S_IRUSR | S_IWUSR, seg[i].p_memsz, 0);
		}
		
		/* Failed to allocate region. */
		if (reg == NULL)
		{
			brelse(header);
			curr_proc->errno = -ENOMEM;
			return (0);
		}
		
		/* Attach memory region. */
		if (attachreg(curr_proc, preg, addr, reg))
		{
			freereg(reg);
			brelse(header);
			curr_proc->errno = -ENOMEM;
			return (0);
		}
		
		loadreg(inode, reg, seg[i].p_offset, seg[i].p_filesz);
		
		unlockreg(reg);	
	}
	
	entry = elf->e_entry;
	
	brelse(header);
	
	return (entry);
}
Esempio n. 4
0
void
freetree(struct trenod *t)
{
	if (t)
	{
		int type;

		type = t->tretyp & COMMSK;

		switch (type)
		{
			case TFND: {
				struct fndnod *f = fndptr(t);

				if (f->fndref > 0) {
					f->fndref--;
					return;
				}
				free(f->fndnam);
				freetree(f->fndval);
				break;
			}

			case TCOM:
				freeio(comptr(t)->comio);
				free_arg(comptr(t)->comarg);
				free_arg(comptr(t)->comset);
				break;

			case TFORK:
				freeio(forkptr(t)->forkio);
				freetree(forkptr(t)->forktre);
				break;

			case TPAR:
				freetree(parptr(t)->partre);
				break;

			case TFIL:
			case TLST:
			case TAND:
			case TORF:
				freetree(lstptr(t)->lstlef);
				freetree(lstptr(t)->lstrit);
				break;

			case TFOR:
			{
				struct fornod *f = (struct fornod *)t;

				free(f->fornam);
				freetree(f->fortre);
				if (f->forlst)
				{
					freeio(f->forlst->comio);
					free_arg(f->forlst->comarg);
					free_arg(f->forlst->comset);
					free(f->forlst);
				}
			}
			break;

			case TWH:
			case TUN:
				freetree(whptr(t)->whtre);
				freetree(whptr(t)->dotre);
				break;

			case TIF:
				freetree(ifptr(t)->iftre);
				freetree(ifptr(t)->thtre);
				freetree(ifptr(t)->eltre);
				break;

			case TSW:
				free(swptr(t)->swarg);
				freereg(swptr(t)->swlst);
				break;
		}
		free(t);
	}
}
Esempio n. 5
0
static void ICACHE_FLASH_ATTR freeexp (FuncState *fs, expdesc *e) {
  if (e->k == VNONRELOC)
    freereg(fs, e->u.s.info);
}
Esempio n. 6
0
File: lcode.cpp Progetto: swizl/lua
/*static*/ void FuncState::freeexp (/*FuncState *fs,*/ expdesc *e) {
	if (e->k == VNONRELOC)
		freereg(e->u.info);
}
Esempio n. 7
0
int codegen(struct Tnode* root)
{
	// printf("Evaluate %d\n",root -> NODE);
	int number,a,r1,r2,r3,l1,l2,i,status = 0;
	struct  Tnode *temp ,*temp1;
	struct Tnode *Ttemp;
	if(intermediate == NULL)
	{
		printf("Error while generating assemblycode\n");
		exit(1);
	}

	if(root == NULL)
	{
		return 0;
	}

	
	if(root -> NODE == NODE_EXPR )
	{
		tree_iter = 0;
		Arg_callee = root -> Ptr3;
		Argtemp = Arg_callee;
		while(Argtemp != NULL)
		{
			++tree_iter;
			// printf("%d : %s\n",tree_iter,Argtemp -> NAME );
			Argtemp = Argtemp -> NEXT;
		}
		Ttemp = root;
		while( tree_iter != 1 )
		{
			// printf("executed\n");	
			if(Ttemp -> Ptr1 -> NODE == NODE_ID)
			{
				Argtemp = Arg_callee;
				for (i = 1 ; i < tree_iter; i++)
				{
					Argtemp = Argtemp -> NEXT;
				}
				// if(Argtemp -> TYPE == TypeLookup("amp_integer") || Argtemp -> TYPE == TypeLookup("amp_boolean") )
				// 	isamp = 1; 
				if(Argtemp -> amp)
					isamp = 1;   
				// else if(Argtemp -> amp == 1)
				// 		fld = 1; 
			}
			if(Ttemp -> Ptr1 -> NODE == NODE_FIELD)
			{
				Argtemp = Arg_callee;
				for (i = 1 ; i < tree_iter; i++)
				{
					Argtemp = Argtemp -> NEXT;
				}
				 if(Argtemp -> amp == 1)
						fld = 1;
			}	
			a = codegen(Ttemp -> Ptr1);
			// printf("IN HERE 1 : %s \n",Ttemp -> Ptr1 -> NAME );
			fprintf(intermediate, "PUSH R%d\n", a);
			freereg();	
			Ttemp =  Ttemp -> Ptr2;
			// printf("executed\n");		
			tree_iter--;
		}
			if(Ttemp -> NODE == NODE_ID)
			{
				Argtemp = Arg_callee;
				for (i = 1 ; i < tree_iter; i++)
				{
					Argtemp = Argtemp -> NEXT;
				}
				if(Argtemp -> amp)
					isamp = 1;   
			}
			if(Ttemp -> NODE == NODE_FIELD)
			{
				Argtemp = Arg_callee;
				for (i = 1 ; i < tree_iter; i++)
				{
					Argtemp = Argtemp -> NEXT;
				}
				 if(Argtemp -> amp == 1)
						fld = 1;
			}
			a = codegen(Ttemp);
			// printf("IN HERE 1 : %s \n",Ttemp -> NAME );
			fprintf(intermediate, "PUSH R%d\n", a);
			freereg();	
			// printf("executed\n");		

	}
	else if(root -> NODE == DEFAULT)
	{
		codegen(root -> Ptr1);
		codegen(root -> Ptr2);
	}
	else
	{
	    temp = root;

		switch(temp -> NODE)
		{
			case NODE_T   :
								/*printf("---T---");*/
								r1 = getreg();
								fprintf(intermediate, "MOV R%d , %d\n",r1,temp -> VALUE);
								// return temp -> VALUE;
								return r1;
								break;
			case NODE_F   :
								/*printf("---F---");*/
								r1 = getreg();
								fprintf(intermediate, "MOV R%d , %d\n",r1,temp -> VALUE);
								// return temp -> VALUE;
								return r1;
								break;					
			case NODE_LE  :
								/*printf("---LE---");*/
								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "LE R%d , R%d\n",r1,r2);
								freereg();
								return r1;		
								break;
			case NODE_GE  :
								/*printf("---GE---");*/
								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "GE R%d , R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_LT  :
								// printf("---LT---");
								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "LT R%d , R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_GT  :
								/*printf("---GT---");*/
								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "GT R%d , R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_DEQ  :
								/*printf("---DEQ---");*/
								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "EQ R%d , R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_NEQ  :
								/*printf("---NEQ---");*/

								r1 = codegen(temp -> Ptr1);
								r2 = codegen(temp -> Ptr2);
								fprintf(intermediate, "NE R%d , R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_AND  :
								r1 = codegen(temp -> Ptr1);
								r2 = getreg();
								fprintf(intermediate,"MOV R%d, 1\n",r2);
								l1 = getlabel();
								fprintf(intermediate, "JZ R%d, L%d\n",r1,l1);
								r3 = codegen(temp -> Ptr2);
								fprintf(intermediate, "MOV R%d, R%d\n",r2,r3);
								freereg();
								fprintf(intermediate, "L%d:\n",l1);
								fprintf(intermediate, "MUL R%d, R%d\n",r1,r2);
								freereg();
								return r1;
								break;
            case NODE_OR  :
								r1 = codegen(temp -> Ptr1);
								r2 = getreg();
								fprintf(intermediate,"MOV R%d, 1\n",r2);
								l1 = getlabel();
								fprintf(intermediate, "JNZ R%d, L%d\n",r1,l1);
								r3 = codegen(temp -> Ptr2);
								fprintf(intermediate, "MOV R%d, R%d\n",r2,r3);
								freereg();
								fprintf(intermediate, "L%d:\n",l1);
								fprintf(intermediate, "ADD R%d, R%d\n",r1,r2);
								freereg();
								return r1;
								break;
			case NODE_NOT  :
								r1 = codegen(temp -> Ptr2);
								l1 = getlabel();
								fprintf(intermediate, "JNZ R%d, L%d\n",r1,l1);
								fprintf(intermediate, "MOV R%d, 1\n",r1);
								l2 = getlabel();
								fprintf(intermediate, "JMP L%d\n",l2);
								fprintf(intermediate, "L%d:\n",l1);
								fprintf(intermediate, "MOV R%d, 0\n",r1);										
								fprintf(intermediate, "L%d:\n",l2);
								return r1;
			case NODE_ID   :
								// printf("---ID---\n");
								// return *(temp -> Gentry -> BINDING);
								r1 = getreg();
								Ltemp = Llookup(temp -> NAME);
								if(Ltemp != NULL)
								{
									Ltemp = Lhead;
									Loffset = 0;
									while(strcmp(temp -> NAME , Ltemp -> NAME) != 0)
									{
										Loffset = Loffset + 1;
										Ltemp = Ltemp -> NEXT;
									}
									
									r2 = getreg();
									fprintf(intermediate, "MOV R%d,BP\n",r2);
									fprintf(intermediate, "MOV R%d,%d\n",r1,Loffset+1);
									fprintf(intermediate, "ADD R%d,R%d\n",r2,r1);
									if(isamp)
									{
										fprintf(intermediate, "MOV R%d,R%d\n",r1,r2);
										isamp = 0; 
									}
									else
									{
										fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r2);
										if(fld)
										{
											fprintf(intermediate, "MOV R%d,R%d\n",r1,r2);
											fld = 0;
										}
									}
									freereg();

									// fprintf(intermediate, "MOV R%d,[%d]\n",r1,(Ltemp -> BINDING));
								}
								else
								{
									Argtemp = Arglookup(temp -> NAME);
	// BRING THIGS FROM STACK
									if(Argtemp != NULL)
									{
										Argtemp = Arghead;
										offset = 0;

										while(strcmp(Argtemp -> NAME,temp -> NAME) != 0)
										{
											offset = offset + 1;
											Argtemp = Argtemp -> NEXT;
										}
									
										r2 = getreg();
										fprintf(intermediate, "MOV R%d,BP\n",r2);
			 							r3 = getreg();
			 							fprintf(intermediate, "MOV R%d,2\n",r3);
			 							fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
			 							fprintf(intermediate, "MOV R%d,%d\n",r3,(offset+1));
										fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
										freereg();
										// if(isamp && (Argtemp -> TYPE == TypeLookup("amp_integer") ||Argtemp -> TYPE == TypeLookup("amp_boolean")))

										if(( isamp || fld )  && (Argtemp -> amp == 1))
										{
											fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r2); //BP-2-(offset+1)
											isamp = 0;
											fld = 0;
										}
				
										else
										{
											fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r2); //BP-2-(offset+1)
											// if(Argtemp -> TYPE == TypeLookup("amp_integer") ||Argtemp -> TYPE == TypeLookup("amp_boolean") )
											if(Argtemp -> amp == 1)
											{
												fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r1); 
											}
										}
										
										freereg();
									}
									else
									{
										if(isamp)
										{
											fprintf(intermediate, "MOV R%d,%d\n",r1,(temp -> Gentry -> BINDING));
											isamp = 0;
										}
										else
										{
											fprintf(intermediate, "MOV R%d,[%d]\n",r1,(temp -> Gentry -> BINDING));
											if(fld)
											{
												fprintf(intermediate, "MOV R%d,%d\n",r1,(temp -> Gentry -> BINDING));
												fld = 0;
											}
										}
									}
								}
								// fprintf(intermediate, "OUT R%d\n",r1 );
								return r1;
								break;


			case NODE_FIELD :		
								r1 = getreg();
								// printf("%d\n",r1 );
								Ltemp = Llookup(temp -> NAME);
								if(Ltemp != NULL)
								{
									Ltemp = Lhead;
									Loffset = 0;
									while(strcmp(temp -> NAME , Ltemp -> NAME) != 0)
									{
										Loffset = Loffset + 1;
										Ltemp = Ltemp -> NEXT;
									}
									
									r2 = getreg();
									fprintf(intermediate, "MOV R%d,BP\n",r2);
									fprintf(intermediate, "MOV R%d,%d\n",r1,Loffset+1);
									fprintf(intermediate, "ADD R%d,R%d\n",r2,r1);
									fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r2);
									freereg();

									fldtemp2 = fldtemp1 = Ltemp -> TYPE -> fields;
									flditer = 0;
									temp1 = temp;
									while(temp1 -> Ptr2 != NULL)
									{
										flditer = 1;
										fldtemp2 = fldtemp1;
										while(fldtemp2 != NULL)
										{
											if(strcmp(fldtemp2 -> NAME,temp1 -> Ptr2 -> NAME) == 0)
											{
												r2 = getreg();
												fprintf(intermediate, "MOV R%d, %d\n",r2,flditer);
												fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
												fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
												freereg();
												break;
											}
											flditer++;
											fldtemp2 = fldtemp2 -> NEXT;
										}
										temp1 = temp1 -> Ptr2;
									}

									if(fld == 1)
									{
										fprintf(intermediate, "MOV R%d, R%d\n",r1,r2);

										fld = 0;
									}
								}
								else
								{
									Argtemp = Arglookup(temp -> NAME);
	
									if(Argtemp != NULL)
									{
										Argtemp = Arghead;
										offset = 0;

										while(strcmp(Argtemp -> NAME,temp -> NAME) != 0)
										{
											offset = offset + 1;
											Argtemp = Argtemp -> NEXT;
										}
									
										r2 = getreg();
										fprintf(intermediate, "MOV R%d,BP\n",r2);
			 							r3 = getreg();
			 							fprintf(intermediate, "MOV R%d,2\n",r3);
			 							fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
			 							fprintf(intermediate, "MOV R%d,%d\n",r3,(offset+1));
										fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
										freereg();

										fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r2); //BP-2-(offset+1)
										freereg();
										if(Argtemp -> amp)
										{
											fprintf(intermediate, "MOV R%d,[R%d]\n",r1,r1); //BP-2-(offset+1)
											
										}
										fldtemp2 = fldtemp1 = Argtemp -> TYPE -> fields;
										flditer = 0;
										temp1 = temp;

										while(temp1 -> Ptr2 != NULL)
										{
											flditer = 1;
											fldtemp2 = fldtemp1;
											while(fldtemp2 != NULL)
											{
												if(strcmp(fldtemp2 -> NAME,temp1 -> Ptr2 -> NAME) == 0)
												{
													r2 = getreg();
													fprintf(intermediate, "MOV R%d, %d\n",r2,flditer);
													fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
													fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
													freereg();

													break;
												}
												flditer++;
												fldtemp2 = fldtemp2 -> NEXT;
											}
											temp1 = temp1 -> Ptr2;
										}

										if(fld == 1)
										{
											fprintf(intermediate, "MOV R%d, R%d\n",r1,r2);

											fld = 0;
										}
									}
									else
									{
										// printf("here %d\n", r1);
										fprintf(intermediate, "MOV R%d,[%d]\n",r1,(temp -> Gentry -> BINDING));

										fldtemp2 = fldtemp1 = temp -> Gentry -> TYPE -> fields;
										flditer = 0;
										temp1 = temp;

										while(temp1 -> Ptr2 != NULL)
										{
											flditer = 1;
											fldtemp2 = fldtemp1;

											while(fldtemp2 != NULL)
											{
												if(strcmp(fldtemp2 -> NAME,temp1 -> Ptr2 -> NAME) == 0)
												{
													r2 = getreg();
													fprintf(intermediate, "MOV R%d, %d\n",r2,flditer);
													fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
													fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
													freereg();

													break;
												}
												flditer++;
												fldtemp2 = fldtemp2 -> NEXT;
											}
											temp1 = temp1 -> Ptr2;
										}

										if(fld == 1)
										{
											fprintf(intermediate, "MOV R%d, R%d\n",r1,r2);

											fld = 0;
										}

									}
								}

	                            return r1;
								break;
			case NODE_ARRAY :
									//printf("---ID ARR---/n");
									offset = codegen(temp -> Ptr2);
									r1 = getreg();
									fprintf(intermediate, "MOV R%d , %d\n",r1,(temp -> Ptr1 -> Gentry -> BINDING));
									// printf("1234\n");
									// r2 = getreg();
									// fprintf(intermediate, "MOV R%d , %d\n",r2,(temp -> Ptr1 -> Gentry -> SIZE));
									// fprintf(intermediate, "GT R%d, R%d\n",r2,offset);
									// l1 = getlabel();
									// fprintf(intermediate, "JNZ R%d, L%d\n",r2,l1);
									// freereg();
									// fprintf(intermediate, "HALT\n");
									// fprintf(intermediate, "L%d:\n",l1);
									// printf("REACHED\n");
									fprintf(intermediate, "ADD R%d , R%d\n",r1,offset);
									
									fprintf(intermediate, "MOV R%d , [R%d]\n",offset,r1);
									if(fld)
									{
										fprintf(intermediate, "MOV R%d , R%d\n",offset,r1);
										fld = 0;	
									}
									freereg();
									// fprintf(intermediate,"OUT R%d\n",offset);
									return offset;
									break;

			case NODE_NUM :
									// printf("NODE_NUM is %d\n",(root -> VALUE));
									// return (root -> VALUE); 
									r1 = getreg();
									fprintf(intermediate, "MOV R%d , %d\n",r1,(root -> VALUE));
									// fprintf(intermediate, "OUT %d\n",(root -> VALUE) );
									return r1;
									break;
			case NODE_PLUS :
									// printf("---PLUS---");
				 					// return (Evaluate(temp -> Ptr1) + Evaluate(temp -> Ptr2));
									r1 = codegen(temp -> Ptr1);
									r2 = codegen(temp -> Ptr2);
									fprintf(intermediate, "ADD R%d ,R%d\n",r1,r2);
									freereg();
									return r1;
									break;
 			case NODE_MINUS :
 									/*printf("---MINUS---");*/
									// return (Evaluate(temp -> Ptr1) - Evaluate(temp -> Ptr2));
 									r1 = codegen(temp -> Ptr1);
									r2 = codegen(temp -> Ptr2);
									fprintf(intermediate, "SUB R%d ,R%d\n",r1,r2);
									freereg();
									return r1;
									break;
 			case NODE_MUL :
 									/*printf("---MUL---");*/
									// return (Evaluate(temp -> Ptr1) * Evaluate(temp -> Ptr2));
									r1 = codegen(temp -> Ptr1);
									r2 = codegen(temp -> Ptr2);
									fprintf(intermediate, "MUL R%d ,R%d\n",r1,r2);
									freereg();
									return r1;
									break;
			case NODE_DIV :
 									/*printf("---DIV---");*/
									// return (Evaluate(temp -> Ptr1) / Evaluate(temp -> Ptr2));
									r1 = codegen(temp -> Ptr1);
									r2 = codegen(temp -> Ptr2);
									l1 = getlabel();
									fprintf(intermediate, "JZ R%d, L%d\n",r2,l1);
									fprintf(intermediate, "DIV R%d ,R%d\n",r1,r2);
									freereg();
									fprintf(intermediate, "JMP L%d\n",l2);
									fprintf(intermediate, "L%d:\n",l1);
									fprintf(intermediate, "HALT\n");
									fprintf(intermediate, "L%d:\n",l2);
									
									return r1;
									break;
			case NODE_MOD :
 									/*printf("---MOD---");*/
									// return (Evaluate(temp -> Ptr1) % Evaluate(temp -> Ptr2));
									r1 = codegen(temp -> Ptr1);
									r2 = codegen(temp -> Ptr2);
									fprintf(intermediate, "MOD R%d ,R%d\n",r1,r2);
									freereg();
									return r1;
									break;
			case NODE_ASGN :
									 // printf("---ASGN---");
								number = codegen(temp -> Ptr2);
								if(temp -> Ptr1 -> NODE == NODE_FIELD)
								{
									fld = 1;
									r1 = codegen(temp -> Ptr1);
									fprintf(intermediate, "MOV [R%d] ,R%d\n",r1,number);
									freereg();
								}
									// printf("%d\n",number );
									// *(temp -> Ptr1 -> Gentry -> BINDING) = number; ///// brought from ID
									//r1 = getreg();
								else
								{
									Ltemp = Llookup(temp -> Ptr1 -> NAME);
									if(Ltemp != NULL)
									{
										Ltemp = Lhead;
										Loffset = 0;

										while(strcmp(temp -> Ptr1 -> NAME , Ltemp -> NAME) != 0)
										{
											Loffset = Loffset + 1;
											Ltemp = Ltemp -> NEXT;
										}
										r1 = getreg();
										r2 = getreg();
										fprintf(intermediate, "MOV R%d,BP\n",r2);
										fprintf(intermediate, "MOV R%d,%d\n",r1,Loffset+1);
										fprintf(intermediate, "ADD R%d,R%d\n",r2,r1);
										// fprintf(intermediate, "MOV R%d,[%d]\n",r1,r2);
										
										fprintf(intermediate, "MOV [R%d],R%d\n",r2,number);
										freereg();
										freereg();
									}
									else
									{
										Argtemp = Arglookup(temp -> Ptr1 -> NAME);
		// BRING THIGS FROM STACK
										if(Argtemp != NULL)
										{
											Argtemp = Arghead;
											offset = 0;

											while(strcmp(Argtemp -> NAME,temp -> Ptr1 -> NAME) != 0)
											{
												offset = offset + 1;
												Argtemp = Argtemp -> NEXT;
											}

											r1 = getreg();
											fprintf(intermediate, "MOV R%d,BP\n",r1);
				 							r2 = getreg();
				 							fprintf(intermediate, "MOV R%d,2\n",r2);
				 							fprintf(intermediate, "SUB R%d,R%d\n",r1,r2);
				 							
				 							fprintf(intermediate, "MOV R%d,%d\n",r2,(offset+1));
											fprintf(intermediate, "SUB R%d,R%d\n",r1,r2);
											freereg();
											// if(Argtemp -> TYPE == TypeLookup("amp_integer") ||Argtemp -> TYPE == TypeLookup("amp_boolean") )
											if(Argtemp -> amp == 1)
											{
												r2 = getreg();
												fprintf(intermediate, "MOV R%d,[R%d]\n",r2,r1); //BP-2-(offset+1)
												fprintf(intermediate, "MOV [R%d],R%d\n",r2,number); //BP-2-(offset+1)
												freereg();
											}
											else
											{
												fprintf(intermediate, "MOV [R%d],R%d\n",r1,number); //BP-2-(offset+1)
											}
											freereg();
										}
										else
										{
											// printf("%d\n", (temp -> Ptr1 -> Gentry -> BINDING));
											fprintf(intermediate, "MOV [%d], R%d\n",(temp -> Ptr1 -> Gentry -> BINDING),number);
										}
									}
								}
									
									freereg();
									break;


			case NODE_ARRAY_ASGN :
										offset1 = codegen(temp -> Ptr2);
										// fprintf(intermediate, "OUT R%d\n",offset1);
										// printf("QWER\n");
										// r2 = getreg();
										// fprintf(intermediate, "MOV R%d , %d\n",r2,(temp -> Ptr1 -> Gentry -> SIZE));
										// fprintf(intermediate, "GT R%d, R%d\n",r2,offset);
										// l1 = getlabel();
										// fprintf(intermediate, "JNZ R%d, L%d\n",r2,l1);
										// freereg();
										// fprintf(intermediate, "HALT\n");
										// fprintf(intermediate, "L%d:\n",l1);
										// // freereg();
										
										r1 = getreg();
										fprintf(intermediate, "MOV R%d , %d\n",r1,(temp -> Ptr1 -> Gentry -> BINDING));
										fprintf(intermediate, "ADD R%d , R%d\n",offset1,r1);
										freereg();
										r1 = codegen(temp -> Ptr3);

										// fprintf(intermediate, "OUT R%d\n",r1);
										 // printf("r1 : %d\n",r1 );
										 // printf("offset : %d\n",offset1 );
										fprintf(intermediate, "MOV [R%d] , R%d\n",offset1,r1);
										freereg();
										freereg();
										// printf("ALSO HERE\n");
										break;
			case NODE_READ :
									/*printf("---READ---");*/
									r1 = getreg();
									fprintf(intermediate, "IN R%d\n",r1);

									if(temp -> Ptr2 -> NODE == NODE_FIELD)
									{
										fld = 1;
										r2 = codegen(temp -> Ptr2);
										fprintf(intermediate, "MOV [R%d] ,R%d\n",r2,r1);
										freereg();
									}
									
									else
									{
										Ltemp = Llookup(temp -> Ptr2 -> NAME);
										if(Ltemp != NULL)
										{
											Ltemp = Lhead;
											Loffset = 0;

											while(strcmp(temp -> Ptr2 -> NAME , Ltemp -> NAME) != 0)
											{
												Loffset = Loffset + 1;
												Ltemp = Ltemp -> NEXT;
											}
											r2 = getreg();
											r3 = getreg();
											fprintf(intermediate, "MOV R%d,BP\n",r3);
											fprintf(intermediate, "MOV R%d,%d\n",r2,Loffset+1);
											fprintf(intermediate, "ADD R%d,R%d\n",r3,r2);
											fprintf(intermediate, "MOV [R%d],R%d\n",r3,r1);
											freereg();
											freereg();
										}
										
										else
										{
											Argtemp = Arglookup(temp -> Ptr2 -> NAME);

											if(Argtemp != NULL)
											{
												Argtemp = Arghead;
												offset = 0;

												while(strcmp(Argtemp -> NAME,temp -> Ptr2 -> NAME) != 0)
												{
													offset = offset + 1;
													Argtemp = Argtemp -> NEXT;
												}

												r2 = getreg();
												fprintf(intermediate, "MOV R%d,BP\n",r2);
					 							r3 = getreg();
					 							fprintf(intermediate, "MOV R%d,2\n",r3);
					 							fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
					 							fprintf(intermediate, "MOV R%d,%d\n",r3,(offset+1));
												fprintf(intermediate, "SUB R%d,R%d\n",r2,r3);
												freereg();

												// if(Argtemp -> TYPE == TypeLookup("amp_integer") ||Argtemp -> TYPE == TypeLookup("amp_boolean") )
												if(Argtemp -> amp)
												{
													r3 = getreg();
													fprintf(intermediate, "MOV R%d,[R%d]\n",r3,r2); //BP-2-(offset+1)
													fprintf(intermediate, "MOV [R%d],R%d\n",r3,r1); //BP-2-(offset+1)
													freereg();
												}
												else
												{
													fprintf(intermediate, "MOV [R%d],R%d\n",r2,r1); //BP-2-(offset+1)
												}
												freereg();
											}
											else
											{
												fprintf(intermediate, "MOV [%d],R%d\n",(temp -> Ptr2 -> Gentry -> BINDING),r1);
											}
										}
								}
									freereg();
									break;
			case NODE_ARRAY_READ :
									offset = codegen(temp -> Ptr3);
		    						r1 = getreg();
									fprintf(intermediate, "MOV R%d , %d\n",r1,(temp -> Ptr2 -> Gentry -> BINDING));
									
									r2 = getreg();
									fprintf(intermediate, "MOV R%d , %d\n",r2,(temp -> Ptr2 -> Gentry -> SIZE));
									fprintf(intermediate, "GT R%d, R%d\n",r2,offset);
									l1 = getlabel();
									fprintf(intermediate, "JNZ R%d, L%d\n",r2,l1);
									// freereg();
									fprintf(intermediate, "HALT\n");
									fprintf(intermediate, "L%d:\n",l1);
									
									freereg();
									fprintf(intermediate, "ADD R%d , R%d\n",offset,r1);
									freereg();
		    						r1 = getreg();
									fprintf(intermediate, "IN R%d\n",r1);
									fprintf(intermediate, "MOV [R%d], R%d\n",offset,r1);
									freereg();
									freereg();
									break;
			case NODE_WRITE :
									// printf("---WRITE---");
									number = codegen(temp -> Ptr2);
									fprintf(intermediate, "OUT R%d\n",number);
									freereg();
									break;
			case NODE_IF  :
									/*printf("---IF---");*/
									l1 = getlabel();
									number = codegen(temp -> Ptr1);
									fprintf(intermediate, "JZ R%d , L%d\n",number,l1);
									number = codegen(temp -> Ptr2);
									fprintf(intermediate, "L%d:\n",l1);
									freereg();
									break;
			case NODE_IF_ELSE:
									/*printf("---IF_ELSE---");*/
									number = codegen(temp -> Ptr1);
									l1 = getlabel();
									l2 = getlabel();
									fprintf(intermediate, "JZ R%d , L%d\n",number,l1);
									freereg();
									number = codegen(temp -> Ptr2);
									fprintf(intermediate, "JMP L%d\n",l2);
									fprintf(intermediate, "L%d:\n",l1);
									freereg();
									number = codegen(temp -> Ptr3);
									fprintf(intermediate, "L%d:\n",l2);
									break;
		 	case NODE_WHILE :
		 							// printf("---WHILE----");
		 							l1 = getlabel();
		 							l2 = getlabel();
		 							fprintf(intermediate, "L%d:\n",l1);
		 							number = codegen(temp -> Ptr1);
		 							fprintf(intermediate, "JZ R%d , L%d\n",number,l2);
		 							freereg();
									number = codegen(temp -> Ptr2);
		 							fprintf(intermediate, "JMP L%d\n",l1);
		 							fprintf(intermediate, "L%d:\n",l2);
		 							freereg();

		 							break;

		 	case NODE_FUNC :
		 							// printf("counter : %d\n",counter);
		 							for(i = 0; i <= counter; i++)
		 								fprintf(intermediate, "PUSH R%d\n",i);
		 							status = counter;

		 							freeallreg();
		 							if(temp -> Ptr3 == NULL && temp -> Ptr2 == NULL)
		 							{
		 							}

		 							else if(temp -> Ptr2 != NULL)
		 							{
		 								// fprintf(intermediate,"IN HERE\n");
		 								// printf("func name : %s \t tree_iter : %d\n",temp -> NAME,tree_iter);
		 								codegen(temp -> Ptr2); //more than 1 argument
		 							}
		 							else
		 							{
		 								
		 								if((temp -> Ptr3 -> NODE == NODE_ID) || (temp -> Ptr3 -> NODE == NODE_FIELD) || (temp -> Ptr3 -> NODE == NODE_ARRAY))
										{
											// Argtemp = Arg_callee;
											Argtemp = temp -> Ptr3 -> Ptr3;
									
											// if(Argtemp -> TYPE == TypeLookup("amp_integer") || Argtemp -> TYPE == TypeLookup("amp_boolean") )
											// 	isamp = 1; 
											// if(Argtemp -> amp)
											// 	isamp = 1;   
											 if(Argtemp -> amp == 1)
													fld = 1; 
										}
										

		 								a = codegen(temp -> Ptr3);
		 								fprintf(intermediate, "PUSH R%d\n",a);
		 								freereg();
		 							}


		 							fprintf(intermediate, "PUSH R0\n"); //space for return value

		 							Gtemp = Glookup(temp -> NAME);
		 							fprintf(intermediate, "CALL F%d\n",Gtemp -> BINDING);

		 							r1 = getreg();
                                    fprintf(intermediate, "POP R%d\n",r1);	// for return value
                                    freereg();

                                    r2 = getreg();

                                    Argtemp = Gtemp -> Arglist;
                                    temporary = 0;

                                    while(Argtemp != NULL)
                                    {
                                    	temporary = temporary + 1;
		 								fprintf(intermediate, "POP R%d\n",r2);
		 								Argtemp = Argtemp -> NEXT;
                                    }

                                    freereg();

                                    for(i = status; i >= 0; i--)
                                    {
                                    	temporary = temporary + 1;
		 								fprintf(intermediate, "POP R%d\n",i);
                                    }
		 							counter = status;
		 							r1 = getreg();
		 							r2 = getreg();
		 							fprintf(intermediate, "MOV R%d, %d\n",r1,(temporary+1));
		 							fprintf(intermediate, "MOV R%d, SP\n",r2);
		 							
		 							fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
		 							fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
		 							freereg();

		 							return r1;

		 							break;



		 	case NODE_RET : 
	 								res = codegen(temp -> Ptr2);
		 							r1 = getreg();
		 							fprintf(intermediate, "MOV R%d,BP\n",r1);
		 							r2 = getreg();
		 							fprintf(intermediate, "MOV R%d,2\n",r2);
		 							fprintf(intermediate, "SUB R%d,R%d\n",r1,r2);
		 							freereg();
		 							fprintf(intermediate, "MOV [R%d],R%d\n",r1,res);
		 							freereg();
		 							freereg();
		 							Ltemp = Lhead;
		 							while(Ltemp != NULL)
		 							{                                                                
                                        fprintf(intermediate, "POP R0\n");
                                        Ltemp = Ltemp -> NEXT;
                                    }

		 							fprintf(intermediate, "MOV BP,[SP]\n");
		 							fprintf(intermediate, "POP R0\n");
                                    fprintf(intermediate, "RET\n");

                                    break;

            case NODE_ALLOC :	
            						for(i = 0; i <= counter; i++)
		 								fprintf(intermediate, "PUSH R%d\n",i);
		 							status = counter;

		 							freeallreg();
		 							fprintf(intermediate, "PUSH R0\n");
		 							
		 							fprintf(intermediate, "CALL ALLOC\n");
		 							
		 							fprintf(intermediate, "POP R0\n");
									
									temporary = 0;
									for(i = status; i >= 0; i--)
                                    {
                                    	temporary = temporary + 1;
		 								fprintf(intermediate, "POP R%d\n",i);
                                    }
		 							
		 							counter = status;
		 							
		 							r1 = getreg();
		 							r2 = getreg();
		 							fprintf(intermediate, "MOV R%d, %d\n",r1,(temporary+1));
		 							fprintf(intermediate, "MOV R%d, SP\n",r2);
		 							fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
		 							fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
		 							freereg();

		 							return r1;

		 	 case NODE_ALLOC1 :	
		 	 						
            						for(i = 0; i <= counter; i++)
		 								fprintf(intermediate, "PUSH R%d\n",i);
		 							status = counter;

		 							freeallreg();
		 	 						r1 = codegen(temp -> Ptr2);
		 	 						fprintf(intermediate, "PUSH R%d\n",r1 );
		 	 						freereg();
		 							
		 							fprintf(intermediate, "PUSH R0\n");
		 							
		 							fprintf(intermediate, "CALL ALLOCATION\n");
		 							
		 							fprintf(intermediate, "POP R0\n");
		 							fprintf(intermediate, "POP R0\n");
									
									temporary = 0;
									for(i = status; i >= 0; i--)
                                    {
                                    	temporary = temporary + 1;
		 								fprintf(intermediate, "POP R%d\n",i);
                                    }
		 							
		 							counter = status;
		 							
		 							r1 = getreg();
		 							r2 = getreg();
		 							fprintf(intermediate, "MOV R%d, %d\n",r1,(temporary+1+1));
		 							fprintf(intermediate, "MOV R%d, SP\n",r2);
		 							fprintf(intermediate, "ADD R%d, R%d\n",r2,r1);
		 							fprintf(intermediate, "MOV R%d, [R%d]\n",r1,r2);
		 							freereg();

		 							return r1;

		 	case NODE_FREE1 :
		 							r1 = getreg();
		 							for(i = 0; i <= counter; i++)
		 								fprintf(intermediate, "PUSH R%d\n",i);
		 							status = counter;

		 							freeallreg();
		 							isamp = 1;
		 							r1 = codegen(temp -> Ptr2);
		 							r2 = getreg();
		 							fprintf(intermediate, "MOV R%d, [R%d]\n",r2,r1);

		 							fprintf(intermediate, "PUSH R%d\n",r2);
		 							freereg();
		 							freereg();
		 							fprintf(intermediate, "PUSH R0\n");

		 							fprintf(intermediate, "CALL FREE1\n");
		 							
		 							fprintf(intermediate, "POP R0\n");//for return value 

		 							isamp = 1;
		 							r1 = codegen(temp -> Ptr2);
		 							fprintf(intermediate, "MOV [R%d], R0\n",r1);
		 							freereg();
		 							fprintf(intermediate, "POP R0\n"); // for argument

									for(i = status; i >= 0; i--)
                                    {
		 								fprintf(intermediate, "POP R%d\n",i);
                                    }
		 							
		 							counter = status;

		 							return;

		 	case NODE_FREE :
		 							r1 = getreg();
		 							r1 = codegen(temp -> Ptr2);
		 							for(i = 0; i <= counter; i++)
		 								fprintf(intermediate, "PUSH R%d\n",i);
		 							status = counter;

		 							freeallreg();
		 							fprintf(intermediate, "PUSH R%d\n",r1);

		 							fprintf(intermediate, "CALL FREE\n");
		 							
		 							fprintf(intermediate, "POP R0\n"); // for argument
									
									for(i = status; i >= 0; i--)
                                    {
		 								fprintf(intermediate, "POP R%d\n",i);
                                    }
		 							
		 							counter = status;

		 							return;		 	case NODE_NILL :
		 					r1 = getreg();
		 					fprintf(intermediate, "MOV R%d, %d\n",r1,temp -> VALUE);
		 					return r1;

			default:
					printf("NODETYPE is %d\n",temp -> NODE);
					printf("Error : Unknown Node Type\n");
					exit(1);	
		}														
	}
	return 0;
}
Esempio n. 8
0
static void freeexp(ktap_funcstate *fs, ktap_expdesc *e)
{
	if (e->k == VNONRELOC)
		freereg(fs, e->u.info);
}