Files
SAPFOR/projects/dvm/fdvm/trunk/parser/sym.c
2025-03-12 14:28:04 +03:00

2012 lines
58 KiB
C

/*********************************************************************/
/* pC++/Sage++ Copyright (C) 1993 */
/* Indiana University University of Oregon University of Rennes */
/*********************************************************************/
/*
* sym.c -- hash table routines
*/
#include <stdio.h>
#include <stdlib.h>
#include "compatible.h"
#ifdef SYS5
#include <string.h>
#else
#include <strings.h>
#endif
#include "defs.h"
#include "symb.h"
#include "defines.h"
#include "bif.h"
#include "extern.h"
#include "fdvm.h" /*f90.h 10.03.03*/
#include "tokdefs.h"
extern int hash(), ndim;
extern PTR_BFND cur_bfnd, pred_bfnd, last_bfnd, global_bfnd;
extern PTR_TYPE vartype, global_default, impltype[], make_type();
extern PTR_LLND make_llnd();
extern PTR_SYMB make_symb();
/* added for FORTRAN 90 */
extern PTR_LLND first_unresolved_call;
extern PTR_LLND last_unresolved_call;
extern void err(), errstr();
char *chkalloc();
void warn1();
extern PTR_HASH hash_table[];
extern int warn_all;
extern int privateall;
/* Scope table variables */
PTR_BFND scope_table[1000];
PTR_TYPE * scope_implicit[1000];
int top_scope_level;
int scope_starts[10];
int top_scope_starts;
struct operand
{
int opval;
char *opname;
} oplist [] = {
{PLUS, "+"},
{MINUS, "-"},
{ASTER, "*"},
{DASTER, "**"},
{SLASH, "/"},
{DSLASH, "//"},
{AND, ".and."},
{OR, ".or."},
{XOR, ".xor."},
{NOT, ".not."},
{EQ, ".eq."},
{NE, ".ne."},
{GT, ".gt."},
{GE, ".ge."},
{LT, ".lt."},
{LE, ".le."},
{NEQV, ".neqv."},
{EQV, ".eqv."},
{0, 0}
};
void store_implicit()
{PTR_TYPE *impl,*it,*ip;
int i;
/*fprintf(stderr,"%s\n",scope_table[top_scope_level]->entry.Template.symbol->ident);*/
impl = (PTR_TYPE * ) calloc(26, sizeof(PTR_TYPE));
it=impltype; ip=impl;
i=26;
while(--i >= 0)
*ip++ = *it++;
/*return(impl)*/;
scope_implicit[top_scope_level] = impl;
}
void restore_implicit()
{PTR_TYPE *impl;
int i;
/*fprintf(stderr,"restore%s\n",scope_table[top_scope_level]->entry.Template.symbol->ident);*/
impl = scope_implicit[top_scope_level];
for(i=0; i<26; i++)
impltype[i] = *impl++;
/* it=impltype;
i=26;
while(--i >= 0)
*it++ = *impl++;*/
}
void
init_scope_table()
{
scope_table[0] = global_bfnd;
top_scope_level = 0;
scope_starts[0]= 0;
top_scope_starts = 0;
scope_implicit[0] = NULL;
}
PTR_BFND
cur_scope()
{
return (scope_table[top_scope_level]);
}
PTR_BFND
parent_scope(present_scope_level)
int present_scope_level;
{
if (present_scope_level >= 0)
return (scope_table[--present_scope_level]);
else err("Requested scope level non-existent", 314);
return 0;
}
void
add_scope_level(new_scope, due_to_use_stat)
PTR_BFND new_scope;
int due_to_use_stat;
{
PTR_BFND tmp;
if (due_to_use_stat)
{
tmp = scope_table[top_scope_level];
scope_table[top_scope_level] = new_scope;
scope_table[++top_scope_level] = tmp;
}
else
{
if(top_scope_level>0 && !scope_implicit[top_scope_level])
store_implicit();
scope_table[++top_scope_level] = new_scope;
scope_starts[++top_scope_starts] = top_scope_level;
}
}
void
delete_beyond_scope_level(level)
PTR_BFND level;
{ scope_implicit[top_scope_level] = NULL;
top_scope_level = scope_starts[top_scope_starts] - 1;
top_scope_starts --;
if (top_scope_level < 0)
err("Requested scope level non-existent", 314);
if(top_scope_level>0)
restore_implicit();
}
int
cur_scope_level()
{
return (top_scope_level);
}
PTR_BFND
scope_at_level(level)
int level;
{
if (level >= 0)
return (scope_table[level]);
else errstr("Requested scope non-existent", 315);
return 0;
}
/*
look_up_sym(string) :
lookup string in the hash table. If a hash table entry having string
as it's name, in curent scope is found then return the hash table entry,
else make a hash table entry with string as it's name and return it.
*/
PTR_HASH
look_up_sym(string)
register char *string;
{
int i, index, cur_scope_level();
register PTR_HASH entry;
PTR_HASH make_hash_entry();
PTR_BFND parent_scope(), scope_at_level(), p;
i = hash(string);
for (index = cur_scope_level(); index >= 0; index--)
{
p = scope_at_level(index);
for (entry = hash_table[i]; entry; entry = entry->next_entry) {
if (!strcmp(string, entry->ident) && (entry->id_attr) &&
(entry->id_attr->scope == p)) {
return (entry);
}
}
}
return (make_hash_entry(string));
}
PTR_HASH
just_look_up_sym_in_scope(scope, string)
PTR_BFND scope;
register char *string;
{
int i, cur_scope_level();
register PTR_HASH entry;
PTR_HASH make_hash_entry();
PTR_BFND parent_scope(), scope_at_level(), p;
i = hash(string);
p = scope;
for (entry = hash_table[i]; entry; entry = entry->next_entry) {
if (!strcmp(string, entry->ident) && (entry->id_attr) &&
(entry->id_attr->scope == p)) {
return (entry);
}
}
return (HSNULL);
}
PTR_HASH
look_up_op(operator)
int operator;
{
struct operand *p;
for (p = oplist; p->opname; p++)
if (p->opval == operator)
return (look_up_sym(p->opname));
errstr("Unknown operator %d", operator, 316);
return (HSNULL);
}
PTR_HASH
just_look_up_sym(string)
register char *string;
{
int i, index, cur_scope_level();
register PTR_HASH entry;
PTR_HASH make_hash_entry();
PTR_BFND parent_scope(), scope_at_level(), p;
i = hash(string);
p = cur_scope();
for (index = cur_scope_level(); index >= 0; index--)
{
p = scope_at_level(index);
for (entry = hash_table[i]; entry; entry = entry->next_entry) {
if (!strcmp(string, entry->ident) && (entry->id_attr) &&
(entry->id_attr->scope == p)) {
return (entry);
}
}
}
return (HSNULL);
}
PTR_HASH
make_hash_entry(string)
register char *string;
{
int i;
register PTR_HASH entry;
i = hash(string);
entry = (struct hash_entry *) chkalloc(sizeof(struct hash_entry));
entry->ident = copys(string);
entry->next_entry = hash_table[i];
hash_table[i] = entry;
return (entry);
}
PTR_SYMB
make_sym_entry(var_hash_entry, variant, type, scope, kind)
PTR_HASH var_hash_entry;
int variant, kind;
PTR_TYPE type;
PTR_BFND scope;
{
PTR_SYMB var_sym_entry;
PTR_SYMB list;
/* If type is undefined, then obtain type from implicit type table. */
if ((variant != PROGRAM_NAME) && (variant != DEFAULT) && (variant != MODULE_NAME) &&
(variant != PROCEDURE_NAME) && (variant != PROCESS_NAME) && (variant != INTERFACE_NAME))
{
if (type == TYNULL)
{
if ((*var_hash_entry->ident - 'a') >= 0)
type = impltype[*var_hash_entry->ident - 'a'];
}
else if ((type->variant == T_ARRAY) &&
(type->entry.ar_decl.base_type == TYNULL)) {
if ((*var_hash_entry->ident-'a') < 0)
type->entry.ar_decl.base_type = 0;
else
type->entry.ar_decl.base_type =
impltype[*var_hash_entry->ident - 'a'];
}
if ((type == TYNULL) ||
((type->variant == T_ARRAY) &&
(type->entry.ar_decl.base_type == TYNULL) &&
(strcmp(var_hash_entry->ident, "_PROCESSORS") != 0)))
{
/*
errstr("type unknown of %s",
var_hash_entry->ident);
*/
type = global_default;
}
}
var_sym_entry = make_symb(fi, variant, var_hash_entry->ident);
/* Point the hash entry to the symbol table entry */
var_hash_entry->id_attr = var_sym_entry;
var_sym_entry->variant = variant;
var_sym_entry->type = type;
var_sym_entry->scope = scope;
var_sym_entry->id_list = SMNULL;
switch (variant) {
case VARIABLE_NAME:
/* if not a formal parameter,
then mark it as local. */
if (var_sym_entry->entry.var_decl.local != IO)
var_sym_entry->entry.var_decl.local = kind;
break;
case FUNCTION_NAME:
case PROCEDURE_NAME:
case PROCESS_NAME:
var_sym_entry->entry.proc_decl.seen = kind;
break;
default:
break;
}
/* initialize administrative stuff */
var_sym_entry->outer = SMNULL;
var_sym_entry->parent = var_hash_entry;
/* var_sym_entry->decl = HARD; */
if(scope == cur_scope() && scope->variant == MODULE_STMT ){
if(privateall)
var_sym_entry->attr = var_sym_entry->attr | PRIVATE_BIT;
list = scope->entry.Template.symbol->entry.Template.next; /* adding to list of all the identifiers of module */
scope->entry.Template.symbol->entry.Template.next = var_sym_entry;
var_sym_entry->entry.Template.next = list;
}
return(var_sym_entry);
}
PTR_SYMB
make_constant(var_hash_entry, type)
PTR_HASH var_hash_entry;
PTR_TYPE type;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, CONST_NAME, type, cur_scope(),
0));
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd)
return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
CONST_NAME, type, cur_scope(), 0));
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
var_sym_entry->variant = CONST_NAME;
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_ARRAY:
if (type != TYNULL)
var_sym_entry->type->entry.ar_decl.base_type = type;
return (var_sym_entry);
case (T_POINTER):
if (type != TYNULL)
var_sym_entry->type->entry.Template.base_type = type;
return (var_sym_entry);
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_STRUCT:
case T_DERIVED_TYPE:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
}
break;
case CONST_NAME:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
default:
errstr("Inconsistent constant declaration %s", var_hash_entry->ident, 17);
return (var_sym_entry);/*return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), CONST_NAME,
type, cur_scope(), 0));
}
/* Occurence of Function name in it's body not properly taken care of. */
PTR_SYMB
make_scalar(var_hash_entry, type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE type;
int kind;
{
PTR_SYMB var_sym_entry, cur_scope_sym_ptr;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, VARIABLE_NAME, type,
cur_scope(), kind));
var_variant = var_sym_entry->variant;
cur_scope_sym_ptr = cur_scope()->entry.Template.symbol;
if (var_sym_entry->scope != cur_scope()){ /*(var_sym_entry->scope == global_bfnd)*/
if ((cur_scope()->variant == FUNC_HEDR) &&
(!(strcmp(var_hash_entry->ident, cur_scope_sym_ptr->ident))))
if (type == TYNULL)
return (var_sym_entry);
else
{
cur_scope_sym_ptr->type = type;
/* result_sym_ptr = cur_scope_sym_ptr->entry.Template.declared_name;
if (result_sym_ptr)
result_sym_ptr->type = type;
*/ /*19.03.03*/
return (var_sym_entry);
}
else return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
VARIABLE_NAME, type, cur_scope(), kind));
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_ARRAY:
if (type != TYNULL)
var_sym_entry->type->entry.ar_decl.base_type = type;
return (var_sym_entry);
case T_POINTER:
if (type != TYNULL)
var_sym_entry->type->entry.Template.base_type = type;
return (var_sym_entry);
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_STRUCT:
case T_DERIVED_TYPE:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
}
break;
case CONST_NAME:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
case ROUTINE_NAME:
case FUNCTION_NAME:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
case LABEL_VAR:
return (var_sym_entry);
case TYPE_NAME:
case PROCEDURE_NAME:
case INTERFACE_NAME:
case NAMELIST_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent declaration of identifier %s",var_hash_entry->ident,16);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
VARIABLE_NAME, type, cur_scope(), kind));
}
/*
make_array(var_hash_entry:PTR_HASH, base_type: PTR_TYPE, dcl_type:int,
ranges: PTR_LLND, ndim : int)
makes a array symbol table entry.
*/
PTR_SYMB
make_array(var_hash_entry, base_type, ranges, ndim, kind)
PTR_HASH var_hash_entry;
PTR_TYPE base_type;
PTR_LLND ranges;
int ndim, kind;
{
PTR_SYMB var_sym_entry, cur_scope_sym_ptr;
PTR_TYPE array_type;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
{
array_type = make_type(fi, T_ARRAY);
array_type->entry.ar_decl.base_type = base_type;
array_type->entry.ar_decl.num_dimensions = ndim;
return (make_sym_entry(var_hash_entry, VARIABLE_NAME, array_type,
cur_scope(), kind));
}
var_variant = var_sym_entry->variant;
cur_scope_sym_ptr = cur_scope()->entry.Template.symbol;
if (var_sym_entry->scope != cur_scope()){ /*(var_sym_entry->scope == global_bfnd)*/
if ((cur_scope()->variant == FUNC_HEDR) &&
(!(strcmp(var_hash_entry->ident, cur_scope_sym_ptr->ident))))
if (base_type == TYNULL)
return (var_sym_entry);
else
{
array_type = make_type(fi, T_ARRAY);
array_type->entry.ar_decl.base_type = base_type;
array_type->entry.ar_decl.num_dimensions = ndim;
cur_scope_sym_ptr->type = array_type;
/*result_sym_ptr = cur_scope_sym_ptr->entry.Template.declared_name;
if (result_sym_ptr)
result_sym_ptr->type = array_type;
*//*19.03.03*/
return (var_sym_entry);
}
else /*return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
VARIABLE_NAME, type, cur_scope(), kind));*/
/* if (var_sym_entry->scope == global_bfnd)*/
{
array_type = make_type(fi, T_ARRAY);
array_type->entry.ar_decl.base_type = base_type;
array_type->entry.ar_decl.num_dimensions = ndim;
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), VARIABLE_NAME, array_type,
cur_scope(), kind));/*7.03.03*/
}
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_ARRAY:
if (base_type != TYNULL)
var_sym_entry->type->entry.ar_decl.base_type =
base_type;
if (ndim)
var_sym_entry->type->entry.ar_decl.num_dimensions = ndim;
return (var_sym_entry);
case T_STRING:
case T_POINTER:
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_DCOMPLEX:
case T_BOOL:
case T_STRUCT:
case T_DERIVED_TYPE:
{
array_type = make_type(fi, T_ARRAY);
if (base_type == TYNULL)
array_type->entry.ar_decl.base_type =
var_sym_entry->type;
else array_type->entry.ar_decl.base_type = base_type;
array_type->entry.ar_decl.num_dimensions = ndim;
var_sym_entry->type = array_type;
return (var_sym_entry);
}
default:
return (var_sym_entry);
}
default:
errstr("Inconsistent array declaration of identifier %s", var_hash_entry->ident,18);
return (var_sym_entry);/*return (SMNULL);*/
}
array_type = make_type(fi, T_ARRAY);
array_type->entry.ar_decl.base_type = base_type;
array_type->entry.ar_decl.num_dimensions = ndim;
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), VARIABLE_NAME, array_type,
cur_scope(), kind)); /*7.03.03*/
}
PTR_SYMB
make_pointer(var_hash_entry, base_type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE base_type;
int kind;
{
PTR_SYMB var_sym_entry;
PTR_TYPE pointer_type;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
{
pointer_type = make_type(fi, T_POINTER);
pointer_type->entry.Template.base_type = base_type;
return (make_sym_entry(var_hash_entry, VARIABLE_NAME, pointer_type,
cur_scope(), kind));
}
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd)
{
pointer_type = make_type(fi, T_POINTER);
pointer_type->entry.Template.base_type = base_type;
return (make_sym_entry(var_hash_entry, VARIABLE_NAME, pointer_type,
cur_scope(), kind));
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_POINTER:
if (base_type != TYNULL)
var_sym_entry->type->entry.Template.base_type =
base_type;
return (var_sym_entry);
case T_STRING:
case T_ARRAY:
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_STRUCT:
case T_DERIVED_TYPE:
{
pointer_type = make_type(fi, T_POINTER);
if (base_type == TYNULL)
pointer_type->entry.Template.base_type =
var_sym_entry->type;
else pointer_type->entry.Template.base_type = base_type;
var_sym_entry->type = pointer_type;
return (var_sym_entry);
}
default:
return (var_sym_entry);
}
default:
errstr("Inconsistent declaration of identifier %s",var_hash_entry->ident,16);
return (var_sym_entry); /* return (SMNULL);*/
}
pointer_type = make_type(fi, T_POINTER);
pointer_type->entry.Template.base_type = base_type;
return (make_sym_entry(var_hash_entry, VARIABLE_NAME, pointer_type,
cur_scope(), kind));
}
PTR_SYMB
make_function(var_hash_entry, type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE type;
int kind;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL){
if (kind == LOCAL)
return (make_sym_entry(var_hash_entry, FUNCTION_NAME, type,
cur_scope(), kind));
else return (make_sym_entry(var_hash_entry, FUNCTION_NAME, type,
global_bfnd, kind));
}
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd) {
if (var_variant == FUNCTION_NAME)
{
if (kind == LOCAL)
return (make_sym_entry(var_hash_entry, FUNCTION_NAME, type,
cur_scope(), kind));
else return var_sym_entry;
}
else if (var_variant == ROUTINE_NAME)
{
var_sym_entry->variant = FUNCTION_NAME;/* FB Modified == before*/
return var_sym_entry;
}
else if (var_variant == INTERFACE_NAME)
return var_sym_entry;
else if (var_variant == DEFAULT){
/* intrinsic function can have same name as a common block name */
if(warn_all)
warn1("Function has the same name as a common block %s.",var_hash_entry->ident, 24);
var_sym_entry->variant = FUNCTION_NAME;
return var_sym_entry;
}
else if (var_variant == VARIABLE_NAME)
{
var_sym_entry->variant = FUNCTION_NAME; /* FB Modified == before*/
return var_sym_entry;
}
else
{
errstr("Inconsistent function declaration %s", var_hash_entry->ident, 19);
return (var_sym_entry); /* return (SMNULL);*/
}
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_POINTER:
case T_STRUCT:
case T_DERIVED_TYPE:
/* if not a formal parameter, convert it into
a global function. */
if (var_sym_entry->entry.var_decl.local != IO)
{
var_sym_entry->variant = FUNCTION_NAME;
/* if (kind != LOCAL)
var_sym_entry->scope = global_bfnd; */ /*podd 02.02.23*/
}
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
case T_ARRAY:
if (kind == LOCAL)
{
errstr("Inconsistent function declaration %s",var_hash_entry->ident,19);
return (var_sym_entry);/* return (SMNULL);*/
}
else return (var_sym_entry);
}
case FUNCTION_NAME:
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
case ROUTINE_NAME:
var_sym_entry->variant = FUNCTION_NAME;
return (var_sym_entry);
case INTERFACE_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent function declaration %s", var_hash_entry->ident, 19);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), FUNCTION_NAME, type, cur_scope(), kind));
}
PTR_SYMB
make_external(var_hash_entry, type)
PTR_HASH var_hash_entry;
PTR_TYPE type;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, ROUTINE_NAME, type,
cur_scope(), NO));
var_variant = var_sym_entry->variant;
/*
if (var_sym_entry->scope == global_bfnd) {
if ((var_variant == FUNCTION_NAME) ||
(var_variant == PROCEDURE_NAME) ||
(var_variant == PROCESS_NAME))
return var_sym_entry;
else if (var_variant == ROUTINE_NAME)
{
return var_sym_entry;
}
else
{
errstr("Inconsistent procedure declaration %s", var_hash_entry->ident, 20);
return (var_sym_entry);
}
}
*/
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_POINTER:
case T_STRUCT:
case T_ARRAY:
case T_DERIVED_TYPE:
/* if not a formal parameter, convert it into
a global function. */
if (var_sym_entry->entry.var_decl.local != IO)
var_sym_entry->variant = ROUTINE_NAME;
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
}
case ROUTINE_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent procedure declaration %s", var_hash_entry->ident, 20);
return (var_sym_entry); /*return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), ROUTINE_NAME, type, cur_scope(), NO));
}
PTR_SYMB
make_intrinsic(var_hash_entry, type)
PTR_HASH var_hash_entry;
PTR_TYPE type;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, ROUTINE_NAME, type,
cur_scope(), LOCAL));
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_POINTER:
case T_STRUCT:
case T_ARRAY:
case T_DERIVED_TYPE:
/* if not a formal parameter, convert it into
a global function. */
if (var_sym_entry->entry.var_decl.local != IO)/*7.03.03*/
var_sym_entry->variant = ROUTINE_NAME;
if (type != TYNULL)
var_sym_entry->type = type;
return (var_sym_entry);
}
case FUNCTION_NAME:
case PROCEDURE_NAME:
case ROUTINE_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent procedure declaration %s", var_hash_entry->ident, 20);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), ROUTINE_NAME, type, cur_scope(), LOCAL));
}
PTR_SYMB
make_procedure(var_hash_entry, kind)
PTR_HASH var_hash_entry;
int kind;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL) {
if (kind == LOCAL)
return (make_sym_entry(var_hash_entry, PROCEDURE_NAME, TYNULL,
cur_scope(), kind));
else return (make_sym_entry(var_hash_entry, PROCEDURE_NAME, TYNULL,
global_bfnd, kind));
}
if (var_sym_entry->scope == global_bfnd) {
if (var_sym_entry->variant == PROCEDURE_NAME){
if (kind == LOCAL) /*10.03.03*/
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), PROCEDURE_NAME, TYNULL,
cur_scope(), kind));
else return var_sym_entry;
/* if (var_sym_entry->variant == PROCEDURE_NAME)
return (var_sym_entry);*/
}
else if (var_sym_entry->variant == PROCESS_NAME)
{
var_sym_entry->variant = PROCEDURE_NAME;
return var_sym_entry;
}
else if (var_sym_entry->variant == ROUTINE_NAME)
{
var_sym_entry->variant = PROCEDURE_NAME;
return var_sym_entry;
}
else if (var_sym_entry->variant == INTERFACE_NAME)
return var_sym_entry;
else
{
errstr("Inconsistent subroutine declaration %s", var_hash_entry->ident, 21);
return (var_sym_entry); /* return (SMNULL);*/
}
}
if (var_sym_entry->scope == cur_scope())
switch(var_sym_entry->variant)
{
case PROCEDURE_NAME:
return (var_sym_entry);
case VARIABLE_NAME:
/* if not a formal parameter, convert it into
a global procedure. */
if (var_sym_entry->entry.var_decl.local != IO)
{
var_sym_entry->variant = PROCEDURE_NAME;
/* if(kind != LOCAL)
var_sym_entry->scope = global_bfnd; */ /*podd 02.02.23*/
}
return (var_sym_entry);
case PROCESS_NAME:
var_sym_entry->variant = PROCEDURE_NAME;
return (var_sym_entry);
case ROUTINE_NAME:
var_sym_entry->variant = PROCEDURE_NAME;
return (var_sym_entry);
case INTERFACE_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent subroutine declaration %s", var_hash_entry->ident, 21);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
PROCEDURE_NAME, TYNULL, cur_scope(), kind));
}
PTR_SYMB /* make_process added for FORTRAN M */
make_process(var_hash_entry, kind)
PTR_HASH var_hash_entry;
int kind;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL) {
if (kind == LOCAL)
return (make_sym_entry(var_hash_entry, PROCESS_NAME, TYNULL,
cur_scope(), kind));
else return (make_sym_entry(var_hash_entry, PROCESS_NAME, TYNULL,
global_bfnd, kind));
}
if (var_sym_entry->scope == global_bfnd) {
if (var_sym_entry->variant == PROCESS_NAME)
return (var_sym_entry);
else if (var_sym_entry->variant == PROCEDURE_NAME)
{
var_sym_entry->variant = PROCESS_NAME;
return var_sym_entry;
}
else if (var_sym_entry->variant == ROUTINE_NAME)
{
var_sym_entry->variant = PROCESS_NAME;
return var_sym_entry;
}
else if (var_sym_entry->variant == INTERFACE_NAME)
return var_sym_entry;
else
{
errstr("Inconsistent process %s %d", var_hash_entry->ident, var_sym_entry->variant, 317);
return (SMNULL);
}
}
if (var_sym_entry->scope == cur_scope())
switch(var_sym_entry->variant)
{
case PROCESS_NAME:
return (var_sym_entry);
case VARIABLE_NAME:
/* if not a formal parameter, convert it into
a global procedure. */
if (var_sym_entry->entry.var_decl.local != IO)
{
var_sym_entry->variant = PROCESS_NAME;
var_sym_entry->scope = global_bfnd;
}
return (var_sym_entry);
case PROCEDURE_NAME:
var_sym_entry->variant = PROCESS_NAME;
return (var_sym_entry);
case ROUTINE_NAME:
var_sym_entry->variant = PROCESS_NAME;
return (var_sym_entry);
case INTERFACE_NAME:
return (var_sym_entry);
default:
errstr("Inconsistent process %s", var_hash_entry->ident,317);
return (SMNULL);
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident),
PROCESS_NAME, TYNULL, global_bfnd, kind));
}
PTR_SYMB
make_program(var_hash_entry)
PTR_HASH var_hash_entry;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, PROGRAM_NAME, TYNULL,
global_bfnd, 0));
if (var_sym_entry->scope == global_bfnd)
{
errstr("Inconsistent program declaration %s", var_hash_entry->ident, 22);
return (var_sym_entry); /*return (SMNULL);*/
}
if (var_sym_entry->scope == cur_scope())
{
errstr("Inconsistent program declaration %s", var_hash_entry->ident, 22);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), PROGRAM_NAME,
TYNULL, global_bfnd, 0));
}
PTR_SYMB
make_module(var_hash_entry)
PTR_HASH var_hash_entry;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, MODULE_NAME, TYNULL,
global_bfnd, 0));
if (var_sym_entry->scope == global_bfnd)
{
errstr("Inconsistent module declaration %s", var_hash_entry->ident, 331);
return (var_sym_entry); /* return (SMNULL);*/
}
if (var_sym_entry->scope == cur_scope())
{
errstr("Inconsistent module declaration %s", var_hash_entry->ident, 331);
return (var_sym_entry); /* return (SMNULL);*/
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), MODULE_NAME,
TYNULL, global_bfnd, 0));
}
PTR_SYMB
make_common(var_hash_entry)
PTR_HASH var_hash_entry;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, DEFAULT, TYNULL, global_bfnd,
0));
if (var_sym_entry->scope == global_bfnd) {
if (var_sym_entry->variant == DEFAULT)
return (var_sym_entry);
else
{ if(var_sym_entry->variant == FUNCTION_NAME){
/* intrinsic function can have same name as a common block name */
if(warn_all)
warn1("Common block have same name as a function %s", var_hash_entry->ident, 25);
return (var_sym_entry);
}
else
errstr("Inconsistent common declaration %s", var_hash_entry->ident, 23);
return (var_sym_entry); /* return (SMNULL);*/
}
}
/* A local entity can have same name as a common block name. So, ignore
the local entity. */
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), DEFAULT,
TYNULL, global_bfnd, 0));
}
PTR_SYMB
make_parallel_region(var_hash_entry) /*SPF*/
PTR_HASH var_hash_entry;
{
PTR_SYMB var_sym_entry;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
return (make_sym_entry(var_hash_entry, SPF_REGION_NAME, TYNULL, global_bfnd,
0));
if (var_sym_entry->scope == global_bfnd) {
if (var_sym_entry->variant != SPF_REGION_NAME)
errstr("Inconsistent region declaration %s", var_hash_entry->ident, 630);
return (var_sym_entry);
}
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), SPF_REGION_NAME,
TYNULL, global_bfnd, 0));
}
PTR_TYPE
make_type_node(typespec, lengspec)
PTR_TYPE typespec;
PTR_LLND lengspec;
{
PTR_TYPE t;
t = typespec;
if (lengspec != LLNULL)
{
t = make_type(fi, typespec->variant);
if(typespec->variant == T_STRING)
t->entry.Template.dummy1 = typespec->entry.Template.dummy1; /* dummy1=2 for string constant inclosing " */
if(lengspec->variant == LEN_OP) {
t->entry.Template.ranges = lengspec;
t->entry.Template.kind_len = typespec->entry.Template.kind_len;
}
else
t->entry.Template.kind_len = lengspec;
}
return (t);
}
PTR_SYMB
make_derived_type(var_hash_entry, type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE type;
int kind;
{
PTR_SYMB var_sym_entry;
PTR_TYPE struct_type;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
{
struct_type = make_type(fi, T_STRUCT);
return (make_sym_entry(var_hash_entry, TYPE_NAME, struct_type,
cur_scope(), kind));
}
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd)
{
struct_type = make_type(fi, T_STRUCT);
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), TYPE_NAME, struct_type,
cur_scope(), kind));/*16.03.03*/
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
case VARIABLE_NAME:
/* var_sym_entry's type */
var_sym_entry->variant = TYPE_NAME;
switch (var_sym_entry->type->variant)
{
case T_STRING:
case T_ARRAY:
if (type != TYNULL)
var_sym_entry->type->entry.ar_decl.base_type =
type;
return (var_sym_entry);
case T_INT:
case T_FLOAT:
case T_DOUBLE:
case T_COMPLEX:
case T_BOOL:
case T_POINTER:
case T_STRUCT:
{
struct_type = make_type(fi, T_STRUCT);
var_sym_entry->type = struct_type;
return (var_sym_entry);
}
default:
return (var_sym_entry);
}
case TYPE_NAME: /*added 24.04.12*/
{
struct_type = make_type(fi, T_STRUCT);
var_sym_entry->type = struct_type;
return (var_sym_entry);
}
default:
errstr("Inconsistent struct declaration of identifier %s", var_hash_entry->ident,318);
return (var_sym_entry); /* return (SMNULL);*/
}
struct_type = make_type(fi, T_STRUCT);
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), TYPE_NAME, struct_type,
cur_scope(), kind)); /*16.03.03*/
}
PTR_SYMB
make_local_entity(var_hash_entry, variant, type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE type;
int variant, kind;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
{
return (make_sym_entry(var_hash_entry, variant, type,
cur_scope(), kind));
}
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd)
{
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), variant, type,
cur_scope(), kind)); /*16.03.03*/
}
if (var_sym_entry->scope == cur_scope())
switch(var_variant)
{
default:
if (variant == var_variant)
return(var_sym_entry);
else
{
errstr("Inconsistent declaration of identifier %s", var_hash_entry->ident, 16);
return (var_sym_entry); /*return (SMNULL);*/
}
};
return (make_sym_entry(make_hash_entry(var_hash_entry->ident), variant, type, cur_scope(), kind));/*16.03.03*/
}
PTR_SYMB
make_global_entity(var_hash_entry, variant, type, kind)
PTR_HASH var_hash_entry;
PTR_TYPE type;
int variant, kind;
{
PTR_SYMB var_sym_entry;
int var_variant;
var_sym_entry = var_hash_entry->id_attr;
if (var_sym_entry == SMNULL)
{
return (make_sym_entry(var_hash_entry, variant, type,
global_bfnd, kind));
}
var_variant = var_sym_entry->variant;
if (var_sym_entry->scope == global_bfnd)
switch(var_variant)
{
default:
if (variant == var_variant)
return(var_sym_entry);
else
{
errstr("Inconsistent declaration of identifier %s", var_hash_entry->ident, 16);
return (var_sym_entry); /* return (SMNULL);*/
}
};
errstr("Inconsistent declaration of identifier %s", var_hash_entry->ident, 16);
return (var_sym_entry); /*return (SMNULL);*/
}
void
process_type(type_var, type_fields_end)
PTR_SYMB type_var;
PTR_BFND type_fields_end;
{
PTR_SYMB sym_temp, last_field;
PTR_LLND ll_temp;
PTR_BFND temp;
PTR_BLOB blob_temp;
int count = 0;
temp = cur_scope();
blob_temp = temp->entry.Template.bl_ptr1;
while(blob_temp->ref->variant != VAR_DECL)
blob_temp = blob_temp->next;
/*last_field = blob_temp->ref->entry.Template.ll_ptr1->entry.list.item->entry.Template.symbol;*/
type_var->type->variant = T_STRUCT;
type_var->type->name = type_var; /*18.03.03*/
/* The field derived class is a constraint put by the design. Maybe instead of T_STRUCT, T_RECORD
might be better. But then it would be inconsistent with C++. */
/*type_var->type->entry.derived_class.first = last_field;*/
last_field = SMNULL;
while (blob_temp && (blob_temp->ref != type_fields_end))
{
ll_temp = blob_temp->ref->entry.Template.ll_ptr1;
while (ll_temp != LLNULL)
{
count++;
if(ll_temp->entry.list.item->variant == ASSGN_OP || ll_temp->entry.list.item->variant == POINTST_OP)/*2.07.03*/
sym_temp = ll_temp->entry.list.item->entry.Template.ll_ptr1->entry.Template.symbol;
else
sym_temp = ll_temp->entry.list.item->entry.Template.symbol;
/* sym_temp->entry.Template.tag = FIELD_NAME;*/
sym_temp->entry.field.tag = sym_temp->variant;
sym_temp->variant = FIELD_NAME;
sym_temp->entry.field.base_name = type_var;
if(last_field){
last_field->entry.field.next = sym_temp;
last_field = sym_temp;
}
else {
last_field = sym_temp;
type_var->type->entry.derived_class.first = last_field;
}
ll_temp = ll_temp->entry.list.next;
}
blob_temp = blob_temp->next;
}
type_var->type->entry.derived_class.num_fields = count;
last_field->entry.field.next = SMNULL;
}
void
process_interface(end_of_interface)
PTR_BFND end_of_interface;
{
PTR_SYMB sym_temp, last_symbol, interface_symbol;
PTR_BFND temp;
PTR_BLOB blob_temp;
PTR_LLND list;
temp = pred_bfnd;
blob_temp = temp->entry.Template.bl_ptr1;
interface_symbol = pred_bfnd->entry.Template.symbol;
if (interface_symbol == SMNULL) return;
if((pred_bfnd->variant != INTERFACE_STMT)) return;
if(!blob_temp->ref) return;
last_symbol = SMNULL;
while (blob_temp && (blob_temp->ref != end_of_interface))
{
sym_temp = blob_temp->ref->entry.Template.symbol;
if(sym_temp != SMNULL){
if(last_symbol) {
last_symbol->entry.Template.declared_name = sym_temp;
last_symbol = sym_temp;
}
else {
last_symbol = sym_temp;
interface_symbol->entry.Template.symb_list = last_symbol;/*19.03.03*/
}
blob_temp = blob_temp->next;
continue;
}
/* MODULE_PROC_STMT(module procedure statement)*/
list = blob_temp->ref->entry.Template.ll_ptr1;
while(list){
sym_temp = list->entry.Template.ll_ptr1->entry.Template.symbol;
if(last_symbol) {
last_symbol->entry.Template.declared_name = sym_temp;
last_symbol = sym_temp;
}
else {
last_symbol = sym_temp;
interface_symbol->entry.Template.symb_list = last_symbol;/*19.03.03*/
}
list = list->entry.Template.ll_ptr2;
}
blob_temp = blob_temp->next;
}
last_symbol->entry.Template.declared_name = SMNULL;
}
/*
void
process_interface(end_of_interface)
PTR_BFND end_of_interface;
{
PTR_SYMB sym_temp, last_symbol, interface_symbol;
PTR_BFND temp;
PTR_BLOB blob_temp;
temp = pred_bfnd;
blob_temp = temp->entry.Template.bl_ptr1;
interface_symbol = pred_bfnd->entry.Template.symbol;
if (interface_symbol == SMNULL) return;
if((pred_bfnd->variant != INTERFACE_STMT)) return;
if(!blob_temp->ref) return;
last_symbol = blob_temp->ref->entry.Template.symbol;
interface_symbol->entry.Template.declared_name = last_symbol;
while (blob_temp && (blob_temp->ref != end_of_interface))
{
sym_temp = blob_temp->ref->entry.Template.symbol;
last_symbol->entry.Template.declared_name = sym_temp;
blob_temp = blob_temp->next;
last_symbol = sym_temp;
}
last_symbol->entry.Template.declared_name = SMNULL;
}
*/
PTR_TYPE
lookup_type(name)
PTR_HASH name;
{
/* PTR_HASH hash_temp; */
PTR_SYMB sym_temp;
PTR_TYPE ty_temp;
/* hash_temp = just_look_up_sym(name->ident); */ /*05.04.17*/
/* if (hash_temp && (sym_temp = hash_temp->id_attr) && (sym_temp->variant == TYPE_NAME))
{
ty_temp = make_type(fi, T_DERIVED_TYPE);
ty_temp->name = sym_temp;
ty_temp->entry.derived_type.symbol = sym_temp;
return (ty_temp);
}
errstr("Undefined type %s", name->ident,319);
return (TYNULL);
*/ /*24.04.12*/
if (name && (sym_temp = name->id_attr) && (sym_temp->variant == TYPE_NAME))
;
else
sym_temp = make_sym_entry(name, TYPE_NAME, TYNULL, cur_scope(), LOCAL);
ty_temp = make_type(fi, T_DERIVED_TYPE);
ty_temp->name = sym_temp;
ty_temp->entry.derived_type.symbol = sym_temp;
return (ty_temp);
}
PTR_SYMB
component(type_sym_entry, fieldname)
PTR_SYMB type_sym_entry;
char *fieldname;
{
int i;
register PTR_HASH entry;
register PTR_SYMB t;
PTR_SYMB OriginalSymbol();
i = hash(fieldname);
for (entry = hash_table[i]; entry; entry = entry->next_entry) {
t = entry->id_attr;
if (!strcmp(fieldname, entry->ident) && t &&
(t->variant == FIELD_NAME) && OriginalSymbol(t->entry.field.base_name) == OriginalSymbol(type_sym_entry)) /*type_sym_entry->type->name*/ /*BaseSymbol(type_sym_entry)*//*(!strcmp(t->entry.field.base_name->ident, type_sym_entry->ident)) */
return (t);
}
return (SMNULL);
}
PTR_SYMB
lookup_type_symbol(type_sym_entry)
PTR_SYMB type_sym_entry;
{
int i;
register PTR_HASH entry;
register PTR_SYMB s;
if (type_sym_entry == NULL)
return (SMNULL);
if (type_sym_entry->type->variant == T_STRUCT && type_sym_entry->type->name)
return (type_sym_entry);
i = hash(type_sym_entry->ident);
for (entry = hash_table[i]; entry; entry = entry->next_entry)
{
s = entry->id_attr;
if (!strcmp(type_sym_entry->ident, entry->ident) && s)
if (s->variant == TYPE_NAME && s->type->variant == T_STRUCT && s->type->name)
return (s);
}
return (SMNULL);
}
PTR_LLND
deal_with_options(name, type, attributes, dims, ndim, value, spec_dims)
PTR_HASH name;
PTR_TYPE type;
int attributes, ndim;
PTR_LLND dims, value, spec_dims;
{
PTR_SYMB s;
PTR_LLND l;
PTR_TYPE t;
l = LLNULL;
s = SMNULL;
t = TYNULL;
if ((attributes & DIMENSION_BIT) && (dims != LLNULL))
{
t = make_type(fi, T_ARRAY);
t->entry.ar_decl.base_type = type;
t->entry.ar_decl.num_dimensions = ndim;
t->entry.ar_decl.ranges = dims;
}
else
t = type;
if (attributes & PARAMETER_BIT)
{
s = make_constant(name, type);
s->entry.const_value = value;
if(!value)
errstr("An initialization expression is missing: %s", s->ident,267 );
s->attr = s->attr | attributes;
if((t->variant==T_STRING) || (t->variant==T_ARRAY))
l = make_llnd(fi, ARRAY_REF, spec_dims, LLNULL, s);
else
l = make_llnd(fi, CONST_REF, LLNULL, LLNULL, s);
s->type = t; /*7.03.03*/
return (l);
}
if (attributes & EXTERNAL_BIT)
{
s = make_scalar(name, type, NO);
s->attr = s->attr | attributes;
/*s->variant = ROUTINE_NAME;*//*7.02.03*/
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
return (l);
}
if (attributes & INTRINSIC_BIT)
{
s = make_intrinsic(name, type); /*make_function(name, type, NO);*/
s->attr = s->attr | attributes;
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
return (l);
}
s = make_scalar(name, type, LOCAL);
s->attr = s->attr | attributes;
if ((attributes & DIMENSION_BIT) && (dims != LLNULL))
{
s->type = t;
/*s = make_array(name, type, dims, ndim, LOCAL);*/
l = make_llnd(fi, ARRAY_REF, spec_dims, LLNULL, s);
/*s->type->entry.ar_decl.ranges = dims;*/
}
if (l == LLNULL)
{
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
}
if (value != LLNULL){
if(value->variant == POINTST_OP) {
value->entry.Template.ll_ptr1 = l;
l = value;
} else
l = make_llnd(fi, ASSGN_OP, l, value, SMNULL);
s->attr = s->attr | DATA_BIT; /*7.03.03*/
}
return (l);
}
/*
PTR_LLND
deal_with_options(name, type, attributes, dims, ndim, value, spec_dims)
PTR_HASH name;
PTR_TYPE type;
int attributes, ndim;
PTR_LLND dims, value, spec_dims;
{
PTR_SYMB s;
PTR_LLND l;
l = LLNULL;
if (attributes & PARAMETER_BIT)
{
s = make_constant(name, type);
s->entry.const_value = value;
s->attr = s->attr | attributes;
l = make_llnd(fi, CONST_REF, LLNULL, LLNULL, s);
* return (l);**7.03.03*
}
if (attributes & EXTERNAL_BIT)
{
s = make_scalar(name, type, NO);
s->attr = s->attr | attributes;
*s->variant = ROUTINE_NAME;**7.02.03*
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
return (l);
}
if (attributes & INTRINSIC_BIT)
{
s = make_intrinsic(name, type); *make_function(name, type, NO);*
s->attr = s->attr | attributes;
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
return (l);
}
if ((attributes & DIMENSION_BIT) && (dims != LLNULL))
{
s = make_array(s->parent, TYNULL, dims, ndim, LOCAL);
l = make_llnd(fi, ARRAY_REF, spec_dims, LLNULL, s);
s->type->entry.ar_decl.ranges = dims;
else
s = make_scalar(name, type, LOCAL);
s->attr = s->attr | attributes;
if (l == LLNULL)
{
l = make_llnd(fi, VAR_REF, LLNULL, LLNULL, s);
}
if (value != LLNULL){
l = make_llnd(fi, ASSGN_OP, l, value, SMNULL);
s->attr = s->attr | DATA_BIT; *7.03.03*
}
return (l);
}
*/
/*
PTR_BFND
parent_scope(p)
register PTR_BFND p;
{
for (p = p->control_parent;
(p != BFNULL) &&
(p->variant != PROG_HEDR) &&
(p->variant != PROC_HEDR) &&
(p->variant != PROS_HEDR) &&
(p->variant != FUNC_HEDR) &&
(p->variant != BLOCK_DATA) &&
(p->variant != FORALL_NODE) &&
(p->variant != GLOBAL) &&
(p->variant != CDOALL_NODE) &&
(p->variant != SDOALL_NODE) &&
(p->variant != DOACROSS_NODE) &&
(p->variant != CDOACROSS_NODE) &&
(p->variant != STRUCT_DECL);
p = p->control_parent)
;
return (p);
}
*/
int is_array_section_ref(list)
PTR_LLND list;
{
int num_triplets = 0;
PTR_LLND p;
PTR_TYPE t;
p = list;
while (p != LLNULL)
{
/* subscript range */
if (p->entry.Template.ll_ptr1->variant == DDOT) num_triplets++;
if ((t = list->entry.Template.ll_ptr1->type))
{
if (t->variant == KEYWORD_ARG) return (0);
/* vector subscript */
if ((t->variant == T_ARRAY) && (t->entry.ar_decl.base_type->variant == T_INT))
num_triplets++;
}
p = p->entry.Template.ll_ptr2;
}
return (num_triplets);
}
int is_substring_ref(list)
PTR_LLND list;
{ PTR_LLND l1;
l1 = list->entry.Template.ll_ptr1;
if (l1->variant == KEYWORD_ARG) return (0);
if (list && (list->entry.Template.ll_ptr2 == LLNULL) &&
l1 && (l1->variant == DDOT) &&
(l1->entry.Template.ll_ptr1->variant == DDOT))
return (1);
else return (0);
}
void
bind()
{
PTR_SYMB s, sym;
PTR_LLND tmp;
PTR_HASH hash_node;
while (first_unresolved_call != LLNULL)
{
s = first_unresolved_call->entry.Template.symbol;
if (s->decl == 0)
{
hash_node = just_look_up_sym_in_scope(s->scope->control_parent, s->ident);
if (hash_node == HSNULL)
{
s->scope = global_bfnd;
}
else if ((hash_node->id_attr->variant == s->variant) || (hash_node->id_attr->variant == VARIABLE_NAME))
{
sym = hash_node->id_attr;
/* remove s from symbol table. */
s->parent->id_attr = SMNULL;
first_unresolved_call->entry.Template.symbol = sym;
}
else errstr("Inconsistent call %s", s->ident, 320);
}
tmp = first_unresolved_call;
first_unresolved_call = tmp->entry.Template.ll_ptr2;
tmp->entry.Template.ll_ptr2 = LLNULL;
}
}
void
late_bind_if_needed(ll_node)
PTR_LLND ll_node;
{
PTR_SYMB s;
s = ll_node->entry.Template.symbol;
if ((s->entry.var_decl.local == IO) ||
(s->decl == YES))
return;
else
{
if (first_unresolved_call == LLNULL)
last_unresolved_call = first_unresolved_call = ll_node;
else
{
last_unresolved_call->entry.Template.ll_ptr2 = ll_node;
last_unresolved_call = ll_node;
}
}
}
void
redefine_func_arg_type()
{PTR_BFND hedr;
PTR_SYMB arg,proc,res;
hedr = cur_scope();
if((hedr->variant == FUNC_HEDR) ||(hedr->variant == PROC_HEDR))
proc = hedr->entry.Template.symbol;
else
return;
if((hedr->variant == FUNC_HEDR) && (hedr->entry.Template.ll_ptr2 == LLNULL)){
if (proc->type->variant == T_ARRAY)
proc->type->entry.ar_decl.base_type = impltype[*proc->ident - 'a'];
else
proc->type = impltype[*proc->ident - 'a'];
if (hedr->entry.Template.ll_ptr1 != LLNULL){
res = hedr->entry.Template.ll_ptr1->entry.Template.symbol;
res->type = impltype[*res->ident - 'a'];
}
}
for(arg = proc->entry.proc_decl.in_list; arg; arg=arg->entry.var_decl.next_in)
if (arg->type->variant == T_ARRAY)
arg->type->entry.ar_decl.base_type = impltype[*arg->ident - 'a'];
else
{
if (*arg->ident - 'a' >= 0)
arg->type = impltype[*arg->ident - 'a'];
}
}
int
in_rename_list(symb,list)
PTR_SYMB symb;
PTR_LLND list;
{ PTR_SYMB s;
PTR_LLND l;
for(l = list; l ; l = l->entry.Template.ll_ptr2){
s = l->entry.Template.ll_ptr1->entry.Template.ll_ptr2->entry.Template.symbol;
if(!strcmp(symb->ident,s->ident))
return(1);
}
return(0);
}
void
copy_sym_data(source, dest)
PTR_SYMB source, dest;
{PTR_SYMB BaseSymbol();
if(source->variant == CONST_NAME) {/* named constant */ /*16.03.03 */
dest->entry.const_value = source->entry.const_value;
dest->entry.Template.base_name = BaseSymbol(source); /*27.01.12*/
dest->attr = source->attr; /*06.11.12*/
return;
}
if(dest->entry.Template.seen == BY_USE) return;
dest->attr = source->attr; /* source->attr & (~PRIVATE_BIT) & (~PUBLIC_BIT);*/
dest->attr = dest->attr & (~PRIVATE_BIT);
dest->attr = dest->attr & (~PUBLIC_BIT);
if(privateall)
dest->attr = dest->attr | PRIVATE_BIT;
dest->entry.Template.seen = BY_USE; /*source->entry.Template.seen;*/
dest->entry.Template.num_input = source->entry.Template.num_input;
dest->entry.Template.num_output = source->entry.Template.num_output;
dest->entry.Template.num_io = source->entry.Template.num_io;
dest->entry.Template.in_list = source->entry.Template.in_list;
dest->entry.Template.out_list = source->entry.Template.out_list;
dest->entry.Template.symb_list = source->entry.Template.symb_list;
dest->entry.Template.local_size = source->entry.Template.local_size;
dest->entry.Template.label_list = source->entry.Template.label_list;
dest->entry.Template.func_hedr = source->entry.Template.func_hedr;
dest->entry.Template.call_list = source->entry.Template.call_list;
dest->entry.Template.tag = source->entry.Template.tag;
dest->entry.Template.offset = source->entry.Template.offset;
dest->entry.Template.declared_name = source->entry.Template.declared_name;
/*dest->entry.Template.next = source->entry.Template.next;*/
/*dest->entry.Template.base_name = source->entry.Template.base_name;*/
dest->entry.Template.base_name = BaseSymbol(source); /*25.03.03*/ /*source;*/
}
void
delete_symbol(symb)
PTR_SYMB symb;
{
/* PTR_SYMB symb_scope, s, s_pre;
symb_scope = symb->scope->entry.Template.symbol;
for(s=symb_scope->thread,s_pre=symb_scope; s; s_pre=s,s=s->thread) {
if(s==symb) {
s_pre->thread = s->thread;
return;
}
}
*/
/* symb->parent = BFNULL; */
symb->ident = "***";
symb->scope = BFNULL;
symb->type = TYNULL;
return;
}
int
copy_is(sym_mod)
PTR_SYMB sym_mod;
{ //looking for a USE-ststement with sym_mod symbol without ONLY-clause
PTR_BFND st;
for(st=cur_scope()->thread; st!=last_bfnd; st=st->thread) {
if(st->variant==USE_STMT && st->entry.Template.ll_ptr1 && st->entry.Template.ll_ptr1->variant==ONLY_NODE)
continue;
if(st->variant==USE_STMT && !strcmp(st->entry.Template.symbol->ident,sym_mod->ident))
return (1);
}
return (0);
}
void
copy_module_scope(sym_mod,list)
PTR_SYMB sym_mod;
PTR_LLND list;
{
PTR_SYMB new_symb, source;
PTR_HASH copy;
if(copy_is(sym_mod))
return;
for(source=sym_mod->entry.Template.next; source; source=source->entry.Template.next) {
if((source->attr & PRIVATE_BIT) && (!(source->attr & PUBLIC_BIT)) )
continue;
if(source->variant == FUNCTION_NAME && source->decl != YES) /* intrinsic function called from specification expression */ /* podd 24.02.24 */
continue;
if(list && in_rename_list(source,list))
continue;
if(!strcmp(source->ident, "***"))
continue;
if((copy=just_look_up_sym_in_scope(cur_scope(),source->ident)) && copy->id_attr && copy->id_attr->entry.Template.tag==sym_mod->entry.Template.func_hedr->id)
continue;
new_symb = make_local_entity(source->parent, source->variant, source->type, LOCAL);
copy_sym_data(source,new_symb);
new_symb->entry.Template.tag = sym_mod->entry.Template.func_hedr->id;
/* if(new_symb->entry.Template.seen != BY_USE) {
copy_sym_data(source,new_symb);
new_symb->entry.Template.base_name = source;
}
*/
}
return;
}
PTR_SYMB
BaseSymbol(sym)
PTR_SYMB sym;
{ PTR_SYMB s;
s = sym;
while(s && s->entry.Template.seen == BY_USE)
s = s->entry.Template.base_name;
return(s);
}
PTR_SYMB
OriginalSymbol(sym)
PTR_SYMB sym;
{
if(sym && sym->entry.Template.base_name)
return(sym->entry.Template.base_name);
else
return(sym);
}
int isResultVar(sym)
PTR_SYMB sym;
{ PTR_BFND curstmt;
curstmt = cur_scope();
if ((sym->variant == FUNCTION_NAME) &&(curstmt->variant == FUNC_HEDR) && (!curstmt->entry.Template.ll_ptr1) &&
(!(strcmp(sym->parent->ident, curstmt->entry.Template.symbol->ident))))
return(1); /* function name is a result variable name */
else
return(0);
}
void replace_symbol_in_expr(PTR_LLND expr, PTR_SYMB symb)
{
if(!expr)
return;
if(expr->variant == VAR_REF)
if(!strcmp(expr->entry.Template.symbol->ident, symb->ident))
expr->entry.Template.symbol = symb;
replace_symbol_in_expr(expr->entry.Template.ll_ptr1,symb);
replace_symbol_in_expr(expr->entry.Template.ll_ptr2,symb);
}