[llvm] r211316 - Change the output of llvm-nm and llvm-size for Mach-O universal files (aka

Kevin Enderby enderby at apple.com
Thu Jun 19 15:03:19 PDT 2014


Author: enderby
Date: Thu Jun 19 17:03:18 2014
New Revision: 211316

URL: http://llvm.org/viewvc/llvm-project?rev=211316&view=rev
Log:
Change the output of llvm-nm and llvm-size for Mach-O universal files (aka
fat files) to print “ (for architecture XYZ)” for fat files with more than
one architecture to be like what the darwin tools do for fat files.

Also clean up the Mach-O printing of archive membernames in llvm-nm to use
the darwin form of "libx.a(foo.o)".

Modified:
    llvm/trunk/include/llvm/Object/MachOUniversal.h
    llvm/trunk/lib/Object/MachOUniversal.cpp
    llvm/trunk/test/Object/nm-universal-binary.test
    llvm/trunk/test/Object/size-trivial-macho.test
    llvm/trunk/tools/llvm-nm/llvm-nm.cpp
    llvm/trunk/tools/llvm-size/llvm-size.cpp

Modified: llvm/trunk/include/llvm/Object/MachOUniversal.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/MachOUniversal.h?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/MachOUniversal.h (original)
+++ llvm/trunk/include/llvm/Object/MachOUniversal.h Thu Jun 19 17:03:18 2014
@@ -18,6 +18,7 @@
 #include "llvm/ADT/Triple.h"
 #include "llvm/Object/Binary.h"
 #include "llvm/Object/Archive.h"
+#include "llvm/Object/MachO.h"
 #include "llvm/Support/ErrorOr.h"
 #include "llvm/Support/MachO.h"
 
@@ -52,6 +53,9 @@ public:
 
     ObjectForArch getNext() const { return ObjectForArch(Parent, Index + 1); }
     uint32_t getCPUType() const { return Header.cputype; }
+    std::string getArchTypeName() const {
+      return Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype));
+    }
 
     std::error_code getAsObjectFile(std::unique_ptr<ObjectFile> &Result) const;
 

Modified: llvm/trunk/lib/Object/MachOUniversal.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOUniversal.cpp?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOUniversal.cpp (original)
+++ llvm/trunk/lib/Object/MachOUniversal.cpp Thu Jun 19 17:03:18 2014
@@ -72,9 +72,7 @@ std::error_code MachOUniversalBinary::Ob
   if (Parent) {
     StringRef ParentData = Parent->getData();
     StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
-    std::string ObjectName =
-        Parent->getFileName().str() + ":" +
-        Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype));
+    std::string ObjectName = Parent->getFileName().str();
     MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer(
         ObjectData, ObjectName, false);
     ErrorOr<ObjectFile *> Obj = ObjectFile::createMachOObjectFile(ObjBuffer);
