Skip to content

Commit

Permalink
[llvm-objdump] Add RAII for xar apis
Browse files Browse the repository at this point in the history
Summary:
xar_open and xar_iter_new require manual calls to close/free functions
to deallocate resources. This makes it easy to introduce memory leaks,
so add RAII struct wrappers for these resources.

Reviewers: enderby, rafael, compnerd, lhames, dblaikie

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D38598

llvm-svn: 315069
  • Loading branch information
fjricci committed Oct 6, 2017
1 parent 32e3cb7 commit 6f94297
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions llvm/tools/llvm-objdump/MachODump.cpp
Expand Up @@ -202,6 +202,34 @@ typedef std::pair<uint64_t, DiceRef> DiceTableEntry;
typedef std::vector<DiceTableEntry> DiceTable;
typedef DiceTable::iterator dice_table_iterator;

namespace {
struct ScopedXarFile {
xar_t xar;
ScopedXarFile(const char *filename, int32_t flags) {
xar = xar_open(filename, flags);
}
~ScopedXarFile() {
if (xar)
xar_close(xar);
}
ScopedXarFile(const ScopedXarFile &) = delete;
ScopedXarFile &operator=(const ScopedXarFile &) = delete;
operator xar_t() { return xar; }
};

struct ScopedXarIter {
xar_iter_t iter;
ScopedXarIter() { iter = xar_iter_new(); }
~ScopedXarIter() {
if (iter)
xar_iter_free(iter);
}
ScopedXarIter(const ScopedXarIter &) = delete;
ScopedXarIter &operator=(const ScopedXarIter &) = delete;
operator xar_iter_t() { return iter; }
};
} // namespace

// This is used to search for a data in code table entry for the PC being
// disassembled. The j parameter has the PC in j.first. A single data in code
// table entry can cover many bytes for each of its Kind's. So if the offset,
Expand Down Expand Up @@ -5802,14 +5830,12 @@ static void PrintModeVerbose(uint32_t mode) {
}

static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) {
xar_iter_t xi;
xar_file_t xf;
xar_iter_t xp;
const char *key, *type, *mode, *user, *group, *size, *mtime, *name, *m;
char *endp;
uint32_t mode_value;

xi = xar_iter_new();
ScopedXarIter xi;
if (!xi) {
errs() << "Can't obtain an xar iterator for xar archive "
<< XarFilename << "\n";
Expand All @@ -5818,7 +5844,7 @@ static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) {

// Go through the xar's files.
for (xf = xar_file_first(xar, xi); xf; xf = xar_file_next(xi)) {
xp = xar_iter_new();
ScopedXarIter xp;
if(!xp){
errs() << "Can't obtain an xar iterator for xar archive "
<< XarFilename << "\n";
Expand Down Expand Up @@ -5880,9 +5906,7 @@ static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) {
if(name != nullptr)
outs() << name;
outs() << "\n";
xar_iter_free(xp);
}
xar_iter_free(xi);
}

static void DumpBitcodeSection(MachOObjectFile *O, const char *sect,
Expand Down Expand Up @@ -5958,7 +5982,7 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect,
if (XarOut.has_error())
return;

xar_t xar = xar_open(XarFilename.c_str(), READ);
ScopedXarFile xar(XarFilename.c_str(), READ);
if (!xar) {
errs() << "Can't create temporary xar archive " << XarFilename << "\n";
return;
Expand Down Expand Up @@ -5998,24 +6022,21 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect,
outs() << Buffer->getBuffer() << "\n";

// TODO: Go through the xar's files.
xar_iter_t xi = xar_iter_new();
ScopedXarIter xi;
if(!xi){
errs() << "Can't obtain an xar iterator for xar archive "
<< XarFilename.c_str() << "\n";
xar_close(xar);
return;
}
for(xar_file_t xf = xar_file_first(xar, xi); xf; xf = xar_file_next(xi)){
const char *key;
xar_iter_t xp;
const char *member_name, *member_type, *member_size_string;
size_t member_size;

xp = xar_iter_new();
ScopedXarIter xp;
if(!xp){
errs() << "Can't obtain an xar iterator for xar archive "
<< XarFilename.c_str() << "\n";
xar_close(xar);
return;
}
member_name = NULL;
Expand Down Expand Up @@ -6080,10 +6101,7 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect,
}
}
}
xar_iter_free(xp);
}
xar_iter_free(xi);
xar_close(xar);
}
#endif // defined(HAVE_LIBXAR)

Expand Down

0 comments on commit 6f94297

Please sign in to comment.