[llvm] r226228 - Add the option, -archive-headers, used with -macho to print the Mach-O archive headers to llvm-objdump.

Rafael EspĂ­ndola rafael.espindola at gmail.com
Thu Jan 15 18:15:54 PST 2015


This is failing in a bot:

http://lab.llvm.org:8011/builders/clang-cmake-armv7-a15-full/builds/3165/steps/ninja%20check%201/logs/LLVM%3A%3Amacho-archive-headers.test

On 15 January 2015 at 18:19, Kevin Enderby <enderby at apple.com> wrote:
> Author: enderby
> Date: Thu Jan 15 17:19:11 2015
> New Revision: 226228
>
> URL: http://llvm.org/viewvc/llvm-project?rev=226228&view=rev
> Log:
> Add the option, -archive-headers, used with -macho to print the Mach-O archive headers to llvm-objdump.
>
> Added:
>     llvm/trunk/test/tools/llvm-objdump/X86/macho-archive-headers.test
> Modified:
>     llvm/trunk/include/llvm/Object/Archive.h
>     llvm/trunk/lib/Object/Archive.cpp
>     llvm/trunk/tools/llvm-objdump/MachODump.cpp
>     llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
>     llvm/trunk/tools/llvm-objdump/llvm-objdump.h
>
> Modified: llvm/trunk/include/llvm/Object/Archive.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Archive.h?rev=226228&r1=226227&r2=226228&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/Archive.h (original)
> +++ llvm/trunk/include/llvm/Object/Archive.h Thu Jan 15 17:19:11 2015
> @@ -41,6 +41,9 @@ struct ArchiveMemberHeader {
>
>    sys::fs::perms getAccessMode() const;
>    sys::TimeValue getLastModified() const;
> +  llvm::StringRef getRawLastModified() const {
> +    return StringRef(LastModified, sizeof(LastModified)).rtrim(" ");
> +  }
>    unsigned getUID() const;
>    unsigned getGID() const;
>  };
> @@ -78,6 +81,9 @@ public:
>      sys::TimeValue getLastModified() const {
>        return getHeader()->getLastModified();
>      }
> +    StringRef getRawLastModified() const {
> +      return getHeader()->getRawLastModified();
> +    }
>      unsigned getUID() const { return getHeader()->getUID(); }
>      unsigned getGID() const { return getHeader()->getGID(); }
>      sys::fs::perms getAccessMode() const {
> @@ -85,10 +91,13 @@ public:
>      }
>      /// \return the size of the archive member without the header or padding.
>      uint64_t getSize() const;
> +    /// \return the size of the archive member with the header and padding.
> +    uint64_t getRawSize() const;
>
>      StringRef getBuffer() const {
>        return StringRef(Data.data() + StartOfFile, getSize());
>      }
> +    uint64_t getChildOffset() const;
>
>      ErrorOr<MemoryBufferRef> getMemoryBufferRef() const;
>
> @@ -194,6 +203,7 @@ public:
>    child_iterator findSym(StringRef name) const;
>
>    bool hasSymbolTable() const;
> +  child_iterator getSymbolTableChild() const { return SymbolTable; }
>
>  private:
>    child_iterator SymbolTable;
>
> Modified: llvm/trunk/lib/Object/Archive.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=226228&r1=226227&r2=226228&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/Archive.cpp (original)
> +++ llvm/trunk/lib/Object/Archive.cpp Thu Jan 15 17:19:11 2015
> @@ -110,6 +110,12 @@ uint64_t Archive::Child::getSize() const
>    return Data.size() - StartOfFile;
>  }
>
> +uint64_t Archive::Child::getRawSize() const {
> +  if (Parent->IsThin)
> +    return getHeader()->getSize();
> +  return Data.size();
> +}
> +
>  Archive::Child Archive::Child::getNext() const {
>    size_t SpaceToSkip = Data.size();
>    // If it's odd, add 1 to make it even.
> @@ -125,6 +131,13 @@ Archive::Child Archive::Child::getNext()
>    return Child(Parent, NextLoc);
>  }
>
> +uint64_t Archive::Child::getChildOffset() const {
> +  const char *a = Parent->Data.getBuffer().data();
> +  const char *c = Data.data();
> +  uint64_t offset = c - a;
> +  return offset;
> +}
> +
>  ErrorOr<StringRef> Archive::Child::getName() const {
>    StringRef name = getRawName();
>    // Check if it's a special name.
>
> Added: llvm/trunk/test/tools/llvm-objdump/X86/macho-archive-headers.test
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/macho-archive-headers.test?rev=226228&view=auto
> ==============================================================================
> --- llvm/trunk/test/tools/llvm-objdump/X86/macho-archive-headers.test (added)
> +++ llvm/trunk/test/tools/llvm-objdump/X86/macho-archive-headers.test Thu Jan 15 17:19:11 2015
> @@ -0,0 +1,10 @@
> +RUN: llvm-objdump %p/Inputs/macho-universal-archive.x86_64.i386 -macho -archive-headers -arch all \
> +RUN: | FileCheck %s
> +
> +# Note the date as printed by ctime(3) is time zone dependent and not checked.
> +CHECK: Archive : {{.*}}/macho-universal-archive.x86_64.i386 (architecture x86_64)
> +CHECK: -rw-r--r--124/11     44 {{.*}} __.SYMDEF SORTED
> +CHECK: -rw-r--r--124/0     860 {{.*}} hello.o
> +CHECK: Archive : {{.*}}/macho-universal-archive.x86_64.i386 (architecture i386)
> +CHECK: -rw-r--r--124/11     60 {{.*}} __.SYMDEF SORTED
> +CHECK: -rw-r--r--124/0     388 {{.*}} foo.o
>
> Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=226228&r1=226227&r2=226228&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Thu Jan 15 17:19:11 2015
> @@ -66,9 +66,14 @@ static cl::opt<bool>
>      PrintImmHex("print-imm-hex",
>                  cl::desc("Use hex format for immediate values"));
>
> +cl::opt<bool> llvm::UniversalHeaders("universal-headers",
> +                                     cl::desc("Print Mach-O universal headers "
> +                                              "(requires -macho)"));
> +
>  cl::opt<bool>
> -    llvm::UniversalHeaders("universal-headers",
> -                           cl::desc("Print Mach-O universal headers"));
> +    llvm::ArchiveHeaders("archive-headers",
> +                         cl::desc("Print archive headers for Mach-O archives "
> +                                  "(requires -macho)"));
>
>  static cl::list<std::string>
>      ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
> @@ -514,6 +519,106 @@ static void printMachOUniversalHeaders(c
>    }
>  }
>
> +static void printArchiveChild(Archive::Child &C, bool verbose,
> +                              bool print_offset) {
> +  if (print_offset)
> +    outs() << C.getChildOffset() << "\t";
> +  sys::fs::perms Mode = C.getAccessMode();
> +  if (verbose) {
> +    // FIXME: this first dash, "-", is for (Mode & S_IFMT) == S_IFREG.
> +    // But there is nothing in sys::fs::perms for S_IFMT or S_IFREG.
> +    outs() << "-";
> +    if (Mode & sys::fs::owner_read)
> +      outs() << "r";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::owner_write)
> +      outs() << "w";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::owner_exe)
> +      outs() << "x";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::group_read)
> +      outs() << "r";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::group_write)
> +      outs() << "w";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::group_exe)
> +      outs() << "x";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::others_read)
> +      outs() << "r";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::others_write)
> +      outs() << "w";
> +    else
> +      outs() << "-";
> +    if (Mode & sys::fs::others_exe)
> +      outs() << "x";
> +    else
> +      outs() << "-";
> +  } else {
> +    outs() << format("0%o ", Mode);
> +  }
> +
> +  unsigned UID = C.getUID();
> +  outs() << format("%3d/", UID);
> +  unsigned GID = C.getGID();
> +  outs() << format("%-3d ", GID);
> +  uint64_t Size = C.getRawSize() - sizeof(object::ArchiveMemberHeader);
> +  outs() << format("%5d ", Size);
> +
> +  StringRef RawLastModified = C.getRawLastModified();
> +  if (verbose) {
> +    unsigned Seconds;
> +    if (RawLastModified.getAsInteger(10, Seconds))
> +      outs() << "(date: \"%s\" contains non-decimal chars) " << RawLastModified;
> +    else {
> +      // Since cime(3) returns a 26 character string of the form:
> +      // "Sun Sep 16 01:03:52 1973\n\0"
> +      // just print 24 characters.
> +      time_t t = Seconds;
> +      outs() << format("%.24s ", ctime(&t));
> +    }
> +  } else {
> +    outs() << RawLastModified << " ";
> +  }
> +
> +  if (verbose) {
> +    ErrorOr<StringRef> NameOrErr = C.getName();
> +    if (NameOrErr.getError()) {
> +      StringRef RawName = C.getRawName();
> +      outs() << RawName << "\n";
> +    } else {
> +      StringRef Name = NameOrErr.get();
> +      outs() << Name << "\n";
> +    }
> +  } else {
> +    StringRef RawName = C.getRawName();
> +    outs() << RawName << "\n";
> +  }
> +}
> +
> +static void printArchiveHeaders(Archive *A, bool verbose, bool print_offset) {
> +  if (A->hasSymbolTable()) {
> +    Archive::child_iterator S = A->getSymbolTableChild();
> +    Archive::Child C = *S;
> +    printArchiveChild(C, verbose, print_offset);
> +  }
> +  for (Archive::child_iterator I = A->child_begin(), E = A->child_end(); I != E;
> +       ++I) {
> +    Archive::Child C = *I;
> +    printArchiveChild(C, verbose, print_offset);
> +  }
> +}
> +
>  // ParseInputMachO() parses the named Mach-O file in Filename and handles the
>  // -arch flags selecting just those slices as specified by them and also parses
>  // archive files.  Then for each individual Mach-O file ProcessMachO() is
> @@ -542,6 +647,8 @@ void llvm::ParseInputMachO(StringRef Fil
>
>    if (Archive *A = dyn_cast<Archive>(&Bin)) {
>      outs() << "Archive : " << Filename << "\n";
> +    if (ArchiveHeaders)
> +      printArchiveHeaders(A, true, false);
>      for (Archive::child_iterator I = A->child_begin(), E = A->child_end();
>           I != E; ++I) {
>        ErrorOr<std::unique_ptr<Binary>> ChildOrErr = I->getAsBinary();
> @@ -587,6 +694,8 @@ void llvm::ParseInputMachO(StringRef Fil
>                if (!ArchitectureName.empty())
>                  outs() << " (architecture " << ArchitectureName << ")";
>                outs() << "\n";
> +              if (ArchiveHeaders)
> +                printArchiveHeaders(A.get(), true, false);
>                for (Archive::child_iterator AI = A->child_begin(),
>                                             AE = A->child_end();
>                     AI != AE; ++AI) {
> @@ -627,6 +736,8 @@ void llvm::ParseInputMachO(StringRef Fil
>                           I->getAsArchive()) {
>              std::unique_ptr<Archive> &A = *AOrErr;
>              outs() << "Archive : " << Filename << "\n";
> +            if (ArchiveHeaders)
> +              printArchiveHeaders(A.get(), true, false);
>              for (Archive::child_iterator AI = A->child_begin(),
>                                           AE = A->child_end();
>                   AI != AE; ++AI) {
> @@ -662,6 +773,8 @@ void llvm::ParseInputMachO(StringRef Fil
>          if (!ArchitectureName.empty())
>            outs() << " (architecture " << ArchitectureName << ")";
>          outs() << "\n";
> +        if (ArchiveHeaders)
> +          printArchiveHeaders(A.get(), true, false);
>          for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end();
>               AI != AE; ++AI) {
>            ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
>
> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=226228&r1=226227&r2=226228&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Thu Jan 15 17:19:11 2015
> @@ -892,7 +892,8 @@ int main(int argc, char **argv) {
>        && !Bind
>        && !LazyBind
>        && !WeakBind
> -      && !(UniversalHeaders && MachOOpt)) {
> +      && !(UniversalHeaders && MachOOpt)
> +      && !(ArchiveHeaders && MachOOpt)) {
>      cl::PrintHelpMessage();
>      return 2;
>    }
>
> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.h?rev=226228&r1=226227&r2=226228&view=diff
> ==============================================================================
> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.h (original)
> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.h Thu Jan 15 17:19:11 2015
> @@ -35,6 +35,7 @@ extern cl::opt<bool> Bind;
>  extern cl::opt<bool> LazyBind;
>  extern cl::opt<bool> WeakBind;
>  extern cl::opt<bool> UniversalHeaders;
> +extern cl::opt<bool> ArchiveHeaders;
>
>  // Various helper functions.
>  bool error(std::error_code ec);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list