@@ -91,9 +89,7 @@ std::error_code MachOUniversalBinary::Ob
   if (Parent) {
     StringRef ParentData = Parent->getData();
     StringRef ObjectData = ParentData.substr(Header.offset, Header.size);
-    std::string ObjectName =
-        Parent->getFileName().str() + ":" +
-        Triple::getArchTypeName(MachOObjectFile::getArch(Header.cputype));
+    std::string ObjectName = Parent->getFileName().str();
     MemoryBuffer *ObjBuffer = MemoryBuffer::getMemBuffer(
         ObjectData, ObjectName, false);
     ErrorOr<Archive *> Obj = Archive::create(ObjBuffer);

Modified: llvm/trunk/test/Object/nm-universal-binary.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-universal-binary.test?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/test/Object/nm-universal-binary.test (original)
+++ llvm/trunk/test/Object/nm-universal-binary.test Thu Jun 19 17:03:18 2014
@@ -3,17 +3,17 @@ RUN:         | FileCheck %s -check-prefi
 RUN: llvm-nm %p/Inputs/macho-universal-archive.x86_64.i386 \
 RUN:         | FileCheck %s -check-prefix CHECK-AR
 
-CHECK-OBJ: macho-universal.x86_64.i386:x86_64
+CHECK-OBJ: macho-universal.x86_64.i386 (for architecture x86_64):
 CHECK-OBJ: 0000000100000f60 T _main
-CHECK-OBJ: macho-universal.x86_64.i386:i386
+CHECK-OBJ: macho-universal.x86_64.i386 (for architecture i386):
 CHECK-OBJ: 00001fa0 T _main
 
-CHECK-AR: macho-universal-archive.x86_64.i386:x86_64:hello.o:
+CHECK-AR: macho-universal-archive.x86_64.i386(hello.o) (for architecture x86_64):
 CHECK-AR: 0000000000000068 s EH_frame0
 CHECK-AR: 000000000000003b s L_.str
 CHECK-AR: 0000000000000000 T _main
 CHECK-AR: 0000000000000080 S _main.eh
 CHECK-AR:                  U _printf
-CHECK-AR: macho-universal-archive.x86_64.i386:i386:foo.o:
+CHECK-AR: macho-universal-archive.x86_64.i386(foo.o) (for architecture i386):
 CHECK-AR: 00000008 S _bar
 CHECK-AR: 00000000 T _foo

Modified: llvm/trunk/test/Object/size-trivial-macho.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/size-trivial-macho.test?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/test/Object/size-trivial-macho.test (original)
+++ llvm/trunk/test/Object/size-trivial-macho.test Thu Jun 19 17:03:18 2014
@@ -71,9 +71,9 @@ mxl: Segment __LINKEDIT: 0x1000 (vmaddr
 mxl: total 0x100003000
 
 u: __TEXT	__DATA	__OBJC	others	dec	hex
-u: 4096	0	0	4294971392	4294975488	100002000	{{.*}}/macho-universal.x86_64.i386:x86_64
-u: 4096	0	0	8192	12288	3000	{{.*}}/macho-universal.x86_64.i386:i386
+u: 4096	0	0	4294971392	4294975488	100002000	{{.*}}/macho-universal.x86_64.i386 (for architecture x86_64)
+u: 4096	0	0	8192	12288	3000	{{.*}}/macho-universal.x86_64.i386 (for architecture i386)
 
 uAR: __TEXT	__DATA	__OBJC	others	dec	hex
-uAR: 136	0	0	32	168	a8	{{.*}}/macho-universal-archive.x86_64.i386:x86_64(hello.o)
-uAR: 5	4	0	0	9	9	{{.*}}/macho-universal-archive.x86_64.i386:i386(foo.o)
+uAR: 136	0	0	32	168	a8	{{.*}}/macho-universal-archive.x86_64.i386(hello.o) (for architecture x86_64)
+uAR: 5	4	0	0	9	9	{{.*}}/macho-universal-archive.x86_64.i386(foo.o) (for architecture i386)

Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
+++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Thu Jun 19 17:03:18 2014
@@ -752,20 +752,28 @@ static void dumpSymbolNamesFromFile(std:
       if (ChildOrErr.getError())
         continue;
       if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
-        outs() << O->getFileName() << ":\n";
+        if (isa<MachOObjectFile>(O)) {
+          outs() << Filename << "(" << O->getFileName() << ")";
+        } else
+          outs() << O->getFileName();
+        outs() << ":\n";
         dumpSymbolNamesFromObject(O);
       }
     }
     return;
   }
   if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(Bin.get())) {
+    bool moreThanOneArch = UB->getNumberOfObjects() > 1;
     for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
                                                E = UB->end_objects();
          I != E; ++I) {
       std::unique_ptr<ObjectFile> Obj;
       std::unique_ptr<Archive> A;
       if (!I->getAsObjectFile(Obj)) {
-        outs() << Obj->getFileName() << ":\n";
+        outs() << Obj->getFileName();
+        if (isa<MachOObjectFile>(Obj.get()) && moreThanOneArch)
+          outs() << " (for architecture " << I->getArchTypeName() << ")";
+        outs() << ":\n";
         dumpSymbolNamesFromObject(Obj.get());
       }
       else if (!I->getAsArchive(A)) {
@@ -776,8 +784,14 @@ static void dumpSymbolNamesFromFile(std:
           if (ChildOrErr.getError())
             continue;
           if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
-            outs() << A->getFileName() << ":";
-            outs() << O->getFileName() << ":\n";
+            outs() << A->getFileName();
+            if (isa<MachOObjectFile>(O)) {
+              outs() << "(" << O->getFileName() << ")";
+              if (moreThanOneArch)
+                outs() << " (for architecture " << I->getArchTypeName() << ")";
+            } else
+              outs() << ":" << O->getFileName();
+            outs() << ":\n";
             dumpSymbolNamesFromObject(O);
           }
         }

Modified: llvm/trunk/tools/llvm-size/llvm-size.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-size/llvm-size.cpp?rev=211316&r1=211315&r2=211316&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-size/llvm-size.cpp (original)
+++ llvm/trunk/tools/llvm-size/llvm-size.cpp Thu Jun 19 17:03:18 2014
@@ -469,13 +469,20 @@ static void PrintFileSectionSizes(String
       std::unique_ptr<Archive> UA;
       if (!I->getAsObjectFile(UO)) {
         if (ObjectFile *o = dyn_cast<ObjectFile>(&*UO.get())) {
+          MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
           if (OutputFormat == sysv)
             outs() << o->getFileName() << "  :\n";
+          else if(MachO && OutputFormat == darwin) {
+            if (moreThanOneFile || moreThanOneArch)
+              outs() << o->getFileName() << " (for architecture "
+                     << I->getArchTypeName() << "):";
+            outs() << "\n";
+          }
           PrintObjectSectionSizes(o);
           if (OutputFormat == berkeley) {
-            MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
             if (!MachO || moreThanOneFile || moreThanOneArch)
-              outs() << o->getFileName();
+              outs() << o->getFileName() << " (for architecture "
+                     << I->getArchTypeName() << ")";
             outs() << "\n";
           }
         }
@@ -495,11 +502,15 @@ static void PrintFileSectionSizes(String
               outs() << o->getFileName() << "   (ex " << UA->getFileName()
                      << "):\n";
             else if(MachO && OutputFormat == darwin)
-              outs() << UA->getFileName() << "(" << o->getFileName() << "):\n";
+              outs() << UA->getFileName() << "(" << o->getFileName() << ")"
+                     << " (for architecture " << I->getArchTypeName()
+                     << "):\n";
             PrintObjectSectionSizes(o);
             if (OutputFormat == berkeley) {
               if (MachO)
-                outs() << UA->getFileName() << "(" << o->getFileName() << ")\n";
+                outs() << UA->getFileName() << "(" << o->getFileName() << ")"
+                       << " (for architecture " << I->getArchTypeName()
+                       << ")\n";
               else
                 outs() << o->getFileName() << " (ex " << UA->getFileName()
                        << ")\n";





More information about the llvm-commits mailing list