diff options
Diffstat (limited to 'llvm/tools/llvm-lipo/llvm-lipo.cpp')
-rw-r--r-- | llvm/tools/llvm-lipo/llvm-lipo.cpp | 59 |
1 files changed, 45 insertions, 14 deletions
diff --git a/llvm/tools/llvm-lipo/llvm-lipo.cpp b/llvm/tools/llvm-lipo/llvm-lipo.cpp index 5fa07b04b24..ea64d69f6ce 100644 --- a/llvm/tools/llvm-lipo/llvm-lipo.cpp +++ b/llvm/tools/llvm-lipo/llvm-lipo.cpp @@ -78,6 +78,7 @@ public: enum class LipoAction { PrintArchs, + PrintInfo, VerifyArch, ThinArch, CreateUniversal, @@ -184,6 +185,10 @@ static Config parseLipoOptions(ArrayRef<const char *> ArgsArr) { C.ActionToPerform = LipoAction::PrintArchs; return C; + case LIPO_info: + C.ActionToPerform = LipoAction::PrintInfo; + return C; + case LIPO_thin: if (C.InputFiles.size() > 1) reportError("thin expects a single input file"); @@ -269,26 +274,49 @@ static std::string getArchString(const MachOObjectFile &ObjectFile) { .str(); } -LLVM_ATTRIBUTE_NORETURN -static void printArchs(ArrayRef<OwningBinary<Binary>> InputBinaries) { +static void printBinaryArchs(const Binary *Binary, raw_ostream &OS) { // Prints trailing space for compatibility with cctools lipo. - assert(InputBinaries.size() == 1 && "Incorrect number of input binaries"); - const Binary *InputBinary = InputBinaries.front().getBinary(); - if (auto UO = dyn_cast<MachOUniversalBinary>(InputBinary)) { + if (auto UO = dyn_cast<MachOUniversalBinary>(Binary)) { for (const auto &O : UO->objects()) { Expected<std::unique_ptr<MachOObjectFile>> BinaryOrError = O.getAsObjectFile(); if (!BinaryOrError) - reportError(InputBinary->getFileName(), BinaryOrError.takeError()); - outs() << getArchString(*BinaryOrError.get().get()) << " "; + reportError(Binary->getFileName(), BinaryOrError.takeError()); + OS << getArchString(*BinaryOrError.get().get()) << " "; } - } else if (auto O = dyn_cast<MachOObjectFile>(InputBinary)) { - outs() << getArchString(*O) << " "; - } else { - llvm_unreachable("Unexpected binary format"); + OS << "\n"; + return; } + OS << getArchString(*cast<MachOObjectFile>(Binary)) << " \n"; +} + +LLVM_ATTRIBUTE_NORETURN +static void printArchs(ArrayRef<OwningBinary<Binary>> InputBinaries) { + assert(InputBinaries.size() == 1 && "Incorrect number of input binaries"); + printBinaryArchs(InputBinaries.front().getBinary(), outs()); + exit(EXIT_SUCCESS); +} - outs() << "\n"; +LLVM_ATTRIBUTE_NORETURN +static void printInfo(ArrayRef<OwningBinary<Binary>> InputBinaries) { + // Group universal and thin files together for compatibility with cctools lipo + for (auto &IB : InputBinaries) { + const Binary *Binary = IB.getBinary(); + if (Binary->isMachOUniversalBinary()) { + outs() << "Architectures in the fat file: " << Binary->getFileName() + << " are: "; + printBinaryArchs(Binary, outs()); + } + } + for (auto &IB : InputBinaries) { + const Binary *Binary = IB.getBinary(); + if (!Binary->isMachOUniversalBinary()) { + assert(Binary->isMachO() && "expected MachO binary"); + outs() << "Non-fat file: " << Binary->getFileName() + << " is architecture: "; + printBinaryArchs(Binary, outs()); + } + } exit(EXIT_SUCCESS); } @@ -470,8 +498,8 @@ static void createUniversalBinary(SmallVectorImpl<Slice> &Slices, OutFile->getBufferStart() + FatArchList[Index].offset); } - // FatArchs written after Slices in order reduce the number of swaps for the - // LittleEndian case + // FatArchs written after Slices in order to reduce the number of swaps for + // the LittleEndian case if (sys::IsLittleEndianHost) for (MachO::fat_arch &FA : FatArchList) MachO::swapStruct(FA); @@ -510,6 +538,9 @@ int main(int argc, char **argv) { case LipoAction::PrintArchs: printArchs(InputBinaries); break; + case LipoAction::PrintInfo: + printInfo(InputBinaries); + break; case LipoAction::ThinArch: extractSlice(InputBinaries, C.ThinArchType, C.OutputFile); break; |