moved
This commit is contained in:
329
Sapfor/_src/SageAnalysisTool/annotationDriver.cpp
Normal file
329
Sapfor/_src/SageAnalysisTool/annotationDriver.cpp
Normal file
@@ -0,0 +1,329 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "sage++user.h"
|
||||
#include "annotationDriver.h"
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// set of functions in the library
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef __SPF
|
||||
extern "C" void addToCollection(const int line, const char *file, void *pointer, int type);
|
||||
extern "C" void removeFromCollection(void *pointer);
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
int initAnnotation();
|
||||
PTR_LLND Get_Define_Field(...);
|
||||
char *Get_Define_Label_Field(...);
|
||||
char *Get_Label_Field(...);
|
||||
PTR_LLND Get_ApplyTo_Field(...);
|
||||
PTR_LLND Get_ApplyToIf_Field(...);
|
||||
PTR_LLND Get_LocalVar_Field(...);
|
||||
PTR_LLND Get_Annotation_Field(...);
|
||||
char *Get_Annotation_Field_Label(...);
|
||||
char *Unparse_Annotation(...);
|
||||
char *Does_Annotation_Defines(...);
|
||||
int Get_Annotation_With_Label(...);
|
||||
int Get_Scope_Of_Annotation(...);
|
||||
PTR_LLND Does_Annotation_Apply(...);
|
||||
PTR_LLND Get_Annotation_Field_List_For_Stmt(...);
|
||||
PTR_LLND Get_Annotation_List_For_Stmt(...);
|
||||
int Get_Number_of_Annotation();
|
||||
PTR_BFND Get_Annotation_Bif(...);
|
||||
PTR_LLND Get_Annotation_Expr(...);
|
||||
char *Get_String_of_Annotation(...);
|
||||
PTR_CMNT Get_Annotation_Comment(...);
|
||||
int Is_Annotation_Defined(...);
|
||||
char *Annotation_Defines_string(...);
|
||||
int Annotation_Defines_string_Value(...);
|
||||
int isItInSection(...);
|
||||
}
|
||||
extern "C" int TRACEANN;
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// Link with the Sage: maps it in sage space.
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
extern SgExpression * LlndMapping(PTR_LLND pt);
|
||||
extern SgStatement *BfndMapping(PTR_BFND st);
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// The interface. method of class annotations
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
SgAnnotation::SgAnnotation(int ident)
|
||||
{
|
||||
PTR_BFND first, last;
|
||||
SgFunctionCallExp *cal;
|
||||
|
||||
if ((ident < 0) || (ident >= Get_Number_of_Annotation()))
|
||||
{
|
||||
Message("Invalid annotation", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// the id of the annotation;
|
||||
id = ident;
|
||||
theannotation = LlndMapping(Get_Annotation_Expr(id));
|
||||
//the statement it is attached on;
|
||||
stmt = BfndMapping(Get_Annotation_Bif(id));
|
||||
Get_Scope_Of_Annotation(id, &first, &last);
|
||||
scopebegin = BfndMapping(first);
|
||||
scopeend = BfndMapping(last);
|
||||
defined = Is_Annotation_Defined(id);
|
||||
thedirective = LlndMapping(Get_Annotation_Field(Get_Annotation_Expr(id)));
|
||||
directiveName = Get_Annotation_Field_Label(Get_Annotation_Expr(id));
|
||||
directiveFields = NULL;
|
||||
nbDirectiveFields = 0;
|
||||
if (cal = isSgFunctionCallExp(thedirective))
|
||||
{
|
||||
int i;
|
||||
nbDirectiveFields = cal->numberOfArgs();
|
||||
if (nbDirectiveFields)
|
||||
{
|
||||
directiveFields = new SgExpression *[nbDirectiveFields];
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, directiveFields, 2);
|
||||
#endif
|
||||
for (i = 0; i < nbDirectiveFields; i++)
|
||||
{
|
||||
directiveFields[i] = cal->arg(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Message("Fail to recognize annotation format", 0);
|
||||
}
|
||||
next = NULL;
|
||||
}
|
||||
|
||||
|
||||
SgAnnotation::~SgAnnotation()
|
||||
{
|
||||
if (directiveFields)
|
||||
{
|
||||
#ifdef __SPF
|
||||
removeFromCollection(directiveFields);
|
||||
#endif
|
||||
delete[] directiveFields;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char * SgAnnotation::unparse()
|
||||
{
|
||||
return Unparse_Annotation(Get_Annotation_Expr(id));
|
||||
}
|
||||
|
||||
|
||||
int SgAnnotation::applyToStatement(SgStatement *stat)
|
||||
{
|
||||
SgStatement *temp;
|
||||
|
||||
if (!stat)
|
||||
return 0;
|
||||
|
||||
for (temp = scopebegin; temp; temp = temp->lexNext())
|
||||
{
|
||||
if (temp == stat)
|
||||
return 1;
|
||||
|
||||
if (temp == scopeend)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// non method functions to get the annotation
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
/////////////////////////////////////////////////////////////
|
||||
// create the list of annotations that applies to a statements
|
||||
// only the defined one
|
||||
/////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
SgAnnotation *
|
||||
getTheAnnotationThatApply(SgStatement *stmt, char *kind)
|
||||
{
|
||||
int i;
|
||||
PTR_BFND first, last;
|
||||
SgAnnotation *listann = NULL;
|
||||
SgAnnotation *lastann = NULL;
|
||||
PTR_BFND bif;
|
||||
|
||||
if (!stmt)
|
||||
return NULL;
|
||||
bif = stmt->thebif;
|
||||
|
||||
for (i = 0; i < Get_Number_of_Annotation(); i++)
|
||||
{
|
||||
if (Is_Annotation_Defined(i))
|
||||
{
|
||||
if (kind)
|
||||
{
|
||||
if (Get_Annotation_Field_Label(Get_Annotation_Expr(i)) &&
|
||||
(strcmp(Get_Annotation_Field_Label(Get_Annotation_Expr(i)), kind) == 0))
|
||||
{
|
||||
if (Get_Scope_Of_Annotation(i, &first, &last))
|
||||
{
|
||||
if (isItInSection(first, last, bif))
|
||||
{
|
||||
if (!listann)
|
||||
{
|
||||
listann = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann, 1);
|
||||
#endif
|
||||
lastann = listann;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastann->next = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann->next, 1);
|
||||
#endif
|
||||
lastann = lastann->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Get_Scope_Of_Annotation(i, &first, &last))
|
||||
{
|
||||
if (isItInSection(first, last, bif))
|
||||
{
|
||||
if (!listann)
|
||||
{
|
||||
listann = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann, 1);
|
||||
#endif
|
||||
lastann = listann;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastann->next = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann->next, 1);
|
||||
#endif
|
||||
lastann = lastann->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return listann;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SgAnnotation *
|
||||
getTheAnnotationWithString(char *kind)
|
||||
{
|
||||
int i;
|
||||
PTR_BFND first, last;
|
||||
SgAnnotation *listann = NULL;
|
||||
SgAnnotation *lastann = NULL;
|
||||
PTR_BFND bif;
|
||||
|
||||
|
||||
for (i = 0; i < Get_Number_of_Annotation(); i++)
|
||||
{
|
||||
if (Is_Annotation_Defined(i))
|
||||
{
|
||||
if (kind)
|
||||
{
|
||||
if (Get_Annotation_Field_Label(Get_Annotation_Expr(i)) &&
|
||||
(strncmp(Get_Annotation_Field_Label(Get_Annotation_Expr(i)),
|
||||
kind, strlen(kind)) == 0))
|
||||
if (!listann)
|
||||
{
|
||||
listann = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann, 1);
|
||||
#endif
|
||||
lastann = listann;
|
||||
}
|
||||
else
|
||||
{
|
||||
lastann->next = new SgAnnotation(i);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, listann->next, 1);
|
||||
#endif
|
||||
lastann = lastann->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return listann;
|
||||
}
|
||||
|
||||
int
|
||||
isAnnotationWithString(SgStatement *stmt, char *kind, int len)
|
||||
{
|
||||
int i;
|
||||
PTR_BFND first, last;
|
||||
SgAnnotation *listann = NULL;
|
||||
SgAnnotation *lastann = NULL;
|
||||
PTR_BFND bif;
|
||||
|
||||
if (!stmt)
|
||||
return 0;
|
||||
bif = stmt->thebif;
|
||||
|
||||
for (i = 0; i < Get_Number_of_Annotation(); i++)
|
||||
{
|
||||
if (Is_Annotation_Defined(i))
|
||||
{
|
||||
if (kind)
|
||||
{
|
||||
if (Get_Annotation_Field_Label(Get_Annotation_Expr(i)) &&
|
||||
(strncmp(Get_Annotation_Field_Label(Get_Annotation_Expr(i)),
|
||||
kind, len) == 0))
|
||||
{
|
||||
if (Get_Scope_Of_Annotation(i, &first, &last))
|
||||
{
|
||||
if (isItInSection(first, last, bif))
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void initAnnotationSystem(int printann)
|
||||
{
|
||||
int i;
|
||||
SgExpression *exp;
|
||||
SgStatement *stmt;
|
||||
if (printann)
|
||||
{
|
||||
TRACEANN = 1;
|
||||
}
|
||||
initAnnotation();
|
||||
// add also the annotation expression for the garbage collection attributes;
|
||||
|
||||
for (i = 0; i < Get_Number_of_Annotation(); i++)
|
||||
{
|
||||
exp = LlndMapping(Get_Annotation_Expr(i));
|
||||
stmt = BfndMapping(Get_Annotation_Bif(i));
|
||||
if (stmt && exp)
|
||||
{
|
||||
stmt->addAttribute(ANNOTATION_EXPR_ATTRIBUTE, (void *)exp, 0);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user