mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[llvm-objdump] Add RAII for xar apis
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
This commit is contained in:
parent
4f58e9307f
commit
ca7bdaa659
@ -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,
|
||||
@ -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";
|
||||
@ -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";
|
||||
@ -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,
|
||||
@ -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;
|
||||
@ -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;
|
||||
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user