Skip to content
Snippets Groups Projects
Commit 125e510e authored by jdh8d's avatar jdh8d
Browse files

Former-commit-id: 63354dfe518e5dd8426ac7590775936d931f5a3b
parent f51dfa03
Branches
Tags cfar-phase3-final
No related merge requests found
...@@ -60,6 +60,7 @@ class File_t : public BaseObj_t ...@@ -60,6 +60,7 @@ class File_t : public BaseObj_t
friend class AggregateType_t; friend class AggregateType_t;
friend class FuncType_t; friend class FuncType_t;
friend class ICFS_t; friend class ICFS_t;
friend class DataScoop_t;
// friend class IBTargets; // friend class IBTargets;
private: private:
......
...@@ -105,6 +105,11 @@ class FileIR_t : public BaseObj_t ...@@ -105,6 +105,11 @@ class FileIR_t : public BaseObj_t
std::map<db_id_t,AddressID_t*> &addrMap, std::map<db_id_t,AddressID_t*> &addrMap,
std::map<db_id_t,Type_t*> &typeMap std::map<db_id_t,Type_t*> &typeMap
); );
void ReadScoopsFromDB
(
std::map<db_id_t,AddressID_t*> &addrMap,
std::map<db_id_t,Type_t*> &typeMap
);
std::map<db_id_t,Instruction_t*> ReadInsnsFromDB std::map<db_id_t,Instruction_t*> ReadInsnsFromDB
( (
std::map<db_id_t,Function_t*> &funcMap, std::map<db_id_t,Function_t*> &funcMap,
......
...@@ -63,6 +63,8 @@ class DataScoop_t : public BaseObj_t ...@@ -63,6 +63,8 @@ class DataScoop_t : public BaseObj_t
void ClearWriteable() { permissions &= ~permissions_w; } void ClearWriteable() { permissions &= ~permissions_w; }
void ClearExecuteable() { permissions &= ~permissions_x; } void ClearExecuteable() { permissions &= ~permissions_x; }
std::string WriteToDB(File_t *fid, db_id_t newid);
private: private:
const int permissions_r=4; const int permissions_r=4;
const int permissions_w=2; const int permissions_w=2;
......
...@@ -18,6 +18,7 @@ files= ''' ...@@ -18,6 +18,7 @@ files= '''
instruction.cpp instruction.cpp
pqxxdb.cpp pqxxdb.cpp
type.cpp type.cpp
scoop.cpp
variantid.cpp variantid.cpp
''' '''
cpppath=''' cpppath='''
......
...@@ -117,6 +117,7 @@ void FileIR_t::ReadFromDB() ...@@ -117,6 +117,7 @@ void FileIR_t::ReadFromDB()
std::map<db_id_t,Type_t*> typesMap = ReadTypesFromDB(types); std::map<db_id_t,Type_t*> typesMap = ReadTypesFromDB(types);
std::map<db_id_t,AddressID_t*> addrMap=ReadAddrsFromDB(); std::map<db_id_t,AddressID_t*> addrMap=ReadAddrsFromDB();
std::map<db_id_t,Function_t*> funcMap=ReadFuncsFromDB(addrMap, typesMap); std::map<db_id_t,Function_t*> funcMap=ReadFuncsFromDB(addrMap, typesMap);
ReadScoopsFromDB(addrMap, typesMap);
std::map<db_id_t,Instruction_t*> addressToInstructionMap; std::map<db_id_t,Instruction_t*> addressToInstructionMap;
std::map<Instruction_t*, db_id_t> unresolvedICFS; std::map<Instruction_t*, db_id_t> unresolvedICFS;
...@@ -615,6 +616,13 @@ void FileIR_t::WriteToDB() ...@@ -615,6 +616,13 @@ void FileIR_t::WriteToDB()
string q = icfs->WriteToDB(fileptr); string q = icfs->WriteToDB(fileptr);
dbintr->IssueQuery(q); dbintr->IssueQuery(q);
} }
for(DataScoopSet_t::const_iterator it=scoops.begin(); it!=scoops.end(); ++it)
{
DataScoop_t* scoop = *it;
assert(scoop);
string q = scoop->WriteToDB(fileptr,j);
dbintr->IssueQuery(q);
}
} }
...@@ -632,6 +640,10 @@ void FileIR_t::SetBaseIDS() ...@@ -632,6 +640,10 @@ void FileIR_t::SetBaseIDS()
j=MAX(j,(*i)->GetBaseID()); j=MAX(j,(*i)->GetBaseID());
for(std::set<Relocation_t*>::const_iterator i=relocs.begin(); i!=relocs.end(); ++i) for(std::set<Relocation_t*>::const_iterator i=relocs.begin(); i!=relocs.end(); ++i)
j=MAX(j,(*i)->GetBaseID()); j=MAX(j,(*i)->GetBaseID());
for(std::set<Type_t*>::const_iterator i=types.begin(); i!=types.end(); ++i)
j=MAX(j,(*i)->GetBaseID());
for(DataScoopSet_t::const_iterator i=scoops.begin(); i!=scoops.end(); ++i)
j=MAX(j,(*i)->GetBaseID());
/* increment past the max ID so we don't duplicate */ /* increment past the max ID so we don't duplicate */
j++; j++;
...@@ -652,6 +664,9 @@ void FileIR_t::SetBaseIDS() ...@@ -652,6 +664,9 @@ void FileIR_t::SetBaseIDS()
for(std::set<Type_t*>::const_iterator i=types.begin(); i!=types.end(); ++i) for(std::set<Type_t*>::const_iterator i=types.begin(); i!=types.end(); ++i)
if((*i)->GetBaseID()==NOT_IN_DATABASE) if((*i)->GetBaseID()==NOT_IN_DATABASE)
(*i)->SetBaseID(j++); (*i)->SetBaseID(j++);
for(DataScoopSet_t::const_iterator i=scoops.begin(); i!=scoops.end(); ++i)
if((*i)->GetBaseID()==NOT_IN_DATABASE)
(*i)->SetBaseID(j++);
} }
std::string Relocation_t::WriteToDB(File_t* fid, Instruction_t* myinsn) std::string Relocation_t::WriteToDB(File_t* fid, Instruction_t* myinsn)
...@@ -1111,3 +1126,46 @@ void FileIR_t::CleanupICFS() ...@@ -1111,3 +1126,46 @@ void FileIR_t::CleanupICFS()
GarbageCollectICFS(); GarbageCollectICFS();
DedupICFS(); DedupICFS();
} }
void FileIR_t::ReadScoopsFromDB
(
std::map<db_id_t,AddressID_t*> &addrMap,
std::map<db_id_t,Type_t*> &typeMap
)
{
/*
scoop_id SERIAL PRIMARY KEY, -- key
name text DEFAULT '', -- string representation of the type
type_id integer, -- the type of the data, as an index into the table table.
start_address_id integer, -- address id for start.
end_address_id integer, -- address id for end
permissions integer -- in umask format (bitmask for rwx)
*/
std::string q= "select * from " + fileptr->scoop_table_name + " ; ";
dbintr->IssueQuery(q);
while(!dbintr->IsDone())
{
db_id_t sid=atoi(dbintr->GetResultColumn("scoop_id").c_str());
std::string name=dbintr->GetResultColumn("name");
db_id_t type_id=atoi(dbintr->GetResultColumn("type_id").c_str());
Type_t *type=typeMap[type_id];
db_id_t start_id=atoi(dbintr->GetResultColumn("start_address_id").c_str());
AddressID_t* start_addr=addrMap[start_id];
db_id_t end_id=atoi(dbintr->GetResultColumn("end_address_id").c_str());
AddressID_t* end_addr=addrMap[end_id];
int permissions=atoi(dbintr->GetResultColumn("permissions").c_str());
DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions);
assert(newscoop);
GetDataScoops().insert(newscoop);
dbintr->MoveToNextRow();
}
return;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment