[Prev][Next][Index]
Help me!
- From: mgolden@demon.eecs.umich.edu (michael leonard golden)
- Subject: Help me!
- To: sage-bugs@cica.indiana.edu
- Date: Mon, 29 Aug 94 16:32:29 EDT
Hello,
I think that this is a bug:
When I create a new variable with the type of an old variable,
normally everything works fine. Things get funny when the old type is a pointer
to a function. The new variable is declared to be of the type of the
function, not to be a function of that type.
Heh heh.
I think the following example will be more illustrative than my tangled tongue:
Original file:
test()
{
int original1;
int *original2;
int (*original3)();
int original4();
}
The new file, where I created copies of every variable that is declared:
test(){
int original4_copy;
int *original3_copy;
int *original2_copy;
int original1_copy;
int original1;
int *original2;
int (*original3)();
int original4();
}
original3_copy and original4_copy shoud be declared
int original4_copy();
int (*original3_copy)();
Yikers. I have looked and looked and cannot find the problem. It seems
that the T_FUNCTION is in the type of the new declaration, but it is not being
printed out. Of course, Tool_Unparse2_LLnode() (or whatever it is called)
must be able to handle it, since it is printing out the original3 variable
correctly.
Help me please! Here is the source code for this example:
------------- Source Code Begins Here ---------------------
#include <stdio.h>
#include <strings.h>
#include <malloc.h>
#include "sage++user.h"
extern "C" {
int exit(int);
}
void
make_new_decls(SgStatement *first_stmt) {
SgStatement *current_stmt = first_stmt;
SgStatement *current_scope = first_stmt;
SgVarDeclStmt *var_decl;
SgType *type;
int variant;
char *new_symbol_name;
char *old_symbol_name;
SgVariableSymb *new_symbol;
while (current_stmt) {
variant = current_stmt->variant();
if (variant == FUNC_HEDR) {
current_scope = current_stmt;
}
if (variant == VAR_DECL) {
var_decl = (SgVarDeclStmt *) current_stmt;
/* Get the type using Maur's trueType(). The function */
/* problem still happens with type() alone. */
type = var_decl->symbol(0)->type()->getTrueType();
/* Make a name oldname_copy */
old_symbol_name = var_decl->symbol(0)->identifier();
new_symbol_name = (char *) malloc (strlen(old_symbol_name) + 6);
sprintf(new_symbol_name,"%s_copy",old_symbol_name);
/* Make the new symbol, and then declare it */
new_symbol = new SgVariableSymb(new_symbol_name,
*type);
new_symbol->declareTheSymbol(*current_scope);
}
current_stmt=current_stmt->lexNext();
}
}
int
main(int argc, char *argv[])
{
SgProject *P;
SgFile *current_file;
FILE *output_file;
char *output_file_name;
char *last_period;
int num_files;
int num_functions;
int i,j;
if (argc < 2) {
fprintf(stderr, "Syntax : bug projectname\n");
exit(-1);
}
fprintf(stdout,"Opening and initializing project : %s\n", argv[1]);
P = new SgProject(argv[1]);
num_files = P->numberOfFiles();
fprintf(stdout,"Here are the files in %s : \n",argv[1]);
for (i = 0; i < num_files ; i++) {
fprintf(stdout,"\t%s\n",P->fileName(i));
current_file = &(P->file(i));
/* Put the code in a simpler form to make instrumentation easy */
make_new_decls(current_file -> firstStatement());
fprintf(stdout,"\t\tRestructured code... \n");
output_file_name = (char *) malloc (strlen(P->fileName(i)) + 7);
/* copy up to the last period */
last_period = strrchr(P->fileName(i),'.') ;
strncpy(output_file_name,P->fileName(i),
last_period - P->fileName(i));
strcat(output_file_name,".decls");
strcat(output_file_name,last_period);
output_file = fopen(output_file_name,"w");
/* Unparse the scanned program to the output file */
fprintf(stdout,"\t\tUnparsing to %s\n\n",output_file_name);
P->file(i).unparse(output_file);
fflush(output_file);
}
}
------------- Source Code Ends Here ---------------------
Michael
-------------------------------------------------------
mgolden@eecs.umich.edu
"They that can give up essential liberty to obtain a little temporary
safety deserve neither liberty nor safety."
-- Benjamin Franklin, 1759