Return ErrorOr<std::unique_ptr<Archive>> form getAsArchive.

This is the same return type of Archive::create.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223827 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-12-09 21:05:36 +00:00
parent 86704cc355
commit b2a5bf25f9
5 changed files with 36 additions and 33 deletions

View File

@ -58,7 +58,7 @@ public:
ErrorOr<std::unique_ptr<MachOObjectFile>> getAsObjectFile() const; ErrorOr<std::unique_ptr<MachOObjectFile>> getAsObjectFile() const;
std::error_code getAsArchive(std::unique_ptr<Archive> &Result) const; ErrorOr<std::unique_ptr<Archive>> getAsArchive() const;
}; };
class object_iterator { class object_iterator {

View File

@ -79,20 +79,16 @@ MachOUniversalBinary::ObjectForArch::getAsObjectFile() const {
return object_error::parse_failed; return object_error::parse_failed;
} }
std::error_code MachOUniversalBinary::ObjectForArch::getAsArchive( ErrorOr<std::unique_ptr<Archive>>
std::unique_ptr<Archive> &Result) const { MachOUniversalBinary::ObjectForArch::getAsArchive() const {
if (Parent) { if (!Parent)
StringRef ParentData = Parent->getData(); return object_error::parse_failed;
StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
StringRef ObjectName = Parent->getFileName(); StringRef ParentData = Parent->getData();
MemoryBufferRef ObjBuffer(ObjectData, ObjectName); StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
ErrorOr<std::unique_ptr<Archive>> Obj = Archive::create(ObjBuffer); StringRef ObjectName = Parent->getFileName();
if (std::error_code EC = Obj.getError()) MemoryBufferRef ObjBuffer(ObjectData, ObjectName);
return EC; return Archive::create(ObjBuffer);
Result = std::move(Obj.get());
return object_error::success;
}
return object_error::parse_failed;
} }
void MachOUniversalBinary::anchor() { } void MachOUniversalBinary::anchor() { }

View File

@ -1069,7 +1069,6 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
ArchFound = true; ArchFound = true;
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr =
I->getAsObjectFile(); I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchiveName; std::string ArchiveName;
std::string ArchitectureName; std::string ArchitectureName;
ArchiveName.clear(); ArchiveName.clear();
@ -1086,7 +1085,9 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
} }
dumpSymbolNamesFromObject(Obj, false, ArchiveName, dumpSymbolNamesFromObject(Obj, false, ArchiveName,
ArchitectureName); ArchitectureName);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
for (Archive::child_iterator AI = A->child_begin(), for (Archive::child_iterator AI = A->child_begin(),
AE = A->child_end(); AE = A->child_end();
AI != AE; ++AI) { AI != AE; ++AI) {
@ -1133,13 +1134,14 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
I != E; ++I) { I != E; ++I) {
if (HostArchName == I->getArchTypeName()) { if (HostArchName == I->getArchTypeName()) {
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchiveName; std::string ArchiveName;
ArchiveName.clear(); ArchiveName.clear();
if (ObjOrErr) { if (ObjOrErr) {
ObjectFile &Obj = *ObjOrErr.get(); ObjectFile &Obj = *ObjOrErr.get();
dumpSymbolNamesFromObject(Obj, false); dumpSymbolNamesFromObject(Obj, false);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
for (Archive::child_iterator AI = A->child_begin(), for (Archive::child_iterator AI = A->child_begin(),
AE = A->child_end(); AE = A->child_end();
AI != AE; ++AI) { AI != AE; ++AI) {
@ -1170,7 +1172,6 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
E = UB->end_objects(); E = UB->end_objects();
I != E; ++I) { I != E; ++I) {
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchiveName; std::string ArchiveName;
std::string ArchitectureName; std::string ArchitectureName;
ArchiveName.clear(); ArchiveName.clear();
@ -1189,7 +1190,8 @@ static void dumpSymbolNamesFromFile(std::string &Filename) {
outs() << ":\n"; outs() << ":\n";
} }
dumpSymbolNamesFromObject(Obj, false, ArchiveName, ArchitectureName); dumpSymbolNamesFromObject(Obj, false, ArchiveName, ArchitectureName);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end();
AI != AE; ++AI) { AI != AE; ++AI) {
ErrorOr<std::unique_ptr<Binary>> ChildOrErr = ErrorOr<std::unique_ptr<Binary>> ChildOrErr =

View File

@ -340,7 +340,6 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
ArchFound = true; ArchFound = true;
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr =
I->getAsObjectFile(); I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchitectureName = ""; std::string ArchitectureName = "";
if (ArchFlags.size() > 1) if (ArchFlags.size() > 1)
ArchitectureName = I->getArchTypeName(); ArchitectureName = I->getArchTypeName();
@ -348,7 +347,9 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
ObjectFile &O = *ObjOrErr.get(); ObjectFile &O = *ObjOrErr.get();
if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O)) if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName); DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
outs() << "Archive : " << Filename; outs() << "Archive : " << Filename;
if (!ArchitectureName.empty()) if (!ArchitectureName.empty())
outs() << " (architecture " << ArchitectureName << ")"; outs() << " (architecture " << ArchitectureName << ")";
@ -384,14 +385,15 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
I != E; ++I) { I != E; ++I) {
if (HostArchName == I->getArchTypeName()) { if (HostArchName == I->getArchTypeName()) {
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchiveName; std::string ArchiveName;
ArchiveName.clear(); ArchiveName.clear();
if (ObjOrErr) { if (ObjOrErr) {
ObjectFile &O = *ObjOrErr.get(); ObjectFile &O = *ObjOrErr.get();
if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O)) if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
DisassembleInputMachO2(Filename, MachOOF); DisassembleInputMachO2(Filename, MachOOF);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
outs() << "Archive : " << Filename << "\n"; outs() << "Archive : " << Filename << "\n";
for (Archive::child_iterator AI = A->child_begin(), for (Archive::child_iterator AI = A->child_begin(),
AE = A->child_end(); AE = A->child_end();
@ -415,7 +417,6 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
E = UB->end_objects(); E = UB->end_objects();
I != E; ++I) { I != E; ++I) {
ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
std::unique_ptr<Archive> A;
std::string ArchitectureName = ""; std::string ArchitectureName = "";
if (moreThanOneArch) if (moreThanOneArch)
ArchitectureName = I->getArchTypeName(); ArchitectureName = I->getArchTypeName();
@ -423,7 +424,8 @@ void llvm::DisassembleInputMachO(StringRef Filename) {
ObjectFile &Obj = *ObjOrErr.get(); ObjectFile &Obj = *ObjOrErr.get();
if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&Obj)) if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&Obj))
DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName); DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName);
} else if (!I->getAsArchive(A)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) {
std::unique_ptr<Archive> &A = *AOrErr;
outs() << "Archive : " << Filename; outs() << "Archive : " << Filename;
if (!ArchitectureName.empty()) if (!ArchitectureName.empty())
outs() << " (architecture " << ArchitectureName << ")"; outs() << " (architecture " << ArchitectureName << ")";

View File

@ -484,7 +484,6 @@ static void PrintFileSectionSizes(StringRef file) {
if (ArchFlags[i] == I->getArchTypeName()) { if (ArchFlags[i] == I->getArchTypeName()) {
ArchFound = true; ArchFound = true;
ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile();
std::unique_ptr<Archive> UA;
if (UO) { if (UO) {
if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) { if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) {
MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o); MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
@ -503,7 +502,9 @@ static void PrintFileSectionSizes(StringRef file) {
outs() << "\n"; outs() << "\n";
} }
} }
} else if (!I->getAsArchive(UA)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &UA = *AOrErr;
// This is an archive. Iterate over each member and display its // This is an archive. Iterate over each member and display its
// sizes. // sizes.
for (object::Archive::child_iterator i = UA->child_begin(), for (object::Archive::child_iterator i = UA->child_begin(),
@ -560,7 +561,6 @@ static void PrintFileSectionSizes(StringRef file) {
I != E; ++I) { I != E; ++I) {
if (HostArchName == I->getArchTypeName()) { if (HostArchName == I->getArchTypeName()) {
ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile();
std::unique_ptr<Archive> UA;
if (UO) { if (UO) {
if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) { if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) {
MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o); MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
@ -579,7 +579,9 @@ static void PrintFileSectionSizes(StringRef file) {
outs() << "\n"; outs() << "\n";
} }
} }
} else if (!I->getAsArchive(UA)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &UA = *AOrErr;
// This is an archive. Iterate over each member and display its // This is an archive. Iterate over each member and display its
// sizes. // sizes.
for (object::Archive::child_iterator i = UA->child_begin(), for (object::Archive::child_iterator i = UA->child_begin(),
@ -623,7 +625,6 @@ static void PrintFileSectionSizes(StringRef file) {
E = UB->end_objects(); E = UB->end_objects();
I != E; ++I) { I != E; ++I) {
ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile(); ErrorOr<std::unique_ptr<ObjectFile>> UO = I->getAsObjectFile();
std::unique_ptr<Archive> UA;
if (UO) { if (UO) {
if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) { if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) {
MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o); MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
@ -643,7 +644,9 @@ static void PrintFileSectionSizes(StringRef file) {
outs() << "\n"; outs() << "\n";
} }
} }
} else if (!I->getAsArchive(UA)) { } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr =
I->getAsArchive()) {
std::unique_ptr<Archive> &UA = *AOrErr;
// This is an archive. Iterate over each member and display its sizes. // This is an archive. Iterate over each member and display its sizes.
for (object::Archive::child_iterator i = UA->child_begin(), for (object::Archive::child_iterator i = UA->child_begin(),
e = UA->child_end(); e = UA->child_end();