Skip to content

Commit

Permalink
bill's changes to parallelize symtab.
Browse files Browse the repository at this point in the history
  • Loading branch information
John Mellor-Crummey committed Jan 25, 2018
1 parent 033872a commit f4e87ef
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 39 deletions.
59 changes: 32 additions & 27 deletions symtabAPI/src/dwarfWalker.C
Expand Up @@ -47,6 +47,8 @@
#include "elfutils/libdw.h"
#include <atomic>
#include <elfutils/libdw.h>
#include <tbb/parallel_for_each.h>
#include <cilk/cilk.h>

using namespace Dyninst;
using namespace SymtabAPI;
Expand Down Expand Up @@ -129,6 +131,7 @@ bool DwarfWalker::parse() {

/* Iterate over the compilation-unit headers for .debug_types. */
uint64_t type_signaturep;
std::vector<Dwarf_Die> module_dies;
for(Dwarf_Off cu_off = 0;
dwarf_next_unit(dbg(), cu_off, &next_cu_header, &cu_header_length,
NULL, &abbrev_offset, &addr_size, &offset_size,
Expand All @@ -138,16 +141,13 @@ bool DwarfWalker::parse() {
if(!dwarf_offdie_types(dbg(), cu_off + cu_header_length, &current_cu_die))
continue;

#if 0
push();
// DwarfWalker mod_walker(*this);
// pop();
// bool ret = /*cilk_spawn */mod_walker.parseModule(false, fixUnknownMod);
bool ret = parseModule(false, fixUnknownMod);
pop();
if(!ret) {
// cilk_sync;
return false;
}
if(!ret) return false;
#endif
module_dies.push_back(current_cu_die);
compile_offset = next_cu_header;
}
// cilk_sync;
Expand All @@ -160,19 +160,35 @@ bool DwarfWalker::parse() {
if(!dwarf_offdie(dbg(), cu_off + cu_header_length, &current_cu_die))
continue;

#if 0
push();
// DwarfWalker mod_walker(*this);
// pop();
// bool ret = /*cilk_spawn */ mod_walker.parseModule(true, fixUnknownMod);
bool ret = parseModule(true, fixUnknownMod);
pop();
if(!ret) {
// cilk_sync;
return false;
}
if(!ret) return false;
#endif
module_dies.push_back(current_cu_die);
compile_offset = next_cu_header;
}
// cilk_sync;

// std::for_each(module_dies.begin(), module_dies.end(), [&](Dwarf_Die cur) {
#ifdef ENABLE_RACE_DETECTION
cilk_for
#else
#pragma omp parallel for
for
#endif
(unsigned int i = 0; i < module_dies.size(); i++) {
Dwarf_Die cur = module_dies[i];
int local_fd = open(symtab()->file().c_str(), O_RDONLY);
Dwarf* temp_dwarf = dwarf_begin(local_fd, DWARF_C_READ);
DwarfWalker w(symtab_, temp_dwarf);
w.push();
bool ok = w.parseModule(cur, fixUnknownMod);
w.pop();
dwarf_end(temp_dwarf);
close(local_fd);
}

if (!fixUnknownMod)
return true;

Expand Down Expand Up @@ -204,18 +220,7 @@ bool DwarfWalker::parse() {
return true;
}

bool DwarfWalker::parseModule(bool /*is_info*/, Module *&fixUnknownMod) {
/* Obtain the module DIE. */
Dwarf_Die moduleDIE = current_cu_die;
/*Dwarf_Die * cu_die_p = 0;
if(is_info){
cu_die_p = dwarf_offdie(dbg(), compile_offset, &moduleDIE);
}else{
cu_die_p = dwarf_offdie_types(dbg(), compile_offset, &moduleDIE);
}
if (cu_die_p == 0) {
return false;
}*/
bool DwarfWalker::parseModule(Dwarf_Die moduleDIE, Module *&fixUnknownMod) {

/* Make sure we've got the right one. */
Dwarf_Half moduleTag;
Expand Down
34 changes: 22 additions & 12 deletions symtabAPI/src/dwarfWalker.h
Expand Up @@ -38,7 +38,7 @@ class Type;
class DwarfParseActions {

protected:
Dwarf* dbg() { return dbg_; }
Dwarf* dbg() { return dbg_; }

Module *& mod() { return mod_; }

Expand Down Expand Up @@ -69,9 +69,8 @@ class DwarfParseActions {
fieldListType *enclosure;
bool parseSibling;
bool parseChild;
Dwarf_Die entry;
Dwarf_Die specEntry;
Dwarf_Die abstractEntry;
Dwarf_Off specEntry;
Dwarf_Off abstractEntry;
Dwarf_Off offset;
unsigned int tag;
Address base;
Expand All @@ -89,7 +88,6 @@ class DwarfParseActions {
enclosure(o.enclosure),
parseSibling(o.parseSibling),
parseChild(o.parseChild),
entry(o.entry),
specEntry(o.specEntry),
abstractEntry(o.specEntry),
offset(o.offset),
Expand All @@ -113,9 +111,21 @@ class DwarfParseActions {
fieldListType *curEnclosure() { return c.top().enclosure; }
bool parseSibling() { return c.top().parseSibling; }
bool parseChild() { return c.top().parseChild; }
Dwarf_Die entry() { return c.top().entry; }
Dwarf_Die specEntry() { return c.top().specEntry; }
Dwarf_Die abstractEntry() { return c.top().abstractEntry; }
Dwarf_Die entry() {
Dwarf_Die ret;
dwarf_offdie(dbg(), c.top().offset, &ret);
return ret;
}
Dwarf_Die specEntry() {
Dwarf_Die ret;
dwarf_offdie(dbg(), c.top().specEntry, &ret);
return ret;
}
Dwarf_Die abstractEntry() {
Dwarf_Die ret;
dwarf_offdie(dbg(), c.top().abstractEntry, &ret);
return ret;
}
Dwarf_Off offset() { return c.top().offset; }
unsigned int tag() { return c.top().tag; }
Address base() { return c.top().base; }
Expand All @@ -127,9 +137,9 @@ class DwarfParseActions {
void setEnclosure(fieldListType *f) { c.top().enclosure = f; }
void setParseSibling(bool p) { c.top().parseSibling = p; }
void setParseChild(bool p) { c.top().parseChild = p; }
virtual void setEntry(Dwarf_Die e) { c.top().entry = e; }
void setSpecEntry(Dwarf_Die e) { c.top().specEntry = e; }
void setAbstractEntry(Dwarf_Die e) { c.top().abstractEntry = e; }
virtual void setEntry(Dwarf_Die e) { c.top().offset = dwarf_dieoffset(&e); }
void setSpecEntry(Dwarf_Die e) { c.top().specEntry = dwarf_dieoffset(&e); }
void setAbstractEntry(Dwarf_Die e) { c.top().abstractEntry = dwarf_dieoffset(&e); }
void setOffset(Dwarf_Off o) { c.top().offset = o; }
void setTag(unsigned int t) { c.top().tag = t; }
void setBase(Address a) { c.top().base = a; }
Expand Down Expand Up @@ -224,7 +234,7 @@ class DwarfWalker : public DwarfParseActions {
bool parse();

// Takes current debug state as represented by dbg_;
bool parseModule(bool is_info, Module *&fixUnknownMod);
bool parseModule(Dwarf_Die is_info, Module *&fixUnknownMod);

// Non-recursive version of parse
// A Context must be provided as an _input_ to this function,
Expand Down

0 comments on commit f4e87ef

Please sign in to comment.