From c985fb077154e3be3ecf580be7f349f6fded085b Mon Sep 17 00:00:00 2001 From: jdh8d <jdh8d@git.zephyr-software.com> Date: Thu, 18 Feb 2016 16:05:08 +0000 Subject: [PATCH] added contents to scoops Former-commit-id: 589996f6bef79940c04ad67b813969c69950723b --- libIRDB/include/core/scoop.hpp | 15 +++++++++++---- libIRDB/src/core/fileir.cpp | 3 ++- libIRDB/test/fill_in_cfg.cpp | 10 ++++++++-- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/libIRDB/include/core/scoop.hpp b/libIRDB/include/core/scoop.hpp index 8da3bbf72..4fe24dca9 100644 --- a/libIRDB/include/core/scoop.hpp +++ b/libIRDB/include/core/scoop.hpp @@ -30,29 +30,35 @@ class DataScoop_t : public BaseObj_t libIRDB::AddressID_t* p_start, libIRDB::AddressID_t* p_end, libIRDB::Type_t* p_type, - int p_permissions) + int p_permissions, + std::string p_contents) : BaseObj_t(NULL), name(p_name), start(p_start), end(p_end), type(p_type), - permissions(p_permissions) + permissions(p_permissions), + contents(p_contents) { + assert(start && end); SetBaseID(id); } std::string GetName() const { return name; } + std::string GetContents() const { return contents; } libIRDB::AddressID_t* GetStart() const { return start; } libIRDB::AddressID_t* GetEnd() const { return end; } libIRDB::Type_t* GetType() const { return type; } + libIRDB::virtual_offset_t GetSize() { assert(start && end); return end->GetVirtualOffset() - start->GetVirtualOffset() ; } bool isReadable() const { return (permissions & permissions_r) == permissions_r; } bool isWriteable() const { return (permissions & permissions_w) == permissions_w; }; bool isExecuteable() const { return (permissions & permissions_x) == permissions_x; }; void SetName(const std::string &n) { name=n; } - void SetStart( libIRDB::AddressID_t* addr) { start=addr; } - void SetEnd( libIRDB::AddressID_t* addr ) { end=addr; } + void SetContents(const std::string &n) { contents=n; } + void SetStart( libIRDB::AddressID_t* addr) { assert(addr); start=addr; } + void SetEnd( libIRDB::AddressID_t* addr ) { assert(addr); end=addr; } void SetType( libIRDB::Type_t* t) { type=t; } void SetReadable() { permissions |= permissions_r; } @@ -75,6 +81,7 @@ class DataScoop_t : public BaseObj_t libIRDB::AddressID_t* end; libIRDB::Type_t* type; int permissions; + std::string contents; }; diff --git a/libIRDB/src/core/fileir.cpp b/libIRDB/src/core/fileir.cpp index 466b21c80..9048747ef 100644 --- a/libIRDB/src/core/fileir.cpp +++ b/libIRDB/src/core/fileir.cpp @@ -1174,8 +1174,9 @@ std::map<db_id_t,DataScoop_t*> FileIR_t::ReadScoopsFromDB 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()); + std::string contents=dbintr->GetResultColumn("data"); - DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions); + DataScoop_t* newscoop=new DataScoop_t(sid,name,start_addr,end_addr,type,permissions,contents); assert(newscoop); GetDataScoops().insert(newscoop); dbintr->MoveToNextRow(); diff --git a/libIRDB/test/fill_in_cfg.cpp b/libIRDB/test/fill_in_cfg.cpp index 354e87625..cd70a20be 100644 --- a/libIRDB/test/fill_in_cfg.cpp +++ b/libIRDB/test/fill_in_cfg.cpp @@ -469,7 +469,13 @@ void fill_in_scoops(FileIR_t *firp) endaddr->SetFileID(firp->GetFile()->GetBaseID()); firp->GetAddresses().insert(endaddr); - Type_t *chunk_type=NULL; /* FIXME -- need to figure out the type system for schoops, but NULL should remain valid */ + string the_contents; + the_contents.resize(elfiop.sections[secndx]->get_size()); + // deal with .bss segments that are 0 init'd. + if (elfiop.sections[secndx]->get_data()) + the_contents.assign(elfiop.sections[secndx]->get_data(),elfiop.sections[secndx]->get_size()); + + Type_t *chunk_type=NULL; /* FIXME -- need to figure out the type system for scoops, but NULL should remain valid */ /* permissions */ int permissions= @@ -477,7 +483,7 @@ void fill_in_scoops(FileIR_t *firp) ( elfiop.sections[secndx]->isWriteable() << 1 ) | ( elfiop.sections[secndx]->isExecutable() << 0 ) ; - DataScoop_t *newscoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, name, startaddr, endaddr, NULL, permissions); + DataScoop_t *newscoop=new DataScoop_t(BaseObj_t::NOT_IN_DATABASE, name, startaddr, endaddr, NULL, permissions, the_contents); assert(newscoop); firp->GetDataScoops().insert(newscoop); -- GitLab